From 33d6420b563fd52f0863578b979f1f34e116838e Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 19 Oct 2024 11:17:08 +0700 Subject: [PATCH 01/30] replace bls library --- Cargo.lock | 368 +++++++++++++++++- packages/rs-dpp/Cargo.toml | 7 +- .../rs-dpp/src/core_types/validator/mod.rs | 5 +- .../rs-dpp/src/core_types/validator/v0/mod.rs | 28 +- .../src/core_types/validator_set/mod.rs | 5 +- .../src/core_types/validator_set/v0/mod.rs | 43 +- .../identity/identity_public_key/key_type.rs | 24 +- .../identity_public_key/methods/hash/mod.rs | 2 +- .../methods/hash/v0/mod.rs | 2 +- .../identity/identity_public_key/random.rs | 32 +- .../identity_public_key/v0/methods/mod.rs | 79 ++-- .../identity/identity_public_key/v0/random.rs | 16 +- packages/rs-dpp/src/identity/random.rs | 8 +- packages/rs-dpp/src/identity/v0/random.rs | 10 +- packages/rs-dpp/src/lib.rs | 2 +- packages/rs-drive-abci/Cargo.toml | 4 +- .../update_operator_identity/v0/mod.rs | 38 +- .../update_quorum_info/v0/mod.rs | 2 +- .../core_chain_lock/choose_quorum/mod.rs | 6 +- .../core_chain_lock/choose_quorum/v0/mod.rs | 25 +- .../verify_chain_lock_locally/v0/mod.rs | 25 +- .../verify_recent_signature_locally/v0/mod.rs | 36 +- .../v0/mod.rs | 4 +- packages/rs-drive-abci/src/mimic/mod.rs | 8 +- .../rs-drive-abci/src/mimic/test_quorum.rs | 38 +- .../src/platform_types/commit/mod.rs | 3 +- .../src/platform_types/commit/v0/mod.rs | 26 +- .../platform_types/platform_state/v0/mod.rs | 6 +- .../platform_state/v0/old_structures/mod.rs | 103 +++++ .../signature_verification_quorum_set/mod.rs | 8 +- .../v0/for_saving.rs | 14 +- .../v0/for_saving_v1.rs | 93 +++++ .../v0/mod.rs | 1 + .../v0/quorums.rs | 33 +- .../src/platform_types/validator/v0/mod.rs | 6 +- .../platform_types/validator_set/v0/mod.rs | 28 +- .../system/current_quorums_info/v0/mod.rs | 6 +- .../tests/strategy_tests/execution.rs | 29 +- .../tests/strategy_tests/main.rs | 2 +- .../masternode_list_item_helpers.rs | 26 +- .../tests/strategy_tests/masternodes.rs | 26 +- .../tests/strategy_tests/query.rs | 20 +- .../rs-drive-proof-verifier/src/unproved.rs | 4 +- .../rs-drive-proof-verifier/src/verify.rs | 27 +- packages/simple-signer/src/signer.rs | 25 +- 45 files changed, 1009 insertions(+), 294 deletions(-) create mode 100644 packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs create mode 100644 packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs diff --git a/Cargo.lock b/Cargo.lock index a6d1c8fd710..e1f0972af41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,6 +333,12 @@ dependencies = [ "rustc-demangle", ] +[[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" @@ -509,7 +515,7 @@ 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]] @@ -533,6 +539,63 @@ dependencies = [ "serde", ] +[[package]] +name = "blsful" +version = "3.0.0-pre6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9de4566ea9f21109f6b3f11551b591ff22683ff47c3a30d97e2feb23257427" +dependencies = [ + "anyhow", + "arrayref", + "blstrs_plus", + "hex", + "hkdf", + "merlin", + "pairing", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_bare", + "sha2", + "sha3", + "subtle", + "thiserror", + "uint-zigzag", + "vsss-rs", + "zeroize", +] + +[[package]] +name = "blst" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "blstrs_plus" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a16dd4b0d6b4538e1fa0388843acb186363082713a8fc8416d802a04d013818" +dependencies = [ + "arrayref", + "blst", + "elliptic-curve", + "ff", + "group", + "pairing", + "rand_core", + "serde", + "subtle", + "zeroize", +] + [[package]] name = "borsh" version = "1.5.1" @@ -912,6 +975,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[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.13" @@ -1006,13 +1078,26 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core", + "serdect", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -1369,6 +1454,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", + "blsful", "bs58", "byteorder", "chrono", @@ -1460,6 +1546,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", + "bls-signatures", "bs58", "chrono", "ciborium 0.2.0", @@ -1577,6 +1664,41 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array 0.14.7", + "group", + "hkdf", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "tap", + "zeroize", +] + +[[package]] +name = "elliptic-curve-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48843edfbd0a370b3dd14cdbb4e446e9a8855311e6b2b57bf9a1fd1367bc317" +dependencies = [ + "elliptic-curve", + "heapless", + "hex", + "multiexp", + "serde", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.34" @@ -1737,6 +1859,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -1933,6 +2066,17 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "serde", + "typenum", ] [[package]] @@ -1972,6 +2116,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand", + "rand_core", + "rand_xorshift", + "subtle", +] + [[package]] name = "grovedb" version = "2.1.0" @@ -2148,6 +2305,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2186,6 +2352,16 @@ dependencies = [ "num-traits", ] +[[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" @@ -2240,6 +2416,15 @@ 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" @@ -2480,7 +2665,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -2642,6 +2827,15 @@ dependencies = [ "uuid", ] +[[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" @@ -2781,6 +2975,18 @@ 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 = "metrics" version = "0.23.0" @@ -2928,6 +3134,19 @@ dependencies = [ "uuid", ] +[[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" @@ -3005,6 +3224,8 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "rand", + "serde", ] [[package]] @@ -3020,6 +3241,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", + "rand", + "serde", ] [[package]] @@ -3068,6 +3291,7 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", + "serde", ] [[package]] @@ -3202,6 +3426,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" version = "2.2.0" @@ -3676,6 +3909,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "raw-cpuid" version = "11.1.0" @@ -4061,6 +4303,20 @@ 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.30.0" @@ -4130,6 +4386,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +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.15" @@ -4263,6 +4528,16 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4285,6 +4560,16 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -4376,6 +4661,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "spki" @@ -4396,6 +4684,22 @@ dependencies = [ "log", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "std-shims" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e49360f31b0b75a6a82a5205c6103ea07a79a60808d44f5cc879d303337926" +dependencies = [ + "hashbrown 0.14.5", + "spin", +] + [[package]] name = "strategy-tests" version = "1.4.1" @@ -4688,6 +4992,26 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -4698,6 +5022,15 @@ dependencies = [ "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.36" @@ -5098,6 +5431,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uint-zigzag" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbf77aed65cb885a8ba07138c365879be3d9a93dce82bf6cc50feca9138ec15" +dependencies = [ + "core2", +] + [[package]] name = "unicase" version = "2.7.0" @@ -5224,6 +5566,26 @@ version = "0.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" +[[package]] +name = "vsss-rs" +version = "5.0.0-rc1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9860fb75908021ae4cc125917c9763134f7f236a716d181ed644627783230c5d" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "elliptic-curve-tools", + "generic-array 1.1.0", + "hex", + "num", + "rand_core", + "serde", + "sha3", + "subtle", + "thiserror-no-std", + "zeroize", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 591a86701d4..c11255e4b22 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -22,14 +22,13 @@ chrono = { version = "0.4.35", default-features = false, features = [ "clock", ] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +blsful = { version = "3.0.0-pre6" , optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "std", "secp-recovery", "rand", "signer", - "serde", - "bls", - "eddsa" + "serde" ], default-features = false, tag = "0.32.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } @@ -75,7 +74,7 @@ once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] -bls-signatures = ["dashcore/bls"] +bls-signatures = ["dashcore/bls", "blsful"] ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", diff --git a/packages/rs-dpp/src/core_types/validator/mod.rs b/packages/rs-dpp/src/core_types/validator/mod.rs index 2261bac56fa..d5f985a3c14 100644 --- a/packages/rs-dpp/src/core_types/validator/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/mod.rs @@ -1,5 +1,6 @@ use crate::bls_signatures::PublicKey as BlsPublicKey; use crate::core_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; +use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, PubkeyHash}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -25,7 +26,7 @@ impl ValidatorV0Getters for Validator { } } - fn public_key(&self) -> &Option { + fn public_key(&self) -> &Option> { match self { Validator::V0(v0) => v0.public_key(), } @@ -75,7 +76,7 @@ impl ValidatorV0Setters for Validator { } } - fn set_public_key(&mut self, public_key: Option) { + fn set_public_key(&mut self, public_key: Option>) { match self { Validator::V0(v0) => v0.set_public_key(public_key), } diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index b427431a04c..81f73a66af4 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -2,6 +2,7 @@ use dashcore::{ProTxHash, PubkeyHash}; use std::fmt::{Debug, Formatter}; use crate::bls_signatures::PublicKey as BlsPublicKey; +use blsful::Bls12381G2Impl; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -26,7 +27,7 @@ pub struct ValidatorV0 { /// The proTxHash pub pro_tx_hash: ProTxHash, /// The public key share of this validator for this quorum - pub public_key: Option, + pub public_key: Option>, /// The node address pub node_ip: String, /// The node id @@ -54,7 +55,7 @@ impl Encode for ValidatorV0 { match &self.public_key { Some(public_key) => { true.encode(encoder)?; // Indicate that public_key is present - public_key.to_bytes().encode(encoder)?; + public_key.0.to_compressed().encode(encoder)?; } None => { false.encode(encoder)?; // Indicate that public_key is not present @@ -94,9 +95,12 @@ impl Decode for ValidatorV0 { let has_public_key = bool::decode(decoder)?; let public_key = if has_public_key { let public_key_bytes = <[u8; 48]>::decode(decoder)?; - Some(BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) - })?) + + Some( + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + })?, + ) } else { None }; @@ -150,7 +154,7 @@ pub trait ValidatorV0Getters { /// Returns the proTxHash of the validator. fn pro_tx_hash(&self) -> &ProTxHash; /// Returns the public key share of this validator for this quorum. - fn public_key(&self) -> &Option; + fn public_key(&self) -> &Option>; /// Returns the node address of the validator. fn node_ip(&self) -> &String; /// Returns the node id of the validator. @@ -170,7 +174,7 @@ pub trait ValidatorV0Setters { /// Sets the proTxHash of the validator. fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash); /// Sets the public key share of this validator for this quorum. - fn set_public_key(&mut self, public_key: Option); + fn set_public_key(&mut self, public_key: Option>); /// Sets the node address of the validator. fn set_node_ip(&mut self, node_ip: String); /// Sets the node id of the validator. @@ -190,7 +194,7 @@ impl ValidatorV0Getters for ValidatorV0 { &self.pro_tx_hash } - fn public_key(&self) -> &Option { + fn public_key(&self) -> &Option> { &self.public_key } @@ -224,7 +228,7 @@ impl ValidatorV0Setters for ValidatorV0 { self.pro_tx_hash = pro_tx_hash; } - fn set_public_key(&mut self, public_key: Option) { + fn set_public_key(&mut self, public_key: Option>) { self.public_key = public_key; } @@ -257,12 +261,16 @@ impl ValidatorV0Setters for ValidatorV0 { mod tests { use super::*; use bincode::config; + use blsful::SecretKey; + use rand::prelude::StdRng; + use rand::SeedableRng; #[test] fn test_serialize_deserialize_validator_v0() { // Sample data for testing let pro_tx_hash = ProTxHash::from_slice(&[1; 32]).unwrap(); - let public_key = Some(BlsPublicKey::generate()); + let mut rng = StdRng::seed_from_u64(0); + let public_key = Some(SecretKey::::random(&mut rng).public_key()); let node_ip = "127.0.0.1".to_string(); let node_id = PubkeyHash::from_slice(&[3; 20]).unwrap(); let core_port = 9999; diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs index 74b78fca058..de5b515f9f7 100644 --- a/packages/rs-dpp/src/core_types/validator_set/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -7,6 +7,7 @@ use crate::core_types::validator_set::v0::{ use crate::ProtocolError; #[cfg(feature = "core-types-serialization")] use bincode::{Decode, Encode}; +use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, QuorumHash}; #[cfg(feature = "core-types-serialization")] use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; @@ -80,7 +81,7 @@ impl ValidatorSetV0Getters for ValidatorSet { } } - fn threshold_public_key(&self) -> &BlsPublicKey { + fn threshold_public_key(&self) -> &BlsPublicKey { match self { ValidatorSet::V0(v0) => v0.threshold_public_key(), } @@ -112,7 +113,7 @@ impl ValidatorSetV0Setters for ValidatorSet { } } - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { match self { ValidatorSet::V0(v0) => v0.set_threshold_public_key(threshold_public_key), } diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index dba9180e24b..cf05bb3d149 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -8,6 +8,7 @@ use bincode::enc::Encoder; use bincode::error::EncodeError; #[cfg(feature = "core-types-serialization")] use bincode::{BorrowDecode, Decode, Encode}; +use blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::{ProTxHash, QuorumHash}; use itertools::Itertools; @@ -34,7 +35,7 @@ pub struct ValidatorSetV0 { /// The list of masternodes pub members: BTreeMap, /// The threshold quorum public key - pub threshold_public_key: BlsPublicKey, + pub threshold_public_key: BlsPublicKey, } impl Display for ValidatorSetV0 { @@ -61,7 +62,7 @@ impl Display for ValidatorSetV0 { pro_tx_hash, validator.node_ip )) .join(", "), - hex::encode(self.threshold_public_key.to_bytes().as_slice()) // Assuming BlsPublicKey is a byte array + hex::encode(self.threshold_public_key.0.to_compressed()) // Assuming BlsPublicKey is a byte array ) } } @@ -85,7 +86,7 @@ impl Encode for ValidatorSetV0 { // Custom encoding for BlsPublicKey if needed // Assuming BlsPublicKey can be serialized to a byte slice - let public_key_bytes = *self.threshold_public_key.to_bytes(); + let public_key_bytes = self.threshold_public_key.0.to_compressed(); public_key_bytes.encode(encoder)?; Ok(()) @@ -118,9 +119,12 @@ impl Decode for ValidatorSetV0 { let mut public_key_bytes = [0u8; 48]; let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); - let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) - })?; + let threshold_public_key = + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode BlsPublicKey".to_string(), + ) + })?; Ok(ValidatorSetV0 { quorum_hash: QuorumHash::from_byte_array(quorum_hash), @@ -162,11 +166,12 @@ impl<'de> BorrowDecode<'de> for ValidatorSetV0 { let mut public_key_bytes = [0u8; 48]; let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); - let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - bincode::error::DecodeError::OtherString( - "Failed to decode BlsPublicKey in borrow decode".to_string(), - ) - })?; + let threshold_public_key = + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode BlsPublicKey in borrow decode".to_string(), + ) + })?; Ok(ValidatorSetV0 { quorum_hash: QuorumHash::from_byte_array(quorum_hash), @@ -211,7 +216,7 @@ pub trait ValidatorSetV0Getters { /// Returns the members of the validator set. fn members_owned(self) -> BTreeMap; /// Returns the threshold public key of the validator set. - fn threshold_public_key(&self) -> &BlsPublicKey; + fn threshold_public_key(&self) -> &BlsPublicKey; } /// Trait providing setter methods for `ValidatorSetV0` struct @@ -225,7 +230,7 @@ pub trait ValidatorSetV0Setters { /// Sets the members of the validator set. fn set_members(&mut self, members: BTreeMap); /// Sets the threshold public key of the validator set. - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); } impl ValidatorSetV0Getters for ValidatorSetV0 { @@ -253,7 +258,7 @@ impl ValidatorSetV0Getters for ValidatorSetV0 { self.members } - fn threshold_public_key(&self) -> &BlsPublicKey { + fn threshold_public_key(&self) -> &BlsPublicKey { &self.threshold_public_key } } @@ -275,7 +280,7 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { self.members = members; } - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { self.threshold_public_key = threshold_public_key; } } @@ -284,7 +289,10 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { mod tests { use super::*; use bincode::config; + use blsful::SecretKey; use dashcore::PubkeyHash; + use rand::rngs::StdRng; + use rand::SeedableRng; use std::collections::BTreeMap; #[test] @@ -296,7 +304,8 @@ mod tests { // Create a sample ProTxHash and ValidatorV0 instance let pro_tx_hash = ProTxHash::from_slice(&[2; 32]).unwrap(); - let public_key = Some(BlsPublicKey::generate()); + let mut rng = StdRng::seed_from_u64(0); + let public_key = Some(SecretKey::::random(&mut rng).public_key()); let node_ip = "192.168.1.1".to_string(); let node_id = PubkeyHash::from_slice(&[4; 20]).unwrap(); let validator = ValidatorV0 { @@ -315,7 +324,7 @@ mod tests { members.insert(pro_tx_hash, validator); // Create a sample threshold public key - let threshold_public_key = BlsPublicKey::generate(); + let threshold_public_key = SecretKey::::random(&mut rng).public_key(); // Create the ValidatorSetV0 instance let validator_set = ValidatorSetV0 { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index e40437a33e5..a1ead4a7253 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -15,6 +15,7 @@ use lazy_static::lazy_static; use crate::fee::Credits; use crate::version::PlatformVersion; use crate::{InvalidVectorSizeError, ProtocolError}; +use blsful::Bls12381G2Impl; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -270,7 +271,7 @@ impl KeyType { #[cfg(feature = "random-public-keys")] /// Gets the default size of the public key - pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, Vec) { + pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, [u8; 32]) { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); @@ -279,18 +280,13 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( private_key.public_key(&secp).to_bytes(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } KeyType::BLS12_381 => { - let private_key = bls_signatures::PrivateKey::generate_dash(rng) - .expect("expected to generate a bls private key"); // we assume this will never error - let public_key_bytes = private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec(); - (public_key_bytes, private_key.to_bytes().to_vec()) + let private_key = blsful::SecretKey::::random(rng); + let public_key_bytes = private_key.public_key().0.to_compressed().to_vec(); + (public_key_bytes, private_key.0.to_be_bytes()) } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); @@ -299,14 +295,14 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } KeyType::EDDSA_25519_HASH160 => { let key_pair = ed25519_dalek::SigningKey::generate(rng); ( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec(), - key_pair.to_bytes().to_vec(), + key_pair.to_bytes(), ) } KeyType::BIP13_SCRIPT_HASH => { @@ -317,7 +313,7 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } } @@ -329,7 +325,7 @@ impl KeyType { &self, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Vec, Vec), ProtocolError> { + ) -> Result<(Vec, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs index b22a3f0c26e..5cc4828dd7e 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs @@ -14,7 +14,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result { match self { diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs index b11c79c31f7..dd2b975e88f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs @@ -8,7 +8,7 @@ pub trait IdentityPublicKeyHashMethodsV0 { /// Verifies that the private key bytes match this identity public key fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result; } diff --git a/packages/rs-dpp/src/identity/identity_public_key/random.rs b/packages/rs-dpp/src/identity/identity_public_key/random.rs index dec286b9278..6ed13153e4f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/random.rs @@ -138,7 +138,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -176,7 +176,7 @@ impl IdentityPublicKey { rng: &mut StdRng, used_key_matrix: Option<(KeyCount, &mut UsedKeyMatrix)>, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -272,7 +272,7 @@ impl IdentityPublicKey { key_type: KeyType, contract_bounds: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -318,7 +318,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -346,7 +346,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -384,7 +384,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -411,7 +411,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -442,7 +442,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -489,7 +489,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -518,7 +518,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -558,7 +558,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -587,7 +587,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -629,7 +629,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -656,7 +656,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -703,7 +703,7 @@ impl IdentityPublicKey { key_count: KeyCount, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result)>, ProtocolError> { + ) -> Result, ProtocolError> { (start_id..(start_id + key_count)) .map(|i| { Self::random_authentication_key_with_private_key_with_rng( @@ -720,7 +720,7 @@ impl IdentityPublicKey { key_count: KeyCount, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result)>, ProtocolError> { + ) -> Result, ProtocolError> { if key_count < 2 { return Err(ProtocolError::PublicKeyGenerationError( "at least 2 keys must be created".to_string(), diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 470dc92b9b7..4b64fe9f16a 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -4,10 +4,11 @@ use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; use crate::ProtocolError; use anyhow::anyhow; +use blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; -use dashcore::{bls_signatures, ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; +use dashcore::{ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { @@ -50,13 +51,13 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result { match self.key_type { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); - let secret_key = match SecretKey::from_slice(private_key_bytes) { + let secret_key = match SecretKey::from_byte_array(private_key_bytes) { Ok(secret_key) => secret_key, Err(_) => return Ok(false), }; @@ -67,17 +68,15 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key = - match bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) { - Ok(secret_key) => secret_key, - Err(_) => return Ok(false), - }; - let g1_element = match private_key.g1_element() { - Ok(g1_element) => g1_element, - Err(_) => return Ok(false), - }; + let private_key: Option> = + blsful::SecretKey::::from_be_bytes(private_key_bytes) + .into(); + if private_key.is_none() { + return Ok(false); + } + let private_key = private_key.expect("expected private key"); - Ok(g1_element.to_bytes().as_slice() == self.data.as_slice()) + Ok(&private_key.public_key().0.to_compressed() == self.data.as_slice()) } #[cfg(not(feature = "bls-signatures"))] return Err(ProtocolError::NotSupported( @@ -86,7 +85,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); - let secret_key = match SecretKey::from_slice(private_key_bytes) { + let secret_key = match SecretKey::from_byte_array(private_key_bytes) { Ok(secret_key) => secret_key, Err(_) => return Ok(false), }; @@ -101,11 +100,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let secret_key = match private_key_bytes.try_into() { - Ok(secret_key) => secret_key, - Err(_) => return Ok(false), - }; - let key_pair = ed25519_dalek::SigningKey::from_bytes(&secret_key); + let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); Ok( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).as_slice() == self.data.as_slice(), @@ -129,11 +124,51 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { mod tests { use super::*; use crate::identity::{Purpose, SecurityLevel}; + use blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; use dashcore::Network; use dpp::version::PlatformVersion; use rand::rngs::StdRng; use rand::SeedableRng; + #[test] + fn test_bls_serialization_deserialization() { + let mut rng = StdRng::seed_from_u64(5); + let (public_key_data, secret_key) = KeyType::BLS12_381 + .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) + .expect("expected to get keys"); + let decoded_secret_key = + blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) + .expect("expected to get secret key"); + let public_key = decoded_secret_key.public_key(); + let decoded_public_key_data = public_key.0.to_compressed(); + assert_eq!( + public_key_data.as_slice(), + decoded_public_key_data.as_slice() + ) + } + + #[test] + fn test_bls_serialization_deserialization_signature() { + let mut rng = StdRng::seed_from_u64(5); + let (_, secret_key) = KeyType::BLS12_381 + .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) + .expect("expected to get keys"); + let decoded_secret_key = + blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) + .expect("expected to get secret key"); + let signature = decoded_secret_key + .sign(SignatureSchemes::Basic, b"hello") + .expect("expected to sign"); + let compressed = signature.as_raw_value().to_compressed(); + let g2 = ::Signature::from_compressed(&compressed) + .expect("G2 projective"); + let decoded_signature = Signature::::Basic(g2); + assert_eq!( + compressed.as_slice(), + decoded_signature.as_raw_value().to_compressed().as_slice() + ) + } + #[cfg(feature = "random-public-keys")] #[test] fn test_validate_private_key_bytes_with_random_keys() { @@ -166,7 +201,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) @@ -207,7 +242,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) @@ -248,7 +283,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs index 162e836e1bc..a7ba471b3ad 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs @@ -68,7 +68,7 @@ impl IdentityPublicKeyV0 { rng: &mut StdRng, used_key_matrix: Option<(KeyCount, &mut UsedKeyMatrix)>, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { // we have 16 different permutations possible let mut binding = [false; 16].to_vec(); let (key_count, key_matrix) = used_key_matrix.unwrap_or((0, &mut binding)); @@ -124,7 +124,7 @@ impl IdentityPublicKeyV0 { key_type: KeyType, contract_bounds: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let read_only = false; let (public_data, private_data) = key_type.random_public_and_private_key_data(rng, platform_version)?; @@ -197,7 +197,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = MASTER; @@ -223,7 +223,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = VOTING; let security_level = MEDIUM; @@ -249,7 +249,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = OWNER; let security_level = CRITICAL; @@ -275,7 +275,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = TRANSFER; let security_level = CRITICAL; @@ -301,7 +301,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = CRITICAL; @@ -327,7 +327,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = HIGH; diff --git a/packages/rs-dpp/src/identity/random.rs b/packages/rs-dpp/src/identity/random.rs index d5f19f493ae..c14525272c1 100644 --- a/packages/rs-dpp/src/identity/random.rs +++ b/packages/rs-dpp/src/identity/random.rs @@ -66,8 +66,8 @@ impl Identity { ) -> Result<(Self, I), ProtocolError> where I: Default - + IntoIterator)> - + Extend<(IdentityPublicKey, Vec)>, + + IntoIterator + + Extend<(IdentityPublicKey, [u8; 32])>, { match platform_version .dpp @@ -234,8 +234,8 @@ impl Identity { ) -> Result<(Vec, I), ProtocolError> where I: Default - + FromIterator<(IdentityPublicKey, Vec)> - + Extend<(IdentityPublicKey, Vec)>, + + FromIterator<(IdentityPublicKey, [u8; 32])> + + Extend<(IdentityPublicKey, [u8; 32])>, { match platform_version .dpp diff --git a/packages/rs-dpp/src/identity/v0/random.rs b/packages/rs-dpp/src/identity/v0/random.rs index 2be4a34cfe1..5733aeda9ee 100644 --- a/packages/rs-dpp/src/identity/v0/random.rs +++ b/packages/rs-dpp/src/identity/v0/random.rs @@ -47,8 +47,8 @@ impl IdentityV0 { ) -> Result<(Self, I), ProtocolError> where I: Default - + IntoIterator)> - + Extend<(IdentityPublicKey, Vec)>, + + IntoIterator + + Extend<(IdentityPublicKey, [u8; 32])>, { let id = Identifier::new(rng.gen::<[u8; 32]>()); let revision = 0; @@ -126,11 +126,11 @@ impl IdentityV0 { ) -> Result<(Vec, I), ProtocolError> where I: Default - + FromIterator<(IdentityPublicKey, Vec)> - + Extend<(IdentityPublicKey, Vec)>, + + FromIterator<(IdentityPublicKey, [u8; 32])> + + Extend<(IdentityPublicKey, [u8; 32])>, { let mut vec: Vec = vec![]; - let mut private_key_map: Vec<(IdentityPublicKey, Vec)> = vec![]; + let mut private_key_map: Vec<(IdentityPublicKey, [u8; 32])> = vec![]; for _i in 0..count { let (identity, mut map) = Self::random_identity_with_main_keys_with_private_key( key_count, diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index a5d4ec177e9..9744e164551 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -90,7 +90,7 @@ pub mod prelude { pub use bincode; #[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] -pub use dashcore::bls_signatures; +pub use blsful as bls_signatures; #[cfg(feature = "ed25519-dalek")] pub use dashcore::ed25519_dalek; #[cfg(feature = "system_contracts")] diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 7e8346fe952..6fc8d7b6be7 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -73,8 +73,10 @@ tokio-util = { version = "0.7" } derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" console-subscriber = { version = "0.4", optional = true } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3", optional = true } [dev-dependencies] +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } bs58 = { version = "0.5.0" } base64 = "0.22.1" platform-version = { path = "../rs-platform-version", features = [ @@ -104,7 +106,7 @@ integer-encoding = { version = "4.0.0" } [features] default = ["mocks"] -mocks = ["mockall", "drive/fixtures-and-mocks"] +mocks = ["mockall", "drive/fixtures-and-mocks", "bls-signatures"] console = ["console-subscriber", "tokio/tracing"] testing-config = [] grovedbg = ["drive/grovedbg"] diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 898eec524ca..1b3e5ef3dd2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -400,7 +400,7 @@ mod tests { use dashcore_rpc::dashcore_rpc_json::{MasternodeListItem, MasternodeType}; use dashcore_rpc::json::DMNState; use dpp::block::block_info::BlockInfo; - use dpp::bls_signatures::PrivateKey as BlsPrivateKey; + use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; use dpp::dashcore::hashes::Hash; use dpp::dashcore::Txid; use dpp::identifier::MasternodeIdentifiers; @@ -433,13 +433,15 @@ mod tests { let node_id_bytes: [u8; 20] = rng.gen(); // Create a public key operator and payout address - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let operator_key: IdentityPublicKey = IdentityPublicKeyV0 { id: 0, @@ -950,13 +952,15 @@ mod tests { ) = create_operator_identity(&platform, &mut rng); // Generate a new public key operator - let new_private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let new_pub_key_operator = new_private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state let masternode_list_item = MasternodeListItem { @@ -1040,13 +1044,15 @@ mod tests { ) = create_operator_identity(&platform, &mut rng); // Generate a new public key operator - let new_private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let new_pub_key_operator = new_private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state with original public key operator let masternode_list_item = MasternodeListItem { diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs index 5ca6ce40708..14320ad1d25 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs @@ -386,7 +386,7 @@ where )?; let public_key = - match BlsPublicKey::from_bytes(quorum_info.quorum_public_key.as_slice()) + match BlsPublicKey::try_from(quorum_info.quorum_public_key.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse) { Ok(public_key) => public_key, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs index 3af3b3fbd2d..397709ed19b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use dpp::dashcore::QuorumHash; use std::collections::BTreeMap; @@ -24,10 +24,10 @@ where // TODO: use CoreQuorumSet.select_quorums instead pub fn choose_quorum<'a>( llmq_quorum_type: QuorumType, - quorums: &'a BTreeMap, + quorums: &'a BTreeMap>, request_id: &[u8; 32], platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result)>, Error> { match platform_version .drive_abci .methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs index 0d8ac563e34..3b6d1f86739 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs @@ -1,5 +1,5 @@ use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::QuorumHash; use std::collections::BTreeMap; @@ -12,11 +12,15 @@ impl Platform { /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums pub(super) fn choose_quorum_v0<'a>( llmq_quorum_type: QuorumType, - quorums: &'a BTreeMap, + quorums: &'a BTreeMap>, request_id: &[u8; 32], - ) -> Option<(ReversedQuorumHashBytes, &'a BlsPublicKey)> { + ) -> Option<(ReversedQuorumHashBytes, &'a BlsPublicKey)> { // Scoring system logic - let mut scores: Vec<(ReversedQuorumHashBytes, &BlsPublicKey, [u8; 32])> = Vec::new(); + let mut scores: Vec<( + ReversedQuorumHashBytes, + &BlsPublicKey, + [u8; 32], + )> = Vec::new(); for (quorum_hash, public_key) in quorums { let mut quorum_hash_bytes = quorum_hash.to_byte_array().to_vec(); @@ -92,9 +96,11 @@ mod tests { use crate::platform_types::platform::Platform; use crate::rpc::core::MockCoreRPCLike; use dashcore_rpc::dashcore_rpc_json::QuorumType; - use dpp::bls_signatures::PublicKey as BlsPublicKey; + use dpp::bls_signatures::SecretKey; use dpp::dashcore::hashes::Hash; use dpp::dashcore::QuorumHash; + use rand::rngs::StdRng; + use rand::SeedableRng; use std::collections::BTreeMap; #[test] @@ -124,11 +130,12 @@ mod tests { .as_slice(), ) .unwrap(); + let mut rng = StdRng::seed_from_u64(345); let quorums = BTreeMap::from([ - (quorum_hash1, BlsPublicKey::generate()), - (quorum_hash2, BlsPublicKey::generate()), - (quorum_hash3, BlsPublicKey::generate()), - (quorum_hash4, BlsPublicKey::generate()), + (quorum_hash1, SecretKey::random(&mut rng).public_key()), + (quorum_hash2, SecretKey::random(&mut rng).public_key()), + (quorum_hash3, SecretKey::random(&mut rng).public_key()), + (quorum_hash4, SecretKey::random(&mut rng).public_key()), ]); // diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs index a48fc30c670..85bc67ddd4f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::G2Element; +use dpp::bls_signatures::{Bls12381G2Impl, Signature}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId}; @@ -37,7 +37,10 @@ where let quorum_config = quorum_set.config(); // First verify that the signature conforms to a signature - let Ok(signature) = G2Element::from_bytes(chain_lock.signature.as_bytes()) else { + + let Ok(signature) = + Signature::::try_from(chain_lock.signature.as_bytes().as_slice()) + else { return Ok(Some(false)); }; @@ -119,9 +122,12 @@ where let message_digest = sha256d::Hash::from_engine(engine); - let mut chain_lock_verified = quorum - .public_key - .verify(&signature, message_digest.as_ref()); + let mut chain_lock_verified = signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok(); tracing::debug!( ?chain_lock, @@ -162,9 +168,12 @@ where let message_digest = sha256d::Hash::from_engine(engine); - chain_lock_verified = quorum - .public_key - .verify(&signature, message_digest.as_ref()); + chain_lock_verified = signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok(); tracing::debug!( ?chain_lock, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs index 335e5cb201c..a55f84ecf18 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::G2Element; +use dpp::bls_signatures::{Bls12381G2Impl, Signature}; use std::fmt::{Debug, Formatter}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; @@ -20,19 +20,20 @@ pub(super) fn verify_recent_instant_lock_signature_locally_v0( platform_state: &PlatformState, ) -> Result { // First verify that the signature conforms to a signature - let signature = match G2Element::from_bytes(instant_lock.signature.as_bytes()) { - Ok(signature) => signature, - Err(e) => { - tracing::trace!( - instant_lock = ?InstantLockDebug(instant_lock), - "Invalid instant Lock {} signature format: {}", - instant_lock.txid, - e, - ); + let signature = + match Signature::::try_from(instant_lock.signature.as_bytes().as_slice()) { + Ok(signature) => signature, + Err(e) => { + tracing::trace!( + instant_lock = ?InstantLockDebug(instant_lock), + "Invalid instant Lock {} signature format: {}", + instant_lock.txid, + e, + ); - return Ok(false); - } - }; + return Ok(false); + } + }; let signing_height = platform_state.last_committed_core_height(); let verification_height = signing_height.saturating_sub(SIGN_OFFSET); @@ -96,9 +97,12 @@ pub(super) fn verify_recent_instant_lock_signature_locally_v0( let message_digest = sha256d::Hash::from_engine(engine); - if quorum - .public_key - .verify(&signature, message_digest.as_ref()) + if signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok() { return Ok(true); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs index 6347c9515c0..0f11ba2a64d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs @@ -5,7 +5,7 @@ use dpp::consensus::basic::identity::{ IdentityAssetLockTransactionIsNotFoundError, IdentityAssetLockTransactionOutputNotFoundError, InvalidAssetLockProofTransactionHeightError, }; -use dpp::dashcore::secp256k1::ThirtyTwoByteHash; +use dpp::dashcore::hashes::Hash; use dpp::dashcore::TxOut; use dpp::identity::state_transition::asset_lock_proof::validate_asset_lock_transaction_structure::validate_asset_lock_transaction_structure; use dpp::prelude::{AssetLockProof, ConsensusValidationResult}; @@ -49,7 +49,7 @@ pub fn fetch_asset_lock_transaction_output_sync_v0( let Some(transaction_info) = maybe_transaction_info else { // Transaction hash bytes needs to be reversed to match actual transaction hash - let mut hash = transaction_hash.as_raw_hash().into_32(); + let mut hash: [u8; 32] = *transaction_hash.as_raw_hash().as_byte_array(); hash.reverse(); return Ok(ValidationResult::new_with_error( diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 0fb866b1074..f0c5f895bca 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -13,6 +13,7 @@ use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::{ use crate::rpc::core::CoreRPCLike; use ciborium::Value as CborValue; use dpp::block::block_info::BlockInfo; +use dpp::bls_signatures::SignatureSchemes; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; @@ -514,9 +515,12 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { public_key = ?current_quorum.public_key, "Signing block" ); - let block_signature = current_quorum.private_key.sign(digest.as_slice()); + let block_signature = current_quorum + .private_key + .sign(SignatureSchemes::Basic, digest.as_slice()) + .expect("expected to be able to sign"); - commit_info.block_signature = block_signature.to_bytes().to_vec(); + commit_info.block_signature = block_signature.as_raw_value().to_compressed().to_vec(); } else { commit_info.block_signature = [0u8; 96].to_vec(); } diff --git a/packages/rs-drive-abci/src/mimic/test_quorum.rs b/packages/rs-drive-abci/src/mimic/test_quorum.rs index c1653183c6d..389abf3bc1c 100644 --- a/packages/rs-drive-abci/src/mimic/test_quorum.rs +++ b/packages/rs-drive-abci/src/mimic/test_quorum.rs @@ -3,8 +3,9 @@ use crate::platform_types::validator_set::v0::ValidatorSetV0; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::{QuorumInfoResult, QuorumMember, QuorumType}; -use dpp::bls_signatures; -use dpp::bls_signatures::{PrivateKey as BlsPrivateKey, PublicKey as BlsPublicKey}; +use dpp::bls_signatures::{ + Bls12381G2Impl, PublicKey as BlsPublicKey, PublicKey, SecretKey as BlsPrivateKey, SecretKey, +}; use rand::rngs::StdRng; use rand::Rng; use std::collections::BTreeMap; @@ -17,9 +18,9 @@ pub struct ValidatorInQuorum { /// The hash of the transaction that identifies this validator in the network. pub pro_tx_hash: ProTxHash, /// The private key for this validator's BLS signature scheme. - pub private_key: BlsPrivateKey, + pub private_key: BlsPrivateKey, /// The public key for this validator's BLS signature scheme. - pub public_key: BlsPublicKey, + pub public_key: BlsPublicKey, /// The node address pub node_ip: String, /// The node id @@ -102,9 +103,9 @@ pub struct TestQuorumInfo { /// A map of validators indexed by their `ProTxHash` identifiers. pub validator_map: BTreeMap, /// The private key used to sign messages for the quorum (for testing purposes only). - pub private_key: BlsPrivateKey, + pub private_key: BlsPrivateKey, /// The public key corresponding to the private key used for signing. - pub public_key: BlsPublicKey, + pub public_key: BlsPublicKey, } fn random_ipv4_address(rng: &mut StdRng) -> Ipv4Addr { @@ -135,6 +136,7 @@ impl TestQuorumInfo { pro_tx_hashes: Vec, rng: &mut StdRng, ) -> Self { + // We test on purpose with the bls library that Dash Core uses let private_keys = bls_signatures::PrivateKey::generate_dash_many(pro_tx_hashes.len(), rng) .expect("expected to generate private keys"); let bls_id_private_key_pairs = private_keys @@ -154,8 +156,12 @@ impl TestQuorumInfo { ValidatorInQuorum { pro_tx_hash: ProTxHash::from_slice(pro_tx_hash.as_slice()) .expect("expected 32 bytes for pro_tx_hash"), - private_key: key, - public_key, + private_key: SecretKey::from_be_bytes( + &key.to_bytes().to_vec().try_into().expect("32 bytes"), + ) + .expect("expected conversion to work"), + public_key: PublicKey::try_from(public_key.to_bytes().as_slice()) + .expect("expected conversion to work"), node_ip: random_socket_addr(rng).to_string(), node_id: PubkeyHash::from_slice(pro_tx_hash.split_at(20).0).unwrap(), core_port: 1, @@ -178,8 +184,16 @@ impl TestQuorumInfo { quorum_index, validator_set, validator_map: map, - private_key: recovered_private_key, - public_key, + private_key: SecretKey::from_be_bytes( + &recovered_private_key + .to_bytes() + .to_vec() + .try_into() + .expect("32 bytes"), + ) + .expect("expected conversion to work"), + public_key: PublicKey::try_from(public_key.to_bytes().as_slice()) + .expect("expected conversion to work"), } } } @@ -255,7 +269,7 @@ impl From<&TestQuorumInfo> for QuorumInfoResult { pro_tx_hash: *pro_tx_hash, pub_key_operator: vec![], //doesn't matter valid: true, - pub_key_share: Some(public_key.to_bytes().to_vec()), + pub_key_share: Some(public_key.0.to_compressed().to_vec()), } }) .collect(); @@ -266,7 +280,7 @@ impl From<&TestQuorumInfo> for QuorumInfoResult { quorum_index: 0, mined_block: vec![], members, - quorum_public_key: public_key.to_bytes().to_vec(), + quorum_public_key: public_key.0.to_compressed().to_vec(), secret_key_share: None, } } diff --git a/packages/rs-drive-abci/src/platform_types/commit/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/mod.rs index 1a24fddcd1b..a903ce25d86 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/mod.rs @@ -5,6 +5,7 @@ use crate::platform_types::cleaned_abci_messages::{cleaned_block_id, cleaned_com use crate::platform_types::commit::v0::CommitV0; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures; +use dpp::bls_signatures::Bls12381G2Impl; use dpp::validation::SimpleValidationResult; use dpp::version::PlatformVersion; use tenderdash_abci::proto::abci::CommitInfo; @@ -82,7 +83,7 @@ impl Commit { pub fn verify_signature( &self, signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> SimpleValidationResult { match self { Commit::V0(v0) => v0.verify_signature(signature, public_key), diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index 403a3fff30f..25c57f441cf 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -6,6 +6,7 @@ use crate::abci::AbciError; use crate::platform_types::cleaned_abci_messages::{cleaned_block_id, cleaned_commit_info}; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures; +use dpp::bls_signatures::{Bls12381G2Impl, BlsError, Pairing, Signature}; use dpp::validation::{SimpleValidationResult, ValidationResult}; use tenderdash_abci::proto; use tenderdash_abci::proto::abci::CommitInfo; @@ -81,24 +82,27 @@ impl CommitV0 { pub(super) fn verify_signature( &self, signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> SimpleValidationResult { if signature == &[0; 96] { return ValidationResult::new_with_error(AbciError::BadRequest( "commit signature not initialized".to_string(), )); } + // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let signature = match bls_signatures::Signature::from_bytes(signature).map_err(|e| { - AbciError::BlsErrorOfTenderdashThresholdMechanism( - e, + let g2_element = match ::Signature::from_compressed(&signature) + .into_option() + .ok_or(AbciError::BlsErrorOfTenderdashThresholdMechanism( + BlsError::InvalidSignature, "verification of a commit signature".to_string(), - ) - }) { + )) { Ok(signature) => signature, Err(e) => return ValidationResult::new_with_error(e), }; + let signature = Signature::Basic(g2_element); + //todo: maybe cache this to lower the chance of a hashing based attack (forcing the // same calculation each time) let quorum_hash = &self.inner.quorum_hash[..] @@ -120,11 +124,11 @@ impl CommitV0 { Err(e) => return ValidationResult::new_with_error(e), }; - match public_key.verify(&signature, &hash) { - true => ValidationResult::default(), - false => ValidationResult::new_with_error(AbciError::BadCommitSignature(format!( + match signature.verify(&public_key, &hash) { + Ok(_) => ValidationResult::default(), + Err(_) => ValidationResult::new_with_error(AbciError::BadCommitSignature(format!( "commit signature {} is wrong", - hex::encode(signature.to_bytes().as_slice()) + signature ))), } } @@ -184,7 +188,7 @@ mod test { }; let pubkey = hex::decode("8d63d603fe858be4d7c14a8f308936bd3447c1f361148ad508a04df92f48cd3b2f2b374ef5d1ee8a75f5aeda2f6f3418").unwrap(); - let pubkey = PublicKey::from_bytes(pubkey.as_slice()).unwrap(); + let pubkey = PublicKey::try_from(pubkey.as_slice()).unwrap(); let signature = hex::decode("b95efd51c69a0baf09b130871e735b49cb1b9a0d566bc7ba8fd0fa149dbd28539ab3df435e87ed2a83c94ea714bc8e120504b1cba9363b32c3d58499ed85ecf14539e8e99329fa7952420e4ad9da80b3b28388d62be00770988e4aee705da830").unwrap(); let commit = CommitV0::new_from_cleaned( diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index d1c2ccd4640..66ab8d427bc 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -1,3 +1,5 @@ +mod old_structures; + use crate::error::execution::ExecutionError; use crate::error::Error; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; @@ -143,7 +145,7 @@ pub struct PlatformStateForSavingV0 { /// The validator set quorums are a subset of the quorums, but they also contain the list of /// all members #[bincode(with_serde)] - pub validator_sets: Vec<(Bytes32, ValidatorSet)>, + pub validator_sets: Vec<(Bytes32, old_structures::ValidatorSet)>, /// The quorums used for validating chain locks pub chain_lock_validating_quorums: SignatureVerificationQuorumSetForSaving, @@ -267,7 +269,7 @@ impl From for PlatformStateV0 { validator_sets: value .validator_sets .into_iter() - .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) + .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v.into())) .collect(), chain_lock_validating_quorums: value.chain_lock_validating_quorums.into(), instant_lock_validating_quorums: value.instant_lock_validating_quorums.into(), diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs new file mode 100644 index 00000000000..d64e1e7723a --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs @@ -0,0 +1,103 @@ +use dpp::bls_signatures::PublicKey; +use dpp::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) enum ValidatorSet { + /// Version 0 + V0(ValidatorSetV0), +} + +impl From for dpp::core_types::validator_set::ValidatorSet { + fn from(value: ValidatorSet) -> Self { + match value { + ValidatorSet::V0(v0) => dpp::core_types::validator_set::ValidatorSet::V0(v0.into()), + } + } +} + +/// The validator set is only slightly different from a quorum as it does not contain non valid +/// members +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) struct ValidatorSetV0 { + /// The quorum hash + pub quorum_hash: QuorumHash, + /// Rotation quorum index is available only for DIP24 quorums + pub quorum_index: Option, + /// Active height + pub core_height: u32, + /// The list of masternodes + pub members: BTreeMap, + /// The threshold quorum public key + pub threshold_public_key: bls_signatures::PublicKey, +} + +impl From for dpp::core_types::validator_set::v0::ValidatorSetV0 { + fn from(value: ValidatorSetV0) -> Self { + let ValidatorSetV0 { + quorum_hash, + quorum_index, + core_height, + members, + threshold_public_key, + } = value; + Self { + quorum_hash, + quorum_index, + core_height, + members: members + .into_iter() + .map(|(pro_tx_hash, validator)| (pro_tx_hash, validator.into())) + .collect(), + threshold_public_key: PublicKey::try_from(threshold_public_key.to_bytes().as_slice()) + .unwrap(), + } + } +} + +/// A validator in the context of a quorum +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) struct ValidatorV0 { + /// The proTxHash + pub pro_tx_hash: ProTxHash, + /// The public key share of this validator for this quorum + pub public_key: Option, + /// The node address + pub node_ip: String, + /// The node id + pub node_id: PubkeyHash, + /// Core port + pub core_port: u16, + /// Http port + pub platform_http_port: u16, + /// Tenderdash port + pub platform_p2p_port: u16, + /// Is the validator banned + pub is_banned: bool, +} + +impl From for dpp::core_types::validator::v0::ValidatorV0 { + fn from(value: ValidatorV0) -> Self { + let ValidatorV0 { + pro_tx_hash, + public_key, + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + } = value; + Self { + pro_tx_hash, + public_key: public_key.map(|pk| PublicKey::try_from(pk.to_bytes().as_slice()).unwrap()), + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs index 8d0eac3c0a3..38c00188ecd 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs @@ -4,6 +4,7 @@ use crate::config::QuorumLikeConfig; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::signature_verification_quorum_set::v0::for_saving::SignatureVerificationQuorumSetForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v1::SignatureVerificationQuorumSetForSavingV1; pub use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ QuorumConfig, QuorumsWithConfig, SelectedQuorumSetIterator, SignatureVerificationQuorumSetV0, SignatureVerificationQuorumSetV0Methods, SIGN_OFFSET, @@ -118,13 +119,15 @@ impl SignatureVerificationQuorumSetV0Methods for SignatureVerificationQuorumSet pub enum SignatureVerificationQuorumSetForSaving { /// Version 0 of the signature verification quorums V0(SignatureVerificationQuorumSetForSavingV0), + /// Version 0 of the signature verification quorums + V1(SignatureVerificationQuorumSetForSavingV1), } impl From for SignatureVerificationQuorumSetForSaving { fn from(value: SignatureVerificationQuorumSet) -> Self { match value { SignatureVerificationQuorumSet::V0(v0) => { - SignatureVerificationQuorumSetForSaving::V0(v0.into()) + SignatureVerificationQuorumSetForSaving::V1(v0.into()) } } } @@ -136,6 +139,9 @@ impl From for SignatureVerificationQuor SignatureVerificationQuorumSetForSaving::V0(v0) => { SignatureVerificationQuorumSet::V0(v0.into()) } + SignatureVerificationQuorumSetForSaving::V1(v1) => { + SignatureVerificationQuorumSet::V0(v1.into()) + } } } } diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs index a1ce283885a..1c6a07db91f 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs @@ -3,7 +3,7 @@ use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ }; use crate::platform_types::signature_verification_quorum_set::{ Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, - ThresholdBlsPublicKey, VerificationQuorum, + VerificationQuorum, }; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::QuorumHash; @@ -135,7 +135,7 @@ impl From for PreviousPastQuorumsV0 { pub struct QuorumForSavingV0 { hash: Bytes32, #[bincode(with_serde)] - public_key: ThresholdBlsPublicKey, + public_key: bls_signatures::PublicKey, index: Option, } @@ -145,7 +145,10 @@ impl From> for Quorums { ( QuorumHash::from_byte_array(quorum.hash.to_buffer()), VerificationQuorum { - public_key: quorum.public_key, + public_key: dpp::bls_signatures::PublicKey::try_from( + quorum.public_key.to_bytes().as_slice(), + ) + .expect("expected to convert between BLS key libraries (from chia)"), index: quorum.index, }, ) @@ -159,7 +162,10 @@ impl Into> for Quorums { self.into_iter() .map(|(hash, quorum)| QuorumForSavingV0 { hash: Bytes32::from(hash.as_byte_array()), - public_key: quorum.public_key, + public_key: bls_signatures::PublicKey::from_bytes( + &quorum.public_key.0.to_compressed(), + ) + .expect("expected to convert between BLS key libraries (to chia)"), index: quorum.index, }) .collect() diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs new file mode 100644 index 00000000000..c7e9bbaf105 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs @@ -0,0 +1,93 @@ +use crate::platform_types::signature_verification_quorum_set::v0::for_saving::{ + PreviousPastQuorumsForSavingV0, QuorumConfigForSavingV0, +}; +use crate::platform_types::signature_verification_quorum_set::{ + Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, + ThresholdBlsPublicKey, VerificationQuorum, +}; +use dashcore_rpc::dashcore::hashes::Hash; +use dashcore_rpc::dashcore::QuorumHash; +use dpp::bls_signatures::Bls12381G2Impl; +use dpp::identity::state_transition::asset_lock_proof::Encode; +use dpp::platform_serialization::de::Decode; +use dpp::platform_value::Bytes32; + +#[derive(Debug, Clone, Encode, Decode)] +pub struct SignatureVerificationQuorumSetForSavingV1 { + config: QuorumConfigForSavingV0, + current_quorums: Vec, + previous_quorums: Option, +} + +impl From for SignatureVerificationQuorumSetForSaving { + fn from(value: SignatureVerificationQuorumSetForSavingV1) -> Self { + SignatureVerificationQuorumSetForSaving::V1(value) + } +} + +impl From for SignatureVerificationQuorumSetForSavingV1 { + fn from(value: SignatureVerificationQuorumSetV0) -> Self { + let SignatureVerificationQuorumSetV0 { + config, + current_quorums, + previous, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous_quorums: previous.map(|previous| previous.into()), + } + } +} + +impl From for SignatureVerificationQuorumSetV0 { + fn from(value: SignatureVerificationQuorumSetForSavingV1) -> Self { + let SignatureVerificationQuorumSetForSavingV1 { + config, + current_quorums, + previous_quorums, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous: previous_quorums.map(|previous| previous.into()), + } + } +} + +#[derive(Debug, Clone, Encode, Decode)] +pub struct QuorumForSavingV1 { + hash: Bytes32, + #[bincode(with_serde)] + public_key: ThresholdBlsPublicKey, + index: Option, +} + +impl From> for Quorums { + fn from(value: Vec) -> Self { + Quorums::from_iter(value.into_iter().map(|quorum| { + ( + QuorumHash::from_byte_array(quorum.hash.to_buffer()), + VerificationQuorum { + public_key: quorum.public_key, + index: quorum.index, + }, + ) + })) + } +} + +#[allow(clippy::from_over_into)] +impl Into> for Quorums { + fn into(self) -> Vec { + self.into_iter() + .map(|(hash, quorum)| QuorumForSavingV1 { + hash: Bytes32::from(hash.as_byte_array()), + public_key: quorum.public_key, + index: quorum.index, + }) + .collect() + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs index e78d6c1c7f4..f38657c29ca 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs @@ -1,3 +1,4 @@ pub mod for_saving; +pub mod for_saving_v1; pub mod quorum_set; pub mod quorums; diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs index 112b877a9b8..7a38272f900 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs @@ -1,13 +1,13 @@ use derive_more::{Deref, DerefMut, From}; -use dpp::bls_signatures::PrivateKey; +use dpp::bls_signatures; +pub use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, SignatureSchemes}; use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::{QuorumHash, Txid}; use std::collections::BTreeMap; use std::convert::TryInto; use std::fmt::Debug; -pub use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; - use crate::error::Error; use crate::platform_types::signature_verification_quorum_set::QuorumConfig; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; @@ -149,17 +149,14 @@ pub struct VerificationQuorum { /// Quorum threshold public key is used to verify /// signatures produced by corresponding quorum - pub public_key: ThresholdBlsPublicKey, + pub public_key: ThresholdBlsPublicKey, } impl Debug for VerificationQuorum { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("VerificationQuorum") .field("index", &self.index) - .field( - "public_key", - &hex::encode(*self.public_key.to_bytes()).to_string(), - ) + .field("public_key", &self.public_key.to_string()) .finish() } } @@ -210,11 +207,21 @@ impl SigningQuorum { let message_digest = sha256d::Hash::from_engine(engine); let private_key = - PrivateKey::from_bytes(&self.private_key, false).map_err(Error::BLSError)?; - - let g2element = private_key.sign(message_digest.as_ref()); - let g2element_bytes = *g2element.to_bytes(); + bls_signatures::SecretKey::::from_be_bytes(&self.private_key) + .into_option() + .ok_or(Error::BLSError( + dpp::bls_signatures::BlsError::DeserializationError( + "Could not deserialize private key".to_string(), + ), + ))?; + + let signature = private_key + .sign( + SignatureSchemes::Basic, + message_digest.as_byte_array().as_slice(), + ) + .map_err(Error::BLSError)?; - Ok(BLSSignature::from(g2element_bytes)) + Ok(BLSSignature::from(signature.as_raw_value().to_compressed())) } } diff --git a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs index 433fe506bf6..798713b0e00 100644 --- a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs @@ -1,14 +1,14 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use dashcore_rpc::json::{DMNState, MasternodeListItem}; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; pub use dpp::core_types::validator::v0::*; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{ProTxHash, PubkeyHash}; pub(crate) trait NewValidatorIfMasternodeInState { fn new_validator_if_masternode_in_state( pro_tx_hash: ProTxHash, - public_key: Option, + public_key: Option>, state: &PlatformState, ) -> Option; } @@ -17,7 +17,7 @@ impl NewValidatorIfMasternodeInState for ValidatorV0 { /// Makes a validator if the masternode is in the list and is valid fn new_validator_if_masternode_in_state( pro_tx_hash: ProTxHash, - public_key: Option, + public_key: Option>, state: &PlatformState, ) -> Option { let MasternodeListItem { state, .. } = state.hpmn_masternode_list().get(&pro_tx_hash)?; diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index f7141d1ff4b..6ce9f40c0b6 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -55,8 +55,8 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { return Err(Error::Execution(ExecutionError::CorruptedCachedState( format!( "updating validator set doesn't match threshold public key ours: {} theirs: {}", - hex::encode(*self.threshold_public_key.to_bytes()), - hex::encode(*rhs.threshold_public_key.to_bytes()) + hex::encode(self.threshold_public_key.0.to_compressed()), + hex::encode(rhs.threshold_public_key.0.to_compressed()) ), ))); } @@ -99,7 +99,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(Ok(abci::ValidatorUpdate { pub_key: public_key.clone().map(|public_key| { crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + public_key.0.to_compressed().to_vec(), + )), } }), power: 100, @@ -131,7 +133,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(Ok(abci::ValidatorUpdate { pub_key: public_key.clone().map(|public_key| { crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + public_key.0.to_compressed().to_vec(), + )), } }), power: 100, @@ -148,7 +152,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Ok(ValidatorSetUpdate { validator_updates, threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(self.threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + self.threshold_public_key.0.to_compressed().to_vec(), + )), }), quorum_hash: self.quorum_hash.to_byte_array().to_vec(), }) @@ -186,7 +192,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { ); Some(abci::ValidatorUpdate { pub_key: public_key.as_ref().map(|public_key| crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381(public_key.0.to_compressed().to_vec())), }), power: 100, pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), @@ -195,7 +201,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect(), threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381(threshold_public_key.0.to_compressed().to_vec())), }), quorum_hash: quorum_hash.to_byte_array().to_vec(), } @@ -233,7 +239,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(abci::ValidatorUpdate { pub_key: public_key.map(|public_key| crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381(public_key.0.to_compressed().to_vec())), }), power: 100, pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), @@ -242,7 +248,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect(), threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381(threshold_public_key.0.to_compressed().to_vec())), }), quorum_hash: quorum_hash.to_byte_array().to_vec(), } @@ -271,7 +277,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { } let public_key = if let Some(public_key_share) = quorum_member.pub_key_share { - match BlsPublicKey::from_bytes(public_key_share.as_slice()) + match BlsPublicKey::try_from(public_key_share.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse) { Ok(public_key) => Some(public_key), @@ -290,7 +296,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect::, Error>>()?; - let threshold_public_key = BlsPublicKey::from_bytes(quorum_public_key.as_slice()) + let threshold_public_key = BlsPublicKey::try_from(quorum_public_key.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse)?; let optional_quorum_index = if quorum_index == 0 { diff --git a/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs index f512f4b8f09..bf75b0c5225 100644 --- a/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs @@ -40,7 +40,11 @@ impl Platform { quorum_hash: validator_set.quorum_hash().as_byte_array().to_vec(), core_height: validator_set.core_height(), members, - threshold_public_key: validator_set.threshold_public_key().to_bytes().to_vec(), + threshold_public_key: validator_set + .threshold_public_key() + .0 + .to_compressed() + .to_vec(), } }) .collect(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 777dc361a29..d02a11e9500 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -20,7 +20,7 @@ use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use dashcore_rpc::json::{ExtendedQuorumListResult, SoftforkInfo}; -use dpp::bls_signatures::PrivateKey; +use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey, SignatureSchemes}; use dpp::dashcore::consensus::Encodable; use dpp::dashcore::hashes::{sha256d, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; @@ -352,7 +352,7 @@ pub(crate) fn run_chain_for_strategy<'a>( instant_lock_quorums_infos .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -379,7 +379,7 @@ pub(crate) fn run_chain_for_strategy<'a>( let signing_quorums = validator_quorums .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -653,7 +653,7 @@ pub(crate) fn run_chain_for_strategy<'a>( let chain_lock_quorums_private_keys: BTreeMap = chain_lock_quorums .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -728,13 +728,18 @@ pub(crate) fn run_chain_for_strategy<'a>( let message_digest = sha256d::Hash::from_engine(engine); let quorum_private_key = - PrivateKey::from_bytes(quorum_private_key.as_slice(), false) + BlsPrivateKey::::from_be_bytes(quorum_private_key) .expect("expected to have a valid private key"); - let signature = quorum_private_key.sign(message_digest.as_byte_array()); + let signature = quorum_private_key + .sign( + SignatureSchemes::Basic, + message_digest.as_byte_array().as_slice(), + ) + .expect("expected to sign"); let chain_lock = ChainLock { block_height, block_hash: BlockHash::from_byte_array(*block_hash), - signature: (*signature.to_bytes()).into(), + signature: signature.as_raw_value().to_compressed().into(), }; Ok(chain_lock) @@ -847,7 +852,9 @@ pub(crate) fn start_chain_for_strategy( .map( |validator_in_quorum| tenderdash_abci::proto::abci::ValidatorUpdate { pub_key: Some(tenderdash_abci::proto::crypto::PublicKey { - sum: Some(Bls12381(validator_in_quorum.public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + validator_in_quorum.public_key.0.to_compressed().to_vec(), + )), }), power: 100, pro_tx_hash: validator_in_quorum.pro_tx_hash.to_byte_array().to_vec(), @@ -857,7 +864,11 @@ pub(crate) fn start_chain_for_strategy( .collect(), threshold_public_key: Some(tenderdash_abci::proto::crypto::PublicKey { sum: Some(Bls12381( - current_quorum_with_test_info.public_key.to_bytes().to_vec(), + current_quorum_with_test_info + .public_key + .0 + .to_compressed() + .to_vec(), )), }), quorum_hash: current_validator_quorum_hash.to_byte_array().to_vec(), diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 2312241cc64..3df889c469d 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -3,7 +3,7 @@ extern crate core; -use dpp::bls_signatures::PrivateKey as BlsPrivateKey; +use dpp::bls_signatures::SecretKey as BlsPrivateKey; use drive_abci::test::helpers::setup::TestPlatformBuilder; use drive_abci::{config::PlatformConfig, test::helpers::setup::TempPlatform}; diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs index f89be95ee15..bdd1ecc9111 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs @@ -1,5 +1,6 @@ use crate::BlsPrivateKey; use dashcore_rpc::json::MasternodeListItem; +use dpp::bls_signatures::Bls12381G2Impl; use rand::prelude::IteratorRandom; use rand::rngs::StdRng; use rand::Rng; @@ -32,13 +33,16 @@ impl UpdateMasternodeListItem for MasternodeListItem { 1 => self.state.voting_address = rng.gen::<[u8; 20]>(), 2 => self.state.payout_address = rng.gen::<[u8; 20]>(), 3 => { - let private_key_operator = BlsPrivateKey::generate_dash(rng) - .expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = + private_key_operator.public_key().0.to_compressed().to_vec(); self.state.pub_key_operator = pub_key_operator; } 4 => { @@ -83,13 +87,15 @@ mod tests { let mut rng = StdRng::seed_from_u64(0); let i = 0; let pro_tx_hash = ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()); - let private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Regular, pro_tx_hash, diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs index 51693b5b60f..89a9697d442 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs @@ -2,7 +2,7 @@ use crate::masternode_list_item_helpers::UpdateMasternodeListItem; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash, Txid}; use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeListItem, MasternodeType}; -use dpp::bls_signatures::PrivateKey as BlsPrivateKey; +use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::IdentityPublicKey; use drive_abci::mimic::test_quorum::TestQuorumInfo; @@ -209,13 +209,15 @@ pub fn generate_test_masternodes( } for i in 0..masternode_count { - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let pro_tx_hash = ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Regular, @@ -345,13 +347,15 @@ pub fn generate_test_masternodes( } for i in 0..hpmn_count { - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Evo, pro_tx_hash: ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()), diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index a7b035dfdb2..969a969cbe5 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -5,6 +5,7 @@ use dapi_grpc::platform::v0::{ GetIdentityByPublicKeyHashRequest, Proof, }; use dashcore_rpc::dashcore_rpc_json::QuorumType; +use dpp::bls_signatures::{Bls12381G2Impl, BlsResult}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMethodsV0; @@ -68,7 +69,7 @@ pub struct ProofVerification<'a> { pub signature: &'a [u8; 96], /// Threshold key used to verify the signature - pub public_key: &'a dpp::bls_signatures::PublicKey, + pub public_key: &'a dpp::bls_signatures::PublicKey, } impl<'a> ProofVerification<'a> { @@ -105,7 +106,9 @@ impl<'a> ProofVerification<'a> { Err(e) => return SimpleValidationResult::new_with_error(e.into()), }; // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let signature = match dpp::bls_signatures::Signature::from_bytes(self.signature) { + let signature = match dpp::bls_signatures::Signature::::try_from( + self.signature.as_slice(), + ) { Ok(signature) => signature, Err(e) => { return SimpleValidationResult::new_with_error( @@ -123,14 +126,11 @@ impl<'a> ProofVerification<'a> { verification_context = ?self, "Proof verification" ); - match self.public_key.verify(&signature, &digest) { - true => SimpleValidationResult::default(), - false => { - SimpleValidationResult::new_with_error(AbciError::BadCommitSignature(format!( - "commit signature {} is wrong", - hex::encode(signature.to_bytes().as_slice()) - ))) - } + match signature.verify(self.public_key, &digest) { + Ok(_) => SimpleValidationResult::default(), + Err(e) => SimpleValidationResult::new_with_error(AbciError::BadCommitSignature( + format!("commit signature {} is wrong: {}", signature, e), + )), } } diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index cc7c63c83ef..93e18b7e214 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -249,8 +249,8 @@ impl FromUnproved for CurrentQuorumsInfo quorum_index: None, // Assuming it's not provided here core_height: vs.core_height, members, - threshold_public_key: BlsPublicKey::from_bytes( - &vs.threshold_public_key, + threshold_public_key: BlsPublicKey::try_from( + vs.threshold_public_key.as_slice(), ) .map_err(|_| Error::ProtocolError { error: "Invalid BlsPublicKey format".to_string(), diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 284efb5a894..6015999df2e 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -1,13 +1,13 @@ use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::bls_signatures; +use crate::Error; +use dpp::bls_signatures::{Bls12381G2Impl, Pairing, Signature}; use tenderdash_abci::{ proto::types::{CanonicalVote, SignedMsgType, StateId}, signatures::{Hashable, Signable}, }; -use crate::Error; - use crate::ContextProvider; /// Verify cryptographic proof generated by Tenderdash @@ -92,11 +92,10 @@ pub(crate) fn verify_tenderdash_proof( } })?; - let pubkey = bls_signatures::PublicKey::from_bytes(&pubkey_bytes).map_err(|e| { - Error::InvalidPublicKey { + let pubkey = bls_signatures::PublicKey::::try_from(pubkey_bytes.as_slice()) + .map_err(|e| Error::InvalidPublicKey { error: e.to_string(), - } - })?; + })?; tracing::trace!( ?state_id, @@ -123,18 +122,20 @@ pub(crate) fn verify_tenderdash_proof( pub fn verify_signature_digest( sign_digest: &[u8], signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> Result { if signature == &[0; 96] { return Err(Error::SignatureVerificationError { error: "empty signature".to_string(), }); } - let signature = bls_signatures::Signature::from_bytes(signature).map_err(|e| { - Error::SignatureVerificationError { - error: e.to_string(), - } - })?; + let signature = Signature::Basic( + ::Signature::from_compressed(&signature) + .into_option() + .ok_or(Error::SignatureVerificationError { + error: "Could not verify signature digest".to_string(), + })?, + ); - Ok(public_key.verify(&signature, sign_digest)) + Ok(signature.verify(public_key, sign_digest).is_ok()) } diff --git a/packages/simple-signer/src/signer.rs b/packages/simple-signer/src/signer.rs index 448e1a5c9c3..04a9b325d3a 100644 --- a/packages/simple-signer/src/signer.rs +++ b/packages/simple-signer/src/signer.rs @@ -2,6 +2,7 @@ use base64::prelude::BASE64_STANDARD; use base64::Engine; use dashcore_rpc::dashcore::signer; use dpp::bincode::{Decode, Encode}; +use dpp::bls_signatures::{Bls12381G2Impl, SignatureSchemes}; use dpp::ed25519_dalek::Signer as BlsSigner; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::signer::Signer; @@ -16,9 +17,9 @@ use std::fmt::{Debug, Formatter}; #[derive(Default, Clone, PartialEq, Encode, Decode)] pub struct SimpleSigner { /// Private keys is a map from the public key to the Private key bytes - pub private_keys: BTreeMap>, + pub private_keys: BTreeMap, /// Private keys to be added at the end of a block - pub private_keys_in_creation: BTreeMap>, + pub private_keys_in_creation: BTreeMap, } impl Debug for SimpleSigner { @@ -46,12 +47,12 @@ impl Debug for SimpleSigner { impl SimpleSigner { /// Add a key to the signer - pub fn add_key(&mut self, public_key: IdentityPublicKey, private_key: Vec) { + pub fn add_key(&mut self, public_key: IdentityPublicKey, private_key: [u8; 32]) { self.private_keys.insert(public_key, private_key); } /// Add keys to the signer - pub fn add_keys)>>(&mut self, keys: I) { + pub fn add_keys>(&mut self, keys: I) { self.private_keys.extend(keys) } @@ -81,13 +82,15 @@ impl Signer for SimpleSigner { Ok(signature.to_vec().into()) } KeyType::BLS12_381 => { - let pk = - bls_signatures::PrivateKey::from_bytes(private_key, false).map_err(|_e| { - ProtocolError::Generic( - "bls private key from bytes isn't correct".to_string(), - ) - })?; - Ok(pk.sign(data).to_bytes().to_vec().into()) + let pk = bls_signatures::SecretKey::::from_be_bytes(private_key) + .into_option() + .ok_or(ProtocolError::Generic( + "bls private key from bytes isn't correct".to_string(), + ))?; + let signature = pk + .sign(SignatureSchemes::Basic, data) + .map_err(|e| ProtocolError::Generic(format!("unable to sign {}", e)))?; + Ok(signature.as_raw_value().to_compressed().to_vec().into()) } KeyType::EDDSA_25519_HASH160 => { let key: [u8; 32] = private_key.clone().try_into().expect("expected 32 bytes"); From 91cbe4aac794115dae0ec58256403f5c52f1239d Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 19 Oct 2024 16:51:14 +0700 Subject: [PATCH 02/30] more work --- Cargo.lock | 28 ++++++----- packages/rs-dpp/Cargo.toml | 5 +- packages/rs-dpp/src/bls/native_bls.rs | 46 +++++++++++------ .../rs-dpp/src/core_types/validator/mod.rs | 3 +- .../rs-dpp/src/core_types/validator/v0/mod.rs | 5 +- .../src/core_types/validator_set/mod.rs | 3 +- .../src/core_types/validator_set/v0/mod.rs | 4 +- packages/rs-dpp/src/errors/protocol_error.rs | 5 ++ .../identity/identity_public_key/key_type.rs | 50 ++++++++----------- .../identity_public_key/v0/methods/mod.rs | 28 ++++++----- packages/rs-dpp/src/lib.rs | 4 +- packages/rs-dpp/src/signing.rs | 45 ++++++++++------- packages/rs-drive-abci/Cargo.toml | 7 ++- .../platform_types/platform_state/v0/mod.rs | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 16 files changed, 134 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e1f0972af41..33c7c23bd93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1230,14 +1230,14 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.32.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +version = "0.33.1" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" dependencies = [ "anyhow", "bech32", "bitflags 2.6.0", - "bls-signatures", - "dashcore-private", + "blsful", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", "dashcore_hashes", "ed25519-dalek", "hex", @@ -1255,12 +1255,17 @@ name = "dashcore-private" version = "0.1.0" source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +[[package]] +name = "dashcore-private" +version = "0.1.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" + [[package]] name = "dashcore-rpc" -version = "0.15.8" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" +version = "0.15.9" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" dependencies = [ - "dashcore-private", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.32.0)", "dashcore-rpc-json", "env_logger 0.10.2", "hex", @@ -1272,8 +1277,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.8" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" +version = "0.15.9" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" dependencies = [ "bincode", "dashcore", @@ -1287,9 +1292,9 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" dependencies = [ - "dashcore-private", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", "secp256k1", "serde", ] @@ -1454,7 +1459,6 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", - "blsful", "bs58", "byteorder", "chrono", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index c11255e4b22..57d27c9600c 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -22,14 +22,13 @@ chrono = { version = "0.4.35", default-features = false, features = [ "clock", ] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } -blsful = { version = "3.0.0-pre6" , optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "std", "secp-recovery", "rand", "signer", "serde" -], default-features = false, tag = "0.32.0" } +], default-features = false, tag = "0.33.1" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } @@ -74,7 +73,7 @@ once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] -bls-signatures = ["dashcore/bls", "blsful"] +bls-signatures = ["dashcore/bls"] ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", diff --git a/packages/rs-dpp/src/bls/native_bls.rs b/packages/rs-dpp/src/bls/native_bls.rs index 5dc7e2bc828..e8e1fd939fc 100644 --- a/packages/rs-dpp/src/bls/native_bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -1,12 +1,14 @@ +use crate::bls_signatures::{ + Bls12381G2Impl, Pairing, PublicKey, SecretKey, Signature, SignatureSchemes, +}; use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; use anyhow::anyhow; -use dashcore::bls_signatures::{self, PrivateKey, PublicKey}; #[derive(Default)] pub struct NativeBlsModule; impl BlsModule for NativeBlsModule { fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError> { - match PublicKey::from_bytes(pk) { + match PublicKey::::try_from(pk) { Ok(_) => Ok(()), Err(e) => Err(PublicKeyValidationError::new(e.to_string())), } @@ -18,13 +20,21 @@ impl BlsModule for NativeBlsModule { data: &[u8], public_key: &[u8], ) -> Result { - let public_key = PublicKey::from_bytes(public_key).map_err(anyhow::Error::msg)?; - let signature = - bls_signatures::Signature::from_bytes(signature).map_err(anyhow::Error::msg)?; - match public_key.verify(&signature, data) { - true => Ok(true), - // TODO change to specific error type - false => Err(anyhow!("Verification failed").into()), + let public_key = + PublicKey::::try_from(public_key).map_err(anyhow::Error::msg)?; + let signature_96_bytes = signature + .try_into() + .map_err(|_| anyhow!("signature wrong size"))?; + let g2_element = + ::Signature::from_compressed(&signature_96_bytes) + .into_option() + .ok_or(anyhow!("signature derivation failed"))?; + + let signature = Signature::Basic(g2_element); + + match signature.verify(&public_key, data) { + Ok(_) => Ok(true), + Err(_) => Err(anyhow!("Verification failed").into()), } } @@ -32,9 +42,11 @@ impl BlsModule for NativeBlsModule { let fixed_len_key: [u8; 32] = private_key .try_into() .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; - let pk = PrivateKey::from_bytes(&fixed_len_key, false).map_err(anyhow::Error::msg)?; - let public_key = pk.g1_element().map_err(anyhow::Error::msg)?; - let public_key_bytes = public_key.to_bytes().to_vec(); + let pk = SecretKey::::from_be_bytes(&fixed_len_key) + .into_option() + .ok_or(anyhow!("Incorrect Priv Key"))?; + let public_key = pk.public_key(); + let public_key_bytes = public_key.0.to_compressed().to_vec(); Ok(public_key_bytes) } @@ -42,7 +54,13 @@ impl BlsModule for NativeBlsModule { let fixed_len_key: [u8; 32] = private_key .try_into() .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; - let pk = PrivateKey::from_bytes(&fixed_len_key, false).map_err(anyhow::Error::msg)?; - Ok(pk.sign(data).to_bytes().to_vec()) + let pk = SecretKey::::from_be_bytes(&fixed_len_key) + .into_option() + .ok_or(anyhow!("Incorrect Priv Key"))?; + Ok(pk + .sign(SignatureSchemes::Basic, data)? + .as_raw_value() + .to_compressed() + .to_vec()) } } diff --git a/packages/rs-dpp/src/core_types/validator/mod.rs b/packages/rs-dpp/src/core_types/validator/mod.rs index d5f985a3c14..01716ab044f 100644 --- a/packages/rs-dpp/src/core_types/validator/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/mod.rs @@ -1,6 +1,5 @@ -use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use crate::core_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; -use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, PubkeyHash}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index 81f73a66af4..fe45fe675da 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -1,8 +1,7 @@ use dashcore::{ProTxHash, PubkeyHash}; use std::fmt::{Debug, Formatter}; -use crate::bls_signatures::PublicKey as BlsPublicKey; -use blsful::Bls12381G2Impl; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -261,7 +260,7 @@ impl ValidatorV0Setters for ValidatorV0 { mod tests { use super::*; use bincode::config; - use blsful::SecretKey; + use dashcore::blsful::SecretKey; use rand::prelude::StdRng; use rand::SeedableRng; diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs index de5b515f9f7..0d56edbc6c5 100644 --- a/packages/rs-dpp/src/core_types/validator_set/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -1,4 +1,4 @@ -use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use crate::core_types::validator::v0::ValidatorV0; use crate::core_types::validator_set::v0::{ ValidatorSetV0, ValidatorSetV0Getters, ValidatorSetV0Setters, @@ -7,7 +7,6 @@ use crate::core_types::validator_set::v0::{ use crate::ProtocolError; #[cfg(feature = "core-types-serialization")] use bincode::{Decode, Encode}; -use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, QuorumHash}; #[cfg(feature = "core-types-serialization")] use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index cf05bb3d149..d500fb04269 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -8,7 +8,7 @@ use bincode::enc::Encoder; use bincode::error::EncodeError; #[cfg(feature = "core-types-serialization")] use bincode::{BorrowDecode, Decode, Encode}; -use blsful::Bls12381G2Impl; +use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::{ProTxHash, QuorumHash}; use itertools::Itertools; @@ -289,7 +289,7 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { mod tests { use super::*; use bincode::config; - use blsful::SecretKey; + use dashcore::blsful::SecretKey; use dashcore::PubkeyHash; use rand::rngs::StdRng; use rand::SeedableRng; diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 2164b339f19..99e83ba64b7 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -1,3 +1,4 @@ +use dashcore::blsful::BlsError; use thiserror::Error; use crate::consensus::basic::state_transition::InvalidStateTransitionTypeError; @@ -247,6 +248,10 @@ pub enum ProtocolError { /// Invalid CBOR error #[error("invalid cbor error: {0}")] InvalidCBOR(String), + + /// Invalid CBOR error + #[error(transparent)] + BlsError(#[from] BlsError), } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index a1ead4a7253..e91cc6c3c39 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -8,14 +8,14 @@ use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; use dashcore::secp256k1::Secp256k1; -use dashcore::{bls_signatures, ed25519_dalek, Network}; +use dashcore::{blsful, ed25519_dalek, Network}; use itertools::Itertools; use lazy_static::lazy_static; +use crate::bls_signatures::{Bls12381G2Impl, BlsError}; use crate::fee::Credits; use crate::version::PlatformVersion; -use crate::{InvalidVectorSizeError, ProtocolError}; -use blsful::Bls12381G2Impl; +use crate::{bls_signatures, ProtocolError}; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -166,13 +166,8 @@ impl KeyType { private_key.public_key(&secp).to_bytes() } KeyType::BLS12_381 => { - let private_key = bls_signatures::PrivateKey::generate_dash(rng) - .expect("expected to generate a bls private key"); // we assume this will never error - private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec() + let private_key = bls_signatures::SecretKey::::random(rng); + private_key.public_key().0.to_compressed().to_vec() } KeyType::ECDSA_HASH160 | KeyType::BIP13_SCRIPT_HASH | KeyType::EDDSA_25519_HASH160 => { (0..self.default_size()).map(|_| rng.gen::()).collect() @@ -205,13 +200,13 @@ impl KeyType { /// Gets the public key data for a private key depending on the key type pub fn public_key_data_from_private_key_data( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result, ProtocolError> { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); - let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + let secret_key = dashcore::secp256k1::SecretKey::from_byte_array(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -220,14 +215,18 @@ impl KeyType { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key = - bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) - .map_err(|e| ProtocolError::Generic(e.to_string()))?; - let public_key_bytes = private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec(); + let private_key: Option> = + bls_signatures::SecretKey::::from_be_bytes( + private_key_bytes, + ) + .into(); + if private_key.is_none() { + return Err(ProtocolError::BlsError(BlsError::DeserializationError( + "private key bytes not a valid secret key".to_string(), + ))); + } + let private_key = private_key.expect("expected private key"); + let public_key_bytes = private_key.public_key().0.to_compressed().to_vec(); Ok(public_key_bytes) } #[cfg(not(feature = "bls-signatures"))] @@ -237,7 +236,7 @@ impl KeyType { } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); - let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + let secret_key = dashcore::secp256k1::SecretKey::from_byte_array(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -246,14 +245,7 @@ impl KeyType { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let key_pair = ed25519_dalek::SigningKey::from_bytes( - &private_key_bytes.try_into().map_err(|_| { - ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( - 32, - private_key_bytes.len(), - )) - })?, - ); + let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) } #[cfg(not(feature = "ed25519-dalek"))] diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 4b64fe9f16a..52357e89a2f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -2,9 +2,9 @@ use crate::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMe use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; -use crate::ProtocolError; +use crate::{bls_signatures, ProtocolError}; use anyhow::anyhow; -use blsful::Bls12381G2Impl; +use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; @@ -68,9 +68,11 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key: Option> = - blsful::SecretKey::::from_be_bytes(private_key_bytes) - .into(); + let private_key: Option> = + bls_signatures::SecretKey::::from_be_bytes( + private_key_bytes, + ) + .into(); if private_key.is_none() { return Ok(false); } @@ -124,7 +126,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { mod tests { use super::*; use crate::identity::{Purpose, SecurityLevel}; - use blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; + use dashcore::blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; use dashcore::Network; use dpp::version::PlatformVersion; use rand::rngs::StdRng; @@ -136,9 +138,10 @@ mod tests { let (public_key_data, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = - blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) - .expect("expected to get secret key"); + let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( + &secret_key.try_into().unwrap(), + ) + .expect("expected to get secret key"); let public_key = decoded_secret_key.public_key(); let decoded_public_key_data = public_key.0.to_compressed(); assert_eq!( @@ -153,9 +156,10 @@ mod tests { let (_, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = - blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) - .expect("expected to get secret key"); + let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( + &secret_key.try_into().unwrap(), + ) + .expect("expected to get secret key"); let signature = decoded_secret_key .sign(SignatureSchemes::Basic, b"hello") .expect("expected to sign"); diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 9744e164551..3ac800e8273 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -89,8 +89,8 @@ pub mod prelude { } pub use bincode; -#[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] -pub use blsful as bls_signatures; +#[cfg(feature = "bls-signatures")] +pub use dashcore::blsful as bls_signatures; #[cfg(feature = "ed25519-dalek")] pub use dashcore::ed25519_dalek; #[cfg(feature = "system_contracts")] diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index d4f69942b6e..336d17e29f7 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -1,3 +1,4 @@ +use crate::bls_signatures::{Bls12381G2Impl, Pairing}; #[cfg(feature = "message-signature-verification")] use crate::consensus::signature::{ BasicBLSError, BasicECDSAError, SignatureError, SignatureShouldNotBePresentError, @@ -8,7 +9,8 @@ use crate::serialization::PlatformMessageSignable; use crate::validation::SimpleConsensusValidationResult; #[cfg(feature = "message-signing")] use crate::{BlsModule, ProtocolError}; -use dashcore::{bls_signatures, signer}; +use dashcore::blsful::Signature; +use dashcore::{blsful as bls_signatures, signer}; impl PlatformMessageSignable for &[u8] { #[cfg(feature = "message-signature-verification")] @@ -38,25 +40,34 @@ impl PlatformMessageSignable for &[u8] { } } KeyType::BLS12_381 => { - let public_key = match bls_signatures::PublicKey::from_bytes(public_key_data) { - Ok(public_key) => public_key, - Err(e) => { - // dbg!(format!("bls public_key could not be recovered")); + let public_key = + match bls_signatures::PublicKey::::try_from(public_key_data) { + Ok(public_key) => public_key, + Err(e) => { + // dbg!(format!("bls public_key could not be recovered")); + return SimpleConsensusValidationResult::new_with_error( + SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())) + .into(), + ); + } + }; + let signature_bytes: [u8; 96] = match signature.to_vec().try_into() { + Ok(bytes) => bytes, + Err(_) => { return SimpleConsensusValidationResult::new_with_error( - SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - ); + SignatureError::BasicBLSError(BasicBLSError::new(format!( + "Signature was {} bytes, expected 96 bytes", + signature.len() + ))) + .into(), + ) } }; - let signature = match bls_signatures::Signature::from_bytes(signature) { - Ok(public_key) => public_key, - Err(e) => { - // dbg!(format!("bls signature could not be recovered")); - return SimpleConsensusValidationResult::new_with_error( - SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - ); - } - }; - if !public_key.verify(&signature, signable_data) { + let g2 = ::Signature::from_compressed(&signature_bytes) + .expect("G2 projective"); + let signature = Signature::::Basic(g2); + + if !signature.verify(&public_key, signable_data).is_ok() { SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new( "bls signature was incorrect".to_string(), diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 6fc8d7b6be7..3a92a46df7d 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" @@ -73,10 +73,9 @@ tokio-util = { version = "0.7" } derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" console-subscriber = { version = "0.4", optional = true } -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3", optional = true } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } [dev-dependencies] -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } bs58 = { version = "0.5.0" } base64 = "0.22.1" platform-version = { path = "../rs-platform-version", features = [ @@ -106,7 +105,7 @@ integer-encoding = { version = "4.0.0" } [features] default = ["mocks"] -mocks = ["mockall", "drive/fixtures-and-mocks", "bls-signatures"] +mocks = ["mockall", "drive/fixtures-and-mocks"] console = ["console-subscriber", "tokio/tracing"] testing-config = [] grovedbg = ["drive/grovedbg"] diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 66ab8d427bc..9bb41bf2d67 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -128,7 +128,7 @@ fn hex_encoded_validator_sets(validator_sets: &IndexMap, /// Information about the last block diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index ebf783f6523..b9fed51bae3 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -33,7 +33,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 12bb07870de..a1c06f26ba7 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 7f814ad6bcc667cae1dbb4cc2973d5cd114fb9cc Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 21 Oct 2024 03:46:11 +0700 Subject: [PATCH 03/30] exposed dapi-grpc in sdk --- packages/rs-sdk/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 1f928ab6db9..d6e29c98258 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -76,6 +76,7 @@ pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; +pub use dapi_grpc; pub mod sync; /// Version of the SDK From 4506f9ff3f76dd9635e8e944794e291fd43b8c7a Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 21 Oct 2024 19:59:18 +0700 Subject: [PATCH 04/30] trial --- packages/rs-sdk/src/core/transaction.rs | 95 +++++++++++++------------ 1 file changed, 49 insertions(+), 46 deletions(-) diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index 39dd85e562c..69343e85886 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -68,13 +68,13 @@ impl Sdk { ) -> Result { let transaction_id = transaction.txid(); - let _span = tracing::debug_span!( - "wait_for_asset_lock_proof_for_transaction", - transaction_id = transaction_id.to_string(), - ) - .entered(); - - tracing::debug!("waiting for messages from stream"); + // let _span = tracing::debug_span!( + // "wait_for_asset_lock_proof_for_transaction", + // transaction_id = transaction_id.to_string(), + // ) + // .entered(); + // + // tracing::debug!("waiting for messages from stream"); // Define an inner async block to handle the stream processing. let stream_processing = async { @@ -97,10 +97,10 @@ impl Sdk { instant_send_lock_messages, ), ) => { - tracing::debug!( - "received {} instant lock message(s)", - instant_send_lock_messages.messages.len() - ); + // tracing::debug!( + // "received {} instant lock message(s)", + // instant_send_lock_messages.messages.len() + // ); for instant_lock_bytes in instant_send_lock_messages.messages { let instant_lock = @@ -119,28 +119,29 @@ impl Sdk { output_index: 0, }); - tracing::debug!( - ?asset_lock_proof, - "instant lock is matching to the broadcasted transaction, returning instant asset lock proof" - ); + // tracing::debug!( + // ?asset_lock_proof, + // "instant lock is matching to the broadcasted transaction, returning instant asset lock proof" + // ); return Ok(asset_lock_proof); - } else { - tracing::debug!( - "instant lock is not matching, waiting for the next message" - ); - } + } + // else { + // tracing::debug!( + // "instant lock is not matching, waiting for the next message" + // ); + // } } } Some(transactions_with_proofs_response::Responses::RawMerkleBlock( raw_merkle_block, )) => { - tracing::debug!("received merkle block"); + // tracing::debug!("received merkle block"); let merkle_block = MerkleBlock::consensus_decode(&mut raw_merkle_block.as_slice()) .map_err(|e| { - tracing::error!("can't decode merkle block: {}", e); + // tracing::error!("can't decode merkle block: {}", e); Error::CoreError(e.into()) })?; @@ -152,16 +153,16 @@ impl Sdk { // Continue receiving messages until we find the transaction if !matches.contains(&transaction_id) { - tracing::debug!( - "merkle block doesn't contain the transaction, waiting for the next message" - ); + // tracing::debug!( + // "merkle block doesn't contain the transaction, waiting for the next message" + // ); continue; } - tracing::debug!( - "merkle block contains the transaction, obtaining core chain locked height" - ); + // tracing::debug!( + // "merkle block contains the transaction, obtaining core chain locked height" + // ); // TODO: This a temporary implementation until we have headers stream running in background // so we can always get actual height and chain locks @@ -188,15 +189,15 @@ impl Sdk { break; } - tracing::trace!("the transaction is on height {} but not chainlocked. try again in 1 sec", height); + // tracing::trace!("the transaction is on height {} but not chainlocked. try again in 1 sec", height); sleep(Duration::from_secs(1)).await; } - tracing::debug!( - "the transaction is chainlocked on height {}, waiting platform for reaching the same core height", - core_chain_locked_height - ); + // tracing::debug!( + // "the transaction is chainlocked on height {}, waiting platform for reaching the same core height", + // core_chain_locked_height + // ); // Wait until platform chain is on the block's chain locked height loop { @@ -207,11 +208,11 @@ impl Sdk { break; } - tracing::trace!( - "platform chain locked core height {} but we need {}. try again in 1 sec", - metadata.core_chain_locked_height, - core_chain_locked_height, - ); + // tracing::trace!( + // "platform chain locked core height {} but we need {}. try again in 1 sec", + // metadata.core_chain_locked_height, + // core_chain_locked_height, + // ); sleep(Duration::from_secs(1)).await; } @@ -224,19 +225,21 @@ impl Sdk { }, }); - tracing::debug!( - ?asset_lock_proof, - "merkle block contains the broadcasted transaction, returning chain asset lock proof" - ); + // tracing::debug!( + // ?asset_lock_proof, + // "merkle block contains the broadcasted transaction, returning chain asset lock proof" + // ); return Ok(asset_lock_proof); } Some(transactions_with_proofs_response::Responses::RawTransactions(_)) => { - tracing::trace!("received transaction(s), ignoring") + // tracing::trace!("received transaction(s), ignoring") } - None => tracing::trace!( - "received empty response as a workaround for the bug in tonic, ignoring" - ), + None => { + // tracing::trace!( + // "received empty response as a workaround for the bug in tonic, ignoring" + // ) + }, } } }; From efb43104974d692013cfdeffa4cd43b7c564eb63 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 27 Oct 2024 08:27:16 +0700 Subject: [PATCH 05/30] fix: add pagination support to sdk --- .../rs-sdk/src/platform/document_query.rs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index a6b1f7c7738..c8136cf0f18 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -19,7 +19,7 @@ use dpp::{ document::Document, platform_value::{platform_value, Value}, prelude::{DataContract, Identifier}, - ProtocolError, + InvalidVectorSizeError, ProtocolError, }; use drive::query::{DriveDocumentQuery, InternalClauses, OrderClause, WhereClause, WhereOperator}; use drive_proof_verifier::{types::Documents, ContextProvider, FromProof}; @@ -326,6 +326,26 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> { } else { None }; + + let (start_at, start_at_included) = match request.start.as_ref() { + None => (None, false), + Some(Start::StartAt(at)) => ( + Some(at.clone().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new(32, at.len())) + })?), + true, + ), + Some(Start::StartAfter(after)) => ( + Some(after.clone().try_into().map_err(|_| { + ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( + 32, + after.len(), + )) + })?), + true, + ), + }; + let query = Self { contract: &request.data_contract, document_type, @@ -338,8 +358,8 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> { .into_iter() .map(|v| (v.field.clone(), v)) .collect(), - start_at: None, - start_at_included: false, + start_at, + start_at_included, block_time_ms: None, }; From 08e6e66fbd4e0e33c1a808e75f1021d71296fe83 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 27 Oct 2024 19:13:56 +0700 Subject: [PATCH 06/30] added more unit tests --- .../src/query/document_query/v0/mod.rs | 591 +++++++++++++++++- packages/rs-drive-abci/src/query/mod.rs | 44 +- 2 files changed, 632 insertions(+), 3 deletions(-) diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 8af82e39cc0..445b460cafc 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -180,9 +180,19 @@ impl Platform { #[cfg(test)] mod tests { use super::*; - use crate::query::tests::{assert_invalid_identifier, setup_platform, store_data_contract}; + use crate::query::tests::{ + assert_invalid_identifier, setup_platform, store_data_contract, store_document, + }; + use ciborium::value::Value as CborValue; use dpp::dashcore::Network; + use dpp::data_contract::document_type::random_document::CreateRandomDocument; + use dpp::document::{Document, DocumentV0, DocumentV0Getters}; use dpp::tests::fixtures::get_data_contract_fixture; + use drive::query::{InternalClauses, OrderClause, WhereClause, WhereOperator}; + use indexmap::IndexMap; + use rand::rngs::StdRng; + use rand::SeedableRng; + use std::collections::BTreeMap; #[test] fn test_invalid_document_id() { @@ -479,4 +489,583 @@ mod tests { }) )); } + + #[test] + fn test_documents_single_item_proof() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let random_document = document_type + .random_document(Some(4), platform_version) + .expect("expected to get random document"); + + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(1), + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 1, + order_by: vec![], + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(documents.len(), 1); + assert_eq!(documents.get(0).expect("first"), &random_document); + } + + #[test] + fn test_documents_range_proof() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + for _i in 0..20 { + let random_document = document_type + .random_document_with_rng(&mut std_rng, platform_version) + .expect("expected to get random document"); + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(10), + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 10, + order_by: vec![], + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("first"), + documents_by_id + .values() + .nth(9) + .expect("expected to get 9th document") + ); + } + + #[test] + fn test_documents_start_after_proof_primary_index() { + let (platform, state, version) = setup_platform(None, Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let created_data_contract = get_data_contract_fixture(None, 0, version.protocol_version); + store_data_contract(&platform, created_data_contract.data_contract(), version); + + let data_contract_id = created_data_contract.data_contract().id(); + let document_type_name = "niceDocument"; + let document_type = created_data_contract + .data_contract() + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + for _i in 0..20 { + let random_document = document_type + .random_document_with_rng(&mut std_rng, platform_version) + .expect("expected to get random document"); + store_document( + &platform, + created_data_contract.data_contract(), + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let after = documents_by_id + .keys() + .nth(9) + .expect("expected to get 9th document") + .to_buffer(); + + let drive_document_query = DriveDocumentQuery { + contract: &created_data_contract.data_contract(), + document_type, + internal_clauses: Default::default(), + offset: None, + limit: Some(10), + order_by: Default::default(), + start_at: Some(after), + start_at_included: false, + block_time_ms: None, + }; + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: vec![], + limit: 10, + order_by: vec![], + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("last"), + documents_by_id + .values() + .nth(19) + .expect("expected to get 9th document") + ); + } + + fn serialize_vec_to_cbor>(input: Vec) -> Result, Error> { + let values = Value::Array( + input + .into_iter() + .map(|v| v.into() as Value) + .collect::>(), + ); + + let cbor_values: CborValue = TryInto::::try_into(values) + .map_err(|e| Error::Protocol(dpp::ProtocolError::EncodingError(e.to_string())))?; + + let mut serialized = Vec::new(); + ciborium::ser::into_writer(&cbor_values, &mut serialized) + .map_err(|e| Error::Protocol(dpp::ProtocolError::EncodingError(e.to_string())))?; + + Ok(serialized) + } + + #[test] + fn test_documents_start_after_proof_secondary_index() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(0)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "status".to_string(), + WhereClause { + field: "status".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(10), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let where_clauses = serialize_vec_to_cbor( + drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(), + ) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses, + limit: 10, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 10); + assert_eq!( + queried_documents.get(9).expect("last"), + documents_by_created_at + .values() + .nth(19) + .expect("expected to get 9th document") + ); + } + + #[test] + fn test_documents_start_after_proof_secondary_index_many_statuses() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "status".to_string(), + WhereClause { + field: "status".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let where_clauses = serialize_vec_to_cbor( + drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(), + ) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 2); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } } diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index a7d58c7358d..6be97cc1cfa 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -32,9 +32,15 @@ pub(crate) mod tests { use crate::config::PlatformConfig; use dpp::dashcore::Network; + use dpp::data_contract::document_type::DocumentTypeRef; + use dpp::document::Document; use dpp::prelude::{CoreBlockHeight, TimestampMillis}; - use drive::util::batch::DataContractOperationType; - use drive::util::batch::DriveOperation::DataContractOperation; + use drive::util::batch::DriveOperation::{DataContractOperation, DocumentOperation}; + use drive::util::batch::{DataContractOperationType, DocumentOperationType}; + use drive::util::object_size_info::{ + DataContractInfo, DocumentInfo, DocumentTypeInfo, OwnedDocumentInfo, + }; + use drive::util::storage_flags::StorageFlags; use platform_version::version::{PlatformVersion, ProtocolVersion}; use std::borrow::Cow; use std::sync::Arc; @@ -108,6 +114,40 @@ pub(crate) mod tests { .expect("expected to apply drive operations"); } + pub fn store_document( + platform: &Platform, + data_contract: &DataContract, + document_type: DocumentTypeRef, + document: &Document, + platform_version: &PlatformVersion, + ) { + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + let operation = DocumentOperation(DocumentOperationType::AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentInfo::DocumentRefInfo((document, storage_flags)), + owner_id: None, + }, + contract_info: DataContractInfo::BorrowedDataContract(data_contract), + document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), + override_document: false, + }); + + let block_info = BlockInfo::genesis(); + + platform + .drive + .apply_drive_operations( + vec![operation], + true, + &block_info, + None, + platform_version, + None, + ) + .expect("expected to apply drive operations"); + } + pub fn assert_invalid_identifier( validation_result: QueryValidationResult, ) { From 12373185369b5919c415f09f5b8be4d0c7b72966 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sun, 27 Oct 2024 19:19:28 +0700 Subject: [PATCH 07/30] temp --- .../src/verify/document/verify_proof_keep_serialized/v0/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs index dc362c7ead9..13999253752 100644 --- a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs +++ b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs @@ -39,6 +39,7 @@ impl<'a> DriveDocumentQuery<'a> { } else { self.construct_path_query(None, platform_version) }?; + println!("path query is {}", path_query); let (root_hash, proved_key_values) = if self.start_at.is_some() { GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? } else { From 7c77c400a546b40b88c2a31a9913dcc8075b87b3 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 28 Oct 2024 05:42:56 +0700 Subject: [PATCH 08/30] more fixes --- .../src/query/document_query/v0/mod.rs | 507 ++++++++++++++++++ packages/rs-drive/src/query/mod.rs | 169 +++++- .../verify_proof_keep_serialized/v0/mod.rs | 1 + packages/rs-drive/tests/query_tests.rs | 6 +- .../contract/withdrawals/withdrawals.json | 141 +++++ 5 files changed, 814 insertions(+), 10 deletions(-) create mode 100644 packages/rs-drive/tests/supporting_files/contract/withdrawals/withdrawals.json diff --git a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs index 445b460cafc..b725855ec15 100644 --- a/packages/rs-drive-abci/src/query/document_query/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/document_query/v0/mod.rs @@ -131,6 +131,8 @@ impl Platform { &self.config.drive, )); + println!("{:?}", drive_query); + let response = if prove { let proof = match drive_query.execute_with_proof(&self.drive, None, None, platform_version) { @@ -183,6 +185,7 @@ mod tests { use crate::query::tests::{ assert_invalid_identifier, setup_platform, store_data_contract, store_document, }; + use assert_matches::assert_matches; use ciborium::value::Value as CborValue; use dpp::dashcore::Network; use dpp::data_contract::document_type::random_document::CreateRandomDocument; @@ -1068,4 +1071,508 @@ mod tests { .expect("expected to get 2nd document") ); } + + #[test] + fn test_documents_proof_secondary_index_in_query() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_id = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_id.insert(random_document.id(), random_document); + } + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: None, + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 3); + } + + #[test] + fn test_documents_start_after_proof_secondary_index_in_query() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(4) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 3); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } + + //todo: this should be possible + #[test] + #[ignore] + fn test_documents_start_after_proof_secondary_index_in_query_2() { + let (platform, state, version) = setup_platform(Some((1, 1)), Network::Testnet, None); + + let platform_version = PlatformVersion::latest(); + let withdrawals = platform + .drive + .cache + .system_data_contracts + .load_withdrawals(); + + let data_contract_id = withdrawals.id(); + let document_type_name = "withdrawal"; + let document_type = withdrawals + .document_type_for_name(document_type_name) + .expect("expected document type"); + + let mut std_rng = StdRng::seed_from_u64(393); + let mut documents_by_created_at = BTreeMap::new(); + + // Define the base time as the current system time + let base_time = 1730028481000; + + for i in 0..20 { + let created_at = base_time + i * 20000; + // Create a Document with the desired properties + let random_document: Document = DocumentV0 { + id: Identifier::random_with_rng(&mut std_rng), + owner_id: Identifier::random_with_rng(&mut std_rng), + properties: { + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::I64(i as i64 % 4)); // Always queued + properties.insert("pooling".to_string(), Value::I64(0)); // Always 0 + properties.insert("coreFeePerByte".to_string(), Value::I64(1)); // Always 1 + properties.insert("amount".to_string(), Value::I64(1000)); // Set a minimum amount of 1000 + properties.insert("outputScript".to_string(), Value::Bytes(vec![])); // Set an empty output script + properties + }, + revision: Some(1), // Example revision + created_at: Some(created_at), // Set created_at + updated_at: Some(created_at), // Set updated_at + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + store_document( + &platform, + &withdrawals, + document_type, + &random_document, + platform_version, + ); + documents_by_created_at.insert(created_at, random_document); + } + + let after = documents_by_created_at + .values() + .nth(9) + .expect("expected to get 9th document") + .id(); + + let drive_document_query = DriveDocumentQuery { + contract: &withdrawals, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::I64(0), + Value::I64(1), + Value::I64(2), + Value::I64(3), + Value::I64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::from([ + ( + "pooling".to_string(), + WhereClause { + field: "pooling".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(0), + }, + ), + ( + "coreFeePerByte".to_string(), + WhereClause { + field: "coreFeePerByte".to_string(), + operator: WhereOperator::Equal, + value: Value::I64(1), + }, + ), + ]), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([( + "$updatedAt".to_string(), + OrderClause { + field: "$updatedAt".to_string(), + ascending: true, + }, + )]), + start_at: Some(after.to_buffer()), + start_at_included: false, + block_time_ms: None, + }; + + let mut where_clauses: Vec<_> = drive_document_query + .internal_clauses + .equal_clauses + .values() + .cloned() + .collect(); + + where_clauses.insert( + 0, + drive_document_query + .internal_clauses + .in_clause + .clone() + .unwrap(), + ); + + let where_clauses_serialized = serialize_vec_to_cbor(where_clauses) + .expect("where clauses serialization should never fail"); + let order_by = + serialize_vec_to_cbor(drive_document_query.order_by.values().cloned().collect()) + .expect("order by clauses serialization should never fail"); + + let request = GetDocumentsRequestV0 { + data_contract_id: data_contract_id.to_vec(), + document_type: document_type_name.to_string(), + r#where: where_clauses_serialized, + limit: 3, + order_by, + prove: true, + start: Some(Start::StartAfter(after.to_vec())), + }; + + let result = platform + .query_documents_v0(request, &state, version) + .expect("expected query to succeed"); + + assert!(result.errors.is_empty(), "errors are {:?}", result.errors); + + let Some(GetDocumentsResponseV0 { + result: Some(get_documents_response_v0::Result::Proof(proof)), + metadata: Some(_), + }) = result.data + else { + panic!("expected proof") + }; + + let (_, queried_documents) = drive_document_query + .verify_proof(&proof.grovedb_proof, platform_version) + .expect("expected to verify proof"); + + assert_eq!(queried_documents.len(), 2); + assert_eq!( + queried_documents.get(1).expect("last"), + documents_by_created_at + .values() + .nth(16) + .expect("expected to get 2nd document") + ); + } } diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index 1d7cf24371f..393883856f2 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -1275,23 +1275,39 @@ impl<'a> DriveDocumentQuery<'a> { #[cfg(any(feature = "server", feature = "verify"))] /// Returns a `Query` that either starts at or after the given key. fn inner_query_starts_from_key( - start_at_key: Vec, + start_at_key: Option>, left_to_right: bool, included: bool, ) -> Query { // We only need items after the start at document let mut inner_query = Query::new_with_direction(left_to_right); + if left_to_right { - if included { - inner_query.insert_range_from(start_at_key..); + if let Some(start_at_key) = start_at_key { + if included { + inner_query.insert_range_from(start_at_key..); + } else { + inner_query.insert_range_after(start_at_key..); + } } else { - inner_query.insert_range_after(start_at_key..); + inner_query.insert_all(); } } else if included { - inner_query.insert_range_to_inclusive(..=start_at_key); + if let Some(start_at_key) = start_at_key { + inner_query.insert_range_to_inclusive(..=start_at_key); + } else { + inner_query.insert_key(vec![]); + } } else { - inner_query.insert_range_to(..start_at_key); + if let Some(start_at_key) = start_at_key { + inner_query.insert_range_to(..start_at_key); + } else { + //todo: really not sure if this is correct + // Should investigate more + inner_query.insert_key(vec![]); + } } + inner_query } @@ -1434,11 +1450,11 @@ impl<'a> DriveDocumentQuery<'a> { platform_version, ) .ok() - .flatten() - .unwrap_or_default(); + .flatten(); // We should always include if we have left_over - let non_conditional_included = !left_over.is_empty() | *included; + let non_conditional_included = + !left_over.is_empty() | *included | start_at_key.is_none(); let mut non_conditional_query = Self::inner_query_starts_from_key( start_at_key, @@ -1849,6 +1865,7 @@ impl<'a> DriveDocumentQuery<'a> { drive_operations, platform_version, )?; + println!("path_query {}", path_query); let query_result = drive.grove_get_path_query_serialized_results( &path_query, transaction, @@ -1976,6 +1993,8 @@ mod tests { use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::Identifier; + use grovedb::Query; + use indexmap::IndexMap; use rand::prelude::StdRng; use rand::SeedableRng; use serde_json::json; @@ -1998,6 +2017,7 @@ mod tests { use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::document::DocumentV0; use dpp::platform_value::string_encoding::Encoding; use dpp::platform_value::Value; use dpp::tests::fixtures::{get_data_contract_fixture, get_dpns_data_contract_fixture}; @@ -2037,6 +2057,38 @@ mod tests { (drive, contract) } + fn setup_withdrawal_contract() -> (Drive, DataContract) { + let tmp_dir = TempDir::new().unwrap(); + + let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); + + let platform_version = PlatformVersion::latest(); + + drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create root tree successfully"); + + let contract_path = "tests/supporting_files/contract/withdrawals/withdrawals.json"; + + // let's construct the grovedb structure for the dashpay data contract + let contract = json_document_to_contract(contract_path, false, platform_version) + .expect("expected to get document"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + storage_flags, + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + (drive, contract) + } + fn setup_family_birthday_contract() -> (Drive, DataContract) { let drive = setup_drive_with_initial_state_structure(None); @@ -2667,4 +2719,103 @@ mod tests { ) .expect_err("starts with can not start with an empty string"); } + + #[test] + fn test_withdrawal_query_with_missing_transaction_index() { + // Setup the withdrawal contract + let (_, contract) = setup_withdrawal_contract(); + let platform_version = PlatformVersion::latest(); + + let document_type_name = "withdrawal"; + let document_type = contract + .document_type_for_name(document_type_name) + .expect("expected to get document type"); + + // Create a DriveDocumentQuery that simulates missing 'transactionIndex' in documents + let drive_document_query = DriveDocumentQuery { + contract: &contract, + document_type, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: Some(WhereClause { + field: "status".to_string(), + operator: WhereOperator::In, + value: Value::Array(vec![ + Value::U64(0), + Value::U64(1), + Value::U64(2), + Value::U64(3), + Value::U64(4), + ]), + }), + range_clause: None, + equal_clauses: BTreeMap::default(), + }, + offset: None, + limit: Some(3), + order_by: IndexMap::from([ + ( + "status".to_string(), + OrderClause { + field: "status".to_string(), + ascending: true, + }, + ), + ( + "transactionIndex".to_string(), + OrderClause { + field: "transactionIndex".to_string(), + ascending: true, + }, + ), + ]), + start_at: Some([3u8; 32]), + start_at_included: false, + block_time_ms: None, + }; + + println!("{:?}", &drive_document_query); + + // Create a document that we are starting at, which may be missing 'transactionIndex' + let mut properties = BTreeMap::new(); + properties.insert("status".to_string(), Value::U64(0)); + // We intentionally omit 'transactionIndex' to simulate missing field + + let starts_at_document = DocumentV0 { + id: Identifier::from([3u8; 32]), // The same as start_at + owner_id: Identifier::random(), + properties, + revision: None, + created_at: None, + updated_at: None, + transferred_at: None, + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + + // Attempt to construct the path query + let result = drive_document_query + .construct_path_query(Some(starts_at_document), platform_version) + .expect("expected to construct a path query"); + + println!("Generated PathQuery: {}", result); + + assert_eq!( + result + .clone() + .query + .query + .default_subquery_branch + .subquery + .expect("expected subquery") + .items, + Query::new_range_full().items + ); + } } diff --git a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs index dc362c7ead9..a0a714cbb8c 100644 --- a/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs +++ b/packages/rs-drive/src/verify/document/verify_proof_keep_serialized/v0/mod.rs @@ -39,6 +39,7 @@ impl<'a> DriveDocumentQuery<'a> { } else { self.construct_path_query(None, platform_version) }?; + println!("{}", &path_query); let (root_hash, proved_key_values) = if self.start_at.is_some() { GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? } else { diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index 5c792aa8733..312d078f62f 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -4342,6 +4342,8 @@ fn test_dpns_query_start_after_with_null_id() { let domain1_id = Identifier::random_with_rng(&mut rng); + assert!(domain0_id > domain1_id); + let domain1 = Domain { id: domain1_id, owner_id: Identifier::random_with_rng(&mut rng), @@ -4428,7 +4430,7 @@ fn test_dpns_query_start_after_with_null_id() { ["normalizedParentDomainName", "==", "dash"] ], "startAfter": encoded_start_at, - "limit": 2, + "limit": 3, "orderBy": [ ["normalizedLabel", "asc"] ] @@ -4446,6 +4448,8 @@ fn test_dpns_query_start_after_with_null_id() { ) .expect("query should be built"); + println!("{:?}", query); + // We are commenting this out on purpose to make it easier to find // let mut query_operations: Vec = vec![]; // let path_query = query diff --git a/packages/rs-drive/tests/supporting_files/contract/withdrawals/withdrawals.json b/packages/rs-drive/tests/supporting_files/contract/withdrawals/withdrawals.json new file mode 100644 index 00000000000..fbadb59824f --- /dev/null +++ b/packages/rs-drive/tests/supporting_files/contract/withdrawals/withdrawals.json @@ -0,0 +1,141 @@ +{ + "$format_version": "0", + "id": "BnqN3oupH6uCogzgZMvSjjpKxmcdNXAShnNY4Kor33aL", + "ownerId": "BnqN3oupH6uCogzgZMvSjjpKxmcdNXAShnNY4Kor33aL", + "version": 1, + "documentSchemas": { + "withdrawal": { + "description": "Withdrawal document to track underlying withdrawal transactions. Withdrawals should be created with IdentityWithdrawalTransition", + "creationRestrictionMode": 2, + "type": "object", + "indices": [ + { + "name": "identityStatus", + "properties": [ + { + "$ownerId": "asc" + }, + { + "status": "asc" + }, + { + "$createdAt": "asc" + } + ], + "unique": false + }, + { + "name": "identityRecent", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$updatedAt": "asc" + }, + { + "status": "asc" + } + ], + "unique": false + }, + { + "name": "pooling", + "properties": [ + { + "status": "asc" + }, + { + "pooling": "asc" + }, + { + "coreFeePerByte": "asc" + }, + { + "$updatedAt": "asc" + } + ], + "unique": false + }, + { + "name": "transaction", + "properties": [ + { + "status": "asc" + }, + { + "transactionIndex": "asc" + } + ], + "unique": false + } + ], + "properties": { + "transactionIndex": { + "type": "integer", + "description": "Sequential index of asset unlock (withdrawal) transaction. Populated when a withdrawal pooled into withdrawal transaction", + "minimum": 1, + "position": 0 + }, + "transactionSignHeight": { + "type": "integer", + "description": "The Core height on which transaction was signed", + "minimum": 1, + "position": 1 + }, + "amount": { + "type": "integer", + "description": "The amount to be withdrawn", + "minimum": 1000, + "position": 2 + }, + "coreFeePerByte": { + "type": "integer", + "description": "This is the fee that you are willing to spend for this transaction in Duffs/Byte", + "minimum": 1, + "maximum": 4294967295, + "position": 3 + }, + "pooling": { + "type": "integer", + "description": "This indicated the level at which Platform should try to pool this transaction", + "enum": [ + 0, + 1, + 2 + ], + "position": 4 + }, + "outputScript": { + "type": "array", + "byteArray": true, + "minItems": 23, + "maxItems": 25, + "position": 5 + }, + "status": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "description": "0 - Pending, 1 - Signed, 2 - Broadcasted, 3 - Complete, 4 - Expired", + "position": 6 + } + }, + "additionalProperties": false, + "required": [ + "$createdAt", + "$updatedAt", + "amount", + "coreFeePerByte", + "pooling", + "outputScript", + "status" + ] + } + } +} From bb18327dfb681abdd0939571d68fdc2ff7789d38 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 30 Oct 2024 23:30:52 +0700 Subject: [PATCH 09/30] updated rust dash core --- Cargo.lock | 25 ++++++++++--------------- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d8d9133d1a..d0658845cbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1231,14 +1231,14 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.33.1" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +version = "0.33.2" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" dependencies = [ "anyhow", "bech32", "bitflags 2.6.0", "blsful", - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", + "dashcore-private", "dashcore_hashes", "ed25519-dalek", "hex", @@ -1254,19 +1254,14 @@ dependencies = [ [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" - -[[package]] -name = "dashcore-private" -version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" [[package]] name = "dashcore-rpc" version = "0.15.9" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.10#7cd04868dbcb255366a0ea391537433de5d35bc8" dependencies = [ - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.32.0)", + "dashcore-private", "dashcore-rpc-json", "env_logger 0.10.2", "hex", @@ -1278,8 +1273,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.9" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" +version = "0.15.10" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.10#7cd04868dbcb255366a0ea391537433de5d35bc8" dependencies = [ "bincode", "dashcore", @@ -1293,9 +1288,9 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" dependencies = [ - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", + "dashcore-private", "secp256k1", "serde", ] diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 57d27c9600c..6e03eb6c41e 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -28,7 +28,7 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "rand", "signer", "serde" -], default-features = false, tag = "0.33.1" } +], default-features = false, tag = "0.33.2" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 3a92a46df7d..d28330fcf10 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index c634047b4d4..931aa5f62f3 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -35,7 +35,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index a1c06f26ba7..1581055d978 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From ae8257c92d013c10ca650baac12dad21af5a9af3 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 1 Nov 2024 14:47:13 +0100 Subject: [PATCH 10/30] more fixes --- Cargo.lock | 16 ++++++++-------- packages/rs-dpp/Cargo.toml | 2 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d0658845cbb..8d73f899227 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1231,8 +1231,8 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.33.2" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" +version = "0.33.3" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.3#d224400d34b5b0ab9089c26698c5ee39645867ff" dependencies = [ "anyhow", "bech32", @@ -1254,12 +1254,12 @@ dependencies = [ [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.3#d224400d34b5b0ab9089c26698c5ee39645867ff" [[package]] name = "dashcore-rpc" -version = "0.15.9" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.10#7cd04868dbcb255366a0ea391537433de5d35bc8" +version = "0.15.12" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.12#677d6e50e13ced4095ff35248ef22edecf3b9962" dependencies = [ "dashcore-private", "dashcore-rpc-json", @@ -1273,8 +1273,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.10" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.10#7cd04868dbcb255366a0ea391537433de5d35bc8" +version = "0.15.12" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.12#677d6e50e13ced4095ff35248ef22edecf3b9962" dependencies = [ "bincode", "dashcore", @@ -1288,7 +1288,7 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.2#078ae448e65647df3b5d77e4376ed5c83ba957de" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.3#d224400d34b5b0ab9089c26698c5ee39645867ff" dependencies = [ "dashcore-private", "secp256k1", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 6e03eb6c41e..376ab5dcc6b 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -28,7 +28,7 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "rand", "signer", "serde" -], default-features = false, tag = "0.33.2" } +], default-features = false, tag = "0.33.3" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index d28330fcf10..400d3d6a8af 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.12" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 931aa5f62f3..52a733a530d 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -35,7 +35,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.12" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 1581055d978..f740616e833 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.10" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.12" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 272f5acf35f90ea6bea68bb58456244fda62b9b4 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Fri, 8 Nov 2024 10:21:47 +0100 Subject: [PATCH 11/30] more fixes --- .../identity_public_key/methods/hash/mod.rs | 8 +++++++- .../methods/hash/v0/mod.rs | 5 ++++- .../identity_public_key/v0/methods/mod.rs | 20 ++++++++++++++++++- packages/rs-drive/src/query/mod.rs | 6 +++--- packages/rs-sdk/src/core/transaction.rs | 12 +++++------ packages/rs-sdk/src/lib.rs | 2 +- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs index 5cc4828dd7e..a7b4803e2d0 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs @@ -2,7 +2,7 @@ mod v0; use crate::identity::IdentityPublicKey; use crate::ProtocolError; -use dashcore::Network; +use dashcore::{Address, Network}; pub use v0::*; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { @@ -12,6 +12,12 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { } } + fn address(&self, network: Network) -> Result { + match self { + IdentityPublicKey::V0(v0) => v0.address(network), + } + } + fn validate_private_key_bytes( &self, private_key_bytes: &[u8; 32], diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs index dd2b975e88f..504d5187e74 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs @@ -1,10 +1,13 @@ use crate::ProtocolError; -use dashcore::Network; +use dashcore::{Address, Network}; pub trait IdentityPublicKeyHashMethodsV0 { /// Get the original public key hash fn public_key_hash(&self) -> Result<[u8; 20], ProtocolError>; + /// Get the address + fn address(&self, network: Network) -> Result; + /// Verifies that the private key bytes match this identity public key fn validate_private_key_bytes( &self, diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 52357e89a2f..b015fabbc13 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -4,11 +4,12 @@ use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; use crate::{bls_signatures, ProtocolError}; use anyhow::anyhow; +use dashcore::address::Payload; use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; -use dashcore::{ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; +use dashcore::{ed25519_dalek, Address, Network, PubkeyHash, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { @@ -49,6 +50,23 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { } } + fn address(&self, network: Network) -> Result { + match self.key_type { + KeyType::BIP13_SCRIPT_HASH => { + return Err(ProtocolError::NotSupported( + "Can not get an address from a single script hash key".to_string(), + )) + } + _ => { + let public_key_hash = self.public_key_hash()?; + Ok(Address::new( + network, + Payload::PubkeyHash(PubkeyHash::from_byte_array(public_key_hash)), + )) + } + } + } + fn validate_private_key_bytes( &self, private_key_bytes: &[u8; 32], diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index a2495dc938b..0bb841649fd 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -2070,7 +2070,7 @@ mod tests { drive .create_initial_state_structure(None, platform_version) .expect("expected to create root tree successfully"); - + // let's construct the grovedb structure for the dashpay data contract let contract = load_system_data_contract(SystemDataContract::Withdrawals, platform_version) .expect("load system contact"); @@ -2775,7 +2775,7 @@ mod tests { start_at_included: false, block_time_ms: None, }; - + // Create a document that we are starting at, which may be missing 'transactionIndex' let mut properties = BTreeMap::new(); properties.insert("status".to_string(), Value::U64(0)); @@ -2802,7 +2802,7 @@ mod tests { let result = drive_document_query .construct_path_query(Some(starts_at_document), platform_version) .expect("expected to construct a path query"); - + assert_eq!( result .clone() diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index 47bba9c4b54..0ce9202c20d 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -74,7 +74,7 @@ impl Sdk { // transaction_id = transaction_id.to_string(), // ) // .entered(); - // + // // tracing::debug!("waiting for messages from stream"); // Define an inner async block to handle the stream processing. @@ -126,7 +126,7 @@ impl Sdk { // ); return Ok(asset_lock_proof); - } + } // else { // tracing::debug!( // "instant lock is not matching, waiting for the next message" @@ -238,10 +238,10 @@ impl Sdk { // tracing::trace!("received transaction(s), ignoring") } None => { - // tracing::trace!( - // "received empty response as a workaround for the bug in tonic, ignoring" - // ) - }, + // tracing::trace!( + // "received empty response as a workaround for the bug in tonic, ignoring" + // ) + } } } }; diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index d6e29c98258..23bdedc2fbc 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -71,12 +71,12 @@ pub mod sdk; pub use error::Error; pub use sdk::{RequestSettings, Sdk, SdkBuilder}; +pub use dapi_grpc; pub use dashcore_rpc; pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; -pub use dapi_grpc; pub mod sync; /// Version of the SDK From ddf1c8bb9407f5367a82d14d81f8903bca8c5c47 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Tue, 12 Nov 2024 00:56:14 +0100 Subject: [PATCH 12/30] retry calls to core in sdk --- packages/rs-sdk/src/core/dash_core_client.rs | 120 ++++++++++++++----- 1 file changed, 90 insertions(+), 30 deletions(-) diff --git a/packages/rs-sdk/src/core/dash_core_client.rs b/packages/rs-sdk/src/core/dash_core_client.rs index d59af4207c5..11c1749cff2 100644 --- a/packages/rs-sdk/src/core/dash_core_client.rs +++ b/packages/rs-sdk/src/core/dash_core_client.rs @@ -13,6 +13,7 @@ use dashcore_rpc::{ use dpp::dashcore::ProTxHash; use dpp::prelude::CoreBlockHeight; use drive_proof_verifier::error::ContextProviderError; +use std::time::Duration; use std::{fmt::Debug, sync::Mutex}; use zeroize::Zeroizing; @@ -27,6 +28,69 @@ pub struct LowLevelDashCoreClient { core_port: u16, } +/// Client still warming up +pub const CORE_RPC_ERROR_IN_WARMUP: i32 = -28; +/// Dash is not connected +pub const CORE_RPC_CLIENT_NOT_CONNECTED: i32 = -9; +/// Still downloading initial blocks +pub const CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD: i32 = -10; + +macro_rules! retry { + ($action:expr) => {{ + /// Maximum number of retry attempts + const MAX_RETRIES: u32 = 4; + /// // Multiplier for Fibonacci sequence + const FIB_MULTIPLIER: u64 = 1; + + const BASE_TIME_MS: u64 = 40; + + fn fibonacci(n: u32) -> u64 { + match n { + 0 => 0, + 1 => 1, + _ => fibonacci(n - 1) + fibonacci(n - 2), + } + } + + let mut final_result = None; + for i in 0..MAX_RETRIES { + match $action { + Ok(result) => { + final_result = Some(Ok(result)); + break; + } + Err(e) => { + match e { + dashcore_rpc::Error::JsonRpc( + // Retry on transport connection error + dashcore_rpc::jsonrpc::error::Error::Transport(_) + | dashcore_rpc::jsonrpc::error::Error::Rpc( + // Retry on Core RPC "not ready" errors + dashcore_rpc::jsonrpc::error::RpcError { + code: + CORE_RPC_ERROR_IN_WARMUP + | CORE_RPC_CLIENT_NOT_CONNECTED + | CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD, + .. + }, + ), + ) => { + if i == MAX_RETRIES - 1 { + final_result = + Some(Err(ContextProviderError::Generic(e.to_string()))); + } + let delay = fibonacci(i + 2) * FIB_MULTIPLIER; + std::thread::sleep(Duration::from_millis(delay * BASE_TIME_MS)); + } + _ => return Err(ContextProviderError::Generic(e.to_string())), + }; + } + } + } + final_result.expect("expected a final result") + }}; +} + impl Clone for LowLevelDashCoreClient { // As Client does not implement Clone, we just create a new instance of CoreClient here. fn clone(&self) -> Self { @@ -98,28 +162,23 @@ impl LowLevelDashCoreClient { pub fn list_unspent( &self, minimum_sum_satoshi: Option, - ) -> Result, Error> { + ) -> Result, ContextProviderError> { let options = json::ListUnspentQueryOptions { minimum_sum_amount: minimum_sum_satoshi.map(Amount::from_sat), ..Default::default() }; - self.core - .lock() - .expect("Core lock poisoned") - .list_unspent(None, None, None, None, Some(options)) - .map_err(Error::CoreClientError) + let core = self.core.lock().expect("Core lock poisoned"); + + retry!(core.list_unspent(None, None, None, None, Some(options.clone()))) } /// Return address to which change of transaction can be sent. #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] - pub fn get_balance(&self) -> Result { - self.core - .lock() - .expect("Core lock poisoned") - .get_balance(None, None) - .map_err(Error::CoreClientError) + pub fn get_balance(&self) -> Result { + let core = self.core.lock().expect("Core lock poisoned"); + retry!(core.get_balance(None, None)) } /// Retrieve quorum public key from core. @@ -132,15 +191,19 @@ impl LowLevelDashCoreClient { .map_err(|e| ContextProviderError::InvalidQuorum(e.to_string()))?; let core = self.core.lock().expect("Core lock poisoned"); - let quorum_info = core - .get_quorum_info(json::QuorumType::from(quorum_type), &quorum_hash, None) - .map_err(|e: dashcore_rpc::Error| ContextProviderError::Generic(e.to_string()))?; + + // Retrieve the quorum info + let quorum_info: json::QuorumInfoResult = + retry!(core.get_quorum_info(json::QuorumType::from(quorum_type), &quorum_hash, None))?; + + // Extract the quorum public key and attempt to convert it let key = quorum_info.quorum_public_key; - let pubkey = as TryInto<[u8; 48]>>::try_into(key).map_err(|_e| { + let pubkey = as TryInto<[u8; 48]>>::try_into(key).map_err(|_| { ContextProviderError::InvalidQuorum( "quorum public key is not 48 bytes long".to_string(), ) })?; + Ok(pubkey) } @@ -148,13 +211,11 @@ impl LowLevelDashCoreClient { pub fn get_platform_activation_height(&self) -> Result { let core = self.core.lock().expect("Core lock poisoned"); - let fork_info = core - .get_blockchain_info() - .map(|blockchain_info| blockchain_info.softforks.get("mn_rr").cloned()) - .map_err(|e: dashcore_rpc::Error| ContextProviderError::Generic(e.to_string()))? - .ok_or(ContextProviderError::ActivationForkError( - "no fork info for mn_rr".to_string(), - ))?; + let blockchain_info = retry!(core.get_blockchain_info())?; + + let fork_info = blockchain_info.softforks.get("mn_rr").ok_or( + ContextProviderError::ActivationForkError("no fork info for mn_rr".to_string()), + )?; fork_info .height @@ -171,15 +232,14 @@ impl LowLevelDashCoreClient { &self, height: Option, protx_type: Option, - ) -> Result, Error> { + ) -> Result, ContextProviderError> { let core = self.core.lock().expect("Core lock poisoned"); - let pro_tx_hashes = - core.get_protx_list(protx_type, Some(false), height) - .map(|x| match x { - ProTxList::Hex(hex) => hex, - ProTxList::Info(info) => info.into_iter().map(|v| v.pro_tx_hash).collect(), - })?; + let pro_tx_list = retry!(core.get_protx_list(protx_type.clone(), Some(false), height))?; + let pro_tx_hashes = match pro_tx_list { + ProTxList::Hex(hex) => hex, + ProTxList::Info(info) => info.into_iter().map(|v| v.pro_tx_hash).collect(), + }; Ok(pro_tx_hashes) } From 0c1ce6d4cc35fa53bb5f81972aa7a9357dddab55 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 19 Oct 2024 11:17:08 +0700 Subject: [PATCH 13/30] replace bls library --- Cargo.lock | 368 +++++++++++++++++- packages/rs-dpp/Cargo.toml | 7 +- .../rs-dpp/src/core_types/validator/mod.rs | 5 +- .../rs-dpp/src/core_types/validator/v0/mod.rs | 28 +- .../src/core_types/validator_set/mod.rs | 5 +- .../src/core_types/validator_set/v0/mod.rs | 43 +- .../identity/identity_public_key/key_type.rs | 24 +- .../identity_public_key/methods/hash/mod.rs | 2 +- .../methods/hash/v0/mod.rs | 2 +- .../identity/identity_public_key/random.rs | 32 +- .../identity_public_key/v0/methods/mod.rs | 79 ++-- .../identity/identity_public_key/v0/random.rs | 16 +- packages/rs-dpp/src/identity/random.rs | 8 +- packages/rs-dpp/src/identity/v0/random.rs | 10 +- packages/rs-dpp/src/lib.rs | 2 +- packages/rs-drive-abci/Cargo.toml | 4 +- .../update_operator_identity/v0/mod.rs | 38 +- .../update_quorum_info/v0/mod.rs | 2 +- .../core_chain_lock/choose_quorum/mod.rs | 6 +- .../core_chain_lock/choose_quorum/v0/mod.rs | 25 +- .../verify_chain_lock_locally/v0/mod.rs | 25 +- .../verify_recent_signature_locally/v0/mod.rs | 36 +- .../v0/mod.rs | 4 +- packages/rs-drive-abci/src/mimic/mod.rs | 8 +- .../rs-drive-abci/src/mimic/test_quorum.rs | 38 +- .../src/platform_types/commit/mod.rs | 3 +- .../src/platform_types/commit/v0/mod.rs | 26 +- .../platform_types/platform_state/v0/mod.rs | 6 +- .../platform_state/v0/old_structures/mod.rs | 103 +++++ .../signature_verification_quorum_set/mod.rs | 8 +- .../v0/for_saving.rs | 14 +- .../v0/for_saving_v1.rs | 93 +++++ .../v0/mod.rs | 1 + .../v0/quorums.rs | 33 +- .../src/platform_types/validator/v0/mod.rs | 6 +- .../platform_types/validator_set/v0/mod.rs | 28 +- .../system/current_quorums_info/v0/mod.rs | 6 +- .../tests/strategy_tests/execution.rs | 29 +- .../tests/strategy_tests/main.rs | 2 +- .../masternode_list_item_helpers.rs | 26 +- .../tests/strategy_tests/masternodes.rs | 26 +- .../tests/strategy_tests/query.rs | 20 +- .../rs-drive-proof-verifier/src/unproved.rs | 4 +- .../rs-drive-proof-verifier/src/verify.rs | 27 +- packages/simple-signer/src/signer.rs | 25 +- 45 files changed, 1009 insertions(+), 294 deletions(-) create mode 100644 packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs create mode 100644 packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs diff --git a/Cargo.lock b/Cargo.lock index c59d07d2b49..50a561805e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,6 +333,12 @@ dependencies = [ "rustc-demangle", ] +[[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" @@ -509,7 +515,7 @@ 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]] @@ -533,6 +539,63 @@ dependencies = [ "serde", ] +[[package]] +name = "blsful" +version = "3.0.0-pre6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9de4566ea9f21109f6b3f11551b591ff22683ff47c3a30d97e2feb23257427" +dependencies = [ + "anyhow", + "arrayref", + "blstrs_plus", + "hex", + "hkdf", + "merlin", + "pairing", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_bare", + "sha2", + "sha3", + "subtle", + "thiserror", + "uint-zigzag", + "vsss-rs", + "zeroize", +] + +[[package]] +name = "blst" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62dc83a094a71d43eeadd254b1ec2d24cb6a0bb6cadce00df51f0db594711a32" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "blstrs_plus" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a16dd4b0d6b4538e1fa0388843acb186363082713a8fc8416d802a04d013818" +dependencies = [ + "arrayref", + "blst", + "elliptic-curve", + "ff", + "group", + "pairing", + "rand_core", + "serde", + "subtle", + "zeroize", +] + [[package]] name = "borsh" version = "1.5.1" @@ -912,6 +975,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[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.13" @@ -1006,13 +1078,26 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core", + "serdect", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -1370,6 +1455,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", + "blsful", "bs58", "byteorder", "chrono", @@ -1461,6 +1547,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", + "bls-signatures", "bs58", "chrono", "ciborium 0.2.0", @@ -1578,6 +1665,41 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array 0.14.7", + "group", + "hkdf", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "tap", + "zeroize", +] + +[[package]] +name = "elliptic-curve-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48843edfbd0a370b3dd14cdbb4e446e9a8855311e6b2b57bf9a1fd1367bc317" +dependencies = [ + "elliptic-curve", + "heapless", + "hex", + "multiexp", + "serde", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.34" @@ -1738,6 +1860,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" @@ -1934,6 +2067,17 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", +] + +[[package]] +name = "generic-array" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96512db27971c2c3eece70a1e106fbe6c87760234e31e8f7e5634912fe52794a" +dependencies = [ + "serde", + "typenum", ] [[package]] @@ -1973,6 +2117,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand", + "rand_core", + "rand_xorshift", + "subtle", +] + [[package]] name = "grovedb" version = "2.1.0" @@ -2149,6 +2306,15 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2187,6 +2353,16 @@ dependencies = [ "num-traits", ] +[[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" @@ -2241,6 +2417,15 @@ 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" @@ -2481,7 +2666,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -2643,6 +2828,15 @@ dependencies = [ "uuid", ] +[[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" @@ -2782,6 +2976,18 @@ 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 = "metrics" version = "0.23.0" @@ -2929,6 +3135,19 @@ dependencies = [ "uuid", ] +[[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" @@ -3006,6 +3225,8 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "rand", + "serde", ] [[package]] @@ -3021,6 +3242,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", + "rand", + "serde", ] [[package]] @@ -3069,6 +3292,7 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", + "serde", ] [[package]] @@ -3203,6 +3427,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" version = "2.2.0" @@ -3677,6 +3910,15 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + [[package]] name = "raw-cpuid" version = "11.1.0" @@ -4062,6 +4304,20 @@ 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.30.0" @@ -4131,6 +4387,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +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.15" @@ -4264,6 +4529,16 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4286,6 +4561,16 @@ dependencies = [ "digest", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -4377,6 +4662,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "spki" @@ -4397,6 +4685,22 @@ dependencies = [ "log", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "std-shims" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e49360f31b0b75a6a82a5205c6103ea07a79a60808d44f5cc879d303337926" +dependencies = [ + "hashbrown 0.14.5", + "spin", +] + [[package]] name = "strategy-tests" version = "1.5.0" @@ -4689,6 +4993,26 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "thiserror-impl-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-no-std" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +dependencies = [ + "thiserror-impl-no-std", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -4699,6 +5023,15 @@ dependencies = [ "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.36" @@ -5099,6 +5432,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uint-zigzag" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abbf77aed65cb885a8ba07138c365879be3d9a93dce82bf6cc50feca9138ec15" +dependencies = [ + "core2", +] + [[package]] name = "unicase" version = "2.7.0" @@ -5225,6 +5567,26 @@ version = "0.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" +[[package]] +name = "vsss-rs" +version = "5.0.0-rc1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9860fb75908021ae4cc125917c9763134f7f236a716d181ed644627783230c5d" +dependencies = [ + "crypto-bigint", + "elliptic-curve", + "elliptic-curve-tools", + "generic-array 1.1.0", + "hex", + "num", + "rand_core", + "serde", + "sha3", + "subtle", + "thiserror-no-std", + "zeroize", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index ff377de7480..68aa7346392 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -22,14 +22,13 @@ chrono = { version = "0.4.35", default-features = false, features = [ "clock", ] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +blsful = { version = "3.0.0-pre6" , optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "std", "secp-recovery", "rand", "signer", - "serde", - "bls", - "eddsa" + "serde" ], default-features = false, tag = "0.32.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } @@ -75,7 +74,7 @@ once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] -bls-signatures = ["dashcore/bls"] +bls-signatures = ["dashcore/bls", "blsful"] ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", diff --git a/packages/rs-dpp/src/core_types/validator/mod.rs b/packages/rs-dpp/src/core_types/validator/mod.rs index 2261bac56fa..d5f985a3c14 100644 --- a/packages/rs-dpp/src/core_types/validator/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/mod.rs @@ -1,5 +1,6 @@ use crate::bls_signatures::PublicKey as BlsPublicKey; use crate::core_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; +use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, PubkeyHash}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -25,7 +26,7 @@ impl ValidatorV0Getters for Validator { } } - fn public_key(&self) -> &Option { + fn public_key(&self) -> &Option> { match self { Validator::V0(v0) => v0.public_key(), } @@ -75,7 +76,7 @@ impl ValidatorV0Setters for Validator { } } - fn set_public_key(&mut self, public_key: Option) { + fn set_public_key(&mut self, public_key: Option>) { match self { Validator::V0(v0) => v0.set_public_key(public_key), } diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index b427431a04c..81f73a66af4 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -2,6 +2,7 @@ use dashcore::{ProTxHash, PubkeyHash}; use std::fmt::{Debug, Formatter}; use crate::bls_signatures::PublicKey as BlsPublicKey; +use blsful::Bls12381G2Impl; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -26,7 +27,7 @@ pub struct ValidatorV0 { /// The proTxHash pub pro_tx_hash: ProTxHash, /// The public key share of this validator for this quorum - pub public_key: Option, + pub public_key: Option>, /// The node address pub node_ip: String, /// The node id @@ -54,7 +55,7 @@ impl Encode for ValidatorV0 { match &self.public_key { Some(public_key) => { true.encode(encoder)?; // Indicate that public_key is present - public_key.to_bytes().encode(encoder)?; + public_key.0.to_compressed().encode(encoder)?; } None => { false.encode(encoder)?; // Indicate that public_key is not present @@ -94,9 +95,12 @@ impl Decode for ValidatorV0 { let has_public_key = bool::decode(decoder)?; let public_key = if has_public_key { let public_key_bytes = <[u8; 48]>::decode(decoder)?; - Some(BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) - })?) + + Some( + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) + })?, + ) } else { None }; @@ -150,7 +154,7 @@ pub trait ValidatorV0Getters { /// Returns the proTxHash of the validator. fn pro_tx_hash(&self) -> &ProTxHash; /// Returns the public key share of this validator for this quorum. - fn public_key(&self) -> &Option; + fn public_key(&self) -> &Option>; /// Returns the node address of the validator. fn node_ip(&self) -> &String; /// Returns the node id of the validator. @@ -170,7 +174,7 @@ pub trait ValidatorV0Setters { /// Sets the proTxHash of the validator. fn set_pro_tx_hash(&mut self, pro_tx_hash: ProTxHash); /// Sets the public key share of this validator for this quorum. - fn set_public_key(&mut self, public_key: Option); + fn set_public_key(&mut self, public_key: Option>); /// Sets the node address of the validator. fn set_node_ip(&mut self, node_ip: String); /// Sets the node id of the validator. @@ -190,7 +194,7 @@ impl ValidatorV0Getters for ValidatorV0 { &self.pro_tx_hash } - fn public_key(&self) -> &Option { + fn public_key(&self) -> &Option> { &self.public_key } @@ -224,7 +228,7 @@ impl ValidatorV0Setters for ValidatorV0 { self.pro_tx_hash = pro_tx_hash; } - fn set_public_key(&mut self, public_key: Option) { + fn set_public_key(&mut self, public_key: Option>) { self.public_key = public_key; } @@ -257,12 +261,16 @@ impl ValidatorV0Setters for ValidatorV0 { mod tests { use super::*; use bincode::config; + use blsful::SecretKey; + use rand::prelude::StdRng; + use rand::SeedableRng; #[test] fn test_serialize_deserialize_validator_v0() { // Sample data for testing let pro_tx_hash = ProTxHash::from_slice(&[1; 32]).unwrap(); - let public_key = Some(BlsPublicKey::generate()); + let mut rng = StdRng::seed_from_u64(0); + let public_key = Some(SecretKey::::random(&mut rng).public_key()); let node_ip = "127.0.0.1".to_string(); let node_id = PubkeyHash::from_slice(&[3; 20]).unwrap(); let core_port = 9999; diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs index 74b78fca058..de5b515f9f7 100644 --- a/packages/rs-dpp/src/core_types/validator_set/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -7,6 +7,7 @@ use crate::core_types::validator_set::v0::{ use crate::ProtocolError; #[cfg(feature = "core-types-serialization")] use bincode::{Decode, Encode}; +use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, QuorumHash}; #[cfg(feature = "core-types-serialization")] use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; @@ -80,7 +81,7 @@ impl ValidatorSetV0Getters for ValidatorSet { } } - fn threshold_public_key(&self) -> &BlsPublicKey { + fn threshold_public_key(&self) -> &BlsPublicKey { match self { ValidatorSet::V0(v0) => v0.threshold_public_key(), } @@ -112,7 +113,7 @@ impl ValidatorSetV0Setters for ValidatorSet { } } - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { match self { ValidatorSet::V0(v0) => v0.set_threshold_public_key(threshold_public_key), } diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index dba9180e24b..cf05bb3d149 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -8,6 +8,7 @@ use bincode::enc::Encoder; use bincode::error::EncodeError; #[cfg(feature = "core-types-serialization")] use bincode::{BorrowDecode, Decode, Encode}; +use blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::{ProTxHash, QuorumHash}; use itertools::Itertools; @@ -34,7 +35,7 @@ pub struct ValidatorSetV0 { /// The list of masternodes pub members: BTreeMap, /// The threshold quorum public key - pub threshold_public_key: BlsPublicKey, + pub threshold_public_key: BlsPublicKey, } impl Display for ValidatorSetV0 { @@ -61,7 +62,7 @@ impl Display for ValidatorSetV0 { pro_tx_hash, validator.node_ip )) .join(", "), - hex::encode(self.threshold_public_key.to_bytes().as_slice()) // Assuming BlsPublicKey is a byte array + hex::encode(self.threshold_public_key.0.to_compressed()) // Assuming BlsPublicKey is a byte array ) } } @@ -85,7 +86,7 @@ impl Encode for ValidatorSetV0 { // Custom encoding for BlsPublicKey if needed // Assuming BlsPublicKey can be serialized to a byte slice - let public_key_bytes = *self.threshold_public_key.to_bytes(); + let public_key_bytes = self.threshold_public_key.0.to_compressed(); public_key_bytes.encode(encoder)?; Ok(()) @@ -118,9 +119,12 @@ impl Decode for ValidatorSetV0 { let mut public_key_bytes = [0u8; 48]; let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); - let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - bincode::error::DecodeError::OtherString("Failed to decode BlsPublicKey".to_string()) - })?; + let threshold_public_key = + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode BlsPublicKey".to_string(), + ) + })?; Ok(ValidatorSetV0 { quorum_hash: QuorumHash::from_byte_array(quorum_hash), @@ -162,11 +166,12 @@ impl<'de> BorrowDecode<'de> for ValidatorSetV0 { let mut public_key_bytes = [0u8; 48]; let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); - let threshold_public_key = BlsPublicKey::from_bytes(&public_key_bytes).map_err(|_| { - bincode::error::DecodeError::OtherString( - "Failed to decode BlsPublicKey in borrow decode".to_string(), - ) - })?; + let threshold_public_key = + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { + bincode::error::DecodeError::OtherString( + "Failed to decode BlsPublicKey in borrow decode".to_string(), + ) + })?; Ok(ValidatorSetV0 { quorum_hash: QuorumHash::from_byte_array(quorum_hash), @@ -211,7 +216,7 @@ pub trait ValidatorSetV0Getters { /// Returns the members of the validator set. fn members_owned(self) -> BTreeMap; /// Returns the threshold public key of the validator set. - fn threshold_public_key(&self) -> &BlsPublicKey; + fn threshold_public_key(&self) -> &BlsPublicKey; } /// Trait providing setter methods for `ValidatorSetV0` struct @@ -225,7 +230,7 @@ pub trait ValidatorSetV0Setters { /// Sets the members of the validator set. fn set_members(&mut self, members: BTreeMap); /// Sets the threshold public key of the validator set. - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey); } impl ValidatorSetV0Getters for ValidatorSetV0 { @@ -253,7 +258,7 @@ impl ValidatorSetV0Getters for ValidatorSetV0 { self.members } - fn threshold_public_key(&self) -> &BlsPublicKey { + fn threshold_public_key(&self) -> &BlsPublicKey { &self.threshold_public_key } } @@ -275,7 +280,7 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { self.members = members; } - fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { + fn set_threshold_public_key(&mut self, threshold_public_key: BlsPublicKey) { self.threshold_public_key = threshold_public_key; } } @@ -284,7 +289,10 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { mod tests { use super::*; use bincode::config; + use blsful::SecretKey; use dashcore::PubkeyHash; + use rand::rngs::StdRng; + use rand::SeedableRng; use std::collections::BTreeMap; #[test] @@ -296,7 +304,8 @@ mod tests { // Create a sample ProTxHash and ValidatorV0 instance let pro_tx_hash = ProTxHash::from_slice(&[2; 32]).unwrap(); - let public_key = Some(BlsPublicKey::generate()); + let mut rng = StdRng::seed_from_u64(0); + let public_key = Some(SecretKey::::random(&mut rng).public_key()); let node_ip = "192.168.1.1".to_string(); let node_id = PubkeyHash::from_slice(&[4; 20]).unwrap(); let validator = ValidatorV0 { @@ -315,7 +324,7 @@ mod tests { members.insert(pro_tx_hash, validator); // Create a sample threshold public key - let threshold_public_key = BlsPublicKey::generate(); + let threshold_public_key = SecretKey::::random(&mut rng).public_key(); // Create the ValidatorSetV0 instance let validator_set = ValidatorSetV0 { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index e40437a33e5..a1ead4a7253 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -15,6 +15,7 @@ use lazy_static::lazy_static; use crate::fee::Credits; use crate::version::PlatformVersion; use crate::{InvalidVectorSizeError, ProtocolError}; +use blsful::Bls12381G2Impl; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -270,7 +271,7 @@ impl KeyType { #[cfg(feature = "random-public-keys")] /// Gets the default size of the public key - pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, Vec) { + pub fn random_public_and_private_key_data_v0(&self, rng: &mut StdRng) -> (Vec, [u8; 32]) { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); @@ -279,18 +280,13 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( private_key.public_key(&secp).to_bytes(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } KeyType::BLS12_381 => { - let private_key = bls_signatures::PrivateKey::generate_dash(rng) - .expect("expected to generate a bls private key"); // we assume this will never error - let public_key_bytes = private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec(); - (public_key_bytes, private_key.to_bytes().to_vec()) + let private_key = blsful::SecretKey::::random(rng); + let public_key_bytes = private_key.public_key().0.to_compressed().to_vec(); + (public_key_bytes, private_key.0.to_be_bytes()) } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); @@ -299,14 +295,14 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } KeyType::EDDSA_25519_HASH160 => { let key_pair = ed25519_dalek::SigningKey::generate(rng); ( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec(), - key_pair.to_bytes().to_vec(), + key_pair.to_bytes(), ) } KeyType::BIP13_SCRIPT_HASH => { @@ -317,7 +313,7 @@ impl KeyType { let private_key = dashcore::PrivateKey::new(secret_key, Network::Dash); ( ripemd160_sha256(private_key.public_key(&secp).to_bytes().as_slice()).to_vec(), - private_key.to_bytes(), + private_key.inner.secret_bytes(), ) } } @@ -329,7 +325,7 @@ impl KeyType { &self, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Vec, Vec), ProtocolError> { + ) -> Result<(Vec, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs index b22a3f0c26e..5cc4828dd7e 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/mod.rs @@ -14,7 +14,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKey { fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result { match self { diff --git a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs index b11c79c31f7..dd2b975e88f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/methods/hash/v0/mod.rs @@ -8,7 +8,7 @@ pub trait IdentityPublicKeyHashMethodsV0 { /// Verifies that the private key bytes match this identity public key fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result; } diff --git a/packages/rs-dpp/src/identity/identity_public_key/random.rs b/packages/rs-dpp/src/identity/identity_public_key/random.rs index dec286b9278..6ed13153e4f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/random.rs @@ -138,7 +138,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -176,7 +176,7 @@ impl IdentityPublicKey { rng: &mut StdRng, used_key_matrix: Option<(KeyCount, &mut UsedKeyMatrix)>, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -272,7 +272,7 @@ impl IdentityPublicKey { key_type: KeyType, contract_bounds: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -318,7 +318,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -346,7 +346,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -384,7 +384,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -411,7 +411,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -442,7 +442,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -489,7 +489,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -518,7 +518,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -558,7 +558,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -587,7 +587,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -629,7 +629,7 @@ impl IdentityPublicKey { id: KeyID, seed: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let mut rng = match seed { None => StdRng::from_entropy(), Some(seed_value) => StdRng::seed_from_u64(seed_value), @@ -656,7 +656,7 @@ impl IdentityPublicKey { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { match platform_version .dpp .identity_versions @@ -703,7 +703,7 @@ impl IdentityPublicKey { key_count: KeyCount, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result)>, ProtocolError> { + ) -> Result, ProtocolError> { (start_id..(start_id + key_count)) .map(|i| { Self::random_authentication_key_with_private_key_with_rng( @@ -720,7 +720,7 @@ impl IdentityPublicKey { key_count: KeyCount, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result)>, ProtocolError> { + ) -> Result, ProtocolError> { if key_count < 2 { return Err(ProtocolError::PublicKeyGenerationError( "at least 2 keys must be created".to_string(), diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 470dc92b9b7..4b64fe9f16a 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -4,10 +4,11 @@ use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; use crate::ProtocolError; use anyhow::anyhow; +use blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; -use dashcore::{bls_signatures, ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; +use dashcore::{ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { @@ -50,13 +51,13 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { fn validate_private_key_bytes( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result { match self.key_type { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); - let secret_key = match SecretKey::from_slice(private_key_bytes) { + let secret_key = match SecretKey::from_byte_array(private_key_bytes) { Ok(secret_key) => secret_key, Err(_) => return Ok(false), }; @@ -67,17 +68,15 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key = - match bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) { - Ok(secret_key) => secret_key, - Err(_) => return Ok(false), - }; - let g1_element = match private_key.g1_element() { - Ok(g1_element) => g1_element, - Err(_) => return Ok(false), - }; + let private_key: Option> = + blsful::SecretKey::::from_be_bytes(private_key_bytes) + .into(); + if private_key.is_none() { + return Ok(false); + } + let private_key = private_key.expect("expected private key"); - Ok(g1_element.to_bytes().as_slice() == self.data.as_slice()) + Ok(&private_key.public_key().0.to_compressed() == self.data.as_slice()) } #[cfg(not(feature = "bls-signatures"))] return Err(ProtocolError::NotSupported( @@ -86,7 +85,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); - let secret_key = match SecretKey::from_slice(private_key_bytes) { + let secret_key = match SecretKey::from_byte_array(private_key_bytes) { Ok(secret_key) => secret_key, Err(_) => return Ok(false), }; @@ -101,11 +100,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let secret_key = match private_key_bytes.try_into() { - Ok(secret_key) => secret_key, - Err(_) => return Ok(false), - }; - let key_pair = ed25519_dalek::SigningKey::from_bytes(&secret_key); + let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); Ok( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).as_slice() == self.data.as_slice(), @@ -129,11 +124,51 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { mod tests { use super::*; use crate::identity::{Purpose, SecurityLevel}; + use blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; use dashcore::Network; use dpp::version::PlatformVersion; use rand::rngs::StdRng; use rand::SeedableRng; + #[test] + fn test_bls_serialization_deserialization() { + let mut rng = StdRng::seed_from_u64(5); + let (public_key_data, secret_key) = KeyType::BLS12_381 + .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) + .expect("expected to get keys"); + let decoded_secret_key = + blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) + .expect("expected to get secret key"); + let public_key = decoded_secret_key.public_key(); + let decoded_public_key_data = public_key.0.to_compressed(); + assert_eq!( + public_key_data.as_slice(), + decoded_public_key_data.as_slice() + ) + } + + #[test] + fn test_bls_serialization_deserialization_signature() { + let mut rng = StdRng::seed_from_u64(5); + let (_, secret_key) = KeyType::BLS12_381 + .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) + .expect("expected to get keys"); + let decoded_secret_key = + blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) + .expect("expected to get secret key"); + let signature = decoded_secret_key + .sign(SignatureSchemes::Basic, b"hello") + .expect("expected to sign"); + let compressed = signature.as_raw_value().to_compressed(); + let g2 = ::Signature::from_compressed(&compressed) + .expect("G2 projective"); + let decoded_signature = Signature::::Basic(g2); + assert_eq!( + compressed.as_slice(), + decoded_signature.as_raw_value().to_compressed().as_slice() + ) + } + #[cfg(feature = "random-public-keys")] #[test] fn test_validate_private_key_bytes_with_random_keys() { @@ -166,7 +201,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) @@ -207,7 +242,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) @@ -248,7 +283,7 @@ mod tests { ); // Test with an invalid private key - let invalid_private_key_bytes = vec![0u8; private_key_data.len()]; + let invalid_private_key_bytes = [0u8; 32]; assert_eq!( identity_public_key .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs index 162e836e1bc..a7ba471b3ad 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/random.rs @@ -68,7 +68,7 @@ impl IdentityPublicKeyV0 { rng: &mut StdRng, used_key_matrix: Option<(KeyCount, &mut UsedKeyMatrix)>, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { // we have 16 different permutations possible let mut binding = [false; 16].to_vec(); let (key_count, key_matrix) = used_key_matrix.unwrap_or((0, &mut binding)); @@ -124,7 +124,7 @@ impl IdentityPublicKeyV0 { key_type: KeyType, contract_bounds: Option, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let read_only = false; let (public_data, private_data) = key_type.random_public_and_private_key_data(rng, platform_version)?; @@ -197,7 +197,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = MASTER; @@ -223,7 +223,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = VOTING; let security_level = MEDIUM; @@ -249,7 +249,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = OWNER; let security_level = CRITICAL; @@ -275,7 +275,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_HASH160; let purpose = TRANSFER; let security_level = CRITICAL; @@ -301,7 +301,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = CRITICAL; @@ -327,7 +327,7 @@ impl IdentityPublicKeyV0 { id: KeyID, rng: &mut StdRng, platform_version: &PlatformVersion, - ) -> Result<(Self, Vec), ProtocolError> { + ) -> Result<(Self, [u8; 32]), ProtocolError> { let key_type = ECDSA_SECP256K1; let purpose = AUTHENTICATION; let security_level = HIGH; diff --git a/packages/rs-dpp/src/identity/random.rs b/packages/rs-dpp/src/identity/random.rs index d5f19f493ae..c14525272c1 100644 --- a/packages/rs-dpp/src/identity/random.rs +++ b/packages/rs-dpp/src/identity/random.rs @@ -66,8 +66,8 @@ impl Identity { ) -> Result<(Self, I), ProtocolError> where I: Default - + IntoIterator)> - + Extend<(IdentityPublicKey, Vec)>, + + IntoIterator + + Extend<(IdentityPublicKey, [u8; 32])>, { match platform_version .dpp @@ -234,8 +234,8 @@ impl Identity { ) -> Result<(Vec, I), ProtocolError> where I: Default - + FromIterator<(IdentityPublicKey, Vec)> - + Extend<(IdentityPublicKey, Vec)>, + + FromIterator<(IdentityPublicKey, [u8; 32])> + + Extend<(IdentityPublicKey, [u8; 32])>, { match platform_version .dpp diff --git a/packages/rs-dpp/src/identity/v0/random.rs b/packages/rs-dpp/src/identity/v0/random.rs index 2be4a34cfe1..5733aeda9ee 100644 --- a/packages/rs-dpp/src/identity/v0/random.rs +++ b/packages/rs-dpp/src/identity/v0/random.rs @@ -47,8 +47,8 @@ impl IdentityV0 { ) -> Result<(Self, I), ProtocolError> where I: Default - + IntoIterator)> - + Extend<(IdentityPublicKey, Vec)>, + + IntoIterator + + Extend<(IdentityPublicKey, [u8; 32])>, { let id = Identifier::new(rng.gen::<[u8; 32]>()); let revision = 0; @@ -126,11 +126,11 @@ impl IdentityV0 { ) -> Result<(Vec, I), ProtocolError> where I: Default - + FromIterator<(IdentityPublicKey, Vec)> - + Extend<(IdentityPublicKey, Vec)>, + + FromIterator<(IdentityPublicKey, [u8; 32])> + + Extend<(IdentityPublicKey, [u8; 32])>, { let mut vec: Vec = vec![]; - let mut private_key_map: Vec<(IdentityPublicKey, Vec)> = vec![]; + let mut private_key_map: Vec<(IdentityPublicKey, [u8; 32])> = vec![]; for _i in 0..count { let (identity, mut map) = Self::random_identity_with_main_keys_with_private_key( key_count, diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index a5d4ec177e9..9744e164551 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -90,7 +90,7 @@ pub mod prelude { pub use bincode; #[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] -pub use dashcore::bls_signatures; +pub use blsful as bls_signatures; #[cfg(feature = "ed25519-dalek")] pub use dashcore::ed25519_dalek; #[cfg(feature = "system_contracts")] diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index b1762b87060..b39852843b3 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -73,8 +73,10 @@ tokio-util = { version = "0.7" } derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" console-subscriber = { version = "0.4", optional = true } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3", optional = true } [dev-dependencies] +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } bs58 = { version = "0.5.0" } base64 = "0.22.1" platform-version = { path = "../rs-platform-version", features = [ @@ -104,7 +106,7 @@ integer-encoding = { version = "4.0.0" } [features] default = ["mocks"] -mocks = ["mockall", "drive/fixtures-and-mocks"] +mocks = ["mockall", "drive/fixtures-and-mocks", "bls-signatures"] console = ["console-subscriber", "tokio/tracing"] testing-config = [] grovedbg = ["drive/grovedbg"] diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 898eec524ca..1b3e5ef3dd2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -400,7 +400,7 @@ mod tests { use dashcore_rpc::dashcore_rpc_json::{MasternodeListItem, MasternodeType}; use dashcore_rpc::json::DMNState; use dpp::block::block_info::BlockInfo; - use dpp::bls_signatures::PrivateKey as BlsPrivateKey; + use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; use dpp::dashcore::hashes::Hash; use dpp::dashcore::Txid; use dpp::identifier::MasternodeIdentifiers; @@ -433,13 +433,15 @@ mod tests { let node_id_bytes: [u8; 20] = rng.gen(); // Create a public key operator and payout address - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let operator_key: IdentityPublicKey = IdentityPublicKeyV0 { id: 0, @@ -950,13 +952,15 @@ mod tests { ) = create_operator_identity(&platform, &mut rng); // Generate a new public key operator - let new_private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let new_pub_key_operator = new_private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state let masternode_list_item = MasternodeListItem { @@ -1040,13 +1044,15 @@ mod tests { ) = create_operator_identity(&platform, &mut rng); // Generate a new public key operator - let new_private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let new_pub_key_operator = new_private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state with original public key operator let masternode_list_item = MasternodeListItem { diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs index 5ca6ce40708..14320ad1d25 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_quorum_info/v0/mod.rs @@ -386,7 +386,7 @@ where )?; let public_key = - match BlsPublicKey::from_bytes(quorum_info.quorum_public_key.as_slice()) + match BlsPublicKey::try_from(quorum_info.quorum_public_key.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse) { Ok(public_key) => public_key, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs index 3af3b3fbd2d..397709ed19b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/mod.rs @@ -3,7 +3,7 @@ mod v0; use crate::error::execution::ExecutionError; use crate::error::Error; use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use dpp::dashcore::QuorumHash; use std::collections::BTreeMap; @@ -24,10 +24,10 @@ where // TODO: use CoreQuorumSet.select_quorums instead pub fn choose_quorum<'a>( llmq_quorum_type: QuorumType, - quorums: &'a BTreeMap, + quorums: &'a BTreeMap>, request_id: &[u8; 32], platform_version: &PlatformVersion, - ) -> Result, Error> { + ) -> Result)>, Error> { match platform_version .drive_abci .methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs index 0d8ac563e34..3b6d1f86739 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/choose_quorum/v0/mod.rs @@ -1,5 +1,5 @@ use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::QuorumHash; use std::collections::BTreeMap; @@ -12,11 +12,15 @@ impl Platform { /// Based on DIP8 deterministically chooses a pseudorandom quorum from the list of quorums pub(super) fn choose_quorum_v0<'a>( llmq_quorum_type: QuorumType, - quorums: &'a BTreeMap, + quorums: &'a BTreeMap>, request_id: &[u8; 32], - ) -> Option<(ReversedQuorumHashBytes, &'a BlsPublicKey)> { + ) -> Option<(ReversedQuorumHashBytes, &'a BlsPublicKey)> { // Scoring system logic - let mut scores: Vec<(ReversedQuorumHashBytes, &BlsPublicKey, [u8; 32])> = Vec::new(); + let mut scores: Vec<( + ReversedQuorumHashBytes, + &BlsPublicKey, + [u8; 32], + )> = Vec::new(); for (quorum_hash, public_key) in quorums { let mut quorum_hash_bytes = quorum_hash.to_byte_array().to_vec(); @@ -92,9 +96,11 @@ mod tests { use crate::platform_types::platform::Platform; use crate::rpc::core::MockCoreRPCLike; use dashcore_rpc::dashcore_rpc_json::QuorumType; - use dpp::bls_signatures::PublicKey as BlsPublicKey; + use dpp::bls_signatures::SecretKey; use dpp::dashcore::hashes::Hash; use dpp::dashcore::QuorumHash; + use rand::rngs::StdRng; + use rand::SeedableRng; use std::collections::BTreeMap; #[test] @@ -124,11 +130,12 @@ mod tests { .as_slice(), ) .unwrap(); + let mut rng = StdRng::seed_from_u64(345); let quorums = BTreeMap::from([ - (quorum_hash1, BlsPublicKey::generate()), - (quorum_hash2, BlsPublicKey::generate()), - (quorum_hash3, BlsPublicKey::generate()), - (quorum_hash4, BlsPublicKey::generate()), + (quorum_hash1, SecretKey::random(&mut rng).public_key()), + (quorum_hash2, SecretKey::random(&mut rng).public_key()), + (quorum_hash3, SecretKey::random(&mut rng).public_key()), + (quorum_hash4, SecretKey::random(&mut rng).public_key()), ]); // diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs index a48fc30c670..85bc67ddd4f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::G2Element; +use dpp::bls_signatures::{Bls12381G2Impl, Signature}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId}; @@ -37,7 +37,10 @@ where let quorum_config = quorum_set.config(); // First verify that the signature conforms to a signature - let Ok(signature) = G2Element::from_bytes(chain_lock.signature.as_bytes()) else { + + let Ok(signature) = + Signature::::try_from(chain_lock.signature.as_bytes().as_slice()) + else { return Ok(Some(false)); }; @@ -119,9 +122,12 @@ where let message_digest = sha256d::Hash::from_engine(engine); - let mut chain_lock_verified = quorum - .public_key - .verify(&signature, message_digest.as_ref()); + let mut chain_lock_verified = signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok(); tracing::debug!( ?chain_lock, @@ -162,9 +168,12 @@ where let message_digest = sha256d::Hash::from_engine(engine); - chain_lock_verified = quorum - .public_key - .verify(&signature, message_digest.as_ref()); + chain_lock_verified = signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok(); tracing::debug!( ?chain_lock, diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs index 335e5cb201c..a55f84ecf18 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::G2Element; +use dpp::bls_signatures::{Bls12381G2Impl, Signature}; use std::fmt::{Debug, Formatter}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; @@ -20,19 +20,20 @@ pub(super) fn verify_recent_instant_lock_signature_locally_v0( platform_state: &PlatformState, ) -> Result { // First verify that the signature conforms to a signature - let signature = match G2Element::from_bytes(instant_lock.signature.as_bytes()) { - Ok(signature) => signature, - Err(e) => { - tracing::trace!( - instant_lock = ?InstantLockDebug(instant_lock), - "Invalid instant Lock {} signature format: {}", - instant_lock.txid, - e, - ); + let signature = + match Signature::::try_from(instant_lock.signature.as_bytes().as_slice()) { + Ok(signature) => signature, + Err(e) => { + tracing::trace!( + instant_lock = ?InstantLockDebug(instant_lock), + "Invalid instant Lock {} signature format: {}", + instant_lock.txid, + e, + ); - return Ok(false); - } - }; + return Ok(false); + } + }; let signing_height = platform_state.last_committed_core_height(); let verification_height = signing_height.saturating_sub(SIGN_OFFSET); @@ -96,9 +97,12 @@ pub(super) fn verify_recent_instant_lock_signature_locally_v0( let message_digest = sha256d::Hash::from_engine(engine); - if quorum - .public_key - .verify(&signature, message_digest.as_ref()) + if signature + .verify( + &quorum.public_key, + message_digest.as_byte_array().as_slice(), + ) + .is_ok() { return Ok(true); } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs index 6347c9515c0..0f11ba2a64d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs @@ -5,7 +5,7 @@ use dpp::consensus::basic::identity::{ IdentityAssetLockTransactionIsNotFoundError, IdentityAssetLockTransactionOutputNotFoundError, InvalidAssetLockProofTransactionHeightError, }; -use dpp::dashcore::secp256k1::ThirtyTwoByteHash; +use dpp::dashcore::hashes::Hash; use dpp::dashcore::TxOut; use dpp::identity::state_transition::asset_lock_proof::validate_asset_lock_transaction_structure::validate_asset_lock_transaction_structure; use dpp::prelude::{AssetLockProof, ConsensusValidationResult}; @@ -49,7 +49,7 @@ pub fn fetch_asset_lock_transaction_output_sync_v0( let Some(transaction_info) = maybe_transaction_info else { // Transaction hash bytes needs to be reversed to match actual transaction hash - let mut hash = transaction_hash.as_raw_hash().into_32(); + let mut hash: [u8; 32] = *transaction_hash.as_raw_hash().as_byte_array(); hash.reverse(); return Ok(ValidationResult::new_with_error( diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index 0fb866b1074..f0c5f895bca 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -13,6 +13,7 @@ use crate::platform_types::withdrawal::unsigned_withdrawal_txs::v0::{ use crate::rpc::core::CoreRPCLike; use ciborium::Value as CborValue; use dpp::block::block_info::BlockInfo; +use dpp::bls_signatures::SignatureSchemes; use dpp::consensus::ConsensusError; use dpp::dashcore::hashes::Hash; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; @@ -514,9 +515,12 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { public_key = ?current_quorum.public_key, "Signing block" ); - let block_signature = current_quorum.private_key.sign(digest.as_slice()); + let block_signature = current_quorum + .private_key + .sign(SignatureSchemes::Basic, digest.as_slice()) + .expect("expected to be able to sign"); - commit_info.block_signature = block_signature.to_bytes().to_vec(); + commit_info.block_signature = block_signature.as_raw_value().to_compressed().to_vec(); } else { commit_info.block_signature = [0u8; 96].to_vec(); } diff --git a/packages/rs-drive-abci/src/mimic/test_quorum.rs b/packages/rs-drive-abci/src/mimic/test_quorum.rs index c1653183c6d..389abf3bc1c 100644 --- a/packages/rs-drive-abci/src/mimic/test_quorum.rs +++ b/packages/rs-drive-abci/src/mimic/test_quorum.rs @@ -3,8 +3,9 @@ use crate::platform_types::validator_set::v0::ValidatorSetV0; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::{QuorumInfoResult, QuorumMember, QuorumType}; -use dpp::bls_signatures; -use dpp::bls_signatures::{PrivateKey as BlsPrivateKey, PublicKey as BlsPublicKey}; +use dpp::bls_signatures::{ + Bls12381G2Impl, PublicKey as BlsPublicKey, PublicKey, SecretKey as BlsPrivateKey, SecretKey, +}; use rand::rngs::StdRng; use rand::Rng; use std::collections::BTreeMap; @@ -17,9 +18,9 @@ pub struct ValidatorInQuorum { /// The hash of the transaction that identifies this validator in the network. pub pro_tx_hash: ProTxHash, /// The private key for this validator's BLS signature scheme. - pub private_key: BlsPrivateKey, + pub private_key: BlsPrivateKey, /// The public key for this validator's BLS signature scheme. - pub public_key: BlsPublicKey, + pub public_key: BlsPublicKey, /// The node address pub node_ip: String, /// The node id @@ -102,9 +103,9 @@ pub struct TestQuorumInfo { /// A map of validators indexed by their `ProTxHash` identifiers. pub validator_map: BTreeMap, /// The private key used to sign messages for the quorum (for testing purposes only). - pub private_key: BlsPrivateKey, + pub private_key: BlsPrivateKey, /// The public key corresponding to the private key used for signing. - pub public_key: BlsPublicKey, + pub public_key: BlsPublicKey, } fn random_ipv4_address(rng: &mut StdRng) -> Ipv4Addr { @@ -135,6 +136,7 @@ impl TestQuorumInfo { pro_tx_hashes: Vec, rng: &mut StdRng, ) -> Self { + // We test on purpose with the bls library that Dash Core uses let private_keys = bls_signatures::PrivateKey::generate_dash_many(pro_tx_hashes.len(), rng) .expect("expected to generate private keys"); let bls_id_private_key_pairs = private_keys @@ -154,8 +156,12 @@ impl TestQuorumInfo { ValidatorInQuorum { pro_tx_hash: ProTxHash::from_slice(pro_tx_hash.as_slice()) .expect("expected 32 bytes for pro_tx_hash"), - private_key: key, - public_key, + private_key: SecretKey::from_be_bytes( + &key.to_bytes().to_vec().try_into().expect("32 bytes"), + ) + .expect("expected conversion to work"), + public_key: PublicKey::try_from(public_key.to_bytes().as_slice()) + .expect("expected conversion to work"), node_ip: random_socket_addr(rng).to_string(), node_id: PubkeyHash::from_slice(pro_tx_hash.split_at(20).0).unwrap(), core_port: 1, @@ -178,8 +184,16 @@ impl TestQuorumInfo { quorum_index, validator_set, validator_map: map, - private_key: recovered_private_key, - public_key, + private_key: SecretKey::from_be_bytes( + &recovered_private_key + .to_bytes() + .to_vec() + .try_into() + .expect("32 bytes"), + ) + .expect("expected conversion to work"), + public_key: PublicKey::try_from(public_key.to_bytes().as_slice()) + .expect("expected conversion to work"), } } } @@ -255,7 +269,7 @@ impl From<&TestQuorumInfo> for QuorumInfoResult { pro_tx_hash: *pro_tx_hash, pub_key_operator: vec![], //doesn't matter valid: true, - pub_key_share: Some(public_key.to_bytes().to_vec()), + pub_key_share: Some(public_key.0.to_compressed().to_vec()), } }) .collect(); @@ -266,7 +280,7 @@ impl From<&TestQuorumInfo> for QuorumInfoResult { quorum_index: 0, mined_block: vec![], members, - quorum_public_key: public_key.to_bytes().to_vec(), + quorum_public_key: public_key.0.to_compressed().to_vec(), secret_key_share: None, } } diff --git a/packages/rs-drive-abci/src/platform_types/commit/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/mod.rs index 1a24fddcd1b..a903ce25d86 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/mod.rs @@ -5,6 +5,7 @@ use crate::platform_types::cleaned_abci_messages::{cleaned_block_id, cleaned_com use crate::platform_types::commit::v0::CommitV0; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures; +use dpp::bls_signatures::Bls12381G2Impl; use dpp::validation::SimpleValidationResult; use dpp::version::PlatformVersion; use tenderdash_abci::proto::abci::CommitInfo; @@ -82,7 +83,7 @@ impl Commit { pub fn verify_signature( &self, signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> SimpleValidationResult { match self { Commit::V0(v0) => v0.verify_signature(signature, public_key), diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index 403a3fff30f..25c57f441cf 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -6,6 +6,7 @@ use crate::abci::AbciError; use crate::platform_types::cleaned_abci_messages::{cleaned_block_id, cleaned_commit_info}; use dashcore_rpc::dashcore_rpc_json::QuorumType; use dpp::bls_signatures; +use dpp::bls_signatures::{Bls12381G2Impl, BlsError, Pairing, Signature}; use dpp::validation::{SimpleValidationResult, ValidationResult}; use tenderdash_abci::proto; use tenderdash_abci::proto::abci::CommitInfo; @@ -81,24 +82,27 @@ impl CommitV0 { pub(super) fn verify_signature( &self, signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> SimpleValidationResult { if signature == &[0; 96] { return ValidationResult::new_with_error(AbciError::BadRequest( "commit signature not initialized".to_string(), )); } + // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let signature = match bls_signatures::Signature::from_bytes(signature).map_err(|e| { - AbciError::BlsErrorOfTenderdashThresholdMechanism( - e, + let g2_element = match ::Signature::from_compressed(&signature) + .into_option() + .ok_or(AbciError::BlsErrorOfTenderdashThresholdMechanism( + BlsError::InvalidSignature, "verification of a commit signature".to_string(), - ) - }) { + )) { Ok(signature) => signature, Err(e) => return ValidationResult::new_with_error(e), }; + let signature = Signature::Basic(g2_element); + //todo: maybe cache this to lower the chance of a hashing based attack (forcing the // same calculation each time) let quorum_hash = &self.inner.quorum_hash[..] @@ -120,11 +124,11 @@ impl CommitV0 { Err(e) => return ValidationResult::new_with_error(e), }; - match public_key.verify(&signature, &hash) { - true => ValidationResult::default(), - false => ValidationResult::new_with_error(AbciError::BadCommitSignature(format!( + match signature.verify(&public_key, &hash) { + Ok(_) => ValidationResult::default(), + Err(_) => ValidationResult::new_with_error(AbciError::BadCommitSignature(format!( "commit signature {} is wrong", - hex::encode(signature.to_bytes().as_slice()) + signature ))), } } @@ -184,7 +188,7 @@ mod test { }; let pubkey = hex::decode("8d63d603fe858be4d7c14a8f308936bd3447c1f361148ad508a04df92f48cd3b2f2b374ef5d1ee8a75f5aeda2f6f3418").unwrap(); - let pubkey = PublicKey::from_bytes(pubkey.as_slice()).unwrap(); + let pubkey = PublicKey::try_from(pubkey.as_slice()).unwrap(); let signature = hex::decode("b95efd51c69a0baf09b130871e735b49cb1b9a0d566bc7ba8fd0fa149dbd28539ab3df435e87ed2a83c94ea714bc8e120504b1cba9363b32c3d58499ed85ecf14539e8e99329fa7952420e4ad9da80b3b28388d62be00770988e4aee705da830").unwrap(); let commit = CommitV0::new_from_cleaned( diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index d1c2ccd4640..66ab8d427bc 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -1,3 +1,5 @@ +mod old_structures; + use crate::error::execution::ExecutionError; use crate::error::Error; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; @@ -143,7 +145,7 @@ pub struct PlatformStateForSavingV0 { /// The validator set quorums are a subset of the quorums, but they also contain the list of /// all members #[bincode(with_serde)] - pub validator_sets: Vec<(Bytes32, ValidatorSet)>, + pub validator_sets: Vec<(Bytes32, old_structures::ValidatorSet)>, /// The quorums used for validating chain locks pub chain_lock_validating_quorums: SignatureVerificationQuorumSetForSaving, @@ -267,7 +269,7 @@ impl From for PlatformStateV0 { validator_sets: value .validator_sets .into_iter() - .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v)) + .map(|(k, v)| (QuorumHash::from_byte_array(k.to_buffer()), v.into())) .collect(), chain_lock_validating_quorums: value.chain_lock_validating_quorums.into(), instant_lock_validating_quorums: value.instant_lock_validating_quorums.into(), diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs new file mode 100644 index 00000000000..d64e1e7723a --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs @@ -0,0 +1,103 @@ +use dpp::bls_signatures::PublicKey; +use dpp::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) enum ValidatorSet { + /// Version 0 + V0(ValidatorSetV0), +} + +impl From for dpp::core_types::validator_set::ValidatorSet { + fn from(value: ValidatorSet) -> Self { + match value { + ValidatorSet::V0(v0) => dpp::core_types::validator_set::ValidatorSet::V0(v0.into()), + } + } +} + +/// The validator set is only slightly different from a quorum as it does not contain non valid +/// members +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) struct ValidatorSetV0 { + /// The quorum hash + pub quorum_hash: QuorumHash, + /// Rotation quorum index is available only for DIP24 quorums + pub quorum_index: Option, + /// Active height + pub core_height: u32, + /// The list of masternodes + pub members: BTreeMap, + /// The threshold quorum public key + pub threshold_public_key: bls_signatures::PublicKey, +} + +impl From for dpp::core_types::validator_set::v0::ValidatorSetV0 { + fn from(value: ValidatorSetV0) -> Self { + let ValidatorSetV0 { + quorum_hash, + quorum_index, + core_height, + members, + threshold_public_key, + } = value; + Self { + quorum_hash, + quorum_index, + core_height, + members: members + .into_iter() + .map(|(pro_tx_hash, validator)| (pro_tx_hash, validator.into())) + .collect(), + threshold_public_key: PublicKey::try_from(threshold_public_key.to_bytes().as_slice()) + .unwrap(), + } + } +} + +/// A validator in the context of a quorum +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub(super) struct ValidatorV0 { + /// The proTxHash + pub pro_tx_hash: ProTxHash, + /// The public key share of this validator for this quorum + pub public_key: Option, + /// The node address + pub node_ip: String, + /// The node id + pub node_id: PubkeyHash, + /// Core port + pub core_port: u16, + /// Http port + pub platform_http_port: u16, + /// Tenderdash port + pub platform_p2p_port: u16, + /// Is the validator banned + pub is_banned: bool, +} + +impl From for dpp::core_types::validator::v0::ValidatorV0 { + fn from(value: ValidatorV0) -> Self { + let ValidatorV0 { + pro_tx_hash, + public_key, + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + } = value; + Self { + pro_tx_hash, + public_key: public_key.map(|pk| PublicKey::try_from(pk.to_bytes().as_slice()).unwrap()), + node_ip, + node_id, + core_port, + platform_http_port, + platform_p2p_port, + is_banned, + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs index 8d0eac3c0a3..38c00188ecd 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs @@ -4,6 +4,7 @@ use crate::config::QuorumLikeConfig; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::signature_verification_quorum_set::v0::for_saving::SignatureVerificationQuorumSetForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v1::SignatureVerificationQuorumSetForSavingV1; pub use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ QuorumConfig, QuorumsWithConfig, SelectedQuorumSetIterator, SignatureVerificationQuorumSetV0, SignatureVerificationQuorumSetV0Methods, SIGN_OFFSET, @@ -118,13 +119,15 @@ impl SignatureVerificationQuorumSetV0Methods for SignatureVerificationQuorumSet pub enum SignatureVerificationQuorumSetForSaving { /// Version 0 of the signature verification quorums V0(SignatureVerificationQuorumSetForSavingV0), + /// Version 0 of the signature verification quorums + V1(SignatureVerificationQuorumSetForSavingV1), } impl From for SignatureVerificationQuorumSetForSaving { fn from(value: SignatureVerificationQuorumSet) -> Self { match value { SignatureVerificationQuorumSet::V0(v0) => { - SignatureVerificationQuorumSetForSaving::V0(v0.into()) + SignatureVerificationQuorumSetForSaving::V1(v0.into()) } } } @@ -136,6 +139,9 @@ impl From for SignatureVerificationQuor SignatureVerificationQuorumSetForSaving::V0(v0) => { SignatureVerificationQuorumSet::V0(v0.into()) } + SignatureVerificationQuorumSetForSaving::V1(v1) => { + SignatureVerificationQuorumSet::V0(v1.into()) + } } } } diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs index a1ce283885a..1c6a07db91f 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs @@ -3,7 +3,7 @@ use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ }; use crate::platform_types::signature_verification_quorum_set::{ Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, - ThresholdBlsPublicKey, VerificationQuorum, + VerificationQuorum, }; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::QuorumHash; @@ -135,7 +135,7 @@ impl From for PreviousPastQuorumsV0 { pub struct QuorumForSavingV0 { hash: Bytes32, #[bincode(with_serde)] - public_key: ThresholdBlsPublicKey, + public_key: bls_signatures::PublicKey, index: Option, } @@ -145,7 +145,10 @@ impl From> for Quorums { ( QuorumHash::from_byte_array(quorum.hash.to_buffer()), VerificationQuorum { - public_key: quorum.public_key, + public_key: dpp::bls_signatures::PublicKey::try_from( + quorum.public_key.to_bytes().as_slice(), + ) + .expect("expected to convert between BLS key libraries (from chia)"), index: quorum.index, }, ) @@ -159,7 +162,10 @@ impl Into> for Quorums { self.into_iter() .map(|(hash, quorum)| QuorumForSavingV0 { hash: Bytes32::from(hash.as_byte_array()), - public_key: quorum.public_key, + public_key: bls_signatures::PublicKey::from_bytes( + &quorum.public_key.0.to_compressed(), + ) + .expect("expected to convert between BLS key libraries (to chia)"), index: quorum.index, }) .collect() diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs new file mode 100644 index 00000000000..c7e9bbaf105 --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs @@ -0,0 +1,93 @@ +use crate::platform_types::signature_verification_quorum_set::v0::for_saving::{ + PreviousPastQuorumsForSavingV0, QuorumConfigForSavingV0, +}; +use crate::platform_types::signature_verification_quorum_set::{ + Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, + ThresholdBlsPublicKey, VerificationQuorum, +}; +use dashcore_rpc::dashcore::hashes::Hash; +use dashcore_rpc::dashcore::QuorumHash; +use dpp::bls_signatures::Bls12381G2Impl; +use dpp::identity::state_transition::asset_lock_proof::Encode; +use dpp::platform_serialization::de::Decode; +use dpp::platform_value::Bytes32; + +#[derive(Debug, Clone, Encode, Decode)] +pub struct SignatureVerificationQuorumSetForSavingV1 { + config: QuorumConfigForSavingV0, + current_quorums: Vec, + previous_quorums: Option, +} + +impl From for SignatureVerificationQuorumSetForSaving { + fn from(value: SignatureVerificationQuorumSetForSavingV1) -> Self { + SignatureVerificationQuorumSetForSaving::V1(value) + } +} + +impl From for SignatureVerificationQuorumSetForSavingV1 { + fn from(value: SignatureVerificationQuorumSetV0) -> Self { + let SignatureVerificationQuorumSetV0 { + config, + current_quorums, + previous, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous_quorums: previous.map(|previous| previous.into()), + } + } +} + +impl From for SignatureVerificationQuorumSetV0 { + fn from(value: SignatureVerificationQuorumSetForSavingV1) -> Self { + let SignatureVerificationQuorumSetForSavingV1 { + config, + current_quorums, + previous_quorums, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous: previous_quorums.map(|previous| previous.into()), + } + } +} + +#[derive(Debug, Clone, Encode, Decode)] +pub struct QuorumForSavingV1 { + hash: Bytes32, + #[bincode(with_serde)] + public_key: ThresholdBlsPublicKey, + index: Option, +} + +impl From> for Quorums { + fn from(value: Vec) -> Self { + Quorums::from_iter(value.into_iter().map(|quorum| { + ( + QuorumHash::from_byte_array(quorum.hash.to_buffer()), + VerificationQuorum { + public_key: quorum.public_key, + index: quorum.index, + }, + ) + })) + } +} + +#[allow(clippy::from_over_into)] +impl Into> for Quorums { + fn into(self) -> Vec { + self.into_iter() + .map(|(hash, quorum)| QuorumForSavingV1 { + hash: Bytes32::from(hash.as_byte_array()), + public_key: quorum.public_key, + index: quorum.index, + }) + .collect() + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs index e78d6c1c7f4..f38657c29ca 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs @@ -1,3 +1,4 @@ pub mod for_saving; +pub mod for_saving_v1; pub mod quorum_set; pub mod quorums; diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs index 112b877a9b8..7a38272f900 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorums.rs @@ -1,13 +1,13 @@ use derive_more::{Deref, DerefMut, From}; -use dpp::bls_signatures::PrivateKey; +use dpp::bls_signatures; +pub use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, SignatureSchemes}; use dpp::dashcore::bls_sig_utils::BLSSignature; use dpp::dashcore::{QuorumHash, Txid}; use std::collections::BTreeMap; use std::convert::TryInto; use std::fmt::Debug; -pub use dpp::bls_signatures::PublicKey as ThresholdBlsPublicKey; - use crate::error::Error; use crate::platform_types::signature_verification_quorum_set::QuorumConfig; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; @@ -149,17 +149,14 @@ pub struct VerificationQuorum { /// Quorum threshold public key is used to verify /// signatures produced by corresponding quorum - pub public_key: ThresholdBlsPublicKey, + pub public_key: ThresholdBlsPublicKey, } impl Debug for VerificationQuorum { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("VerificationQuorum") .field("index", &self.index) - .field( - "public_key", - &hex::encode(*self.public_key.to_bytes()).to_string(), - ) + .field("public_key", &self.public_key.to_string()) .finish() } } @@ -210,11 +207,21 @@ impl SigningQuorum { let message_digest = sha256d::Hash::from_engine(engine); let private_key = - PrivateKey::from_bytes(&self.private_key, false).map_err(Error::BLSError)?; - - let g2element = private_key.sign(message_digest.as_ref()); - let g2element_bytes = *g2element.to_bytes(); + bls_signatures::SecretKey::::from_be_bytes(&self.private_key) + .into_option() + .ok_or(Error::BLSError( + dpp::bls_signatures::BlsError::DeserializationError( + "Could not deserialize private key".to_string(), + ), + ))?; + + let signature = private_key + .sign( + SignatureSchemes::Basic, + message_digest.as_byte_array().as_slice(), + ) + .map_err(Error::BLSError)?; - Ok(BLSSignature::from(g2element_bytes)) + Ok(BLSSignature::from(signature.as_raw_value().to_compressed())) } } diff --git a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs index 433fe506bf6..798713b0e00 100644 --- a/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator/v0/mod.rs @@ -1,14 +1,14 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use dashcore_rpc::json::{DMNState, MasternodeListItem}; -use dpp::bls_signatures::PublicKey as BlsPublicKey; +use dpp::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; pub use dpp::core_types::validator::v0::*; use dpp::dashcore::hashes::Hash; use dpp::dashcore::{ProTxHash, PubkeyHash}; pub(crate) trait NewValidatorIfMasternodeInState { fn new_validator_if_masternode_in_state( pro_tx_hash: ProTxHash, - public_key: Option, + public_key: Option>, state: &PlatformState, ) -> Option; } @@ -17,7 +17,7 @@ impl NewValidatorIfMasternodeInState for ValidatorV0 { /// Makes a validator if the masternode is in the list and is valid fn new_validator_if_masternode_in_state( pro_tx_hash: ProTxHash, - public_key: Option, + public_key: Option>, state: &PlatformState, ) -> Option { let MasternodeListItem { state, .. } = state.hpmn_masternode_list().get(&pro_tx_hash)?; diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index f7141d1ff4b..6ce9f40c0b6 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -55,8 +55,8 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { return Err(Error::Execution(ExecutionError::CorruptedCachedState( format!( "updating validator set doesn't match threshold public key ours: {} theirs: {}", - hex::encode(*self.threshold_public_key.to_bytes()), - hex::encode(*rhs.threshold_public_key.to_bytes()) + hex::encode(self.threshold_public_key.0.to_compressed()), + hex::encode(rhs.threshold_public_key.0.to_compressed()) ), ))); } @@ -99,7 +99,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(Ok(abci::ValidatorUpdate { pub_key: public_key.clone().map(|public_key| { crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + public_key.0.to_compressed().to_vec(), + )), } }), power: 100, @@ -131,7 +133,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(Ok(abci::ValidatorUpdate { pub_key: public_key.clone().map(|public_key| { crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + public_key.0.to_compressed().to_vec(), + )), } }), power: 100, @@ -148,7 +152,9 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Ok(ValidatorSetUpdate { validator_updates, threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(self.threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + self.threshold_public_key.0.to_compressed().to_vec(), + )), }), quorum_hash: self.quorum_hash.to_byte_array().to_vec(), }) @@ -186,7 +192,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { ); Some(abci::ValidatorUpdate { pub_key: public_key.as_ref().map(|public_key| crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381(public_key.0.to_compressed().to_vec())), }), power: 100, pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), @@ -195,7 +201,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect(), threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381(threshold_public_key.0.to_compressed().to_vec())), }), quorum_hash: quorum_hash.to_byte_array().to_vec(), } @@ -233,7 +239,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { Some(abci::ValidatorUpdate { pub_key: public_key.map(|public_key| crypto::PublicKey { - sum: Some(Bls12381(public_key.to_bytes().to_vec())), + sum: Some(Bls12381(public_key.0.to_compressed().to_vec())), }), power: 100, pro_tx_hash: pro_tx_hash.to_byte_array().to_vec(), @@ -242,7 +248,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect(), threshold_public_key: Some(crypto::PublicKey { - sum: Some(Bls12381(threshold_public_key.to_bytes().to_vec())), + sum: Some(Bls12381(threshold_public_key.0.to_compressed().to_vec())), }), quorum_hash: quorum_hash.to_byte_array().to_vec(), } @@ -271,7 +277,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { } let public_key = if let Some(public_key_share) = quorum_member.pub_key_share { - match BlsPublicKey::from_bytes(public_key_share.as_slice()) + match BlsPublicKey::try_from(public_key_share.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse) { Ok(public_key) => Some(public_key), @@ -290,7 +296,7 @@ impl ValidatorSetMethodsV0 for ValidatorSetV0 { }) .collect::, Error>>()?; - let threshold_public_key = BlsPublicKey::from_bytes(quorum_public_key.as_slice()) + let threshold_public_key = BlsPublicKey::try_from(quorum_public_key.as_slice()) .map_err(ExecutionError::BlsErrorFromDashCoreResponse)?; let optional_quorum_index = if quorum_index == 0 { diff --git a/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs index f512f4b8f09..bf75b0c5225 100644 --- a/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/current_quorums_info/v0/mod.rs @@ -40,7 +40,11 @@ impl Platform { quorum_hash: validator_set.quorum_hash().as_byte_array().to_vec(), core_height: validator_set.core_height(), members, - threshold_public_key: validator_set.threshold_public_key().to_bytes().to_vec(), + threshold_public_key: validator_set + .threshold_public_key() + .0 + .to_compressed() + .to_vec(), } }) .collect(); diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index 777dc361a29..d02a11e9500 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -20,7 +20,7 @@ use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use dashcore_rpc::json::{ExtendedQuorumListResult, SoftforkInfo}; -use dpp::bls_signatures::PrivateKey; +use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey, SignatureSchemes}; use dpp::dashcore::consensus::Encodable; use dpp::dashcore::hashes::{sha256d, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId, VarInt}; @@ -352,7 +352,7 @@ pub(crate) fn run_chain_for_strategy<'a>( instant_lock_quorums_infos .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -379,7 +379,7 @@ pub(crate) fn run_chain_for_strategy<'a>( let signing_quorums = validator_quorums .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -653,7 +653,7 @@ pub(crate) fn run_chain_for_strategy<'a>( let chain_lock_quorums_private_keys: BTreeMap = chain_lock_quorums .iter() .map(|(quorum_hash, info)| { - let bytes = info.private_key.to_bytes(); + let bytes = info.private_key.to_be_bytes(); let fixed_bytes: [u8; 32] = bytes .as_slice() .try_into() @@ -728,13 +728,18 @@ pub(crate) fn run_chain_for_strategy<'a>( let message_digest = sha256d::Hash::from_engine(engine); let quorum_private_key = - PrivateKey::from_bytes(quorum_private_key.as_slice(), false) + BlsPrivateKey::::from_be_bytes(quorum_private_key) .expect("expected to have a valid private key"); - let signature = quorum_private_key.sign(message_digest.as_byte_array()); + let signature = quorum_private_key + .sign( + SignatureSchemes::Basic, + message_digest.as_byte_array().as_slice(), + ) + .expect("expected to sign"); let chain_lock = ChainLock { block_height, block_hash: BlockHash::from_byte_array(*block_hash), - signature: (*signature.to_bytes()).into(), + signature: signature.as_raw_value().to_compressed().into(), }; Ok(chain_lock) @@ -847,7 +852,9 @@ pub(crate) fn start_chain_for_strategy( .map( |validator_in_quorum| tenderdash_abci::proto::abci::ValidatorUpdate { pub_key: Some(tenderdash_abci::proto::crypto::PublicKey { - sum: Some(Bls12381(validator_in_quorum.public_key.to_bytes().to_vec())), + sum: Some(Bls12381( + validator_in_quorum.public_key.0.to_compressed().to_vec(), + )), }), power: 100, pro_tx_hash: validator_in_quorum.pro_tx_hash.to_byte_array().to_vec(), @@ -857,7 +864,11 @@ pub(crate) fn start_chain_for_strategy( .collect(), threshold_public_key: Some(tenderdash_abci::proto::crypto::PublicKey { sum: Some(Bls12381( - current_quorum_with_test_info.public_key.to_bytes().to_vec(), + current_quorum_with_test_info + .public_key + .0 + .to_compressed() + .to_vec(), )), }), quorum_hash: current_validator_quorum_hash.to_byte_array().to_vec(), diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 03bb92bc1ad..4194e306896 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -3,7 +3,7 @@ extern crate core; -use dpp::bls_signatures::PrivateKey as BlsPrivateKey; +use dpp::bls_signatures::SecretKey as BlsPrivateKey; use drive_abci::test::helpers::setup::TestPlatformBuilder; use drive_abci::{config::PlatformConfig, test::helpers::setup::TempPlatform}; diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs index f89be95ee15..bdd1ecc9111 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs @@ -1,5 +1,6 @@ use crate::BlsPrivateKey; use dashcore_rpc::json::MasternodeListItem; +use dpp::bls_signatures::Bls12381G2Impl; use rand::prelude::IteratorRandom; use rand::rngs::StdRng; use rand::Rng; @@ -32,13 +33,16 @@ impl UpdateMasternodeListItem for MasternodeListItem { 1 => self.state.voting_address = rng.gen::<[u8; 20]>(), 2 => self.state.payout_address = rng.gen::<[u8; 20]>(), 3 => { - let private_key_operator = BlsPrivateKey::generate_dash(rng) - .expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = + private_key_operator.public_key().0.to_compressed().to_vec(); self.state.pub_key_operator = pub_key_operator; } 4 => { @@ -83,13 +87,15 @@ mod tests { let mut rng = StdRng::seed_from_u64(0); let i = 0; let pro_tx_hash = ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()); - let private_key_operator = - BlsPrivateKey::generate_dash(&mut rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(&mut rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Regular, pro_tx_hash, diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs index 51693b5b60f..89a9697d442 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs @@ -2,7 +2,7 @@ use crate::masternode_list_item_helpers::UpdateMasternodeListItem; use dashcore_rpc::dashcore::hashes::Hash; use dashcore_rpc::dashcore::{ProTxHash, QuorumHash, Txid}; use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeListItem, MasternodeType}; -use dpp::bls_signatures::PrivateKey as BlsPrivateKey; +use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::IdentityPublicKey; use drive_abci::mimic::test_quorum::TestQuorumInfo; @@ -209,13 +209,15 @@ pub fn generate_test_masternodes( } for i in 0..masternode_count { - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let pro_tx_hash = ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Regular, @@ -345,13 +347,15 @@ pub fn generate_test_masternodes( } for i in 0..hpmn_count { - let private_key_operator = - BlsPrivateKey::generate_dash(rng).expect("expected to generate a private key"); - let pub_key_operator = private_key_operator - .g1_element() - .expect("expected to get public key") + let private_key_operator_bytes = bls_signatures::PrivateKey::generate_dash(rng) + .expect("expected to generate a private key") .to_bytes() .to_vec(); + let private_key_operator = BlsPrivateKey::::from_be_bytes( + &private_key_operator_bytes.try_into().unwrap(), + ) + .unwrap(); + let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Evo, pro_tx_hash: ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()), diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index a7b035dfdb2..969a969cbe5 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -5,6 +5,7 @@ use dapi_grpc::platform::v0::{ GetIdentityByPublicKeyHashRequest, Proof, }; use dashcore_rpc::dashcore_rpc_json::QuorumType; +use dpp::bls_signatures::{Bls12381G2Impl, BlsResult}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMethodsV0; @@ -68,7 +69,7 @@ pub struct ProofVerification<'a> { pub signature: &'a [u8; 96], /// Threshold key used to verify the signature - pub public_key: &'a dpp::bls_signatures::PublicKey, + pub public_key: &'a dpp::bls_signatures::PublicKey, } impl<'a> ProofVerification<'a> { @@ -105,7 +106,9 @@ impl<'a> ProofVerification<'a> { Err(e) => return SimpleValidationResult::new_with_error(e.into()), }; // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let signature = match dpp::bls_signatures::Signature::from_bytes(self.signature) { + let signature = match dpp::bls_signatures::Signature::::try_from( + self.signature.as_slice(), + ) { Ok(signature) => signature, Err(e) => { return SimpleValidationResult::new_with_error( @@ -123,14 +126,11 @@ impl<'a> ProofVerification<'a> { verification_context = ?self, "Proof verification" ); - match self.public_key.verify(&signature, &digest) { - true => SimpleValidationResult::default(), - false => { - SimpleValidationResult::new_with_error(AbciError::BadCommitSignature(format!( - "commit signature {} is wrong", - hex::encode(signature.to_bytes().as_slice()) - ))) - } + match signature.verify(self.public_key, &digest) { + Ok(_) => SimpleValidationResult::default(), + Err(e) => SimpleValidationResult::new_with_error(AbciError::BadCommitSignature( + format!("commit signature {} is wrong: {}", signature, e), + )), } } diff --git a/packages/rs-drive-proof-verifier/src/unproved.rs b/packages/rs-drive-proof-verifier/src/unproved.rs index cc7c63c83ef..93e18b7e214 100644 --- a/packages/rs-drive-proof-verifier/src/unproved.rs +++ b/packages/rs-drive-proof-verifier/src/unproved.rs @@ -249,8 +249,8 @@ impl FromUnproved for CurrentQuorumsInfo quorum_index: None, // Assuming it's not provided here core_height: vs.core_height, members, - threshold_public_key: BlsPublicKey::from_bytes( - &vs.threshold_public_key, + threshold_public_key: BlsPublicKey::try_from( + vs.threshold_public_key.as_slice(), ) .map_err(|_| Error::ProtocolError { error: "Invalid BlsPublicKey format".to_string(), diff --git a/packages/rs-drive-proof-verifier/src/verify.rs b/packages/rs-drive-proof-verifier/src/verify.rs index 284efb5a894..6015999df2e 100644 --- a/packages/rs-drive-proof-verifier/src/verify.rs +++ b/packages/rs-drive-proof-verifier/src/verify.rs @@ -1,13 +1,13 @@ use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; use dpp::bls_signatures; +use crate::Error; +use dpp::bls_signatures::{Bls12381G2Impl, Pairing, Signature}; use tenderdash_abci::{ proto::types::{CanonicalVote, SignedMsgType, StateId}, signatures::{Hashable, Signable}, }; -use crate::Error; - use crate::ContextProvider; /// Verify cryptographic proof generated by Tenderdash @@ -92,11 +92,10 @@ pub(crate) fn verify_tenderdash_proof( } })?; - let pubkey = bls_signatures::PublicKey::from_bytes(&pubkey_bytes).map_err(|e| { - Error::InvalidPublicKey { + let pubkey = bls_signatures::PublicKey::::try_from(pubkey_bytes.as_slice()) + .map_err(|e| Error::InvalidPublicKey { error: e.to_string(), - } - })?; + })?; tracing::trace!( ?state_id, @@ -123,18 +122,20 @@ pub(crate) fn verify_tenderdash_proof( pub fn verify_signature_digest( sign_digest: &[u8], signature: &[u8; 96], - public_key: &bls_signatures::PublicKey, + public_key: &bls_signatures::PublicKey, ) -> Result { if signature == &[0; 96] { return Err(Error::SignatureVerificationError { error: "empty signature".to_string(), }); } - let signature = bls_signatures::Signature::from_bytes(signature).map_err(|e| { - Error::SignatureVerificationError { - error: e.to_string(), - } - })?; + let signature = Signature::Basic( + ::Signature::from_compressed(&signature) + .into_option() + .ok_or(Error::SignatureVerificationError { + error: "Could not verify signature digest".to_string(), + })?, + ); - Ok(public_key.verify(&signature, sign_digest)) + Ok(signature.verify(public_key, sign_digest).is_ok()) } diff --git a/packages/simple-signer/src/signer.rs b/packages/simple-signer/src/signer.rs index 448e1a5c9c3..04a9b325d3a 100644 --- a/packages/simple-signer/src/signer.rs +++ b/packages/simple-signer/src/signer.rs @@ -2,6 +2,7 @@ use base64::prelude::BASE64_STANDARD; use base64::Engine; use dashcore_rpc::dashcore::signer; use dpp::bincode::{Decode, Encode}; +use dpp::bls_signatures::{Bls12381G2Impl, SignatureSchemes}; use dpp::ed25519_dalek::Signer as BlsSigner; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::signer::Signer; @@ -16,9 +17,9 @@ use std::fmt::{Debug, Formatter}; #[derive(Default, Clone, PartialEq, Encode, Decode)] pub struct SimpleSigner { /// Private keys is a map from the public key to the Private key bytes - pub private_keys: BTreeMap>, + pub private_keys: BTreeMap, /// Private keys to be added at the end of a block - pub private_keys_in_creation: BTreeMap>, + pub private_keys_in_creation: BTreeMap, } impl Debug for SimpleSigner { @@ -46,12 +47,12 @@ impl Debug for SimpleSigner { impl SimpleSigner { /// Add a key to the signer - pub fn add_key(&mut self, public_key: IdentityPublicKey, private_key: Vec) { + pub fn add_key(&mut self, public_key: IdentityPublicKey, private_key: [u8; 32]) { self.private_keys.insert(public_key, private_key); } /// Add keys to the signer - pub fn add_keys)>>(&mut self, keys: I) { + pub fn add_keys>(&mut self, keys: I) { self.private_keys.extend(keys) } @@ -81,13 +82,15 @@ impl Signer for SimpleSigner { Ok(signature.to_vec().into()) } KeyType::BLS12_381 => { - let pk = - bls_signatures::PrivateKey::from_bytes(private_key, false).map_err(|_e| { - ProtocolError::Generic( - "bls private key from bytes isn't correct".to_string(), - ) - })?; - Ok(pk.sign(data).to_bytes().to_vec().into()) + let pk = bls_signatures::SecretKey::::from_be_bytes(private_key) + .into_option() + .ok_or(ProtocolError::Generic( + "bls private key from bytes isn't correct".to_string(), + ))?; + let signature = pk + .sign(SignatureSchemes::Basic, data) + .map_err(|e| ProtocolError::Generic(format!("unable to sign {}", e)))?; + Ok(signature.as_raw_value().to_compressed().to_vec().into()) } KeyType::EDDSA_25519_HASH160 => { let key: [u8; 32] = private_key.clone().try_into().expect("expected 32 bytes"); From 46d96987557abb24883219968e0f758f5a1671e5 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Sat, 19 Oct 2024 16:51:14 +0700 Subject: [PATCH 14/30] more work --- Cargo.lock | 28 ++++++----- packages/rs-dpp/Cargo.toml | 5 +- packages/rs-dpp/src/bls/native_bls.rs | 46 +++++++++++------ .../rs-dpp/src/core_types/validator/mod.rs | 3 +- .../rs-dpp/src/core_types/validator/v0/mod.rs | 5 +- .../src/core_types/validator_set/mod.rs | 3 +- .../src/core_types/validator_set/v0/mod.rs | 4 +- packages/rs-dpp/src/errors/protocol_error.rs | 5 ++ .../identity/identity_public_key/key_type.rs | 50 ++++++++----------- .../identity_public_key/v0/methods/mod.rs | 28 ++++++----- packages/rs-dpp/src/lib.rs | 4 +- packages/rs-dpp/src/signing.rs | 45 ++++++++++------- packages/rs-drive-abci/Cargo.toml | 7 ++- .../platform_types/platform_state/v0/mod.rs | 2 +- packages/rs-sdk/Cargo.toml | 2 +- packages/simple-signer/Cargo.toml | 2 +- 16 files changed, 134 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50a561805e8..390413e0afb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1231,14 +1231,14 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.32.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +version = "0.33.1" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" dependencies = [ "anyhow", "bech32", "bitflags 2.6.0", - "bls-signatures", - "dashcore-private", + "blsful", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", "dashcore_hashes", "ed25519-dalek", "hex", @@ -1256,12 +1256,17 @@ name = "dashcore-private" version = "0.1.0" source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +[[package]] +name = "dashcore-private" +version = "0.1.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" + [[package]] name = "dashcore-rpc" -version = "0.15.8" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" +version = "0.15.9" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" dependencies = [ - "dashcore-private", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.32.0)", "dashcore-rpc-json", "env_logger 0.10.2", "hex", @@ -1273,8 +1278,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.8" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.8#4d4d5b1488daa7f083d254a1f5acf03b550d5b10" +version = "0.15.9" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" dependencies = [ "bincode", "dashcore", @@ -1288,9 +1293,9 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" dependencies = [ - "dashcore-private", + "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", "secp256k1", "serde", ] @@ -1455,7 +1460,6 @@ dependencies = [ "async-trait", "base64 0.22.1", "bincode", - "blsful", "bs58", "byteorder", "chrono", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 68aa7346392..b2886970bae 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -22,14 +22,13 @@ chrono = { version = "0.4.35", default-features = false, features = [ "clock", ] } ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } -blsful = { version = "3.0.0-pre6" , optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "std", "secp-recovery", "rand", "signer", "serde" -], default-features = false, tag = "0.32.0" } +], default-features = false, tag = "0.33.1" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } @@ -74,7 +73,7 @@ once_cell = "1.7" [features] default = ["platform-value", "state-transitions"] -bls-signatures = ["dashcore/bls", "blsful"] +bls-signatures = ["dashcore/bls"] ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", diff --git a/packages/rs-dpp/src/bls/native_bls.rs b/packages/rs-dpp/src/bls/native_bls.rs index 5dc7e2bc828..e8e1fd939fc 100644 --- a/packages/rs-dpp/src/bls/native_bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -1,12 +1,14 @@ +use crate::bls_signatures::{ + Bls12381G2Impl, Pairing, PublicKey, SecretKey, Signature, SignatureSchemes, +}; use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; use anyhow::anyhow; -use dashcore::bls_signatures::{self, PrivateKey, PublicKey}; #[derive(Default)] pub struct NativeBlsModule; impl BlsModule for NativeBlsModule { fn validate_public_key(&self, pk: &[u8]) -> Result<(), PublicKeyValidationError> { - match PublicKey::from_bytes(pk) { + match PublicKey::::try_from(pk) { Ok(_) => Ok(()), Err(e) => Err(PublicKeyValidationError::new(e.to_string())), } @@ -18,13 +20,21 @@ impl BlsModule for NativeBlsModule { data: &[u8], public_key: &[u8], ) -> Result { - let public_key = PublicKey::from_bytes(public_key).map_err(anyhow::Error::msg)?; - let signature = - bls_signatures::Signature::from_bytes(signature).map_err(anyhow::Error::msg)?; - match public_key.verify(&signature, data) { - true => Ok(true), - // TODO change to specific error type - false => Err(anyhow!("Verification failed").into()), + let public_key = + PublicKey::::try_from(public_key).map_err(anyhow::Error::msg)?; + let signature_96_bytes = signature + .try_into() + .map_err(|_| anyhow!("signature wrong size"))?; + let g2_element = + ::Signature::from_compressed(&signature_96_bytes) + .into_option() + .ok_or(anyhow!("signature derivation failed"))?; + + let signature = Signature::Basic(g2_element); + + match signature.verify(&public_key, data) { + Ok(_) => Ok(true), + Err(_) => Err(anyhow!("Verification failed").into()), } } @@ -32,9 +42,11 @@ impl BlsModule for NativeBlsModule { let fixed_len_key: [u8; 32] = private_key .try_into() .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; - let pk = PrivateKey::from_bytes(&fixed_len_key, false).map_err(anyhow::Error::msg)?; - let public_key = pk.g1_element().map_err(anyhow::Error::msg)?; - let public_key_bytes = public_key.to_bytes().to_vec(); + let pk = SecretKey::::from_be_bytes(&fixed_len_key) + .into_option() + .ok_or(anyhow!("Incorrect Priv Key"))?; + let public_key = pk.public_key(); + let public_key_bytes = public_key.0.to_compressed().to_vec(); Ok(public_key_bytes) } @@ -42,7 +54,13 @@ impl BlsModule for NativeBlsModule { let fixed_len_key: [u8; 32] = private_key .try_into() .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; - let pk = PrivateKey::from_bytes(&fixed_len_key, false).map_err(anyhow::Error::msg)?; - Ok(pk.sign(data).to_bytes().to_vec()) + let pk = SecretKey::::from_be_bytes(&fixed_len_key) + .into_option() + .ok_or(anyhow!("Incorrect Priv Key"))?; + Ok(pk + .sign(SignatureSchemes::Basic, data)? + .as_raw_value() + .to_compressed() + .to_vec()) } } diff --git a/packages/rs-dpp/src/core_types/validator/mod.rs b/packages/rs-dpp/src/core_types/validator/mod.rs index d5f985a3c14..01716ab044f 100644 --- a/packages/rs-dpp/src/core_types/validator/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/mod.rs @@ -1,6 +1,5 @@ -use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use crate::core_types::validator::v0::{ValidatorV0, ValidatorV0Getters, ValidatorV0Setters}; -use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, PubkeyHash}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; diff --git a/packages/rs-dpp/src/core_types/validator/v0/mod.rs b/packages/rs-dpp/src/core_types/validator/v0/mod.rs index 81f73a66af4..fe45fe675da 100644 --- a/packages/rs-dpp/src/core_types/validator/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator/v0/mod.rs @@ -1,8 +1,7 @@ use dashcore::{ProTxHash, PubkeyHash}; use std::fmt::{Debug, Formatter}; -use crate::bls_signatures::PublicKey as BlsPublicKey; -use blsful::Bls12381G2Impl; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; #[cfg(feature = "core-types-serde-conversion")] use serde::{Deserialize, Serialize}; @@ -261,7 +260,7 @@ impl ValidatorV0Setters for ValidatorV0 { mod tests { use super::*; use bincode::config; - use blsful::SecretKey; + use dashcore::blsful::SecretKey; use rand::prelude::StdRng; use rand::SeedableRng; diff --git a/packages/rs-dpp/src/core_types/validator_set/mod.rs b/packages/rs-dpp/src/core_types/validator_set/mod.rs index de5b515f9f7..0d56edbc6c5 100644 --- a/packages/rs-dpp/src/core_types/validator_set/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/mod.rs @@ -1,4 +1,4 @@ -use crate::bls_signatures::PublicKey as BlsPublicKey; +use crate::bls_signatures::{Bls12381G2Impl, PublicKey as BlsPublicKey}; use crate::core_types::validator::v0::ValidatorV0; use crate::core_types::validator_set::v0::{ ValidatorSetV0, ValidatorSetV0Getters, ValidatorSetV0Setters, @@ -7,7 +7,6 @@ use crate::core_types::validator_set::v0::{ use crate::ProtocolError; #[cfg(feature = "core-types-serialization")] use bincode::{Decode, Encode}; -use blsful::Bls12381G2Impl; use dashcore::{ProTxHash, QuorumHash}; #[cfg(feature = "core-types-serialization")] use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index cf05bb3d149..d500fb04269 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -8,7 +8,7 @@ use bincode::enc::Encoder; use bincode::error::EncodeError; #[cfg(feature = "core-types-serialization")] use bincode::{BorrowDecode, Decode, Encode}; -use blsful::Bls12381G2Impl; +use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::{ProTxHash, QuorumHash}; use itertools::Itertools; @@ -289,7 +289,7 @@ impl ValidatorSetV0Setters for ValidatorSetV0 { mod tests { use super::*; use bincode::config; - use blsful::SecretKey; + use dashcore::blsful::SecretKey; use dashcore::PubkeyHash; use rand::rngs::StdRng; use rand::SeedableRng; diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 2164b339f19..99e83ba64b7 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -1,3 +1,4 @@ +use dashcore::blsful::BlsError; use thiserror::Error; use crate::consensus::basic::state_transition::InvalidStateTransitionTypeError; @@ -247,6 +248,10 @@ pub enum ProtocolError { /// Invalid CBOR error #[error("invalid cbor error: {0}")] InvalidCBOR(String), + + /// Invalid CBOR error + #[error(transparent)] + BlsError(#[from] BlsError), } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index a1ead4a7253..e91cc6c3c39 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -8,14 +8,14 @@ use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; use dashcore::secp256k1::Secp256k1; -use dashcore::{bls_signatures, ed25519_dalek, Network}; +use dashcore::{blsful, ed25519_dalek, Network}; use itertools::Itertools; use lazy_static::lazy_static; +use crate::bls_signatures::{Bls12381G2Impl, BlsError}; use crate::fee::Credits; use crate::version::PlatformVersion; -use crate::{InvalidVectorSizeError, ProtocolError}; -use blsful::Bls12381G2Impl; +use crate::{bls_signatures, ProtocolError}; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -166,13 +166,8 @@ impl KeyType { private_key.public_key(&secp).to_bytes() } KeyType::BLS12_381 => { - let private_key = bls_signatures::PrivateKey::generate_dash(rng) - .expect("expected to generate a bls private key"); // we assume this will never error - private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec() + let private_key = bls_signatures::SecretKey::::random(rng); + private_key.public_key().0.to_compressed().to_vec() } KeyType::ECDSA_HASH160 | KeyType::BIP13_SCRIPT_HASH | KeyType::EDDSA_25519_HASH160 => { (0..self.default_size()).map(|_| rng.gen::()).collect() @@ -205,13 +200,13 @@ impl KeyType { /// Gets the public key data for a private key depending on the key type pub fn public_key_data_from_private_key_data( &self, - private_key_bytes: &[u8], + private_key_bytes: &[u8; 32], network: Network, ) -> Result, ProtocolError> { match self { KeyType::ECDSA_SECP256K1 => { let secp = Secp256k1::new(); - let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + let secret_key = dashcore::secp256k1::SecretKey::from_byte_array(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -220,14 +215,18 @@ impl KeyType { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key = - bls_signatures::PrivateKey::from_bytes(private_key_bytes, false) - .map_err(|e| ProtocolError::Generic(e.to_string()))?; - let public_key_bytes = private_key - .g1_element() - .expect("expected to get a public key from a bls private key") - .to_bytes() - .to_vec(); + let private_key: Option> = + bls_signatures::SecretKey::::from_be_bytes( + private_key_bytes, + ) + .into(); + if private_key.is_none() { + return Err(ProtocolError::BlsError(BlsError::DeserializationError( + "private key bytes not a valid secret key".to_string(), + ))); + } + let private_key = private_key.expect("expected private key"); + let public_key_bytes = private_key.public_key().0.to_compressed().to_vec(); Ok(public_key_bytes) } #[cfg(not(feature = "bls-signatures"))] @@ -237,7 +236,7 @@ impl KeyType { } KeyType::ECDSA_HASH160 => { let secp = Secp256k1::new(); - let secret_key = dashcore::secp256k1::SecretKey::from_slice(private_key_bytes) + let secret_key = dashcore::secp256k1::SecretKey::from_byte_array(private_key_bytes) .map_err(|e| ProtocolError::Generic(e.to_string()))?; let private_key = dashcore::PrivateKey::new(secret_key, network); @@ -246,14 +245,7 @@ impl KeyType { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let key_pair = ed25519_dalek::SigningKey::from_bytes( - &private_key_bytes.try_into().map_err(|_| { - ProtocolError::InvalidVectorSizeError(InvalidVectorSizeError::new( - 32, - private_key_bytes.len(), - )) - })?, - ); + let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) } #[cfg(not(feature = "ed25519-dalek"))] diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 4b64fe9f16a..52357e89a2f 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -2,9 +2,9 @@ use crate::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMe use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; -use crate::ProtocolError; +use crate::{bls_signatures, ProtocolError}; use anyhow::anyhow; -use blsful::Bls12381G2Impl; +use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; @@ -68,9 +68,11 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::BLS12_381 => { #[cfg(feature = "bls-signatures")] { - let private_key: Option> = - blsful::SecretKey::::from_be_bytes(private_key_bytes) - .into(); + let private_key: Option> = + bls_signatures::SecretKey::::from_be_bytes( + private_key_bytes, + ) + .into(); if private_key.is_none() { return Ok(false); } @@ -124,7 +126,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { mod tests { use super::*; use crate::identity::{Purpose, SecurityLevel}; - use blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; + use dashcore::blsful::{Bls12381G2Impl, Pairing, Signature, SignatureSchemes}; use dashcore::Network; use dpp::version::PlatformVersion; use rand::rngs::StdRng; @@ -136,9 +138,10 @@ mod tests { let (public_key_data, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = - blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) - .expect("expected to get secret key"); + let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( + &secret_key.try_into().unwrap(), + ) + .expect("expected to get secret key"); let public_key = decoded_secret_key.public_key(); let decoded_public_key_data = public_key.0.to_compressed(); assert_eq!( @@ -153,9 +156,10 @@ mod tests { let (_, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = - blsful::SecretKey::::from_be_bytes(&secret_key.try_into().unwrap()) - .expect("expected to get secret key"); + let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( + &secret_key.try_into().unwrap(), + ) + .expect("expected to get secret key"); let signature = decoded_secret_key .sign(SignatureSchemes::Basic, b"hello") .expect("expected to sign"); diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 9744e164551..3ac800e8273 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -89,8 +89,8 @@ pub mod prelude { } pub use bincode; -#[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] -pub use blsful as bls_signatures; +#[cfg(feature = "bls-signatures")] +pub use dashcore::blsful as bls_signatures; #[cfg(feature = "ed25519-dalek")] pub use dashcore::ed25519_dalek; #[cfg(feature = "system_contracts")] diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index d4f69942b6e..336d17e29f7 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -1,3 +1,4 @@ +use crate::bls_signatures::{Bls12381G2Impl, Pairing}; #[cfg(feature = "message-signature-verification")] use crate::consensus::signature::{ BasicBLSError, BasicECDSAError, SignatureError, SignatureShouldNotBePresentError, @@ -8,7 +9,8 @@ use crate::serialization::PlatformMessageSignable; use crate::validation::SimpleConsensusValidationResult; #[cfg(feature = "message-signing")] use crate::{BlsModule, ProtocolError}; -use dashcore::{bls_signatures, signer}; +use dashcore::blsful::Signature; +use dashcore::{blsful as bls_signatures, signer}; impl PlatformMessageSignable for &[u8] { #[cfg(feature = "message-signature-verification")] @@ -38,25 +40,34 @@ impl PlatformMessageSignable for &[u8] { } } KeyType::BLS12_381 => { - let public_key = match bls_signatures::PublicKey::from_bytes(public_key_data) { - Ok(public_key) => public_key, - Err(e) => { - // dbg!(format!("bls public_key could not be recovered")); + let public_key = + match bls_signatures::PublicKey::::try_from(public_key_data) { + Ok(public_key) => public_key, + Err(e) => { + // dbg!(format!("bls public_key could not be recovered")); + return SimpleConsensusValidationResult::new_with_error( + SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())) + .into(), + ); + } + }; + let signature_bytes: [u8; 96] = match signature.to_vec().try_into() { + Ok(bytes) => bytes, + Err(_) => { return SimpleConsensusValidationResult::new_with_error( - SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - ); + SignatureError::BasicBLSError(BasicBLSError::new(format!( + "Signature was {} bytes, expected 96 bytes", + signature.len() + ))) + .into(), + ) } }; - let signature = match bls_signatures::Signature::from_bytes(signature) { - Ok(public_key) => public_key, - Err(e) => { - // dbg!(format!("bls signature could not be recovered")); - return SimpleConsensusValidationResult::new_with_error( - SignatureError::BasicBLSError(BasicBLSError::new(e.to_string())).into(), - ); - } - }; - if !public_key.verify(&signature, signable_data) { + let g2 = ::Signature::from_compressed(&signature_bytes) + .expect("G2 projective"); + let signature = Signature::::Basic(g2); + + if !signature.verify(&public_key, signable_data).is_ok() { SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new( "bls signature was incorrect".to_string(), diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index b39852843b3..5547a6c07ee 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" @@ -73,10 +73,9 @@ tokio-util = { version = "0.7" } derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" console-subscriber = { version = "0.4", optional = true } -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3", optional = true } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } [dev-dependencies] -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } bs58 = { version = "0.5.0" } base64 = "0.22.1" platform-version = { path = "../rs-platform-version", features = [ @@ -106,7 +105,7 @@ integer-encoding = { version = "4.0.0" } [features] default = ["mocks"] -mocks = ["mockall", "drive/fixtures-and-mocks", "bls-signatures"] +mocks = ["mockall", "drive/fixtures-and-mocks"] console = ["console-subscriber", "tokio/tracing"] testing-config = [] grovedbg = ["drive/grovedbg"] diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 66ab8d427bc..9bb41bf2d67 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -128,7 +128,7 @@ fn hex_encoded_validator_sets(validator_sets: &IndexMap, /// Information about the last block diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index ed45b0d8135..d323fa41184 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -35,7 +35,7 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } lru = { version = "0.12.3", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index 080f921ba7a..15589f994d2 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.8" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 7d44dcb5e8fb5bdd13c4d05e8e8d9b8a05c868a9 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Mon, 21 Oct 2024 03:46:11 +0700 Subject: [PATCH 15/30] exposed dapi-grpc in sdk --- packages/rs-sdk/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index 1f928ab6db9..d6e29c98258 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -76,6 +76,7 @@ pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; +pub use dapi_grpc; pub mod sync; /// Version of the SDK From 2b93932f44732f1aafa9a29cedec0967bb06f3fd Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:47:05 +0100 Subject: [PATCH 16/30] fix(sdk): broken import fails compilation --- packages/rs-sdk/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index b463ad83463..23bdedc2fbc 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -77,7 +77,6 @@ pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; -pub use dapi_grpc; pub mod sync; /// Version of the SDK From ab743551c0153babcde5e2d03d4c4b412216f87b Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:52:20 +0100 Subject: [PATCH 17/30] chore(dpp): fix bls signatures --- .../rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index 52357e89a2f..fa06cd32b46 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -1,8 +1,10 @@ +#[cfg(feature = "bls-signatures")] +use crate::bls_signatures; use crate::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMethodsV0; use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; -use crate::{bls_signatures, ProtocolError}; +use crate::ProtocolError; use anyhow::anyhow; use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; From e6bda11e29607e5e0600d7f25f341d0c82889460 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:02:23 +0100 Subject: [PATCH 18/30] chore(dpp): fix build errors and some lint warnings --- packages/rs-dpp/src/errors/protocol_error.rs | 6 +- .../identity/identity_public_key/key_type.rs | 20 ++-- .../identity_public_key/v0/methods/mod.rs | 96 ++++++++----------- .../methods/v0/mod.rs | 3 +- 4 files changed, 53 insertions(+), 72 deletions(-) diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 99e83ba64b7..0d4f6cae6aa 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -1,4 +1,3 @@ -use dashcore::blsful::BlsError; use thiserror::Error; use crate::consensus::basic::state_transition::InvalidStateTransitionTypeError; @@ -249,9 +248,10 @@ pub enum ProtocolError { #[error("invalid cbor error: {0}")] InvalidCBOR(String), - /// Invalid CBOR error + /// BLS signature error + #[cfg(feature = "bls-signatures")] #[error(transparent)] - BlsError(#[from] BlsError), + BlsError(#[from] dashcore::blsful::BlsError), } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index e91cc6c3c39..eabfb7e13d8 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -8,14 +8,13 @@ use dashcore::secp256k1::rand::rngs::StdRng as EcdsaRng; #[cfg(feature = "random-public-keys")] use dashcore::secp256k1::rand::SeedableRng; use dashcore::secp256k1::Secp256k1; -use dashcore::{blsful, ed25519_dalek, Network}; +use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; -use crate::bls_signatures::{Bls12381G2Impl, BlsError}; use crate::fee::Credits; use crate::version::PlatformVersion; -use crate::{bls_signatures, ProtocolError}; +use crate::ProtocolError; #[cfg(feature = "random-public-keys")] use rand::rngs::StdRng; #[cfg(feature = "random-public-keys")] @@ -23,6 +22,11 @@ use rand::Rng; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::collections::HashMap; use std::convert::TryFrom; +#[cfg(feature = "bls-signatures")] +use { + crate::bls_signatures::{self as bls_signatures, Bls12381G2Impl, BlsError}, + dashcore::{blsful, ed25519_dalek}, +}; #[allow(non_camel_case_types)] #[repr(u8)] @@ -245,7 +249,7 @@ impl KeyType { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); + let key_pair = ed25519_dalek::SigningKey::from_bytes(private_key_bytes); Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) } #[cfg(not(feature = "ed25519-dalek"))] @@ -253,11 +257,9 @@ impl KeyType { "Converting a private key to a eddsa hash 160 is not supported without the ed25519-dalek feature".to_string(), )); } - KeyType::BIP13_SCRIPT_HASH => { - return Err(ProtocolError::NotSupported( - "Converting a private key to a script hash is not supported".to_string(), - )); - } + KeyType::BIP13_SCRIPT_HASH => Err(ProtocolError::NotSupported( + "Converting a private key to a script hash is not supported".to_string(), + )), } } diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index fa06cd32b46..df9e2ff87bd 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -1,17 +1,19 @@ -#[cfg(feature = "bls-signatures")] -use crate::bls_signatures; use crate::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMethodsV0; use crate::identity::identity_public_key::v0::IdentityPublicKeyV0; use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; use crate::ProtocolError; use anyhow::anyhow; -use dashcore::blsful::Bls12381G2Impl; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; -use dashcore::{ed25519_dalek, Network, PublicKey as ECDSAPublicKey}; +use dashcore::{Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; +#[cfg(feature = "bls-signatures")] +use { + crate::bls_signatures, + dashcore::{blsful::Bls12381G2Impl, ed25519_dalek}, +}; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { /// Get the original public key hash @@ -80,7 +82,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { } let private_key = private_key.expect("expected private key"); - Ok(&private_key.public_key().0.to_compressed() == self.data.as_slice()) + Ok(private_key.public_key().0.to_compressed() == self.data.as_slice()) } #[cfg(not(feature = "bls-signatures"))] return Err(ProtocolError::NotSupported( @@ -104,7 +106,7 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let key_pair = ed25519_dalek::SigningKey::from_bytes(&private_key_bytes); + let key_pair = ed25519_dalek::SigningKey::from_bytes(private_key_bytes); Ok( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).as_slice() == self.data.as_slice(), @@ -115,11 +117,9 @@ impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { "Converting a private key to a eddsa hash 160 is not supported without the ed25519-dalek feature".to_string(), )); } - KeyType::BIP13_SCRIPT_HASH => { - return Err(ProtocolError::NotSupported( - "Converting a private key to a script hash is not supported".to_string(), - )); - } + KeyType::BIP13_SCRIPT_HASH => Err(ProtocolError::NotSupported( + "Converting a private key to a script hash is not supported".to_string(), + )), } } } @@ -140,10 +140,9 @@ mod tests { let (public_key_data, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( - &secret_key.try_into().unwrap(), - ) - .expect("expected to get secret key"); + let decoded_secret_key = + dashcore::blsful::SecretKey::::from_be_bytes(&secret_key) + .expect("expected to get secret key"); let public_key = decoded_secret_key.public_key(); let decoded_public_key_data = public_key.0.to_compressed(); assert_eq!( @@ -158,10 +157,9 @@ mod tests { let (_, secret_key) = KeyType::BLS12_381 .random_public_and_private_key_data(&mut rng, PlatformVersion::latest()) .expect("expected to get keys"); - let decoded_secret_key = dashcore::blsful::SecretKey::::from_be_bytes( - &secret_key.try_into().unwrap(), - ) - .expect("expected to get secret key"); + let decoded_secret_key = + dashcore::blsful::SecretKey::::from_be_bytes(&secret_key) + .expect("expected to get secret key"); let signature = decoded_secret_key .sign(SignatureSchemes::Basic, b"hello") .expect("expected to sign"); @@ -184,7 +182,7 @@ mod tests { // Test for ECDSA_SECP256K1 let key_type = KeyType::ECDSA_SECP256K1; let (public_key_data, private_key_data) = key_type - .random_public_and_private_key_data(&mut rng, &platform_version) + .random_public_and_private_key_data(&mut rng, platform_version) .expect("expected to generate random keys"); let identity_public_key = IdentityPublicKeyV0 { @@ -199,21 +197,15 @@ mod tests { }; // Validate that the private key matches the public key - assert_eq!( - identity_public_key - .validate_private_key_bytes(&private_key_data, Network::Testnet) - .unwrap(), - true - ); + assert!(identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap(),); // Test with an invalid private key let invalid_private_key_bytes = [0u8; 32]; - assert_eq!( - identity_public_key - .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) - .unwrap(), - false - ); + assert!(!identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap()); } #[cfg(all(feature = "random-public-keys", feature = "bls-signatures"))] @@ -225,7 +217,7 @@ mod tests { // Test for BLS12_381 let key_type = KeyType::BLS12_381; let (public_key_data, private_key_data) = key_type - .random_public_and_private_key_data(&mut rng, &platform_version) + .random_public_and_private_key_data(&mut rng, platform_version) .expect("expected to generate random keys"); let identity_public_key = IdentityPublicKeyV0 { @@ -240,21 +232,15 @@ mod tests { }; // Validate that the private key matches the public key - assert_eq!( - identity_public_key - .validate_private_key_bytes(&private_key_data, Network::Testnet) - .unwrap(), - true - ); + assert!(identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap()); // Test with an invalid private key let invalid_private_key_bytes = [0u8; 32]; - assert_eq!( - identity_public_key - .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) - .unwrap(), - false - ); + assert!(!identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap()); } #[cfg(all(feature = "random-public-keys", feature = "ed25519-dalek"))] @@ -266,7 +252,7 @@ mod tests { // Test for EDDSA_25519_HASH160 let key_type = KeyType::EDDSA_25519_HASH160; let (public_key_data, private_key_data) = key_type - .random_public_and_private_key_data(&mut rng, &platform_version) + .random_public_and_private_key_data(&mut rng, platform_version) .expect("expected to generate random keys"); let identity_public_key = IdentityPublicKeyV0 { @@ -281,20 +267,14 @@ mod tests { }; // Validate that the private key matches the public key - assert_eq!( - identity_public_key - .validate_private_key_bytes(&private_key_data, Network::Testnet) - .unwrap(), - true - ); + assert!(identity_public_key + .validate_private_key_bytes(&private_key_data, Network::Testnet) + .unwrap()); // Test with an invalid private key let invalid_private_key_bytes = [0u8; 32]; - assert_eq!( - identity_public_key - .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) - .unwrap(), - false - ); + assert!(!identity_public_key + .validate_private_key_bytes(&invalid_private_key_bytes, Network::Testnet) + .unwrap()); } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs index eeb7104420b..588fafe2c06 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs @@ -5,7 +5,6 @@ use crate::{ state_transition::StateTransition, ProtocolError, }; -use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; @@ -15,7 +14,7 @@ pub trait IdentityCreditTransferTransitionMethodsV0 { #[cfg(feature = "state-transition-signing")] fn try_from_identity( identity: &Identity, - to_identity_with_identifier: Identifier, + to_identity_with_identifier: platform_value::Identifier, amount: u64, user_fee_increase: UserFeeIncrease, signer: S, From 5859848af148262aa7abb918a085641c21ddf447 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:21:42 +0100 Subject: [PATCH 19/30] chore(sdk): fmt --- packages/rs-sdk/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rs-sdk/src/lib.rs b/packages/rs-sdk/src/lib.rs index d6e29c98258..23bdedc2fbc 100644 --- a/packages/rs-sdk/src/lib.rs +++ b/packages/rs-sdk/src/lib.rs @@ -71,12 +71,12 @@ pub mod sdk; pub use error::Error; pub use sdk::{RequestSettings, Sdk, SdkBuilder}; +pub use dapi_grpc; pub use dashcore_rpc; pub use dpp; pub use drive; pub use drive_proof_verifier::types as query_types; pub use rs_dapi_client as dapi_client; -pub use dapi_grpc; pub mod sync; /// Version of the SDK From b86245e4be16c2bfc14ad181b7b67f6de987edf8 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:31:58 +0100 Subject: [PATCH 20/30] chore(dpp): fix feature build issues --- packages/rs-dpp/Cargo.toml | 2 +- .../src/identity/identity_public_key/key_type.rs | 14 ++++++-------- .../identity/identity_public_key/v0/methods/mod.rs | 8 +++----- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index b2886970bae..8386ba22ba0 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -27,7 +27,7 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "secp-recovery", "rand", "signer", - "serde" + "serde", ], default-features = false, tag = "0.33.1" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } diff --git a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs index eabfb7e13d8..e87df348bb7 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/key_type.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/key_type.rs @@ -12,6 +12,8 @@ use dashcore::Network; use itertools::Itertools; use lazy_static::lazy_static; +#[cfg(feature = "bls-signatures")] +use crate::bls_signatures::{self as bls_signatures, Bls12381G2Impl, BlsError}; use crate::fee::Credits; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -22,11 +24,6 @@ use rand::Rng; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::collections::HashMap; use std::convert::TryFrom; -#[cfg(feature = "bls-signatures")] -use { - crate::bls_signatures::{self as bls_signatures, Bls12381G2Impl, BlsError}, - dashcore::{blsful, ed25519_dalek}, -}; #[allow(non_camel_case_types)] #[repr(u8)] @@ -249,7 +246,8 @@ impl KeyType { KeyType::EDDSA_25519_HASH160 => { #[cfg(feature = "ed25519-dalek")] { - let key_pair = ed25519_dalek::SigningKey::from_bytes(private_key_bytes); + let key_pair = + dashcore::ed25519_dalek::SigningKey::from_bytes(private_key_bytes); Ok(ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec()) } #[cfg(not(feature = "ed25519-dalek"))] @@ -278,7 +276,7 @@ impl KeyType { ) } KeyType::BLS12_381 => { - let private_key = blsful::SecretKey::::random(rng); + let private_key = dashcore::blsful::SecretKey::::random(rng); let public_key_bytes = private_key.public_key().0.to_compressed().to_vec(); (public_key_bytes, private_key.0.to_be_bytes()) } @@ -293,7 +291,7 @@ impl KeyType { ) } KeyType::EDDSA_25519_HASH160 => { - let key_pair = ed25519_dalek::SigningKey::generate(rng); + let key_pair = dashcore::ed25519_dalek::SigningKey::generate(rng); ( ripemd160_sha256(key_pair.verifying_key().to_bytes().as_slice()).to_vec(), key_pair.to_bytes(), diff --git a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs index df9e2ff87bd..ea064e33b65 100644 --- a/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs +++ b/packages/rs-dpp/src/identity/identity_public_key/v0/methods/mod.rs @@ -4,17 +4,15 @@ use crate::identity::KeyType; use crate::util::hash::ripemd160_sha256; use crate::ProtocolError; use anyhow::anyhow; +#[cfg(feature = "ed25519-dalek")] +use dashcore::ed25519_dalek; use dashcore::hashes::Hash; use dashcore::key::Secp256k1; use dashcore::secp256k1::SecretKey; use dashcore::{Network, PublicKey as ECDSAPublicKey}; use platform_value::Bytes20; #[cfg(feature = "bls-signatures")] -use { - crate::bls_signatures, - dashcore::{blsful::Bls12381G2Impl, ed25519_dalek}, -}; - +use {crate::bls_signatures, dashcore::blsful::Bls12381G2Impl}; impl IdentityPublicKeyHashMethodsV0 for IdentityPublicKeyV0 { /// Get the original public key hash fn public_key_hash(&self) -> Result<[u8; 20], ProtocolError> { From ae22fb82cd1a7b357c25e3a6ba8a9dfc895d6d57 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:01:38 +0100 Subject: [PATCH 21/30] build: experimental: use build base image --- Dockerfile | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/Dockerfile b/Dockerfile index d03f82d895e..acf2599a178 100644 --- a/Dockerfile +++ b/Dockerfile @@ -254,35 +254,39 @@ WORKDIR /platform # Download and install cargo-binstall ENV BINSTALL_VERSION=1.10.11 -RUN set -ex; \ - if [ "$TARGETARCH" = "amd64" ]; then \ - CARGO_BINSTALL_ARCH="x86_64-unknown-linux-musl"; \ - elif [ "$TARGETARCH" = "arm64" ]; then \ - CARGO_BINSTALL_ARCH="aarch64-unknown-linux-musl"; \ - else \ - echo "Unsupported architecture: $TARGETARCH"; exit 1; \ - fi; \ - # Construct download URL - DOWNLOAD_URL="https://github.com/cargo-bins/cargo-binstall/releases/download/v${BINSTALL_VERSION}/cargo-binstall-${CARGO_BINSTALL_ARCH}.tgz"; \ - # Download and extract the cargo-binstall binary - curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" -L --proto '=https' --tlsv1.2 -sSf "$DOWNLOAD_URL" | tar -xvzf -; \ - ./cargo-binstall -y --force cargo-binstall; \ - rm ./cargo-binstall; \ - source $HOME/.cargo/env; \ - cargo binstall -V - -RUN source $HOME/.cargo/env; \ - cargo binstall wasm-bindgen-cli@0.2.86 cargo-chef@0.1.67 \ +RUN < Date: Thu, 14 Nov 2024 13:09:16 +0100 Subject: [PATCH 22/30] chore(dpp): fix features --- packages/rs-dpp/src/signing.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index 336d17e29f7..1986cb16ea5 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -1,16 +1,20 @@ -use crate::bls_signatures::{Bls12381G2Impl, Pairing}; -#[cfg(feature = "message-signature-verification")] -use crate::consensus::signature::{ - BasicBLSError, BasicECDSAError, SignatureError, SignatureShouldNotBePresentError, -}; use crate::identity::KeyType; use crate::serialization::PlatformMessageSignable; #[cfg(feature = "message-signature-verification")] -use crate::validation::SimpleConsensusValidationResult; +use crate::{ + consensus::signature::{ + BasicBLSError, BasicECDSAError, SignatureError, SignatureShouldNotBePresentError, + }, + validation::SimpleConsensusValidationResult, +}; #[cfg(feature = "message-signing")] use crate::{BlsModule, ProtocolError}; -use dashcore::blsful::Signature; -use dashcore::{blsful as bls_signatures, signer}; +use dashcore::signer; +#[cfg(feature = "bls-signatures")] +use { + crate::bls_signatures::{Bls12381G2Impl, Pairing}, + dashcore::{blsful as bls_signatures, blsful::Signature}, +}; impl PlatformMessageSignable for &[u8] { #[cfg(feature = "message-signature-verification")] @@ -67,7 +71,7 @@ impl PlatformMessageSignable for &[u8] { .expect("G2 projective"); let signature = Signature::::Basic(g2); - if !signature.verify(&public_key, signable_data).is_ok() { + if signature.verify(&public_key, signable_data).is_err() { SimpleConsensusValidationResult::new_with_error( SignatureError::BasicBLSError(BasicBLSError::new( "bls signature was incorrect".to_string(), From 98c021504ad7928746a8ebf2d1bc15b4d1aa4127 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 14 Nov 2024 13:45:29 +0100 Subject: [PATCH 23/30] Revert "build: experimental: use build base image" This reverts commit ae22fb82cd1a7b357c25e3a6ba8a9dfc895d6d57. --- Dockerfile | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/Dockerfile b/Dockerfile index acf2599a178..d03f82d895e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -254,39 +254,35 @@ WORKDIR /platform # Download and install cargo-binstall ENV BINSTALL_VERSION=1.10.11 -RUN < Date: Fri, 15 Nov 2024 17:23:23 +0100 Subject: [PATCH 24/30] fix(drive-abci): invalid chainlock sig deserialization --- .../engine/run_block_proposal/v0/mod.rs | 2 +- .../verify_chain_lock_locally/v0/mod.rs | 54 +++++++++++++++++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 9c45694f6c4..4cef4a48bca 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -272,7 +272,7 @@ where // Rebroadcast expired withdrawals if they exist self.rebroadcast_expired_withdrawal_documents( &block_info, - &last_committed_platform_state, + last_committed_platform_state, transaction, platform_version, )?; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs index 85bc67ddd4f..cefe129e4d6 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/verify_chain_lock_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::{Bls12381G2Impl, Signature}; +use dpp::bls_signatures::{Bls12381G2Impl, Pairing, Signature}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::{ChainLock, QuorumSigningRequestId}; @@ -38,12 +38,29 @@ where // First verify that the signature conforms to a signature - let Ok(signature) = - Signature::::try_from(chain_lock.signature.as_bytes().as_slice()) - else { - return Ok(Some(false)); + let decoded_sig = match ::Signature::from_compressed( + chain_lock.signature.as_bytes(), + ) + .into_option() + { + Some(signature) => signature, + None => { + tracing::error!( + ?chain_lock, + "chain lock signature was not deserializable: h:{} r:{}", + platform_state.last_committed_block_height() + 1, + round + ); + return Err(Error::BLSError( + dpp::bls_signatures::BlsError::DeserializationError( + "chain lock signature was not deserializable".to_string(), + ), + )); + } }; + let signature = Signature::Basic(decoded_sig); + // we attempt to verify the chain lock locally let chain_lock_height = chain_lock.block_height; @@ -219,6 +236,7 @@ where #[cfg(test)] mod tests { use crate::execution::platform_events::core_chain_lock::verify_chain_lock_locally::v0::CHAIN_LOCK_REQUEST_ID_PREFIX; + use dpp::bls_signatures::{Bls12381G2Impl, Pairing}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; use dpp::dashcore::QuorumSigningRequestId; @@ -288,4 +306,30 @@ mod tests { "5ec53e83b8ff390b970e28db21da5b8e45fbe3b69d9f11a2c39062769b1f5e47" ); } + + #[test] + // Verify that the signature can be deserialized + fn verify_signature() { + let signatures =vec![ + // local devnet + [ + 139, 91, 189, 131, 240, 161, 167, 171, 205, 251, 134, 2, 160, 27, 100, 46, 55, 162, 23, + 224, 18, 130, 100, 147, 255, 29, 128, 110, 111, 138, 195, 219, 243, 137, 110, 60, 243, + 176, 180, 242, 58, 223, 235, 59, 172, 168, 235, 146, 6, 243, 139, 112, 175, 99, 82, 69, + 144, 38, 15, 72, 250, 94, 82, 198, 52, 35, 126, 131, 37, 140, 25, 178, 33, 187, 71, + 167, 87, 81, 15, 210, 220, 201, 44, 245, 222, 66, 252, 70, 227, 109, 43, 60, 102, 187, + 144, 108, + ], + // mainnet + hex::decode("9609d7dea0812c0a6b72d6f20f988d269d3076324c5e51ff6042ce0506370a738bfce420f8174a4e0e34ded7e5792ac217a169b71c7dc3eefde5abba9feaf7d3c7c29fb36ade2e41bc5dfada13d7546c6061ef7e03e894e813f72dd20af8bcbb").unwrap().try_into().unwrap(), + ]; + + for signature in signatures { + assert!( + ::Signature::from_compressed(&signature) + .into_option() + .is_some(), + ); + } + } } From f7458579adfa6b415e74c5bea8dcef1d268b00dc Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:51:39 +0100 Subject: [PATCH 25/30] fix(drive-abci): invalid signature decoding --- ...nstant_asset_lock_proof_signature_error.rs | 2 +- .../verify_recent_signature_locally/v0/mod.rs | 28 +++++++++--------- .../src/platform_types/commit/v0/mod.rs | 4 +-- .../tests/strategy_tests/query.rs | 29 ++++++++++--------- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs index 8d72de7772b..49403c91643 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/invalid_instant_asset_lock_proof_signature_error.rs @@ -18,7 +18,7 @@ use bincode::{Decode, Encode}; PlatformSerialize, PlatformDeserialize, )] -#[error("Instant lock proof signature is invalid or wasn't created recently. Pleases try chain asset lock proof instead.")] +#[error("Instant lock proof signature is invalid or wasn't created recently. Please try chain asset lock proof instead.")] #[platform_serialize(unversioned)] pub struct InvalidInstantAssetLockProofSignatureError; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs index a55f84ecf18..0f3d38e5a8f 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_instant_send_lock/verify_recent_signature_locally/v0/mod.rs @@ -1,4 +1,4 @@ -use dpp::bls_signatures::{Bls12381G2Impl, Signature}; +use dpp::bls_signatures::{Bls12381G2Impl, Pairing, Signature}; use std::fmt::{Debug, Formatter}; use dpp::dashcore::hashes::{sha256d, Hash, HashEngine}; @@ -20,20 +20,20 @@ pub(super) fn verify_recent_instant_lock_signature_locally_v0( platform_state: &PlatformState, ) -> Result { // First verify that the signature conforms to a signature - let signature = - match Signature::::try_from(instant_lock.signature.as_bytes().as_slice()) { - Ok(signature) => signature, - Err(e) => { - tracing::trace!( - instant_lock = ?InstantLockDebug(instant_lock), - "Invalid instant Lock {} signature format: {}", - instant_lock.txid, - e, - ); - return Ok(false); - } - }; + let signature = match ::Signature::from_compressed( + instant_lock.signature.as_bytes(), + ) + .into_option() + { + Some(signature) => Signature::Basic(signature), + None => { + tracing::trace!( + instant_lock = ?InstantLockDebug(instant_lock), "Invalid instant Lock {} signature format", instant_lock.txid, ); + + return Ok(false); + } + }; let signing_height = platform_state.last_committed_core_height(); let verification_height = signing_height.saturating_sub(SIGN_OFFSET); diff --git a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs index 25c57f441cf..2f70aa8e5ca 100644 --- a/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/commit/v0/mod.rs @@ -91,7 +91,7 @@ impl CommitV0 { } // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let g2_element = match ::Signature::from_compressed(&signature) + let g2_element = match ::Signature::from_compressed(signature) .into_option() .ok_or(AbciError::BlsErrorOfTenderdashThresholdMechanism( BlsError::InvalidSignature, @@ -124,7 +124,7 @@ impl CommitV0 { Err(e) => return ValidationResult::new_with_error(e), }; - match signature.verify(&public_key, &hash) { + match signature.verify(public_key, &hash) { Ok(_) => ValidationResult::default(), Err(_) => ValidationResult::new_with_error(AbciError::BadCommitSignature(format!( "commit signature {} is wrong", diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 969a969cbe5..56f166ab749 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -5,7 +5,7 @@ use dapi_grpc::platform::v0::{ GetIdentityByPublicKeyHashRequest, Proof, }; use dashcore_rpc::dashcore_rpc_json::QuorumType; -use dpp::bls_signatures::{Bls12381G2Impl, BlsResult}; +use dpp::bls_signatures::{Bls12381G2Impl, BlsError, Pairing, Signature}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::identity::identity_public_key::methods::hash::IdentityPublicKeyHashMethodsV0; @@ -106,19 +106,20 @@ impl<'a> ProofVerification<'a> { Err(e) => return SimpleValidationResult::new_with_error(e.into()), }; // We could have received a fake commit, so signature validation needs to be returned if error as a simple validation result - let signature = match dpp::bls_signatures::Signature::::try_from( - self.signature.as_slice(), - ) { - Ok(signature) => signature, - Err(e) => { - return SimpleValidationResult::new_with_error( - AbciError::BlsErrorOfTenderdashThresholdMechanism( - e, - format!("Malformed signature data: {}", hex::encode(self.signature)), - ), - ); - } - }; + let signature = + match ::Signature::from_compressed(self.signature) + .into_option() + { + Some(signature) => Signature::Basic(signature), + None => { + return SimpleValidationResult::new_with_error( + AbciError::BlsErrorOfTenderdashThresholdMechanism( + BlsError::InvalidSignature, + format!("malformed signature data: {}", hex::encode(self.signature)), + ), + ); + } + }; tracing::trace!( digest=hex::encode(&digest), ?state_id, From 9f9c12346b34992dc903c0ab797a1f61d17a7e06 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 20 Nov 2024 21:55:28 +0100 Subject: [PATCH 26/30] fixes for coderabbit --- packages/rs-dpp/src/bls/native_bls.rs | 48 ++++++++++++------- .../src/core_types/validator_set/v0/mod.rs | 18 +++---- packages/rs-dpp/src/errors/protocol_error.rs | 10 ++++ packages/rs-dpp/src/signing.rs | 16 +++++-- .../update_operator_identity/v0/mod.rs | 12 ++--- .../platform_state/v0/old_structures/mod.rs | 4 +- .../signature_verification_quorum_set/mod.rs | 2 +- .../v0/for_saving.rs | 8 ++-- .../v0/for_saving_v1.rs | 9 ++-- .../masternode_list_item_helpers.rs | 8 ++-- .../tests/strategy_tests/masternodes.rs | 8 ++-- packages/simple-signer/src/signer.rs | 2 +- 12 files changed, 90 insertions(+), 55 deletions(-) diff --git a/packages/rs-dpp/src/bls/native_bls.rs b/packages/rs-dpp/src/bls/native_bls.rs index e8e1fd939fc..492f5635117 100644 --- a/packages/rs-dpp/src/bls/native_bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -2,7 +2,7 @@ use crate::bls_signatures::{ Bls12381G2Impl, Pairing, PublicKey, SecretKey, Signature, SignatureSchemes, }; use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; -use anyhow::anyhow; +use std::array::TryFromSliceError; #[derive(Default)] pub struct NativeBlsModule; @@ -20,43 +20,57 @@ impl BlsModule for NativeBlsModule { data: &[u8], public_key: &[u8], ) -> Result { - let public_key = - PublicKey::::try_from(public_key).map_err(anyhow::Error::msg)?; - let signature_96_bytes = signature - .try_into() - .map_err(|_| anyhow!("signature wrong size"))?; - let g2_element = + let public_key = PublicKey::::try_from(public_key)?; + let signature_96_bytes = + signature + .try_into() + .map_err(|_| ProtocolError::BlsSignatureSizeError { + got: signature.len() as u32, + })?; + let Some(g2_element) = ::Signature::from_compressed(&signature_96_bytes) .into_option() - .ok_or(anyhow!("signature derivation failed"))?; + else { + return Ok(false); // We should not error because the signature could be given by an invalid source + }; let signature = Signature::Basic(g2_element); match signature.verify(&public_key, data) { Ok(_) => Ok(true), - Err(_) => Err(anyhow!("Verification failed").into()), + Err(_) => Ok(false), } } fn private_key_to_public_key(&self, private_key: &[u8]) -> Result, ProtocolError> { - let fixed_len_key: [u8; 32] = private_key - .try_into() - .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; + let fixed_len_key: [u8; 32] = + private_key + .try_into() + .map_err(|_| ProtocolError::PrivateKeySizeError { + got: private_key.len() as u32, + })?; let pk = SecretKey::::from_be_bytes(&fixed_len_key) .into_option() - .ok_or(anyhow!("Incorrect Priv Key"))?; + .ok_or(ProtocolError::InvalidBLSPrivateKeyError( + "key not valid".to_string(), + ))?; let public_key = pk.public_key(); let public_key_bytes = public_key.0.to_compressed().to_vec(); Ok(public_key_bytes) } fn sign(&self, data: &[u8], private_key: &[u8]) -> Result, ProtocolError> { - let fixed_len_key: [u8; 32] = private_key - .try_into() - .map_err(|_| anyhow!("the BLS private key must be 32 bytes long"))?; + let fixed_len_key: [u8; 32] = + private_key + .try_into() + .map_err(|_| ProtocolError::PrivateKeySizeError { + got: private_key.len() as u32, + })?; let pk = SecretKey::::from_be_bytes(&fixed_len_key) .into_option() - .ok_or(anyhow!("Incorrect Priv Key"))?; + .ok_or(ProtocolError::InvalidBLSPrivateKeyError( + "key not valid".to_string(), + ))?; Ok(pk .sign(SignatureSchemes::Basic, data)? .as_raw_value() diff --git a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs index d500fb04269..4789d53dd62 100644 --- a/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs +++ b/packages/rs-dpp/src/core_types/validator_set/v0/mod.rs @@ -120,10 +120,11 @@ impl Decode for ValidatorSetV0 { let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); let threshold_public_key = - BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { - bincode::error::DecodeError::OtherString( - "Failed to decode BlsPublicKey".to_string(), - ) + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|e| { + bincode::error::DecodeError::OtherString(format!( + "Failed to decode BlsPublicKey: {}", + e + )) })?; Ok(ValidatorSetV0 { @@ -167,10 +168,11 @@ impl<'de> BorrowDecode<'de> for ValidatorSetV0 { let bytes = <[u8; 48]>::decode(decoder)?; public_key_bytes.copy_from_slice(&bytes); let threshold_public_key = - BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|_| { - bincode::error::DecodeError::OtherString( - "Failed to decode BlsPublicKey in borrow decode".to_string(), - ) + BlsPublicKey::try_from(public_key_bytes.as_slice()).map_err(|e| { + bincode::error::DecodeError::OtherString(format!( + "Failed to decode BlsPublicKey in borrow decode: {}", + e + )) })?; Ok(ValidatorSetV0 { diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 0d4f6cae6aa..1ed9888821a 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -1,3 +1,4 @@ +use std::array::TryFromSliceError; use thiserror::Error; use crate::consensus::basic::state_transition::InvalidStateTransitionTypeError; @@ -252,6 +253,15 @@ pub enum ProtocolError { #[cfg(feature = "bls-signatures")] #[error(transparent)] BlsError(#[from] dashcore::blsful::BlsError), + + #[error("Private key wrong size: expected 32, got {got}")] + PrivateKeySizeError { got: u32 }, + + #[error("Private key invalid error: {0}")] + InvalidBLSPrivateKeyError(String), + + #[error("Signature wrong size: expected 96, got {got}")] + BlsSignatureSizeError { got: u32 }, } impl From<&str> for ProtocolError { diff --git a/packages/rs-dpp/src/signing.rs b/packages/rs-dpp/src/signing.rs index 1986cb16ea5..d637c0480b1 100644 --- a/packages/rs-dpp/src/signing.rs +++ b/packages/rs-dpp/src/signing.rs @@ -55,7 +55,7 @@ impl PlatformMessageSignable for &[u8] { ); } }; - let signature_bytes: [u8; 96] = match signature.to_vec().try_into() { + let signature_bytes: [u8; 96] = match signature.try_into() { Ok(bytes) => bytes, Err(_) => { return SimpleConsensusValidationResult::new_with_error( @@ -67,8 +67,18 @@ impl PlatformMessageSignable for &[u8] { ) } }; - let g2 = ::Signature::from_compressed(&signature_bytes) - .expect("G2 projective"); + let g2 = match ::Signature::from_compressed( + &signature_bytes, + ) + .into_option() + { + Some(g2) => g2, + None => { + return SimpleConsensusValidationResult::new_with_error( + SignatureError::BasicBLSError(BasicBLSError::new("bls signature does not conform to proper bls signature serialization".to_string())).into(), + ); + } + }; let signature = Signature::::Basic(g2); if signature.verify(&public_key, signable_data).is_err() { diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 1b3e5ef3dd2..7c901380b09 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -438,9 +438,9 @@ mod tests { .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let operator_key: IdentityPublicKey = IdentityPublicKeyV0 { @@ -957,9 +957,9 @@ mod tests { .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state @@ -1049,9 +1049,9 @@ mod tests { .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let new_pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); // Create an old masternode state with original public key operator diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs index d64e1e7723a..ebd0e85875f 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs @@ -51,7 +51,7 @@ impl From for dpp::core_types::validator_set::v0::ValidatorSetV0 .map(|(pro_tx_hash, validator)| (pro_tx_hash, validator.into())) .collect(), threshold_public_key: PublicKey::try_from(threshold_public_key.to_bytes().as_slice()) - .unwrap(), + .expect("this should not be possible to error as the threshold_public_key was already verified on disk"), } } } @@ -91,7 +91,7 @@ impl From for dpp::core_types::validator::v0::ValidatorV0 { } = value; Self { pro_tx_hash, - public_key: public_key.map(|pk| PublicKey::try_from(pk.to_bytes().as_slice()).unwrap()), + public_key: public_key.map(|pk| PublicKey::try_from(pk.to_bytes().as_slice()).expect("this should not be possible to error as the public_key was already verified on disk")), node_ip, node_id, core_port, diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs index 38c00188ecd..a314829a7d7 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs @@ -119,7 +119,7 @@ impl SignatureVerificationQuorumSetV0Methods for SignatureVerificationQuorumSet pub enum SignatureVerificationQuorumSetForSaving { /// Version 0 of the signature verification quorums V0(SignatureVerificationQuorumSetForSavingV0), - /// Version 0 of the signature verification quorums + /// Version 1 of the signature verification quorums V1(SignatureVerificationQuorumSetForSavingV1), } diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs index 1c6a07db91f..de69aff56d3 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs @@ -156,10 +156,10 @@ impl From> for Quorums { } } -#[allow(clippy::from_over_into)] -impl Into> for Quorums { - fn into(self) -> Vec { - self.into_iter() +impl From> for Vec { + fn from(quorums: Quorums) -> Self { + quorums + .into_iter() .map(|(hash, quorum)| QuorumForSavingV0 { hash: Bytes32::from(hash.as_byte_array()), public_key: bls_signatures::PublicKey::from_bytes( diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs index c7e9bbaf105..bfb596e451b 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs @@ -78,11 +78,10 @@ impl From> for Quorums { })) } } - -#[allow(clippy::from_over_into)] -impl Into> for Quorums { - fn into(self) -> Vec { - self.into_iter() +impl From> for Vec { + fn from(quorums: Quorums) -> Self { + quorums + .into_iter() .map(|(hash, quorum)| QuorumForSavingV1 { hash: Bytes32::from(hash.as_byte_array()), public_key: quorum.public_key, diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs index bdd1ecc9111..4084e7f065f 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs @@ -38,9 +38,9 @@ impl UpdateMasternodeListItem for MasternodeListItem { .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); self.state.pub_key_operator = pub_key_operator; @@ -92,9 +92,9 @@ mod tests { .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Regular, diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs index 89a9697d442..02a647b66ca 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs @@ -214,9 +214,9 @@ pub fn generate_test_masternodes( .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let pro_tx_hash = ProTxHash::from_byte_array(rng.gen::<[u8; 32]>()); let masternode_list_item = MasternodeListItem { @@ -352,9 +352,9 @@ pub fn generate_test_masternodes( .to_bytes() .to_vec(); let private_key_operator = BlsPrivateKey::::from_be_bytes( - &private_key_operator_bytes.try_into().unwrap(), + &private_key_operator_bytes.try_into().expect("expected the secret key to be 32 bytes"), ) - .unwrap(); + .expect("expected the conversion between bls signatures library and blsful to happen without failing"); let pub_key_operator = private_key_operator.public_key().0.to_compressed().to_vec(); let masternode_list_item = MasternodeListItem { node_type: MasternodeType::Evo, diff --git a/packages/simple-signer/src/signer.rs b/packages/simple-signer/src/signer.rs index 04a9b325d3a..d93acb5aee7 100644 --- a/packages/simple-signer/src/signer.rs +++ b/packages/simple-signer/src/signer.rs @@ -89,7 +89,7 @@ impl Signer for SimpleSigner { ))?; let signature = pk .sign(SignatureSchemes::Basic, data) - .map_err(|e| ProtocolError::Generic(format!("unable to sign {}", e)))?; + .map_err(|e| ProtocolError::Generic(format!("BLS signing failed {}", e)))?; Ok(signature.as_raw_value().to_compressed().to_vec().into()) } KeyType::EDDSA_25519_HASH160 => { From 6eeec1a14ed40d5aaeb48a42f4f5e10d5a489e96 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:44:50 +0100 Subject: [PATCH 27/30] deps: bump dashcore and dashcore-rpc --- Cargo.lock | 131 ++++++++++++++++++------------ packages/rs-dpp/Cargo.toml | 4 +- packages/rs-drive-abci/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 4 +- packages/simple-signer/Cargo.toml | 2 +- 5 files changed, 86 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6a16559de8f..d9899552c77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -506,7 +506,7 @@ dependencies = [ "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.3.0", + "constant_time_eq 0.3.1", ] [[package]] @@ -949,9 +949,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "convert_case" @@ -1231,14 +1231,14 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.33.1" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +version = "0.34.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" dependencies = [ "anyhow", "bech32", "bitflags 2.6.0", "blsful", - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", + "dashcore-private", "dashcore_hashes", "ed25519-dalek", "hex", @@ -1254,19 +1254,14 @@ dependencies = [ [[package]] name = "dashcore-private" version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.32.0#6a0ec164ca1bdcb8d19b29f40e946120e99473eb" - -[[package]] -name = "dashcore-private" -version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" [[package]] name = "dashcore-rpc" -version = "0.15.9" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" +version = "0.15.13" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.13#88dfef0dc04cbe8f4b0d24e9aabfae8ca126c74a" dependencies = [ - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.32.0)", + "dashcore-private", "dashcore-rpc-json", "env_logger 0.10.2", "hex", @@ -1278,8 +1273,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.9" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.9#dcfa6b34da596c52093ed6a1f26f15bcf2196c0d" +version = "0.15.13" +source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.13#88dfef0dc04cbe8f4b0d24e9aabfae8ca126c74a" dependencies = [ "bincode", "dashcore", @@ -1293,9 +1288,9 @@ dependencies = [ [[package]] name = "dashcore_hashes" version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.33.1#eb700aeff1610188414d0250254d0a6daaa4db46" +source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" dependencies = [ - "dashcore-private 0.1.0 (git+https://github.com/dashpay/rust-dashcore?tag=0.33.1)", + "dashcore-private", "secp256k1", "serde", ] @@ -1472,7 +1467,7 @@ dependencies = [ "env_logger 0.11.5", "getrandom", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "integer-encoding", "itertools 0.13.0", "json-schema-compatibility-validator", @@ -1525,7 +1520,7 @@ dependencies = [ "grovedb-storage", "grovedb-version", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "integer-encoding", "intmap", "itertools 0.13.0", @@ -1569,7 +1564,7 @@ dependencies = [ "envy", "file-rotate", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "integer-encoding", "itertools 0.13.0", "lazy_static", @@ -1608,7 +1603,7 @@ dependencies = [ "dpp", "drive", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "platform-serialization", "platform-serialization-derive", "serde", @@ -1923,6 +1918,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2155,7 +2156,7 @@ dependencies = [ "grovedbg-types", "hex", "hex-literal", - "indexmap 2.6.0", + "indexmap 2.7.0", "integer-encoding", "intmap", "itertools 0.12.1", @@ -2212,7 +2213,7 @@ dependencies = [ "grovedb-version", "grovedb-visualize", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "integer-encoding", "num_cpus", "rand", @@ -2288,7 +2289,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -2331,7 +2332,7 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ @@ -2341,9 +2342,14 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hdrhistogram" @@ -2656,12 +2662,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] @@ -2909,6 +2915,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "lock_api" version = "0.4.12" @@ -2933,11 +2945,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -3013,7 +3025,7 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "indexmap 2.6.0", + "indexmap 2.7.0", "ipnet", "metrics", "metrics-util", @@ -3517,7 +3529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -3595,7 +3607,7 @@ dependencies = [ "bs58", "ciborium 0.2.0", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "lazy_static", "platform-serialization", "platform-version", @@ -4203,9 +4215,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "log", "once_cell", @@ -4241,15 +4253,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -4426,7 +4438,7 @@ version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b863381a05ffefbc82571a2d893edf47b27fb0ebedbf582c39640e51abebef" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -4501,7 +4513,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -5207,7 +5219,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow 0.5.40", ] @@ -5218,7 +5230,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow 0.5.40", ] @@ -5229,7 +5241,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -5291,7 +5303,7 @@ source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV04 dependencies = [ "futures-core", "futures-util", - "indexmap 2.6.0", + "indexmap 2.7.0", "pin-project", "pin-project-lite", "rand", @@ -6026,6 +6038,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "zerofrom", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -6047,6 +6070,12 @@ dependencies = [ "syn 2.0.75", ] +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" + [[package]] name = "zeroize" version = "1.8.1" @@ -6099,7 +6128,7 @@ dependencies = [ "crossbeam-utils", "displaydoc", "flate2", - "indexmap 2.6.0", + "indexmap 2.7.0", "memchr", "thiserror", "zopfli", diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index 1e9125db78e..cac0277ec38 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -28,7 +28,7 @@ dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "rand", "signer", "serde", -], default-features = false, tag = "0.33.1" } +], default-features = false, tag = "0.34.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } @@ -58,7 +58,7 @@ derive_more = { version = "1.0", features = ["from", "display", "try_into"] } nohash-hasher = "0.2.0" rust_decimal = "1.29.1" rust_decimal_macros = "1.29.1" -indexmap = { version = "2.0.2", features = ["serde"] } +indexmap = { version = "2.7.0", features = ["serde"] } strum = { version = "0.26", features = ["derive"] } json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator' } once_cell = "1.19.0" diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 46b498b4791..48f60e83add 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 345a293000e..61054444aa2 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -35,8 +35,8 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } -lru = { version = "0.12.3", optional = true } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } +lru = { version = "0.12.5", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index deec00cbe05..fea2aca5bb4 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.9" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } From 5c3f318683c9b4a022acd81a966a31eb67936395 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Fri, 6 Dec 2024 14:31:09 +0100 Subject: [PATCH 28/30] chore: uncomment logging --- packages/rs-sdk/src/core/transaction.rs | 91 ++++++++++++------------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/packages/rs-sdk/src/core/transaction.rs b/packages/rs-sdk/src/core/transaction.rs index ae0e09629d9..f3d2df46c27 100644 --- a/packages/rs-sdk/src/core/transaction.rs +++ b/packages/rs-sdk/src/core/transaction.rs @@ -69,13 +69,13 @@ impl Sdk { ) -> Result { let transaction_id = transaction.txid(); - // let _span = tracing::debug_span!( - // "wait_for_asset_lock_proof_for_transaction", - // transaction_id = transaction_id.to_string(), - // ) - // .entered(); - // - // tracing::debug!("waiting for messages from stream"); + let _span = tracing::debug_span!( + "wait_for_asset_lock_proof_for_transaction", + transaction_id = transaction_id.to_string(), + ) + .entered(); + + tracing::debug!("waiting for messages from stream"); // Define an inner async block to handle the stream processing. let stream_processing = async { @@ -98,10 +98,10 @@ impl Sdk { instant_send_lock_messages, ), ) => { - // tracing::debug!( - // "received {} instant lock message(s)", - // instant_send_lock_messages.messages.len() - // ); + tracing::trace!( + "received {} instant lock message(s)", + instant_send_lock_messages.messages.len() + ); for instant_lock_bytes in instant_send_lock_messages.messages { let instant_lock = @@ -120,29 +120,28 @@ impl Sdk { output_index: 0, }); - // tracing::debug!( - // ?asset_lock_proof, - // "instant lock is matching to the broadcasted transaction, returning instant asset lock proof" - // ); + tracing::trace!( + ?asset_lock_proof, + "instant lock is matching to the broadcasted transaction, returning instant asset lock proof" + ); return Ok(asset_lock_proof); + } else { + tracing::debug!( + "instant lock is not matching, waiting for the next message" + ); } - // else { - // tracing::debug!( - // "instant lock is not matching, waiting for the next message" - // ); - // } } } Some(transactions_with_proofs_response::Responses::RawMerkleBlock( raw_merkle_block, )) => { - // tracing::debug!("received merkle block"); + tracing::trace!("received merkle block"); let merkle_block = MerkleBlock::consensus_decode(&mut raw_merkle_block.as_slice()) .map_err(|e| { - // tracing::error!("can't decode merkle block: {}", e); + tracing::error!("can't decode merkle block: {}", e); Error::CoreError(e.into()) })?; @@ -154,16 +153,16 @@ impl Sdk { // Continue receiving messages until we find the transaction if !matches.contains(&transaction_id) { - // tracing::debug!( - // "merkle block doesn't contain the transaction, waiting for the next message" - // ); + tracing::debug!( + "merkle block doesn't contain the transaction, waiting for the next message" + ); continue; } - // tracing::debug!( - // "merkle block contains the transaction, obtaining core chain locked height" - // ); + tracing::trace!( + "merkle block contains the transaction, obtaining core chain locked height" + ); // TODO: This a temporary implementation until we have headers stream running in background // so we can always get actual height and chain locks @@ -191,15 +190,15 @@ impl Sdk { break; } - // tracing::trace!("the transaction is on height {} but not chainlocked. try again in 1 sec", height); + tracing::trace!("the transaction is on height {} but not chainlocked. try again in 1 sec", height); sleep(Duration::from_secs(1)).await; } - // tracing::debug!( - // "the transaction is chainlocked on height {}, waiting platform for reaching the same core height", - // core_chain_locked_height - // ); + tracing::trace!( + "the transaction is chainlocked on height {}, waiting platform for reaching the same core height", + core_chain_locked_height + ); // Wait until platform chain is on the block's chain locked height loop { @@ -210,11 +209,11 @@ impl Sdk { break; } - // tracing::trace!( - // "platform chain locked core height {} but we need {}. try again in 1 sec", - // metadata.core_chain_locked_height, - // core_chain_locked_height, - // ); + tracing::trace!( + "platform chain locked core height {} but we need {}. try again in 1 sec", + metadata.core_chain_locked_height, + core_chain_locked_height, + ); sleep(Duration::from_secs(1)).await; } @@ -227,20 +226,20 @@ impl Sdk { }, }); - // tracing::debug!( - // ?asset_lock_proof, - // "merkle block contains the broadcasted transaction, returning chain asset lock proof" - // ); + tracing::trace!( + ?asset_lock_proof, + "merkle block contains the broadcasted transaction, returning chain asset lock proof" + ); return Ok(asset_lock_proof); } Some(transactions_with_proofs_response::Responses::RawTransactions(_)) => { - // tracing::trace!("received transaction(s), ignoring") + tracing::trace!("received transaction(s), ignoring") } None => { - // tracing::trace!( - // "received empty response as a workaround for the bug in tonic, ignoring" - // ) + tracing::trace!( + "received empty response as a workaround for the bug in tonic, ignoring" + ) } } } From c3a8f8037341a634e106fa9509c773ac223e2dd9 Mon Sep 17 00:00:00 2001 From: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:22:24 +0100 Subject: [PATCH 29/30] refactor(sdk)!: separate dash core client error (#2380) --- packages/rs-dpp/src/bls/native_bls.rs | 1 - packages/rs-drive-proof-verifier/src/error.rs | 4 + packages/rs-sdk/src/core/dash_core_client.rs | 83 +++++++------------ packages/rs-sdk/src/core/error.rs | 56 +++++++++++++ packages/rs-sdk/src/core/mod.rs | 2 + packages/rs-sdk/src/error.rs | 17 +++- packages/rs-sdk/src/mock/provider.rs | 2 +- packages/rs-sdk/src/sync.rs | 1 - packages/rs-sdk/tests/fetch/config.rs | 2 +- packages/rs-sdk/tests/fetch/evonode.rs | 1 - 10 files changed, 111 insertions(+), 58 deletions(-) create mode 100644 packages/rs-sdk/src/core/error.rs diff --git a/packages/rs-dpp/src/bls/native_bls.rs b/packages/rs-dpp/src/bls/native_bls.rs index 492f5635117..3e1341bf9ab 100644 --- a/packages/rs-dpp/src/bls/native_bls.rs +++ b/packages/rs-dpp/src/bls/native_bls.rs @@ -2,7 +2,6 @@ use crate::bls_signatures::{ Bls12381G2Impl, Pairing, PublicKey, SecretKey, Signature, SignatureSchemes, }; use crate::{BlsModule, ProtocolError, PublicKeyValidationError}; -use std::array::TryFromSliceError; #[derive(Default)] pub struct NativeBlsModule; diff --git a/packages/rs-drive-proof-verifier/src/error.rs b/packages/rs-drive-proof-verifier/src/error.rs index 3fb5825a8cf..3da25aacc7c 100644 --- a/packages/rs-drive-proof-verifier/src/error.rs +++ b/packages/rs-drive-proof-verifier/src/error.rs @@ -119,6 +119,10 @@ pub enum ContextProviderError { /// Async error, eg. when tokio runtime fails #[error("async error: {0}")] AsyncError(String), + + /// Dash Core error + #[error("Dash Core error: {0}")] + DashCoreError(String), } impl From for Error { diff --git a/packages/rs-sdk/src/core/dash_core_client.rs b/packages/rs-sdk/src/core/dash_core_client.rs index 11c1749cff2..73216f294af 100644 --- a/packages/rs-sdk/src/core/dash_core_client.rs +++ b/packages/rs-sdk/src/core/dash_core_client.rs @@ -12,11 +12,12 @@ use dashcore_rpc::{ }; use dpp::dashcore::ProTxHash; use dpp::prelude::CoreBlockHeight; -use drive_proof_verifier::error::ContextProviderError; use std::time::Duration; use std::{fmt::Debug, sync::Mutex}; use zeroize::Zeroizing; +use super::DashCoreError; + /// Core RPC client that can be used to retrieve quorum keys from core. /// /// TODO: This is a temporary implementation, effective until we integrate SPV. @@ -28,13 +29,6 @@ pub struct LowLevelDashCoreClient { core_port: u16, } -/// Client still warming up -pub const CORE_RPC_ERROR_IN_WARMUP: i32 = -28; -/// Dash is not connected -pub const CORE_RPC_CLIENT_NOT_CONNECTED: i32 = -9; -/// Still downloading initial blocks -pub const CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD: i32 = -10; - macro_rules! retry { ($action:expr) => {{ /// Maximum number of retry attempts @@ -60,30 +54,18 @@ macro_rules! retry { break; } Err(e) => { - match e { - dashcore_rpc::Error::JsonRpc( - // Retry on transport connection error - dashcore_rpc::jsonrpc::error::Error::Transport(_) - | dashcore_rpc::jsonrpc::error::Error::Rpc( - // Retry on Core RPC "not ready" errors - dashcore_rpc::jsonrpc::error::RpcError { - code: - CORE_RPC_ERROR_IN_WARMUP - | CORE_RPC_CLIENT_NOT_CONNECTED - | CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD, - .. - }, - ), - ) => { - if i == MAX_RETRIES - 1 { - final_result = - Some(Err(ContextProviderError::Generic(e.to_string()))); - } - let delay = fibonacci(i + 2) * FIB_MULTIPLIER; - std::thread::sleep(Duration::from_millis(delay * BASE_TIME_MS)); + use rs_dapi_client::CanRetry; + + let err: DashCoreError = e.into(); + if err.can_retry() { + if i == MAX_RETRIES - 1 { + final_result = Some(Err(err)); } - _ => return Err(ContextProviderError::Generic(e.to_string())), - }; + let delay = fibonacci(i + 2) * FIB_MULTIPLIER; + std::thread::sleep(Duration::from_millis(delay * BASE_TIME_MS)); + } else { + return Err(err); + } } } } @@ -133,8 +115,7 @@ impl LowLevelDashCoreClient { let core = Client::new( &addr, Auth::UserPass(core_user.to_string(), core_password.to_string()), - ) - .map_err(Error::CoreClientError)?; + )?; Ok(Self { core: Mutex::new(core), @@ -162,7 +143,7 @@ impl LowLevelDashCoreClient { pub fn list_unspent( &self, minimum_sum_satoshi: Option, - ) -> Result, ContextProviderError> { + ) -> Result, DashCoreError> { let options = json::ListUnspentQueryOptions { minimum_sum_amount: minimum_sum_satoshi.map(Amount::from_sat), ..Default::default() @@ -176,7 +157,7 @@ impl LowLevelDashCoreClient { /// Return address to which change of transaction can be sent. #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] - pub fn get_balance(&self) -> Result { + pub fn get_balance(&self) -> Result { let core = self.core.lock().expect("Core lock poisoned"); retry!(core.get_balance(None, None)) } @@ -186,9 +167,9 @@ impl LowLevelDashCoreClient { &self, quorum_type: u32, quorum_hash: [u8; 32], - ) -> Result<[u8; 48], ContextProviderError> { + ) -> Result<[u8; 48], DashCoreError> { let quorum_hash = QuorumHash::from_slice(&quorum_hash) - .map_err(|e| ContextProviderError::InvalidQuorum(e.to_string()))?; + .map_err(|e| DashCoreError::InvalidQuorum(format!("invalid quorum hash: {}", e)))?; let core = self.core.lock().expect("Core lock poisoned"); @@ -199,29 +180,29 @@ impl LowLevelDashCoreClient { // Extract the quorum public key and attempt to convert it let key = quorum_info.quorum_public_key; let pubkey = as TryInto<[u8; 48]>>::try_into(key).map_err(|_| { - ContextProviderError::InvalidQuorum( - "quorum public key is not 48 bytes long".to_string(), - ) + DashCoreError::InvalidQuorum("quorum public key is not 48 bytes long".to_string()) })?; Ok(pubkey) } /// Retrieve platform activation height from core. - pub fn get_platform_activation_height(&self) -> Result { + pub fn get_platform_activation_height(&self) -> Result { let core = self.core.lock().expect("Core lock poisoned"); let blockchain_info = retry!(core.get_blockchain_info())?; - let fork_info = blockchain_info.softforks.get("mn_rr").ok_or( - ContextProviderError::ActivationForkError("no fork info for mn_rr".to_string()), - )?; - - fork_info - .height - .ok_or(ContextProviderError::ActivationForkError( - "unknown fork height".to_string(), - )) + let fork_info = + blockchain_info + .softforks + .get("mn_rr") + .ok_or(DashCoreError::ActivationForkError( + "no fork info for mn_rr".to_string(), + ))?; + + fork_info.height.ok_or(DashCoreError::ActivationForkError( + "unknown fork height".to_string(), + )) } /// Require list of validators from Core. @@ -232,7 +213,7 @@ impl LowLevelDashCoreClient { &self, height: Option, protx_type: Option, - ) -> Result, ContextProviderError> { + ) -> Result, DashCoreError> { let core = self.core.lock().expect("Core lock poisoned"); let pro_tx_list = retry!(core.get_protx_list(protx_type.clone(), Some(false), height))?; diff --git a/packages/rs-sdk/src/core/error.rs b/packages/rs-sdk/src/core/error.rs new file mode 100644 index 00000000000..ec1b4925f6e --- /dev/null +++ b/packages/rs-sdk/src/core/error.rs @@ -0,0 +1,56 @@ +//! Errors that can occur in the Dash Core. + +use drive_proof_verifier::error::ContextProviderError; +use rs_dapi_client::CanRetry; + +/// Dash Core still warming up +pub const CORE_RPC_ERROR_IN_WARMUP: i32 = -28; +/// Dash Core Client is not connected +pub const CORE_RPC_CLIENT_NOT_CONNECTED: i32 = -9; +/// Dash Core still downloading initial blocks +pub const CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD: i32 = -10; + +#[derive(Debug, thiserror::Error)] +/// Errors that can occur when communicating with the Dash Core. +pub enum DashCoreError { + /// Error from Dash Core. + #[error("Dash Core RPC error: {0}")] + Rpc(#[from] dashcore_rpc::Error), + + /// Quorum is invalid. + #[error("Invalid quorum: {0}")] + InvalidQuorum(String), + + /// Fork activation error - most likely the fork is not activated yet. + #[error("Fork activation: {0}")] + ActivationForkError(String), +} + +impl From for ContextProviderError { + fn from(error: DashCoreError) -> Self { + match error { + DashCoreError::Rpc(e) => Self::DashCoreError(e.to_string()), + DashCoreError::InvalidQuorum(e) => Self::InvalidQuorum(e), + DashCoreError::ActivationForkError(e) => Self::ActivationForkError(e), + } + } +} + +impl CanRetry for DashCoreError { + fn can_retry(&self) -> bool { + use dashcore_rpc::jsonrpc::error::Error as JsonRpcError; + use dashcore_rpc::Error as RpcError; + match self { + DashCoreError::Rpc(RpcError::JsonRpc(JsonRpcError::Transport(..))) => true, + DashCoreError::Rpc(RpcError::JsonRpc(JsonRpcError::Rpc(e))) => { + matches!( + e.code, + CORE_RPC_ERROR_IN_WARMUP + | CORE_RPC_CLIENT_NOT_CONNECTED + | CORE_RPC_CLIENT_IN_INITIAL_DOWNLOAD, + ) + } + _ => false, + } + } +} diff --git a/packages/rs-sdk/src/core/mod.rs b/packages/rs-sdk/src/core/mod.rs index f642f3b26f6..d5c4be9cd5b 100644 --- a/packages/rs-sdk/src/core/mod.rs +++ b/packages/rs-sdk/src/core/mod.rs @@ -6,3 +6,5 @@ mod dash_core_client; mod transaction; #[cfg(feature = "mocks")] pub use dash_core_client::LowLevelDashCoreClient; +mod error; +pub use error::DashCoreError; diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 23def69d1a9..75e114a8008 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -10,6 +10,8 @@ use rs_dapi_client::{CanRetry, DapiClientError, ExecutionError}; use std::fmt::Debug; use std::time::Duration; +use crate::core::DashCoreError; + /// Error type for the SDK // TODO: Propagate server address and retry information so that the user can retrieve it #[derive(Debug, thiserror::Error)] @@ -44,7 +46,7 @@ pub enum Error { MerkleBlockError(#[from] dpp::dashcore::merkle_tree::MerkleBlockError), /// Core client error, for example, connection error #[error("Core client error: {0}")] - CoreClientError(#[from] dashcore_rpc::Error), + CoreClientError(#[from] DashCoreError), /// Dependency not found, for example data contract for a document not found #[error("Required {0} not found: {1}")] MissingDependency(String, String), @@ -125,9 +127,20 @@ where } } +impl From for Error { + fn from(value: dashcore_rpc::Error) -> Self { + Self::CoreClientError(value.into()) + } +} + impl CanRetry for Error { fn can_retry(&self) -> bool { - matches!(self, Error::StaleNode(..) | Error::TimeoutReached(_, _)) + match self { + Error::StaleNode(..) => true, + Error::TimeoutReached(..) => true, + Error::CoreClientError(e) => e.can_retry(), + _ => false, + } } } diff --git a/packages/rs-sdk/src/mock/provider.rs b/packages/rs-sdk/src/mock/provider.rs index 879c4137ebe..ef0db5be923 100644 --- a/packages/rs-sdk/src/mock/provider.rs +++ b/packages/rs-sdk/src/mock/provider.rs @@ -215,7 +215,7 @@ impl ContextProvider for GrpcContextProvider { } fn get_platform_activation_height(&self) -> Result { - self.core.get_platform_activation_height() + Ok(self.core.get_platform_activation_height()?) } } diff --git a/packages/rs-sdk/src/sync.rs b/packages/rs-sdk/src/sync.rs index 5f5d2666699..3b267f5a531 100644 --- a/packages/rs-sdk/src/sync.rs +++ b/packages/rs-sdk/src/sync.rs @@ -244,7 +244,6 @@ where mod test { use super::*; use derive_more::Display; - use http::Uri; use rs_dapi_client::ExecutionError; use std::{ future::Future, diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index f55484f5ce3..5fc403560d2 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -10,7 +10,7 @@ use dpp::{ }; use rs_dapi_client::{Address, AddressList}; use serde::Deserialize; -use std::{path::PathBuf, str::FromStr}; +use std::path::PathBuf; use zeroize::Zeroizing; /// Existing document ID diff --git a/packages/rs-sdk/tests/fetch/evonode.rs b/packages/rs-sdk/tests/fetch/evonode.rs index b2521ba8648..9a01eabb9d3 100644 --- a/packages/rs-sdk/tests/fetch/evonode.rs +++ b/packages/rs-sdk/tests/fetch/evonode.rs @@ -4,7 +4,6 @@ use super::{common::setup_logs, config::Config}; use dash_sdk::platform::{types::evonode::EvoNode, FetchUnproved}; use dpp::dashcore::{hashes::Hash, ProTxHash}; use drive_proof_verifier::types::EvoNodeStatus; -use http::Uri; use rs_dapi_client::Address; use std::time::Duration; /// Given some existing evonode URIs, WHEN we connect to them, THEN we get status. From 8884df7f58e54b444f2796806504d6cc1c3e5877 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Thu, 6 Mar 2025 13:19:01 +0100 Subject: [PATCH 30/30] Squashed commit of the following: commit 67766514941405addbc951f72e7167ccb5a9caea Author: QuantumExplorer Date: Sat Mar 1 22:23:41 2025 +0700 chore: update to latest dash core 37 (#2483) commit 1501103c24cb97a583fd34f5640aed5782a68a4f Merge: a7c7a0fff7 da17fc5c10 Author: Ivan Shumkov Date: Thu Feb 27 14:21:41 2025 +0700 chore: merge master and resolve conflicts (#2481) commit da17fc5c104752b38393238c9a884d089ea5427a Author: pshenmic Date: Thu Feb 27 13:31:51 2025 +0700 feat(js-dash-sdk): fix tests after merge commit c7e40cb9ff43627901d6cb81638e1151bec24313 Merge: c57e8b28c5 f9eb06999d Author: Ivan Shumkov Date: Thu Feb 27 09:35:02 2025 +0700 Merge remote-tracking branch 'origin/chore/merge-master' into chore/merge-master commit c57e8b28c58fb3fab92dc37d70371dfac0edf8e0 Author: Ivan Shumkov Date: Thu Feb 27 09:34:40 2025 +0700 test(dpp): fix assertion with the same value commit 045b6fa1508940c9005b884501f05f9b28f17709 Author: Ivan Shumkov Date: Thu Feb 27 09:32:33 2025 +0700 chore(dpp): remove unnecessary type conversion commit 8160ccdd253b560dd5c207a91b2e51b0e569cf06 Author: Ivan Shumkov Date: Thu Feb 27 09:31:32 2025 +0700 chore: remove duplicated commented code commit f9eb06999d048503522312f91f61d64fe0be56d2 Merge: 05d0085c96 a7c7a0fff7 Author: pshenmic Date: Wed Feb 26 20:03:00 2025 +0700 Merge branch 'v2.0-dev' into chore/merge-master commit a7c7a0fff73bd8b4b8f9cae03ae0347cd5005fc2 Author: pshenmic Date: Wed Feb 26 19:52:02 2025 +0700 build: bump rust version to 1.85 (#2480) commit 05d0085c96959071fbb314ef575f5eac6a0553a4 Merge: bcf178571b 196976c8fa Author: Ivan Shumkov Date: Wed Feb 26 18:03:38 2025 +0700 Merge branch 'master' into v2.0-dev commit bcf178571b20a7a5d67c389e702c553c915c6c1f Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Fri Feb 21 08:43:35 2025 +0100 feat: wasm sdk build proof-of-concept (#2405) Co-authored-by: Ivan Shumkov commit 5e32426093101b735c01e50553ac0d7085b8d181 Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu Feb 20 19:22:52 2025 +0700 fix: token already paused unpaused and frozen validation (#2466) commit 374a0366d891952e2ef9bb549e6562fca2c08708 Author: Ivan Shumkov Date: Thu Feb 20 17:46:57 2025 +0700 test: fix slowdown of JS SDK unit tests (#2475) commit 1fed09be5d942d26fe38ec43792f68d3f25eab88 Author: Ivan Shumkov Date: Thu Feb 20 13:46:36 2025 +0700 fix(dpp): invalid feature flag usage (#2477) commit 33507bbe677461deb06f206332a575f754712b47 Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu Feb 20 13:18:55 2025 +0700 fix: destroy frozen funds used wrong identity and proof verification (#2467) commit 91a9766d71bec60dacb464c298d89086aa64ac49 Author: Ivan Shumkov Date: Wed Feb 19 16:57:32 2025 +0700 feat(sdk): return state transition execution error (#2454) commit cb915a73460d32bc546d8c88c6c350907f413fe3 Author: Ivan Shumkov Date: Wed Feb 19 16:46:54 2025 +0700 test: fix token history contract tests (#2470) commit 04276d53b22026d38d40c0ab5c960569557524b2 Author: Ivan Shumkov Date: Tue Feb 18 21:00:05 2025 +0700 fix: xss vulnerability in mocha (#2469) commit 196976c8faae1df92d915c93c7f24fd60bd0db56 Author: pshenmic Date: Fri Feb 14 18:50:08 2025 +0700 fix(sdk)!: bigint for uint64 values (#2443) commit 0bd29a6ddc67f9ddef9ffb7d4f2b99bd967d5b8d Author: pshenmic Date: Fri Feb 14 17:29:35 2025 +0700 feat(dpp): extra methods for state transitions in wasm (#2462) commit 1eae781a11619b832dedb7eb3a2abbdc69a0f6d9 Author: pshenmic Date: Fri Feb 14 15:29:17 2025 +0700 chore(platform): npm audit fix (#2463) commit ddf4e67fea0f9dfd7abfdfa63244fbe8fe62a607 Author: Ivan Shumkov Date: Fri Feb 14 11:28:08 2025 +0700 test: fix `fetchProofForStateTransition` tests and warnings (#2460) commit d88ea4621e3304cf3fa7c7488b61851b170f820b Author: Ivan Shumkov Date: Fri Feb 14 09:52:53 2025 +0700 fix(dpp): invalid imports and tests (#2459) commit 82e4d4c497a438311efa7d23dd1879d3d66645bb Merge: 125cfe79ec 4becf5f4b5 Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu Feb 13 19:05:51 2025 +0700 fix: check if token is paused on token transfers (#2458) commit 4becf5f4b587e9a90b35ab284de6fc6d384e8a90 Author: pauldelucia Date: Thu Feb 13 18:34:24 2025 +0700 add costs commit 907971d54b5be333826e107249f45ad82f6c8c7b Merge: 9026669553 125cfe79ec Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Thu Feb 13 18:05:06 2025 +0700 Merge branch 'v2.0-dev' into feat/token-paused-validation commit 125cfe79ecfa317da26f41438fd5b08f3172018f Merge: 91f65c61a1 c286ec0f0f Author: Ivan Shumkov Date: Thu Feb 13 15:51:46 2025 +0700 Merge branch 'v2.0-dev' into v2.0-tokens-dev commit 9026669553f4e427cb6c820e4e3c6ad351c54ff3 Author: pauldelucia Date: Thu Feb 13 13:41:19 2025 +0700 feat: check if token is paused on token transfers commit c286ec0f0fc2c9df6699ec64a0ef381308105fdd Author: pshenmic Date: Wed Feb 12 15:41:21 2025 +0700 feat(sdk): add option to request all keys (#2445) commit 91f65c61a18c1f6feef9f3861debbab0ac10ed5d Merge: d6b40e696f 1a1c50bccd Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Wed Feb 12 12:04:58 2025 +0700 fix: wrong order of parameters in UnauthorizedTokenActionError (#2456) commit 1a1c50bccdbe7e6390e0abc14d7d24731e22e32b Author: pauldelucia Date: Wed Feb 12 11:51:31 2025 +0700 fix: wrong order of parameters in UnauthorizedTokenActionError commit 26aff3657e9941bd46927e53b655ebc5492efd53 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue Feb 11 13:06:54 2025 +0100 build: bump Alpine version to 3.21 (#2074) commit 9daa1959a8efe4dac996bfd6c68cd14b6e35d726 Author: Ivan Shumkov Date: Tue Feb 11 14:38:55 2025 +0700 ci: use github-hosted arm runner for release workflow (#2452) commit 2b1c2528af34bb0ec2cb13c91b94863ac37d0d99 Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Tue Feb 4 16:40:34 2025 +0700 fix: proof result error for credit transfers in sdk (#2451) commit d6b40e696ff85fcbf70946a00cf7cad7a48a6369 Author: QuantumExplorer Date: Tue Feb 4 06:49:03 2025 +0700 feat(platform): token distribution part two (#2450) commit 93f7d446283e35ecdcc46473bc51d21fddaa5600 Author: Ivan Shumkov Date: Wed Jan 29 14:07:55 2025 +0700 fix(dpp): invalid feature flag instructions (#2448) commit 6d5af88a3b927758b776ae6c48c82b7291f7302e Author: QuantumExplorer Date: Mon Jan 27 16:59:39 2025 +0700 feat(dpp): token distribution model (#2447) commit e7353133e32bb779085ff55a492677434224430a Author: Ivan Shumkov Date: Mon Jan 27 14:24:26 2025 +0700 feat: add token transitions to SDK and DAPI (#2434) commit 0743be234d4008a5260d6ec41db6736a48b35798 Author: pshenmic Date: Sun Jan 26 22:00:40 2025 +0700 feat(dpp): extra methods for state transitions in wasm (#2401) commit f609bcf8678c3f45819f2b50b630c1ee182710c9 Merge: 3733f56867 cbddb8d8c0 Author: Ivan Shumkov Date: Fri Jan 24 18:16:38 2025 +0700 Merge branch 'v2.0-dev' into v2.0-tokens-dev commit cbddb8d8c0bc7b693beb553b8255b82d03def639 Author: QuantumExplorer Date: Fri Jan 24 17:59:16 2025 +0700 chore(platform): make bls sig compatibility an optional feature (#2440) Co-authored-by: Ivan Shumkov commit 764684b8a791d8f7d93b8613da7ab3e3767c77d3 Author: Ivan Shumkov Date: Fri Jan 24 17:57:27 2025 +0700 chore: ignore deprecated `lodash.get` (#2441) commit 3733f568676ba3e9faab612e276cf132f6649c0a Author: QuantumExplorer Date: Thu Jan 23 09:16:12 2025 +0700 feat(platform)!: enhance token configuration and validation mechanisms (#2439) commit 2480ceb9d6f0ad2f0deaed0f7e191f088b81385e Author: QuantumExplorer Date: Wed Jan 22 16:33:13 2025 +0700 chore: dapi grpc queries (#2437) commit c9ab154319484f65f5e313215e91eeaf066de69c Author: QuantumExplorer Date: Wed Jan 22 15:50:25 2025 +0700 feat(platform)!: improved token validation and token config update transition (#2435) commit d9647cc33213f119c10609c77e264c3e1c5a7bba Author: QuantumExplorer Date: Tue Jan 21 10:28:58 2025 +0700 feat: get proofs for tokens (#2433) commit e5964b8585a1ac83eced9536c074470eb133051b Author: QuantumExplorer Date: Mon Jan 20 23:31:50 2025 +0700 feat: group queries (#2432) commit 022030275eda1221166c7336071c335e419d1175 Author: QuantumExplorer Date: Sun Jan 19 14:43:51 2025 +0700 feat(platform): proof verification for many queries and a few more queries (#2431) commit cd1527d3ea54a7bcf0d51a036cd453859050c35b Author: QuantumExplorer Date: Fri Jan 17 19:39:37 2025 +0700 fix(dpp)!: wrapping overflow issue (#2430) commit fd7ee85febd9fda6d21edfc9218c9ca94a6c73ce Merge: d7143ccb48 e4e156c864 Author: Ivan Shumkov Date: Thu Jan 16 21:45:47 2025 +0700 Merge branch 'master' into v1.9-dev commit e4e156c864400e81c2407eac30715b50d8040c28 Author: QuantumExplorer Date: Thu Jan 16 18:11:57 2025 +0700 chore(release): update change log and release v1.8.0 (#2427) Co-authored-by: Ivan Shumkov commit 55a1e03273dd98797d43dff040f8e99827b9be3c Author: QuantumExplorer Date: Thu Jan 16 15:30:42 2025 +0700 feat(platform)!: token base support (#2383) commit 59bf0af642f8dd2daed53e5994fd0a04e2ca1a42 Author: QuantumExplorer Date: Thu Jan 16 13:10:39 2025 +0700 chore(release): bump to v1.8.0-rc.2 (#2426) commit 410eb09f8fe67a6da204313527d2f3615c5667ce Author: QuantumExplorer Date: Thu Jan 16 06:31:26 2025 +0700 fix(drive-abci): rebroadcasting should not only take first 2 quorums too (#2425) commit 2abce8ec578fb3a18d66f858adf14825cef3786e Author: Ivan Shumkov Date: Wed Jan 15 22:51:58 2025 +0700 chore(release): update changelog and bump version to 1.8.0-rc.1 (#2423) commit ad5f604375188bc753ed2695f7a59ce0e9d35945 Author: Ivan Shumkov Date: Wed Jan 15 22:14:13 2025 +0700 chore: update bls library (#2424) commit c6feb5b4dc1263cfdd8bd87010ecfa98e2e95e55 Author: QuantumExplorer Date: Wed Jan 15 18:57:49 2025 +0700 feat(platform)!: distribute prefunded specialized balances after vote (#2422) Co-authored-by: Ivan Shumkov commit 94dcbb289fdf7f1331dbc9437825d48a9d4bca1d Author: Ivan Shumkov Date: Wed Jan 15 05:51:45 2025 +0700 chore(drive): increase withdrawal limits to 2000 Dash per day (#2287) commit 6a0aedeca61421a58946f25c46662893c3977ff8 Author: Ivan Shumkov Date: Tue Jan 14 21:42:59 2025 +0700 chore: fix test suite configuration script (#2402) commit e94b7bb3ef1c316dc3043635cc017796aae1ad6d Author: QuantumExplorer Date: Tue Jan 14 19:23:46 2025 +0700 fix(drive-abci): document purchase on mutable document from different epoch had issue (#2420) commit 4ee57a6758161e2ce621e067a70d74b1fbc4195e Author: Ivan Shumkov Date: Tue Jan 14 19:12:20 2025 +0700 fix(drive): more than one key was returned when expecting only one result (#2421) commit be5cd6d34bb6baf31c4c79310c9bf6ce90a18642 Author: Ivan Shumkov Date: Mon Jan 13 15:12:33 2025 +0700 fix(sdk): failed to deserialize consensus error (#2410) commit e07271ed850baf2bb5c02e71f0ec14b2c6438fbf Author: Ivan Shumkov Date: Mon Jan 13 14:57:08 2025 +0700 chore: resolve NPM audit warnings (#2417) commit a809df7cb5cf800fda629ba84f4ba3871984c087 Author: QuantumExplorer Date: Sun Jan 12 09:21:48 2025 +0700 test: unify identity versioned cost coverage (#2416) commit 6d637fe72d4e081178d2dbe2e7ca64032e7cd4be Author: Paul DeLucia <69597248+pauldelucia@users.noreply.github.com> Date: Fri Dec 27 09:42:04 2024 -0500 fix: try DriveDocumentQuery from DocumentQuery start field (#2407) commit cfd9c4deb584786e58214b5a29343ac5b44dbda3 Author: Ivan Shumkov Date: Thu Dec 19 18:30:06 2024 +0700 chore(release): update changelog and bump version to 1.8.0-dev.2 (#2404) commit fecda31d018b0eba4397ade1d3387e8de703eb21 Merge: 37d5732356 fc7d994b87 Author: Ivan Shumkov Date: Thu Dec 19 15:33:45 2024 +0700 Merge branch 'master' into v1.8-dev commit fc7d994b8722b628e7f9976f37b76e8a8c5dff24 Author: Ivan Shumkov Date: Thu Dec 19 14:40:44 2024 +0700 chore(release): update changelog and bump version to 1.7.1 (#2403) commit adcd3b8625b295099ce6f7953bc643711181cee1 Author: QuantumExplorer Date: Thu Dec 19 09:54:07 2024 +0300 fix!: emergency hard fork to fix masternode voting (#2397) commit 37d573235655d8a12346f6c91b01f5bf6dcd4cae Author: Ivan Shumkov Date: Wed Dec 18 22:24:37 2024 +0700 fix(dashmate): some group commands fail with mtime not found (#2400) commit 01a5b7a8887a3af9f8625210db7ff88c02391e78 Author: Ivan Shumkov Date: Wed Dec 18 20:44:44 2024 +0700 refactor(dpp): using deprecated param to init wasm module (#2399) commit c5f5878c43166cd4c02de754ef8664d67169515d Author: Ivan Shumkov Date: Wed Dec 18 18:04:14 2024 +0700 fix(dashmate): local network starting issues (#2394) commit 71c41ff96b45ede749ebd67d14ba94700f699308 Author: Ivan Shumkov Date: Wed Dec 18 18:03:55 2024 +0700 perf(dpp): reduce JS binding size by 3x (#2396) commit 21ec39367f7e20f50dfb3a581b13fa395920e4a8 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Wed Dec 18 10:47:58 2024 +0100 build!: update rust to 1.83 - backport #2393 to v1.7 (#2398) commit d7143ccb48cc1569ae5132e8533416bdf5cfa8b4 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Wed Dec 18 08:53:53 2024 +0100 build!: optimize for x86-64-v3 cpu microarchitecture (Haswell+) (#2374) commit d318b1c3fbb43c1f57a159aa119ba4dda06260e9 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue Dec 17 14:56:15 2024 +0100 build: bump wasm-bindgen to 0.2.99 (#2395) commit 889d192a20ed0958c44b9c8b962f98b01df688aa Author: Ivan Shumkov Date: Tue Dec 17 19:25:58 2024 +0700 chore(release): update changelog and bump version to 1.8.0-dev.1 (#2391) commit 8185d210590bff2240716ad36a438aff82c202b1 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue Dec 17 10:47:53 2024 +0100 feat(sdk)!: allow setting CA cert (#1924) commit 82a621742ea736c1beb25cedfa0e6f8ef1790ce9 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Tue Dec 17 02:51:18 2024 +0100 build!: update rust to 1.83 (#2393) commit 494054a2856b8dae341c7562b81eec6fd19afd5f Author: QuantumExplorer Date: Mon Dec 16 13:47:58 2024 +0300 refactor(platform): replace bls library (#2257) Co-authored-by: Lukasz Klimek <842586+lklimek@users.noreply.github.com> commit 4c203e4463a325f0ebc25bddba57b6040b559c04 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon Dec 16 10:38:34 2024 +0100 test(sdk): generate test vectors using testnet (#2381) commit 0ff6b275a2f69b149aaf0f681725ea0442945c0a Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Mon Dec 16 10:37:35 2024 +0100 chore: remove deprecated check_network_version.sh (#2084) commit b265bb81c1394a7116c2f8605c275d5a91a9948a Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Fri Dec 13 13:25:40 2024 +0100 ci: fix artifact upload issue on release build (#2389) commit 40ae73f875df8a8d7f3d1fe997e547768f0bdb91 Author: Ivan Shumkov Date: Fri Dec 13 17:35:40 2024 +0700 chore(release): update changelog and bump version to 1.7.0 (#2387) commit 257e3dad4e7517d8e1528240a0c302255b5a7b03 Author: Ivan Shumkov Date: Fri Dec 13 15:44:10 2024 +0700 chore(dashmate)!: update Core to version 22 (#2384) commit 19a4c6d13cb517dfc32e17faaa4143fe2bb44d0a Author: Ivan Shumkov Date: Thu Dec 12 18:30:14 2024 +0700 chore(dashmate): set tenderdash version to 1 (#2385) commit 0e9d4dc1b83064e28e8c3314aedecf49ed201bd6 Author: lklimek <842586+lklimek@users.noreply.github.com> Date: Thu Dec 12 11:39:35 2024 +0100 chore: address vulnerabilty GHSA-mwcw-c2x4-8c55 (#2382) Co-authored-by: Ivan Shumkov commit bdae90c6ca7b400dc54bee2d35fd278c01b369ed Author: Ivan Shumkov Date: Thu Dec 12 13:36:04 2024 +0700 chore(dashmate): increase subsidy for devnet (#2353) --- .cargo/config-release.toml | 8 +- .cargo/config.toml | 22 +- .devcontainer/Dockerfile | 2 +- .github/actions/librocksdb/action.yaml | 4 +- .github/package-filters/js-packages.yml | 6 + .github/package-filters/rs-packages.yml | 5 + .github/workflows/release-docker-image.yml | 19 +- .github/workflows/release.yml | 10 +- .github/workflows/tests-build-js.yml | 9 +- .pnp.cjs | 459 +- ...ce-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip | Bin 56381 -> 0 bytes ...ettled-npm-1.1.2-c0f42e147b-ee8fe811be.zip | Bin 4432 -> 0 bytes ...colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip | Bin 0 -> 10383 bytes ...okidar-npm-3.6.0-3c413a828f-c327fb0770.zip | Bin 0 -> 31342 bytes .../cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip | Bin 0 -> 12504 bytes .../debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip | Bin 15650 -> 0 bytes .../debug-npm-4.4.0-f6efe76023-1847944c2e.zip | Bin 0 -> 15951 bytes .../diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip | Bin 206407 -> 0 bytes .../diff-npm-5.0.0-ad6900db18-4a179a75b1.zip | Bin 124199 -> 0 bytes .../diff-npm-5.2.0-f523a581f3-01b7b440f8.zip | Bin 0 -> 144414 bytes .../glob-npm-7.2.0-bb4644d239-bc78b6ea07.zip | Bin 19539 -> 0 bytes ...growl-npm-1.10.5-2d1da54198-1391a9add9.zip | Bin 12058 -> 0 bytes ...imatch-npm-4.2.1-558ec7f418-27e49fb720.zip | Bin 13126 -> 0 bytes ...imatch-npm-5.0.1-612724f6f0-2656580f18.zip | Bin 13696 -> 0 bytes ...mocha-npm-10.2.0-87db25c7c5-f7362898ae.zip | Bin 510226 -> 0 bytes ...mocha-npm-11.1.0-7c863baca0-50d1305813.zip | Bin 0 -> 522102 bytes .../mocha-npm-9.2.2-f7735febb8-8ee58bff86.zip | Bin 969855 -> 0 bytes ...nanoid-npm-3.3.1-bdd760bee0-306f2cb9e4.zip | Bin 14130 -> 0 bytes ...nanoid-npm-3.3.3-25d865be84-c703ed58a2.zip | Bin 14119 -> 0 bytes ...-utils-npm-4.3.0-6f0a75e2e2-86c5a7c72a.zip | Bin 0 -> 24419 bytes ...script-npm-6.0.0-0bb8a3c88d-ed3dabfbb5.zip | Bin 7321 -> 0 bytes ...tion-npm-5.22.11-e704a1605b-315cd3f2cc.zip | Bin 142631 -> 0 bytes ...tion-npm-5.25.11-e1c9348b68-9a43bb8991.zip | Bin 0 -> 160169 bytes ...erser-npm-5.14.2-b0f8815852-0646b5db1d.zip | Bin 428464 -> 0 bytes ...erser-npm-5.39.0-127c67156d-d84aff6423.zip | Bin 0 -> 470431 bytes ...lugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip | Bin 0 -> 22979 bytes ...plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip | Bin 23168 -> 0 bytes ...mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip | Bin 6054 -> 0 bytes ...-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip | Bin 0 -> 238737 bytes ...s-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip | Bin 39072 -> 0 bytes ...erpool-npm-6.2.0-d2a722f6bb-c7dce6eae0.zip | Bin 102713 -> 0 bytes ...erpool-npm-6.2.1-1486cb2056-3e637f7632.zip | Bin 102732 -> 0 bytes ...erpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip | Bin 0 -> 111251 bytes ...yargs-npm-17.7.2-80b62638e1-abb3e37678.zip | Bin 0 -> 88003 bytes ...arser-npm-20.2.4-1de20916a6-db8f251ae4.zip | Bin 30011 -> 0 bytes ...arser-npm-21.1.1-8fdc003314-9dc2c217ea.zip | Bin 0 -> 32536 bytes .../yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip | Bin 3226 -> 0 bytes .yarnrc.yml | 5 +- CHANGELOG.md | 208 + Cargo.lock | 965 +- Cargo.toml | 9 +- Dockerfile | 75 +- README.md | 4 +- package.json | 9 +- packages/bench-suite/package.json | 4 +- packages/check-features/Cargo.toml | 2 +- packages/dapi-grpc/.eslintrc | 3 + packages/dapi-grpc/Cargo.toml | 39 +- packages/dapi-grpc/build.rs | 88 +- .../dash/platform/dapi/v0/PlatformGrpc.java | 814 + .../platform/v0/nodejs/platform_pbjs.js | 22311 ++++++- .../platform/v0/nodejs/platform_protoc.js | 55089 +++++++++++----- .../platform/v0/objective-c/Platform.pbobjc.h | 2246 + .../platform/v0/objective-c/Platform.pbobjc.m | 5970 ++ .../platform/v0/objective-c/Platform.pbrpc.h | 143 + .../platform/v0/objective-c/Platform.pbrpc.m | 220 + .../platform/v0/python/platform_pb2.py | 7969 ++- .../platform/v0/python/platform_pb2_grpc.py | 363 + .../clients/platform/v0/web/platform_pb.d.ts | 3015 +- .../clients/platform/v0/web/platform_pb.js | 55089 +++++++++++----- .../platform/v0/web/platform_pb_service.d.ts | 209 + .../platform/v0/web/platform_pb_service.js | 440 + packages/dapi-grpc/package.json | 4 +- .../protos/platform/v0/platform.proto | 635 +- packages/dapi-grpc/src/lib.rs | 29 +- .../fetchProofForStateTransitionFactory.js | 173 +- ...tForStateTransitionResultHandlerFactory.js | 7 +- packages/dapi/package.json | 4 +- ...tateTransitionResultHandlerFactory.spec.js | 44 +- ...etchProofForStateTransitionFactory.spec.js | 48 +- packages/dash-spv/package.json | 4 +- .../configs/defaults/getBaseConfigFactory.js | 5 +- .../configs/getConfigFileMigrationsFactory.js | 18 + packages/dashmate/package.json | 6 +- .../dashmate/src/config/configJsonSchema.js | 6 +- .../core/quorum/waitForMasternodeProbes.js | 17 +- .../core/quorum/waitForQuorumConnections.js | 4 - .../src/listr/tasks/resetNodeTaskFactory.js | 8 - .../setup/local/configureCoreTaskFactory.js | 223 +- .../local/enableCoreQuorumsTaskFactory.js | 18 - .../setup/setupLocalPresetTaskFactory.js | 6 +- .../listr/tasks/startGroupNodesTaskFactory.js | 40 - .../src/listr/tasks/stopNodeTaskFactory.js | 17 - .../dashmate/src/status/scopes/platform.js | 7 +- .../dashmate/templates/core/dash.conf.dot | 5 +- packages/dashpay-contract/Cargo.toml | 2 +- packages/dashpay-contract/package.json | 4 +- packages/data-contracts/Cargo.toml | 3 +- packages/data-contracts/src/error.rs | 17 + packages/data-contracts/src/lib.rs | 10 + packages/dpns-contract/Cargo.toml | 2 +- packages/dpns-contract/package.json | 4 +- packages/feature-flags-contract/Cargo.toml | 2 +- packages/feature-flags-contract/package.json | 4 +- packages/js-dapi-client/.eslintrc.yml | 2 + .../BlockHeadersProvider.js | 27 +- .../createMasternodeListStreamFactory.js | 5 +- .../DataContractHistoryEntry.js | 26 + .../GetDataContractHistoryResponse.js | 22 +- .../getDataContractHistoryFactory.js | 6 +- .../platform/getEpochsInfo/EpochInfo.js | 8 +- .../getEpochsInfo/GetEpochsInfoResponse.js | 4 +- .../GetIdentityBalanceResponse.js | 6 +- .../GetIdentityContractNonceResponse.js | 10 +- .../getIdentityKeys/getIdentityKeysFactory.js | 21 +- .../GetIdentityNonceResponse.js | 10 +- .../methods/platform/getStatus/ChainStatus.js | 99 + .../platform/getStatus/GetStatusResponse.js | 164 + .../platform/getStatus/NetworkStatus.js | 35 + .../methods/platform/getStatus/NodeStatus.js | 26 + .../platform/getStatus/StateSyncStatus.js | 89 + .../methods/platform/getStatus/TimeStatus.js | 49 + .../platform/getStatus/VersionStatus.js | 79 + .../platform/getStatus/getStatusFactory.js | 12 +- .../GetTotalCreditsInPlatformResponse.js | 6 +- .../platform/response/AbstractResponse.js | 7 +- .../lib/methods/platform/response/Metadata.js | 12 +- .../ErrorResult.js | 4 +- .../WaitForStateTransitionResultResponse.js | 8 +- .../lib/test/fixtures/getMetadataFixture.js | 13 +- .../lib/test/fixtures/getStatusFixture.js | 62 + packages/js-dapi-client/package.json | 7 +- .../GetDataContractResponse.spec.js | 24 +- .../getDataContractFactory.spec.js | 29 +- .../GetDataContractHistoryResponse.spec.js | 75 +- .../getDataContractHistoryFactory.spec.js | 61 +- .../getDocuments/GetDocumentsResponse.spec.js | 22 +- .../getDocuments/getDocumentsFactory.spec.js | 36 +- .../GetEpochsInfoResponse.spec.js | 32 +- .../getEpochsInfoFactory.spec.js | 27 +- .../GetIdentitiesContractKeysResponse.spec.js | 30 +- .../getIdentitiesContractKeysFactory.spec.js | 25 +- .../GetIdentityResponse.spec.js | 20 +- .../getIdentityFactory.spec.js | 25 +- .../GetIdentityBalanceResponse.spec.js | 14 +- .../getIdentityBalanceFactory.spec.js | 29 +- ...GetIdentityByPublicKeyHashResponse.spec.js | 21 +- .../getIdentityByPublicKeyHashFactory.spec.js | 25 +- .../GetIdentityContractNonce.spec.js | 16 +- .../getIdentityContractNonceFactory.spec.js | 29 +- .../getIdentityKeys/GetIdentityKeys.spec.js | 10 +- .../getIdentityKeysFactory.spec.js | 78 +- .../getIdentityNonce/GetIdentityNonce.spec.js | 15 +- .../getIdentityNonceFactory.spec.js | 29 +- ...rotocolVersionUpgradeStateResponse.spec.js | 10 +- ...ProtocolVersionUpgradeStateFactory.spec.js | 25 +- ...olVersionUpgradeVoteStatusResponse.spec.js | 10 +- ...colVersionUpgradeVoteStatusFactory.spec.js | 25 +- .../getStatus/GetStatusResponse.spec.js | 347 + .../getStatus/getStatusFactory.spec.js | 279 + ...aitForStateTransitionResultFactory.spec.js | 36 +- packages/js-dash-sdk/package.json | 9 +- packages/js-dash-sdk/src/SDK/Client/Client.ts | 6 +- .../SDK/Client/Platform/Fetcher/Fetcher.ts | 12 +- .../Client/Platform/IStateTransitionResult.ts | 2 +- .../NonceManager/NonceManager.spec.ts | 46 +- .../Platform/NonceManager/NonceManager.ts | 24 +- .../Platform/broadcastStateTransition.ts | 6 +- .../Platform/methods/contracts/get.spec.ts | 8 +- .../Client/Platform/methods/contracts/get.ts | 12 +- .../methods/contracts/history.spec.ts | 3 +- .../Platform/methods/contracts/history.ts | 17 +- .../Platform/methods/contracts/update.ts | 2 +- .../Platform/methods/documents/broadcast.ts | 2 +- .../Client/Platform/methods/documents/get.ts | 12 +- .../Client/Platform/methods/identities/get.ts | 12 +- .../createAndAttachTransportMocksToClient.ts | 2 +- .../src/test/mocks/createDapiClientMock.ts | 4 +- packages/js-dash-sdk/tests/functional/sdk.js | 1 - packages/js-dash-sdk/tsconfig.json | 2 +- packages/js-dash-sdk/tsconfig.mocha.json | 8 +- packages/js-grpc-common/package.json | 4 +- .../Cargo.toml | 2 +- .../package.json | 4 +- .../test/fixtures/getDataContractFixture.js | 2 +- .../lib/test/fixtures/getIdentityFixture.js | 2 +- packages/platform-test-suite/package.json | 4 +- .../test/e2e/withdrawals.spec.js | 10 +- .../test/functional/platform/Document.spec.js | 2 +- .../test/functional/platform/Epoch.spec.js | 2 +- .../test/functional/platform/Identity.spec.js | 23 +- .../functional/platform/getStatus.spec.js | 9 +- packages/rs-dapi-client/Cargo.toml | 30 +- packages/rs-dapi-client/src/address_list.rs | 2 +- .../rs-dapi-client/src/connection_pool.rs | 2 +- packages/rs-dapi-client/src/dapi_client.rs | 45 +- packages/rs-dapi-client/src/executor.rs | 8 +- packages/rs-dapi-client/src/lib.rs | 4 + .../rs-dapi-client/src/request_settings.rs | 19 +- packages/rs-dapi-client/src/transport.rs | 17 +- packages/rs-dapi-client/src/transport/grpc.rs | 57 +- .../src/transport/tonic_channel.rs | 45 + .../src/transport/wasm_channel.rs | 119 + .../tests/local_platform_connectivity.rs | 17 +- packages/rs-dapi-grpc-macros/Cargo.toml | 2 +- packages/rs-dpp/Cargo.toml | 65 +- .../meta_schemas/token/v0/token-meta.json | 245 + packages/rs-dpp/src/balances/credits.rs | 13 +- packages/rs-dpp/src/balances/mod.rs | 2 + .../total_single_token_balance/mod.rs | 49 + .../src/balances/total_tokens_balance/mod.rs | 53 + packages/rs-dpp/src/bls/mod.rs | 2 +- .../rs-dpp/src/data_contract/accessors/mod.rs | 176 +- .../src/data_contract/accessors/v1/mod.rs | 57 + .../src/data_contract/associated_token/mod.rs | 7 + .../token_configuration/accessors/mod.rs | 242 + .../token_configuration/accessors/v0/mod.rs | 104 + .../apply_token_configuration_item/mod.rs | 18 + .../apply_token_configuration_item/v0/mod.rs | 140 + .../mod.rs | 25 + .../v0/mod.rs | 127 + .../can_apply_token_configuration_item/mod.rs | 38 + .../v0/mod.rs | 287 + .../token_configuration/methods/mod.rs | 5 + .../mod.rs | 50 + .../v0/mod.rs | 42 + .../mod.rs | 43 + .../v0/mod.rs | 361 + .../token_configuration/mod.rs | 33 + .../token_configuration/v0/accessors.rs | 222 + .../token_configuration/v0/mod.rs | 258 + .../token_configuration_convention/mod.rs | 25 + .../token_configuration_convention/v0/mod.rs | 56 + .../token_configuration_item.rs | 220 + .../token_distribution_key.rs | 31 + .../token_distribution_rules/accessors/mod.rs | 158 + .../accessors/v0/mod.rs | 73 + .../token_distribution_rules/mod.rs | 26 + .../token_distribution_rules/v0/accessors.rs | 114 + .../token_distribution_rules/v0/mod.rs | 79 + .../distribution_function/encode.rs | 208 + .../distribution_function/mod.rs | 243 + .../distribution_recipient.rs | 31 + .../methods/mod.rs | 44 + .../methods/v0/mod.rs | 25 + .../token_perpetual_distribution/mod.rs | 44 + .../reward_distribution_type/mod.rs | 44 + .../v0/methods.rs | 26 + .../token_perpetual_distribution/v0/mod.rs | 27 + .../methods/mod.rs | 41 + .../methods/v0/mod.rs | 24 + .../token_pre_programmed_distribution/mod.rs | 25 + .../v0/mod.rs | 28 + .../authorized_action_takers.rs | 132 + .../data_contract/change_control_rules/mod.rs | 138 + .../change_control_rules/v0/mod.rs | 181 + .../src/data_contract/conversion/cbor/mod.rs | 16 +- .../src/data_contract/conversion/json/mod.rs | 11 +- .../src/data_contract/conversion/value/mod.rs | 8 +- .../src/data_contract/data_contract_facade.rs | 17 +- .../mod.rs | 17 +- .../v0/mod.rs | 1 + .../v1/mod.rs | 66 + .../class_methods/try_from_schema/v0/mod.rs | 50 +- .../data_contract/document_type/index/mod.rs | 58 +- .../methods/estimated_size/v0/mod.rs | 35 +- .../document_type/methods/max_size/v0/mod.rs | 32 +- .../document_type/methods/mod.rs | 4 +- .../src/data_contract/document_type/mod.rs | 2 + .../document_type/property/mod.rs | 198 +- .../document_type/restricted_creation/mod.rs | 2 +- .../schema/enrich_with_base_schema/v0/mod.rs | 5 +- .../data_contract/extra/drive_api_tests.rs | 61 +- .../src/data_contract/factory/v0/mod.rs | 13 +- .../src/data_contract/group/accessors/mod.rs | 1 + .../data_contract/group/accessors/v0/mod.rs | 33 + .../src/data_contract/group/methods/mod.rs | 1 + .../src/data_contract/group/methods/v0/mod.rs | 10 + .../rs-dpp/src/data_contract/group/mod.rs | 99 + .../rs-dpp/src/data_contract/group/v0/mod.rs | 155 + .../rs-dpp/src/data_contract/methods/mod.rs | 2 + .../src/data_contract/methods/schema/mod.rs | 22 + .../methods/validate_groups/mod.rs | 58 + .../methods/validate_groups/v0/mod.rs | 39 + .../methods/validate_update/v0/mod.rs | 82 + packages/rs-dpp/src/data_contract/mod.rs | 76 +- .../data_contract/serialized_version/mod.rs | 173 +- .../serialized_version/v0/mod.rs | 33 +- .../serialized_version/v1/mod.rs | 136 + .../src/data_contract/v0/conversion/cbor.rs | 2 +- .../src/data_contract/v0/conversion/value.rs | 7 +- .../src/data_contract/v0/methods/schema.rs | 1 + .../data_contract/v0/serialization/bincode.rs | 31 - .../src/data_contract/v0/serialization/mod.rs | 117 +- .../src/data_contract/v1/accessors/mod.rs | 225 + .../src/data_contract/v1/conversion/cbor.rs | 98 + .../src/data_contract/v1/conversion/json.rs | 38 + .../src/data_contract/v1/conversion/mod.rs | 8 + .../src/data_contract/v1/conversion/value.rs | 78 + .../src/data_contract/v1/data_contract.rs | 75 + .../src/data_contract/v1/methods/mod.rs | 1 + .../src/data_contract/v1/methods/schema.rs | 198 + packages/rs-dpp/src/data_contract/v1/mod.rs | 7 + .../src/data_contract/v1/serialization/mod.rs | 194 + .../src/document/document_factory/mod.rs | 7 +- .../src/document/document_factory/v0/mod.rs | 18 +- packages/rs-dpp/src/document/errors.rs | 2 +- .../specialized_document_factory/mod.rs | 7 +- .../specialized_document_factory/v0/mod.rs | 18 +- .../src/errors/consensus/basic/basic_error.rs | 79 +- ...ntract_token_configuration_update_error.rs | 63 + .../group_exceeds_max_members_error.rs | 31 + .../group_member_has_power_of_zero_error.rs | 32 + ...group_member_has_power_over_limit_error.rs | 57 + ...ower_has_less_than_required_power_error.rs | 49 + .../group_position_does_not_exist_error.rs | 46 + ...ower_has_less_than_required_power_error.rs | 40 + .../invalid_token_base_supply_error.rs | 41 + .../consensus/basic/data_contract/mod.rs | 20 + ...ntiguous_contract_group_positions_error.rs | 52 + ...ntiguous_contract_token_positions_error.rs | 52 + ..._action_not_allowed_on_transition_error.rs | 31 + .../src/errors/consensus/basic/group/mod.rs | 3 + ...set_lock_transaction_is_not_found_error.rs | 12 - .../rs-dpp/src/errors/consensus/basic/mod.rs | 2 + ..._token_mint_recipient_not_allowed_error.rs | 31 + .../token/contract_has_no_tokens_error.rs | 31 + ...dentity_for_token_minting_not_set_error.rs | 33 + .../basic/token/invalid_action_id_error.rs | 43 + .../basic/token/invalid_token_id_error.rs | 43 + .../token/invalid_token_position_error.rs | 47 + .../src/errors/consensus/basic/token/mod.rs | 15 + .../token_transfer_to_ourselves_error.rs | 44 + packages/rs-dpp/src/errors/consensus/codes.rs | 53 +- ...ontract_update_action_not_allowed_error.rs | 45 + .../consensus/state/data_contract/mod.rs | 1 + .../consensus/state/data_trigger/mod.rs | 2 +- .../group_action_already_completed_error.rs | 55 + ...action_already_signed_by_identity_error.rs | 64 + .../group_action_does_not_exist_error.rs | 56 + .../identity_not_member_of_group_error.rs | 56 + .../src/errors/consensus/state/group/mod.rs | 9 + .../errors/consensus/state/identity/mod.rs | 3 + ...recipient_identity_does_not_exist_error.rs | 31 + .../rs-dpp/src/errors/consensus/state/mod.rs | 2 + .../src/errors/consensus/state/state_error.rs | 76 +- ...oes_not_have_enough_token_balance_error.rs | 70 + ...tity_token_account_already_frozen_error.rs | 51 + .../identity_token_account_frozen_error.rs | 51 + ...identity_token_account_not_frozen_error.rs | 51 + .../token/invalid_group_position_error.rs | 50 + .../src/errors/consensus/state/token/mod.rs | 31 + ...action_taker_group_does_not_exist_error.rs | 36 + ...ion_taker_identity_does_not_exist_error.rs | 32 + ...d_action_taker_main_group_not_set_error.rs | 29 + ...stination_identity_does_not_exist_error.rs | 34 + .../state/token/token_already_paused_error.rs | 37 + .../state/token/token_is_paused_error.rs | 32 + .../token/token_mint_past_max_supply_error.rs | 60 + .../state/token/token_not_paused_error.rs | 37 + ...upply_to_less_than_current_supply_error.rs | 48 + .../token/unauthorized_token_action_error.rs | 60 + packages/rs-dpp/src/errors/protocol_error.rs | 16 + packages/rs-dpp/src/group/action_event.rs | 12 + packages/rs-dpp/src/group/action_taker.rs | 13 + packages/rs-dpp/src/group/group_action/mod.rs | 14 + .../rs-dpp/src/group/group_action/v0/mod.rs | 12 + .../rs-dpp/src/group/group_action_status.rs | 29 + packages/rs-dpp/src/group/mod.rs | 69 + .../rs-dpp/src/identity/identity_facade.rs | 8 +- .../chain/chain_asset_lock_proof.rs | 1 - .../state_transition/asset_lock_proof/mod.rs | 2 +- packages/rs-dpp/src/lib.rs | 23 +- packages/rs-dpp/src/nft/mod.rs | 1 - packages/rs-dpp/src/state_transition/mod.rs | 196 +- .../src/state_transition/proof_result.rs | 9 + .../src/state_transition/serialization.rs | 12 +- .../state_transition_types.rs | 2 +- .../batch_transition/accessors/mod.rs | 99 + .../batch_transition/accessors/v0/mod.rs | 19 + .../document_base_transition_trait.rs | 16 + .../document_base_transition/fields.rs | 2 +- .../document_base_transition/from_document.rs | 4 +- .../document_base_transition/mod.rs | 3 +- .../v0/from_document.rs | 4 +- .../document_base_transition/v0/mod.rs | 2 +- .../document_base_transition/v0/v0_methods.rs | 2 +- .../document_base_transition/v0_methods.rs | 4 +- .../document_create_transition/convertible.rs | 14 +- .../from_document.rs | 4 +- .../document_create_transition/mod.rs | 2 +- .../v0/from_document.rs | 4 +- .../document_create_transition/v0/mod.rs | 16 +- .../v0/v0_methods.rs | 24 +- .../document_create_transition/v0_methods.rs | 11 +- .../from_document.rs | 4 +- .../document_delete_transition/mod.rs | 0 .../v0/from_document.rs | 10 +- .../document_delete_transition/v0/mod.rs | 2 +- .../v0/v0_methods.rs | 17 + .../document_delete_transition/v0_methods.rs | 8 +- .../from_document.rs | 4 +- .../document_purchase_transition/mod.rs | 0 .../v0/from_document.rs | 10 +- .../document_purchase_transition/v0/mod.rs | 2 +- .../v0/v0_methods.rs | 24 +- .../v0_methods.rs | 11 +- .../from_document.rs | 10 +- .../document_replace_transition/mod.rs | 0 .../v0/from_document.rs | 10 +- .../document_replace_transition/v0/mod.rs | 4 +- .../v0/v0_methods.rs | 21 +- .../document_replace_transition/v0_methods.rs | 11 +- .../from_document.rs | 12 +- .../document_transfer_transition/mod.rs | 0 .../v0/from_document.rs | 12 +- .../document_transfer_transition/v0/mod.rs | 2 +- .../v0/v0_methods.rs | 21 +- .../v0_methods.rs | 11 +- .../document_transition.rs} | 170 +- .../document_transition_action_type.rs} | 8 +- .../from_document.rs | 4 +- .../document_update_price_transition/mod.rs | 0 .../v0/from_document.rs | 4 +- .../v0/mod.rs | 2 +- .../v0/v0_methods.rs | 21 +- .../v0_methods.rs | 11 +- .../batched_transition/mod.rs | 141 + .../batched_transition/multi_party_action.rs | 5 + .../batched_transition/resolvers.rs | 185 + .../token_base_transition/fields.rs | 12 + .../token_base_transition/mod.rs | 106 + .../token_base_transition_accessors.rs | 16 + .../token_base_transition/v0/mod.rs | 117 + .../token_base_transition/v0/v0_methods.rs | 102 + .../token_base_transition/v0_methods.rs | 86 + .../token_burn_transition/mod.rs | 24 + .../token_burn_transition/v0/mod.rs | 38 + .../token_burn_transition/v0/v0_methods.rs | 75 + .../token_burn_transition/v0_methods.rs | 86 + .../token_config_update_transition/mod.rs | 25 + .../token_config_update_transition/v0/mod.rs | 27 + .../v0/v0_methods.rs | 86 + .../v0_methods.rs | 91 + .../mod.rs | 25 + .../v0/mod.rs | 25 + .../v0/v0_methods.rs | 78 + .../v0_methods.rs | 87 + .../token_emergency_action_transition/mod.rs | 25 + .../v0/mod.rs | 30 + .../v0/v0_methods.rs | 80 + .../v0_methods.rs | 86 + .../token_freeze_transition/mod.rs | 24 + .../token_freeze_transition/v0/mod.rs | 46 + .../token_freeze_transition/v0/v0_methods.rs | 78 + .../token_freeze_transition/v0_methods.rs | 85 + .../token_mint_transition/mod.rs | 24 + .../token_mint_transition/v0/mod.rs | 59 + .../token_mint_transition/v0/v0_methods.rs | 112 + .../token_mint_transition/v0_methods.rs | 109 + .../token_transfer_transition/mod.rs | 18 + .../token_transfer_transition/v0/mod.rs | 61 + .../v0/v0_methods.rs | 199 + .../token_transfer_transition/v0_methods.rs | 163 + .../batched_transition/token_transition.rs | 387 + .../token_transition_action_type.rs | 74 + .../token_unfreeze_transition/mod.rs | 24 + .../token_unfreeze_transition/v0/mod.rs | 42 + .../v0/v0_methods.rs | 78 + .../token_unfreeze_transition/v0_methods.rs | 85 + .../fields.rs | 2 +- .../batch_transition/identity_signed.rs | 26 + .../json_conversion.rs | 17 +- .../document/batch_transition/methods/mod.rs | 919 + .../methods/v0/mod.rs | 35 +- .../batch_transition/methods/v1/mod.rs | 184 + .../document/batch_transition/mod.rs | 116 + .../batch_transition/resolvers/mod.rs | 1 + .../batch_transition/resolvers/v0/mod.rs | 26 + .../batch_transition/state_transition_like.rs | 79 + .../v0/cbor_conversion.rs | 0 .../v0/identity_signed.rs | 4 +- .../batch_transition/v0/json_conversion.rs | 4 + .../v0/mod.rs | 4 +- .../v0/state_transition_like.rs | 20 +- .../v0/types.rs | 8 +- .../v0/v0_methods.rs | 90 +- .../batch_transition/v0/value_conversion.rs | 4 + .../v0/version.rs | 4 +- .../batch_transition/v1/identity_signed.rs | 23 + .../batch_transition/v1/json_conversion.rs | 4 + .../document/batch_transition/v1/mod.rs | 37 + .../v1/state_transition_like.rs | 92 + .../document/batch_transition/v1/types.rs | 18 + .../batch_transition/v1/v0_methods.rs | 977 + .../batch_transition/v1/value_conversion.rs | 4 + .../document/batch_transition/v1/version.rs | 9 + .../validation/find_duplicates_by_id/mod.rs | 2 +- .../find_duplicates_by_id/v0/mod.rs | 23 +- .../validation/mod.rs | 0 .../validate_basic_structure/mod.rs | 4 +- .../validate_basic_structure/v0/mod.rs | 192 + .../value_conversion.rs | 51 +- .../document/batch_transition/version.rs | 12 + .../accessors/mod.rs | 19 - .../accessors/v0/mod.rs | 6 - .../v0/v0_methods.rs | 29 - .../identity_signed.rs | 27 - .../documents_batch_transition/methods/mod.rs | 326 - .../documents_batch_transition/mod.rs | 598 - .../state_transition_like.rs | 71 - .../v0/json_conversion.rs | 4 - .../v0/value_conversion.rs | 4 - .../validate_basic_structure/v0/mod.rs | 104 - .../documents_batch_transition/version.rs | 11 - .../state_transitions/document/mod.rs | 2 +- .../methods/v0/mod.rs | 2 + .../v0/v0_methods.rs | 2 + .../value_conversion.rs | 2 +- .../traits/state_transition_like.rs | 3 +- .../get_document_transitions_fixture.rs | 17 +- .../rs-dpp/src/tokens/allowed_currency.rs | 7 + .../rs-dpp/src/tokens/emergency_action.rs | 33 + packages/rs-dpp/src/tokens/errors.rs | 11 + packages/rs-dpp/src/tokens/info/methods.rs | 16 + packages/rs-dpp/src/tokens/info/mod.rs | 44 + packages/rs-dpp/src/tokens/info/v0/mod.rs | 26 + packages/rs-dpp/src/tokens/mod.rs | 26 + packages/rs-dpp/src/tokens/status/methods.rs | 16 + packages/rs-dpp/src/tokens/status/mod.rs | 44 + packages/rs-dpp/src/tokens/status/v0/mod.rs | 26 + packages/rs-dpp/src/tokens/token_event.rs | 230 + .../rs-dpp/src/util/cbor_value/canonical.rs | 4 +- packages/rs-dpp/src/util/deserializer.rs | 14 - packages/rs-dpp/src/util/json_schema.rs | 1 + .../src/validation/meta_validators/mod.rs | 65 +- .../contender_structs/contender/v0/mod.rs | 2 +- .../src/voting/contender_structs/mod.rs | 2 +- .../mod.rs | 2 +- .../mod.rs | 2 +- packages/rs-dpp/src/voting/vote_polls/mod.rs | 2 +- .../src/voting/votes/resource_vote/mod.rs | 2 +- .../withdrawal/daily_withdrawal_limit/mod.rs | 2 + .../daily_withdrawal_limit/v1/mod.rs | 8 + packages/rs-drive-abci/Cargo.toml | 33 +- .../src/abci/handler/check_tx.rs | 3 +- packages/rs-drive-abci/src/config.rs | 9 + packages/rs-drive-abci/src/error/execution.rs | 2 +- .../src/execution/check_tx/v0/mod.rs | 940 +- .../engine/finalize_block_proposal/v0/mod.rs | 7 +- .../initialization/init_chain/v0/mod.rs | 10 +- .../engine/run_block_proposal/v0/mod.rs | 6 +- .../mod.rs | 0 .../v0/mod.rs | 0 .../mod.rs | 2 +- .../mod.rs | 17 +- .../v0/mod.rs | 4 +- .../v1/mod.rs | 54 + .../tests.rs | 42 +- .../update_masternode_identities/mod.rs | 2 +- .../update_masternode_identities/mod.rs | 2 +- .../update_masternode_identities/v0/mod.rs | 2 +- .../update_operator_identity/mod.rs | 2 +- .../update_operator_identity/v0/mod.rs | 4 +- .../update_voter_identity/mod.rs | 2 +- .../update_voter_identity/v0/mod.rs | 4 +- .../update_state_masternode_list/v0/mod.rs | 2 +- .../mod.rs | 2 +- .../v0/mod.rs | 2 +- .../create_genesis_state/common.rs | 101 + .../create_genesis_state/mod.rs | 10 +- .../create_genesis_state/v0/mod.rs | 93 +- .../create_genesis_state/v1/mod.rs | 125 + .../src/execution/platform_events/mod.rs | 3 +- .../v0/mod.rs | 355 +- .../execution/platform_events/tokens/mod.rs | 1 + .../validate_token_aggregated_balance/mod.rs | 54 + .../v0/mod.rs | 37 + .../check_for_ended_vote_polls/v0/mod.rs | 3 +- .../mod.rs | 12 +- .../v0/mod.rs | 58 +- .../v1/mod.rs | 88 + .../clean_up_after_vote_polls_end/mod.rs | 3 + .../clean_up_after_vote_polls_end/v0/mod.rs | 3 + .../v0/mod.rs | 16 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 8 +- .../execution/types/execution_event/mod.rs | 2 +- .../types/execution_operation/mod.rs | 14 + .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../state_transition/processor/v0/mod.rs | 28 +- .../document_create_transition_action/mod.rs | 14 +- .../state_v0/mod.rs | 10 +- .../state_v1/mod.rs | 10 +- .../structure_v0/mod.rs | 6 +- .../document_delete_transition_action/mod.rs | 10 +- .../state_v0/mod.rs | 10 +- .../structure_v0/mod.rs | 8 +- .../mod.rs | 10 +- .../state_v0/mod.rs | 6 +- .../structure_v0/mod.rs | 6 +- .../document_replace_transition_action/mod.rs | 10 +- .../state_v0/mod.rs | 6 +- .../structure_v0/mod.rs | 6 +- .../mod.rs | 10 +- .../state_v0/mod.rs | 6 +- .../structure_v0/mod.rs | 6 +- .../mod.rs | 10 +- .../state_v0/mod.rs | 6 +- .../structure_v0/mod.rs | 6 +- .../action_validation/document}/mod.rs | 0 .../batch/action_validation/mod.rs | 2 + .../batch/action_validation/token/mod.rs | 9 + .../token/token_base_transition_action/mod.rs | 138 + .../state_v0/mod.rs | 178 + .../structure_v0/mod.rs | 49 + .../token/token_burn_transition_action/mod.rs | 86 + .../state_v0/mod.rs | 100 + .../structure_v0/mod.rs | 25 + .../mod.rs | 86 + .../state_v0/mod.rs | 385 + .../structure_v0/mod.rs | 25 + .../mod.rs | 86 + .../state_v0/mod.rs | 100 + .../structure_v0/mod.rs | 27 + .../mod.rs | 86 + .../state_v0/mod.rs | 115 + .../structure_v0/mod.rs | 27 + .../token_freeze_transition_action/mod.rs | 86 + .../state_v0/mod.rs | 101 + .../structure_v0/mod.rs | 25 + .../token/token_mint_transition_action/mod.rs | 86 + .../state_v0/mod.rs | 147 + .../structure_v0/mod.rs | 25 + .../token_transfer_transition_action/mod.rs | 88 + .../state_v0/mod.rs | 122 + .../structure_v0/mod.rs | 29 + .../token_unfreeze_transition_action/mod.rs | 86 + .../state_v0/mod.rs | 96 + .../structure_v0/mod.rs | 25 + .../advanced_structure/mod.rs | 0 .../batch/advanced_structure/v0/mod.rs | 354 + .../{documents_batch => batch}/balance/mod.rs | 8 +- .../balance/v0/mod.rs | 15 +- .../bindings/data_trigger_binding/mod.rs | 4 +- .../bindings/data_trigger_binding/v0/mod.rs | 4 +- .../data_triggers/bindings/list/mod.rs | 4 +- .../data_triggers/bindings/list/v0/mod.rs | 12 +- .../data_triggers/bindings/mod.rs | 0 .../data_triggers/context.rs | 0 .../data_triggers/executor.rs | 27 +- .../data_triggers/mod.rs | 2 +- .../data_triggers/triggers/dashpay/mod.rs | 8 +- .../data_triggers/triggers/dashpay/v0/mod.rs | 50 +- .../data_triggers/triggers/dpns/mod.rs | 14 +- .../data_triggers/triggers/dpns/v0/mod.rs | 105 +- .../triggers/feature_flags/mod.rs | 8 +- .../triggers/feature_flags/v0/mod.rs | 34 +- .../data_triggers/triggers/mod.rs | 0 .../data_triggers/triggers/reject/mod.rs | 14 +- .../data_triggers/triggers/reject/v0/mod.rs | 21 +- .../data_triggers/triggers/withdrawals/mod.rs | 8 +- .../triggers/withdrawals/v0/mod.rs | 28 +- .../identity_contract_nonce/mod.rs | 0 .../identity_contract_nonce/v0/mod.rs | 11 +- .../is_allowed/mod.rs | 8 +- .../is_allowed/v0/mod.rs | 11 +- .../{documents_batch => batch}/mod.rs | 9507 ++- .../{documents_batch => batch}/state/mod.rs | 0 .../state/v0/data_triggers.rs | 10 +- .../state/v0/fetch_contender.rs | 0 .../state/v0/fetch_documents.rs | 4 +- .../state_transitions/batch/state/v0/mod.rs | 313 + .../transformer/mod.rs | 0 .../transformer/v0/mod.rs | 405 +- .../advanced_structure/v0/mod.rs | 75 +- .../data_contract_create/mod.rs | 1627 +- .../data_contract_create/state/v0/mod.rs | 109 +- .../data_contract_update/mod.rs | 858 + .../data_contract_update/state/v0/mod.rs | 14 +- .../advanced_structure/v0/mod.rs | 219 - .../documents_batch/state/v0/mod.rs | 231 - .../state_transitions/identity_create/mod.rs | 601 +- .../state_transitions/identity_top_up/mod.rs | 135 +- .../masternode_vote/nonce/mod.rs | 14 +- .../masternode_vote/nonce/v0/mod.rs | 12 + .../masternode_vote/nonce/v1/mod.rs | 71 + .../state_transition/state_transitions/mod.rs | 77 +- .../state_transition/transformer/mod.rs | 2 +- packages/rs-drive-abci/src/main.rs | 4 +- packages/rs-drive-abci/src/mimic/mod.rs | 6 +- .../rs-drive-abci/src/mimic/test_quorum.rs | 4 +- .../src/platform_types/block_proposal/v0.rs | 42 +- .../v0/mod.rs | 6 +- .../src/platform_types/platform/mod.rs | 16 +- .../src/platform_types/platform_state/mod.rs | 2 +- .../platform_types/platform_state/v0/mod.rs | 4 +- .../platform_state/v0/old_structures/mod.rs | 36 +- .../signature_verification_quorum_set/mod.rs | 10 +- .../v0/{for_saving.rs => for_saving_v0.rs} | 48 +- .../v0/for_saving_v1.rs | 64 +- .../v0/for_saving_v2.rs | 57 + .../v0/mod.rs | 4 +- .../v0/quorum_config_for_saving_v0.rs | 34 + .../platform_types/validator_set/v0/mod.rs | 4 +- .../group_queries/group_action_signers/mod.rs | 62 + .../group_action_signers/v0/mod.rs | 110 + .../query/group_queries/group_actions/mod.rs | 59 + .../group_queries/group_actions/v0/mod.rs | 251 + .../src/query/group_queries/group_info/mod.rs | 53 + .../query/group_queries/group_info/v0/mod.rs | 95 + .../query/group_queries/group_infos/mod.rs | 53 + .../query/group_queries/group_infos/v0/mod.rs | 127 + .../src/query/group_queries/mod.rs | 4 + packages/rs-drive-abci/src/query/mod.rs | 2 + .../balance/v0/mod.rs | 2 +- .../rs-drive-abci/src/query/proofs/v0/mod.rs | 94 + packages/rs-drive-abci/src/query/service.rs | 159 +- .../total_credits_in_platform/v0/mod.rs | 2 +- .../identities_token_balances/mod.rs | 66 + .../identities_token_balances/v0/mod.rs | 88 + .../identities_token_infos/mod.rs | 62 + .../identities_token_infos/v0/mod.rs | 94 + .../identity_token_balances/mod.rs | 62 + .../identity_token_balances/v0/mod.rs | 86 + .../token_queries/identity_token_infos/mod.rs | 62 + .../identity_token_infos/v0/mod.rs | 89 + .../src/query/token_queries/mod.rs | 7 + .../token_pre_programmed_distributions/mod.rs | 66 + .../v0/mod.rs | 140 + .../query/token_queries/token_status/mod.rs | 59 + .../token_queries/token_status/v0/mod.rs | 73 + .../token_queries/token_total_supply/mod.rs | 59 + .../token_total_supply/v0/mod.rs | 81 + packages/rs-drive-abci/src/rpc/core.rs | 9 +- .../tests/strategy_tests/execution.rs | 10 +- .../tests/strategy_tests/main.rs | 119 +- .../masternode_list_item_helpers.rs | 4 +- .../tests/strategy_tests/masternodes.rs | 6 +- .../tests/strategy_tests/query.rs | 10 +- .../tests/strategy_tests/strategy.rs | 309 +- .../tests/strategy_tests/token_tests.rs | 333 + .../strategy_tests/upgrade_fork_tests.rs | 4 +- .../verify_state_transitions.rs | 629 +- .../tests/strategy_tests/voting_tests.rs | 1265 +- .../contract/basic-token/basic-token.json | 19 + ...ame-direct-purchase-documents-mutable.json | 134 + .../crypto-card-game-in-game-currency.json | 135 + packages/rs-drive-proof-verifier/Cargo.toml | 23 +- packages/rs-drive-proof-verifier/src/types.rs | 4 +- packages/rs-drive/Cargo.toml | 23 +- .../rs-drive/src/cache/system_contracts.rs | 11 + .../v0/mod.rs | 9 +- .../fetch_asset_lock_outpoint_info/v0/mod.rs | 4 +- packages/rs-drive/src/drive/balances/mod.rs | 60 +- .../v0/mod.rs | 5 +- .../v0/mod.rs | 8 +- .../get_fetch/fetch_contract/v0/mod.rs | 12 +- .../insert/add_contract_to_storage/v0/mod.rs | 8 +- .../contract/insert/insert_contract/mod.rs | 18 +- .../contract/insert/insert_contract/v0/mod.rs | 2 +- .../contract/insert/insert_contract/v1/mod.rs | 312 + .../contract/update/update_contract/mod.rs | 34 +- .../contract/update/update_contract/v0/mod.rs | 10 +- .../contract/update/update_contract/v1/mod.rs | 253 + .../mod.rs | 56 + .../v0/mod.rs | 60 + .../mod.rs | 4 +- .../v0/mod.rs | 4 +- .../epochs/credit_distribution_pools/mod.rs | 1 + .../credit_pools/epochs/operations_factory.rs | 20 +- .../v0/mod.rs | 2 +- .../get_unpaid_epoch_index/v0/mod.rs | 2 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../rs-drive/src/drive/document/delete/mod.rs | 24 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 8 +- .../v0/mod.rs | 8 +- .../v0/mod.rs | 8 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 8 +- .../mod.rs | 6 +- .../v0/mod.rs | 14 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../mod.rs | 2 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../add_document_to_primary_storage/v0/mod.rs | 10 +- .../v0/mod.rs | 16 +- .../v0/mod.rs | 14 +- .../v0/mod.rs | 12 +- .../rs-drive/src/drive/document/insert/mod.rs | 180 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 20 +- .../v0/mod.rs | 8 +- .../v0/mod.rs | 12 +- .../v0/mod.rs | 12 +- .../v0/mod.rs | 14 +- .../rs-drive/src/drive/document/update/mod.rs | 54 +- .../for_add_group_action/mod.rs | 79 + .../for_add_group_action/v0/mod.rs | 173 + .../estimated_costs/for_add_groups/mod.rs | 74 + .../estimated_costs/for_add_groups/v0/mod.rs | 88 + .../src/drive/group/estimated_costs/mod.rs | 2 + .../fetch/fetch_action_id_has_signer/mod.rs | 118 + .../fetch_action_id_has_signer/v0/mod.rs | 165 + .../mod.rs | 120 + .../v0/mod.rs | 132 + .../fetch_action_id_signers_power/mod.rs | 78 + .../fetch_action_id_signers_power/v0/mod.rs | 132 + .../group/fetch/fetch_action_infos/mod.rs | 128 + .../group/fetch/fetch_action_infos/v0/mod.rs | 86 + .../group/fetch/fetch_action_signers/mod.rs | 133 + .../fetch/fetch_action_signers/v0/mod.rs | 78 + .../fetch/fetch_active_action_info/mod.rs | 121 + .../fetch/fetch_active_action_info/v0/mod.rs | 91 + .../drive/group/fetch/fetch_group_info/mod.rs | 103 + .../group/fetch/fetch_group_info/v0/mod.rs | 83 + .../group/fetch/fetch_group_infos/mod.rs | 99 + .../group/fetch/fetch_group_infos/v0/mod.rs | 79 + .../rs-drive/src/drive/group/fetch/mod.rs | 8 + .../group/insert/add_group_action/mod.rs | 128 + .../group/insert/add_group_action/v0/mod.rs | 244 + .../drive/group/insert/add_new_groups/mod.rs | 99 + .../group/insert/add_new_groups/v0/mod.rs | 226 + .../rs-drive/src/drive/group/insert/mod.rs | 2 + packages/rs-drive/src/drive/group/mod.rs | 11 + packages/rs-drive/src/drive/group/paths.rs | 256 + .../rs-drive/src/drive/group/prove/mod.rs | 4 + .../group/prove/prove_action_infos/mod.rs | 132 + .../group/prove/prove_action_infos/v0/mod.rs | 536 + .../group/prove/prove_action_signers/mod.rs | 124 + .../prove/prove_action_signers/v0/mod.rs | 479 + .../drive/group/prove/prove_group_info/mod.rs | 96 + .../group/prove/prove_group_info/v0/mod.rs | 199 + .../group/prove/prove_group_infos/mod.rs | 97 + .../group/prove/prove_group_infos/v0/mod.rs | 367 + packages/rs-drive/src/drive/group/queries.rs | 122 + .../src/drive/identity/balance/update.rs | 533 +- .../fetch_identity_contract_nonce/v0/mod.rs | 4 +- .../merge_identity_contract_nonce/v0/mod.rs | 12 +- .../v0/mod.rs | 10 +- .../v0/mod.rs | 4 +- .../estimation_costs/for_balances/v0/mod.rs | 9 +- .../for_identity_contract_info/v0/mod.rs | 10 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../for_keys_for_identity_id/v0/mod.rs | 10 +- .../for_negative_credit/v0/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../for_root_key_reference_tree/v0/mod.rs | 4 +- .../for_update_nonce/v0/mod.rs | 8 +- .../for_update_revision/v0/mod.rs | 8 +- .../balance/fetch_identity_balance/v0/mod.rs | 4 +- .../fetch_identity_negative_balance/v0/mod.rs | 4 +- .../fetch/fetch_by_public_key_hashes/mod.rs | 2 +- .../nonce/fetch_identity_nonce/v0/mod.rs | 4 +- .../fetch_identity_revision/v0/mod.rs | 4 +- .../identity/insert/add_new_identity/mod.rs | 103 + .../insert/add_new_identity/v0/mod.rs | 87 +- .../src/drive/identity/key/fetch/mod.rs | 8 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../rs-drive/src/drive/identity/update/mod.rs | 699 +- .../merge_identity_nonce_operations/v0/mod.rs | 2 +- .../rs-drive/src/drive/initialization/mod.rs | 4 +- .../src/drive/initialization/v0/mod.rs | 385 +- .../src/drive/initialization/v1/mod.rs | 135 + packages/rs-drive/src/drive/mod.rs | 34 +- .../mod.rs | 10 +- .../v1/mod.rs | 91 + .../mod.rs | 8 + .../v1/mod.rs | 91 + .../mod.rs | 53 + .../v0/mod.rs | 52 + .../mod.rs | 60 + .../v0/mod.rs | 85 + .../v0/mod.rs | 11 +- .../fetch/single_balance/v0/mod.rs | 4 +- .../prefunded_specialized_balances/mod.rs | 11 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 19 +- .../v0/mod.rs | 17 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 6 +- .../for_total_system_credits_update/v0/mod.rs | 9 +- .../src/drive/system/genesis_time/mod.rs | 6 +- .../add_transaction_history_operations/mod.rs | 55 + .../v0/mod.rs | 62 + .../src/drive/tokens/apply_status/mod.rs | 93 + .../src/drive/tokens/apply_status/v0/mod.rs | 107 + .../add_to_previous_token_balance/mod.rs | 119 + .../add_to_previous_token_balance/v0/mod.rs | 141 + .../fetch_identities_token_balances/mod.rs | 152 + .../fetch_identities_token_balances/v0/mod.rs | 63 + .../fetch_identity_token_balance/mod.rs | 135 + .../fetch_identity_token_balance/v0/mod.rs | 83 + .../fetch_identity_token_balances/mod.rs | 151 + .../fetch_identity_token_balances/v0/mod.rs | 69 + .../rs-drive/src/drive/tokens/balance/mod.rs | 17 + .../prove_identities_token_balances/mod.rs | 149 + .../prove_identities_token_balances/v0/mod.rs | 359 + .../prove_identity_token_balances/mod.rs | 149 + .../prove_identity_token_balances/v0/mod.rs | 382 + .../src/drive/tokens/balance/queries.rs | 118 + .../remove_from_identity_token_balance/mod.rs | 117 + .../v0/mod.rs | 129 + .../src/drive/tokens/balance/update.rs | 896 + .../rs-drive/src/drive/tokens/burn/mod.rs | 100 + .../rs-drive/src/drive/tokens/burn/v0/mod.rs | 108 + .../calculate_total_tokens_balance/mod.rs | 47 + .../calculate_total_tokens_balance/v0/mod.rs | 47 + .../add_perpetual_distribution/mod.rs | 53 + .../add_perpetual_distribution/v0/mod.rs | 109 + .../add_pre_programmed_distribution/mod.rs | 83 + .../add_pre_programmed_distribution/v0/mod.rs | 187 + .../drive/tokens/distribution/fetch/mod.rs | 104 + .../fetch/pre_programmed_distributions/mod.rs | 89 + .../src/drive/tokens/distribution/mod.rs | 11 + .../drive/tokens/distribution/prove/mod.rs | 101 + .../prove/pre_programmed_distributions/mod.rs | 50 + .../src/drive/tokens/distribution/queries.rs | 81 + .../mod.rs | 40 + .../v0/mod.rs | 65 + .../estimated_costs/for_token_balances/mod.rs | 57 + .../for_token_balances/v0/mod.rs | 100 + .../for_token_identity_infos/mod.rs | 57 + .../for_token_identity_infos/v0/mod.rs | 81 + .../mod.rs | 72 + .../v0/mod.rs | 81 + .../for_token_status_infos/mod.rs | 55 + .../for_token_status_infos/v0/mod.rs | 68 + .../for_token_total_supply/mod.rs | 50 + .../for_token_total_supply/v0/mod.rs | 101 + .../src/drive/tokens/estimated_costs/mod.rs | 17 + .../rs-drive/src/drive/tokens/freeze/mod.rs | 95 + .../src/drive/tokens/freeze/v0/mod.rs | 147 + .../info/fetch_identities_token_infos/mod.rs | 151 + .../fetch_identities_token_infos/v0/mod.rs | 66 + .../info/fetch_identity_token_info/mod.rs | 134 + .../info/fetch_identity_token_info/v0/mod.rs | 73 + .../info/fetch_identity_token_infos/mod.rs | 151 + .../info/fetch_identity_token_infos/v0/mod.rs | 73 + .../rs-drive/src/drive/tokens/info/mod.rs | 12 + .../info/prove_identities_token_infos/mod.rs | 149 + .../prove_identities_token_infos/v0/mod.rs | 353 + .../info/prove_identity_token_infos/mod.rs | 149 + .../info/prove_identity_token_infos/v0/mod.rs | 285 + .../rs-drive/src/drive/tokens/info/queries.rs | 95 + .../rs-drive/src/drive/tokens/mint/mod.rs | 106 + .../rs-drive/src/drive/tokens/mint/v0/mod.rs | 115 + packages/rs-drive/src/drive/tokens/mod.rs | 52 + packages/rs-drive/src/drive/tokens/paths.rs | 478 + .../tokens/status/fetch_token_status/mod.rs | 108 + .../status/fetch_token_status/v0/mod.rs | 70 + .../tokens/status/fetch_token_statuses/mod.rs | 126 + .../status/fetch_token_statuses/v0/mod.rs | 62 + .../rs-drive/src/drive/tokens/status/mod.rs | 8 + .../tokens/status/prove_token_statuses/mod.rs | 124 + .../status/prove_token_statuses/v0/mod.rs | 221 + .../src/drive/tokens/status/queries.rs | 33 + .../system/add_to_token_total_supply/mod.rs | 119 + .../add_to_token_total_supply/v0/mod.rs | 148 + .../tokens/system/create_token_trees/mod.rs | 124 + .../system/create_token_trees/v0/mod.rs | 220 + .../mod.rs | 74 + .../v0/mod.rs | 75 + .../system/fetch_token_total_supply/mod.rs | 99 + .../system/fetch_token_total_supply/v0/mod.rs | 101 + .../rs-drive/src/drive/tokens/system/mod.rs | 6 + .../mod.rs | 36 + .../v0/mod.rs | 259 + .../remove_from_token_total_supply/mod.rs | 112 + .../remove_from_token_total_supply/v0/mod.rs | 128 + .../rs-drive/src/drive/tokens/transfer/mod.rs | 106 + .../src/drive/tokens/transfer/v0/mod.rs | 114 + .../rs-drive/src/drive/tokens/unfreeze/mod.rs | 95 + .../src/drive/tokens/unfreeze/v0/mod.rs | 147 + .../v0/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../v1/mod.rs | 8 +- .../v0/mod.rs | 6 +- .../v1/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../v1/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 4 +- .../v0/mod.rs | 6 +- .../v0/mod.rs | 14 +- .../resolve.rs | 2 + packages/rs-drive/src/error/proof.rs | 8 + packages/rs-drive/src/fees/mod.rs | 1 + packages/rs-drive/src/fees/op.rs | 98 +- packages/rs-drive/src/lib.rs | 3 +- packages/rs-drive/src/open/mod.rs | 21 +- .../mod.rs | 17 + .../v0/mod.rs | 50 + ..._resource_votes_given_by_identity_query.rs | 6 + .../query/drive_contested_document_query.rs | 2 + .../identity_token_balance_drive_query.rs | 23 + .../query/identity_token_info_drive_query.rs | 23 + packages/rs-drive/src/query/mod.rs | 31 +- .../src/query/token_status_drive_query.rs | 18 + .../src/query/vote_poll_vote_state_query.rs | 2 + .../batch/batch_transition.rs | 28 + .../document/document_create_transition.rs | 10 +- .../document/document_delete_transition.rs | 12 +- .../document/document_purchase_transition.rs | 10 +- .../document/document_replace_transition.rs | 10 +- .../document/document_transfer_transition.rs | 10 +- .../document/document_transition.rs | 25 +- .../document_update_price_transition.rs | 10 +- .../document/documents_batch_transition.rs | 8 +- .../batch/document/mod.rs | 8 + .../{document => batch}/mod.rs | 15 +- .../batch/token/mod.rs | 9 + .../batch/token/token_burn_transition.rs | 102 + .../token/token_config_update_transition.rs | 120 + .../token_destroy_frozen_funds_transition.rs | 107 + .../token_emergency_action_transition.rs | 105 + .../batch/token/token_freeze_transition.rs | 107 + .../batch/token/token_mint_transition.rs | 111 + .../batch/token/token_transfer_transition.rs | 84 + .../batch/token/token_transition.rs | 112 + .../batch/token/token_unfreeze_transition.rs | 107 + .../action_convert_to_operations/mod.rs | 4 +- .../document_base_transition_action/mod.rs | 0 .../transformer.rs | 8 +- .../document_base_transition_action/v0/mod.rs | 0 .../v0/transformer.rs | 4 +- .../document_create_transition_action/mod.rs | 2 +- .../transformer.rs | 8 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 10 +- .../document_delete_transition_action/mod.rs | 4 +- .../transformer.rs | 8 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 10 +- .../mod.rs | 2 +- .../transformer.rs | 4 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 8 +- .../document_replace_transition_action/mod.rs | 2 +- .../transformer.rs | 4 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 8 +- .../mod.rs | 2 +- .../transformer.rs | 4 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 8 +- .../document_transition_action_type.rs} | 11 +- .../mod.rs | 2 +- .../transformer.rs | 4 +- .../v0/mod.rs | 2 +- .../v0/transformer.rs | 8 +- .../document_transition/mod.rs | 54 +- .../batch/batched_transition/mod.rs | 40 + .../token_transition/mod.rs | 155 + .../token_base_transition_action/mod.rs | 79 + .../transformer.rs | 69 + .../token_base_transition_action/v0/mod.rs | 112 + .../v0/transformer.rs | 242 + .../token_burn_transition_action/mod.rs | 60 + .../transformer.rs | 125 + .../token_burn_transition_action/v0/mod.rs | 102 + .../v0/transformer.rs | 229 + .../mod.rs | 66 + .../transformer.rs | 117 + .../v0/mod.rs | 104 + .../v0/transformer.rs | 233 + .../mod.rs | 76 + .../transformer.rs | 117 + .../v0/mod.rs | 115 + .../v0/transformer.rs | 311 + .../mod.rs | 63 + .../transformer.rs | 117 + .../v0/mod.rs | 97 + .../v0/transformer.rs | 232 + .../token_freeze_transition_action/mod.rs | 61 + .../transformer.rs | 117 + .../token_freeze_transition_action/v0/mod.rs | 96 + .../v0/transformer.rs | 232 + .../token_mint_transition_action/mod.rs | 73 + .../transformer.rs | 117 + .../token_mint_transition_action/v0/mod.rs | 112 + .../v0/transformer.rs | 376 + .../token_transfer_transition_action/mod.rs | 140 + .../transformer.rs | 112 + .../v0/mod.rs | 229 + .../v0/transformer.rs | 177 + .../token_transition_action_type.rs | 23 + .../token_unfreeze_transition_action/mod.rs | 61 + .../transformer.rs | 117 + .../v0/mod.rs | 96 + .../v0/transformer.rs | 232 + .../documents_batch => batch}/mod.rs | 86 +- .../documents_batch => batch}/v0/mod.rs | 39 +- .../state_transition_action/document/mod.rs | 2 - .../identity_credit_withdrawal/transformer.rs | 63 + .../v0/transformer.rs | 4 +- .../src/state_transition_action/mod.rs | 12 +- .../transformer.rs | 173 +- .../v0/transformer.rs | 90 +- .../v0/mod.rs | 2 +- .../src/util/batch/drive_op_batch/group.rs | 68 + .../src/util/batch/drive_op_batch/mod.rs | 37 +- .../src/util/batch/drive_op_batch/token.rs | 208 + .../util/batch/drive_op_batch/withdrawals.rs | 8 +- .../src/util/batch/grovedb_op_batch/mod.rs | 12 +- .../grove_operations/batch_delete/v0/mod.rs | 2 +- .../v0/mod.rs | 16 +- .../batch_insert_empty_sum_tree/mod.rs | 52 + .../batch_insert_empty_sum_tree/v0/mod.rs | 53 + .../mod.rs | 6 +- .../v0/mod.rs | 88 +- .../batch_insert_if_changed_value/v0/mod.rs | 3 +- .../batch_insert_if_not_exists/v0/mod.rs | 3 +- .../v0/mod.rs | 3 +- .../mod.rs | 71 + .../v0/mod.rs | 230 + .../v0/mod.rs | 4 +- .../batch_move_items_in_path_query/v0/mod.rs | 18 +- .../batch_remove_raw/v0/mod.rs | 6 +- .../v0/mod.rs | 2 +- .../grove_apply_operation/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../grove_batch_operations_costs/v0/mod.rs | 2 +- .../grove_operations/grove_clear/v0/mod.rs | 2 +- .../grove_operations/grove_delete/v0/mod.rs | 2 +- .../util/grove_operations/grove_get/v0/mod.rs | 8 +- .../grove_get_big_sum_tree_total_value/mod.rs | 58 + .../v0/mod.rs | 67 + .../mod.rs | 58 + .../v0/mod.rs | 72 + .../grove_get_path_query/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../grove_get_proved_path_query/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../grove_operations/grove_get_raw/v0/mod.rs | 8 +- .../grove_get_raw_item/mod.rs | 55 + .../grove_get_raw_item/v0/mod.rs | 83 + .../grove_get_raw_optional/v0/mod.rs | 8 +- .../grove_get_raw_optional_item/mod.rs | 59 + .../grove_get_raw_optional_item/v0/mod.rs | 84 + .../grove_get_raw_path_query/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../grove_get_sum_tree_total_value/v0/mod.rs | 6 +- .../grove_operations/grove_has_raw/v0/mod.rs | 8 +- .../grove_operations/grove_insert/v0/mod.rs | 2 +- .../grove_insert_empty_sum_tree/v0/mod.rs | 2 +- .../grove_insert_empty_tree/v0/mod.rs | 2 +- .../grove_insert_if_not_exists/v0/mod.rs | 2 +- .../v0/mod.rs | 2 +- .../rs-drive/src/util/grove_operations/mod.rs | 85 +- .../util/object_size_info/contract_info.rs | 5 + .../util/object_size_info/document_info.rs | 21 +- .../apply_batch_grovedb_operations/v0/mod.rs | 2 +- .../rs-drive/src/util/test_helpers/mod.rs | 13 +- .../rs-drive/src/util/test_helpers/setup.rs | 19 +- packages/rs-drive/src/util/type_constants.rs | 2 + packages/rs-drive/src/verify/group/mod.rs | 4 + .../verify/group/verify_action_signers/mod.rs | 78 + .../group/verify_action_signers/v0/mod.rs | 72 + .../group/verify_active_action_infos/mod.rs | 81 + .../verify_active_action_infos/v0/mod.rs | 74 + .../src/verify/group/verify_group_info/mod.rs | 69 + .../verify/group/verify_group_info/v0/mod.rs | 57 + .../verify_group_infos_in_contract/mod.rs | 77 + .../verify_group_infos_in_contract/v0/mod.rs | 79 + packages/rs-drive/src/verify/mod.rs | 5 + .../v0/mod.rs | 596 +- packages/rs-drive/src/verify/tokens/mod.rs | 10 + .../mod.rs | 75 + .../v0/mod.rs | 51 + .../mod.rs | 75 + .../v0/mod.rs | 72 + .../mod.rs | 80 + .../v0/mod.rs | 71 + .../verify_token_info_for_identity_id/mod.rs | 73 + .../v0/mod.rs | 55 + .../verify_token_infos_for_identity_id/mod.rs | 74 + .../v0/mod.rs | 74 + .../mod.rs | 79 + .../v0/mod.rs | 65 + .../mod.rs | 71 + .../v0/mod.rs | 115 + .../verify/tokens/verify_token_status/mod.rs | 68 + .../tokens/verify_token_status/v0/mod.rs | 54 + .../tokens/verify_token_statuses/mod.rs | 67 + .../tokens/verify_token_statuses/v0/mod.rs | 65 + .../mod.rs | 64 + .../v0/mod.rs | 73 + .../rs-drive/tests/deterministic_root_hash.rs | 41 +- packages/rs-drive/tests/query_tests.rs | 1708 +- .../rs-drive/tests/query_tests_history.rs | 1409 +- .../tokens/token-example-contract.json | 23 + .../Cargo.toml | 2 +- .../Cargo.toml | 2 +- packages/rs-platform-serialization/Cargo.toml | 2 +- .../rs-platform-value-convertible/Cargo.toml | 2 +- packages/rs-platform-value/Cargo.toml | 6 +- packages/rs-platform-value/src/inner_value.rs | 2 +- .../src/inner_value_at_path.rs | 125 +- packages/rs-platform-version/Cargo.toml | 4 +- .../dpp_versions/dpp_contract_versions/mod.rs | 2 + .../dpp_versions/dpp_contract_versions/v1.rs | 1 + .../dpp_versions/dpp_contract_versions/v2.rs | 55 + .../dpp_versions/dpp_method_versions/mod.rs | 1 + .../dpp_versions/dpp_method_versions/v2.rs | 5 + .../mod.rs | 3 +- .../v1.rs | 2 +- .../v2.rs | 105 + .../dpp_versions/dpp_token_versions/mod.rs | 9 + .../dpp_versions/dpp_token_versions/v1.rs | 6 + .../dpp_validation_versions/mod.rs | 2 + .../dpp_validation_versions/v1.rs | 2 + .../dpp_validation_versions/v2.rs | 2 + .../src/version/dpp_versions/mod.rs | 3 + .../drive_abci_method_versions/mod.rs | 10 +- .../drive_abci_method_versions/v1.rs | 8 +- .../drive_abci_method_versions/v2.rs | 8 +- .../drive_abci_method_versions/v3.rs | 8 +- .../drive_abci_method_versions/v4.rs | 8 +- .../drive_abci_method_versions/v5.rs | 129 + .../drive_abci_method_versions/v6.rs | 126 + .../drive_abci_query_versions/mod.rs | 21 + .../drive_abci_query_versions/v1.rs | 66 +- .../drive_abci_validation_versions/mod.rs | 22 +- .../drive_abci_validation_versions/v1.rs | 21 +- .../drive_abci_validation_versions/v2.rs | 21 +- .../drive_abci_validation_versions/v3.rs | 21 +- .../drive_abci_validation_versions/v4.rs | 26 +- .../drive_abci_validation_versions/v5.rs | 170 + .../drive_contract_method_versions/mod.rs | 1 + .../drive_contract_method_versions/v2.rs | 33 + .../drive_credit_pool_method_versions/mod.rs | 1 + .../drive_credit_pool_method_versions/v1.rs | 1 + .../drive_group_method_versions/mod.rs | 43 + .../drive_group_method_versions/v1.rs | 31 + .../drive_grove_method_versions/mod.rs | 6 + .../drive_grove_method_versions/v1.rs | 6 + .../drive_identity_method_versions/mod.rs | 5 + .../drive_identity_method_versions/v1.rs | 5 + .../mod.rs | 8 + .../v1.rs | 8 + .../drive_token_method_versions/mod.rs | 62 + .../drive_token_method_versions/v1.rs | 50 + .../drive_verify_method_versions/mod.rs | 24 + .../drive_verify_method_versions/v1.rs | 22 +- .../src/version/drive_versions/mod.rs | 9 + .../src/version/drive_versions/v1.rs | 5 + .../src/version/drive_versions/v2.rs | 5 + .../src/version/drive_versions/v3.rs | 105 + .../src/version/drive_versions/v4.rs | 105 + .../src/version/fee/processing/mod.rs | 4 + .../src/version/fee/processing/v1.rs | 1 + .../src/version/mocks/v2_test.rs | 74 +- .../src/version/mocks/v3_test.rs | 10 +- .../rs-platform-version/src/version/mod.rs | 6 +- .../src/version/protocol_version.rs | 7 +- .../src/version/system_limits/mod.rs | 1 + .../src/version/system_limits/v1.rs | 1 + .../rs-platform-version/src/version/v1.rs | 2 + .../rs-platform-version/src/version/v2.rs | 2 + .../rs-platform-version/src/version/v3.rs | 2 + .../rs-platform-version/src/version/v4.rs | 2 + .../rs-platform-version/src/version/v5.rs | 2 + .../rs-platform-version/src/version/v6.rs | 2 + .../rs-platform-version/src/version/v7.rs | 9 +- .../rs-platform-version/src/version/v8.rs | 71 + .../rs-platform-version/src/version/v9.rs | 66 + packages/rs-platform-versioning/Cargo.toml | 2 +- packages/rs-sdk/Cargo.toml | 34 +- packages/rs-sdk/README.md | 9 +- packages/rs-sdk/scripts/connect_to_remote.sh | 91 + .../rs-sdk/scripts/generate_test_vectors.sh | 3 +- packages/rs-sdk/src/error.rs | 160 +- .../rs-sdk/src/platform/document_query.rs | 2 +- packages/rs-sdk/src/platform/transition.rs | 3 + .../src/platform/transition/broadcast.rs | 30 +- .../rs-sdk/src/platform/transition/builder.rs | 95 + .../transition/fungible_tokens/burn.rs | 177 + .../transition/fungible_tokens/destroy.rs | 185 + .../fungible_tokens/emergency_action.rs | 214 + .../transition/fungible_tokens/freeze.rs | 185 + .../transition/fungible_tokens/mint.rs | 206 + .../transition/fungible_tokens/mod.rs | 9 + .../transition/fungible_tokens/transfer.rs | 211 + .../transition/fungible_tokens/unfreeze.rs | 185 + .../platform/transition/purchase_document.rs | 6 +- .../src/platform/transition/put_document.rs | 6 +- .../src/platform/transition/transfer.rs | 23 +- .../platform/transition/transfer_document.rs | 6 +- .../transition/update_price_of_document.rs | 32 +- .../src/platform/transition/waitable.rs | 2 +- packages/rs-sdk/src/sdk.rs | 66 +- packages/rs-sdk/src/sync.rs | 16 +- packages/rs-sdk/tests/.env.example | 3 + packages/rs-sdk/tests/fetch/config.rs | 18 +- packages/rs-sdk/tests/fetch/data_contract.rs | 2 + packages/search-contract/.eslintrc | 18 + packages/search-contract/.mocharc.yml | 2 + packages/search-contract/Cargo.toml | 13 + packages/search-contract/LICENSE | 20 + packages/search-contract/README.md | 26 + packages/search-contract/lib/systemIds.js | 4 + packages/search-contract/package.json | 29 + .../schema/v1/search-contract-documents.json | 62 + packages/search-contract/src/error.rs | 17 + packages/search-contract/src/lib.rs | 37 + packages/search-contract/src/v1/mod.rs | 27 + packages/search-contract/test/.eslintrc | 12 + packages/search-contract/test/bootstrap.js | 30 + .../test/unit/searchContract.spec.js | 187 + packages/simple-signer/Cargo.toml | 4 +- packages/strategy-tests/Cargo.toml | 4 +- packages/strategy-tests/src/lib.rs | 125 +- packages/strategy-tests/src/operations.rs | 118 +- packages/strategy-tests/src/transitions.rs | 13 +- packages/token-history-contract/.eslintrc | 18 + packages/token-history-contract/.mocharc.yml | 2 + packages/token-history-contract/Cargo.toml | 13 + packages/token-history-contract/LICENSE | 20 + packages/token-history-contract/README.md | 26 + .../token-history-contract/lib/systemIds.js | 4 + packages/token-history-contract/package.json | 29 + .../v1/token-history-contract-documents.json | 651 + packages/token-history-contract/src/error.rs | 17 + packages/token-history-contract/src/lib.rs | 37 + packages/token-history-contract/src/v1/mod.rs | 21 + .../token-history-contract/test/.eslintrc | 12 + .../token-history-contract/test/bootstrap.js | 30 + .../test/unit/tokenHistoryContract.spec.js | 412 + packages/wallet-lib/package.json | 4 +- .../TransactionsReader.spec.js | 6 +- .../TransactionsSyncWorker.spec.js | 2 +- packages/wallet-utils-contract/Cargo.toml | 2 +- packages/wallet-utils-contract/package.json | 4 +- packages/wasm-dpp/.eslintrc | 3 + packages/wasm-dpp/Cargo.toml | 11 +- packages/wasm-dpp/README.md | 2 +- packages/wasm-dpp/lib/index.ts | 2 +- ...IdentityCreditTransferTransitionFixture.js | 2 +- .../lib/test/fixtures/getIdentityFixture.js | 2 +- packages/wasm-dpp/package.json | 4 +- packages/wasm-dpp/scripts/build-wasm.sh | 11 +- .../src/data_contract/data_contract.rs | 20 +- packages/wasm-dpp/src/data_contract/mod.rs | 1 + .../data_contract_create_transition/mod.rs | 21 + .../data_contract_update_transition/mod.rs | 25 + packages/wasm-dpp/src/data_contract/tokens.rs | 18 + .../wasm-dpp/src/document/document_facade.rs | 6 +- .../errors/document_already_exists_error.rs | 2 +- .../errors/document_not_provided_error.rs | 2 +- .../errors/invalid_document_action_error.rs | 4 +- .../src/document/extended_document.rs | 8 +- packages/wasm-dpp/src/document/factory.rs | 22 +- packages/wasm-dpp/src/document/mod.rs | 8 +- .../batched_transition/mod.rs | 18 + .../document_create_transition.rs | 48 +- .../document_delete_transition.rs | 27 +- .../document_replace_transition.rs | 29 +- .../document_transition/mod.rs | 113 +- .../mod.rs | 74 +- .../batch_transition/token_transition/burn.rs | 12 + .../token_transition/config.rs | 12 + .../token_transition/destroy.rs | 22 + .../token_transition/emergency_action.rs | 12 + .../token_transition/freeze.rs | 22 + .../batch_transition/token_transition/mint.rs | 31 + .../batch_transition/token_transition/mod.rs | 117 + .../token_transition/transfer.rs | 22 + .../token_transition/unfreeze.rs | 22 + .../validation/basic/find_duplicates_by_id.rs | 0 .../basic/find_duplicates_by_indices.rs | 0 .../validation/basic/mod.rs | 0 ...lidate_documents_batch_transition_basic.rs | 0 .../validate_partial_compound_indices.rs | 0 .../validation/mod.rs | 0 .../state/fetch_extended_documents.rs | 0 .../validation/state/mod.rs | 0 ...idate_documents_batch_transitions_state.rs | 0 ...alidate_documents_uniqueness_by_indices.rs | 0 .../src/document/state_transition/mod.rs | 2 +- .../identity_insufficient_balance_error.rs | 4 +- .../src/errors/consensus/consensus_error.rs | 130 +- .../fee/balance_is_not_enough_error.rs | 8 +- .../wasm-dpp/src/identity/factory_utils.rs | 12 +- packages/wasm-dpp/src/identity/identity.rs | 28 +- .../state_transition/asset_lock_proof/mod.rs | 5 +- .../identity_create_transition.rs | 29 +- .../transition.rs | 37 +- .../transition.rs | 15 + .../identity_topup_transition.rs | 10 + .../identity_update_transition.rs | 64 +- .../identity_update_transition/to_object.rs | 4 +- .../state_transition/transition_types.rs | 2 +- packages/wasm-dpp/src/metadata.rs | 43 +- .../state_transition_factory.rs | 6 +- .../masternode_vote_transition/mod.rs | 125 +- .../integration/document/Document.spec.js | 9 +- .../document/DocumentFacade.spec.js | 8 +- .../identity/IdentityFacade.spec.js | 15 +- ...entityUpdateTransitionStateFactory.spec.js | 8 +- ...hainAssetLockProofStructureFactory.spec.js | 6 +- ...hAssetLockTransactionOutputFactory.spec.js | 2 +- .../StateTransitionFacade.spec.js | 6 +- packages/wasm-dpp/test/unit/Metadata.spec.js | 31 +- .../unit/dataContract/DataContract.spec.js | 7 +- .../test/unit/document/Document.spec.js | 11 +- .../unit/document/DocumentFactory.spec.js | 4 +- .../test/unit/identity/Identity.spec.js | 50 +- .../unit/identity/IdentityFactory.spec.js | 6 +- .../IdentityUpdateTransition.spec.js | 4 +- .../identityCreditTransferTransition.spec.js | 2 +- packages/wasm-sdk/.gitignore | 1 + packages/wasm-sdk/Cargo.toml | 46 + packages/wasm-sdk/build.sh | 12 + packages/wasm-sdk/index.html | 87 + packages/wasm-sdk/src/context_provider.rs | 101 + packages/wasm-sdk/src/dpp.rs | 308 + packages/wasm-sdk/src/error.rs | 13 + packages/wasm-sdk/src/lib.rs | 24 + packages/wasm-sdk/src/sdk.rs | 208 + .../src/state_transitions/documents.rs | 75 + .../wasm-sdk/src/state_transitions/mod.rs | 1 + packages/wasm-sdk/src/verify.rs | 189 + packages/withdrawals-contract/Cargo.toml | 2 +- packages/withdrawals-contract/package.json | 4 +- rust-toolchain.toml | 2 +- scripts/check_network_version.sh | 207 - scripts/configure_test_suite_network.sh | 5 +- yarn.lock | 644 +- 1451 files changed, 203483 insertions(+), 44898 deletions(-) delete mode 100644 .yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip delete mode 100644 .yarn/cache/@ungap-promise-all-settled-npm-1.1.2-c0f42e147b-ee8fe811be.zip create mode 100644 .yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip create mode 100644 .yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip create mode 100644 .yarn/cache/cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip delete mode 100644 .yarn/cache/debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip create mode 100644 .yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip delete mode 100644 .yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip delete mode 100644 .yarn/cache/diff-npm-5.0.0-ad6900db18-4a179a75b1.zip create mode 100644 .yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip delete mode 100644 .yarn/cache/glob-npm-7.2.0-bb4644d239-bc78b6ea07.zip delete mode 100644 .yarn/cache/growl-npm-1.10.5-2d1da54198-1391a9add9.zip delete mode 100644 .yarn/cache/minimatch-npm-4.2.1-558ec7f418-27e49fb720.zip delete mode 100644 .yarn/cache/minimatch-npm-5.0.1-612724f6f0-2656580f18.zip delete mode 100644 .yarn/cache/mocha-npm-10.2.0-87db25c7c5-f7362898ae.zip create mode 100644 .yarn/cache/mocha-npm-11.1.0-7c863baca0-50d1305813.zip delete mode 100644 .yarn/cache/mocha-npm-9.2.2-f7735febb8-8ee58bff86.zip delete mode 100644 .yarn/cache/nanoid-npm-3.3.1-bdd760bee0-306f2cb9e4.zip delete mode 100644 .yarn/cache/nanoid-npm-3.3.3-25d865be84-c703ed58a2.zip create mode 100644 .yarn/cache/schema-utils-npm-4.3.0-6f0a75e2e2-86c5a7c72a.zip delete mode 100644 .yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-ed3dabfbb5.zip delete mode 100644 .yarn/cache/systeminformation-npm-5.22.11-e704a1605b-315cd3f2cc.zip create mode 100644 .yarn/cache/systeminformation-npm-5.25.11-e1c9348b68-9a43bb8991.zip delete mode 100644 .yarn/cache/terser-npm-5.14.2-b0f8815852-0646b5db1d.zip create mode 100644 .yarn/cache/terser-npm-5.39.0-127c67156d-d84aff6423.zip create mode 100644 .yarn/cache/terser-webpack-plugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip delete mode 100644 .yarn/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip delete mode 100644 .yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip create mode 100644 .yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip delete mode 100644 .yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip delete mode 100644 .yarn/cache/workerpool-npm-6.2.0-d2a722f6bb-c7dce6eae0.zip delete mode 100644 .yarn/cache/workerpool-npm-6.2.1-1486cb2056-3e637f7632.zip create mode 100644 .yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip create mode 100644 .yarn/cache/yargs-npm-17.7.2-80b62638e1-abb3e37678.zip delete mode 100644 .yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-db8f251ae4.zip create mode 100644 .yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-9dc2c217ea.zip delete mode 100644 .yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip create mode 100644 packages/js-dapi-client/lib/methods/platform/getDataContractHistory/DataContractHistoryEntry.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/ChainStatus.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/GetStatusResponse.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/NetworkStatus.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/NodeStatus.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/StateSyncStatus.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/TimeStatus.js create mode 100644 packages/js-dapi-client/lib/methods/platform/getStatus/VersionStatus.js create mode 100644 packages/js-dapi-client/lib/test/fixtures/getStatusFixture.js rename packages/js-dapi-client/test/unit/methods/platform/{getIdentitiy => getIdentity}/GetIdentityResponse.spec.js (85%) rename packages/js-dapi-client/test/unit/methods/platform/{getIdentitiy => getIdentity}/getIdentityFactory.spec.js (83%) create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getStatus/GetStatusResponse.spec.js create mode 100644 packages/js-dapi-client/test/unit/methods/platform/getStatus/getStatusFactory.spec.js create mode 100644 packages/rs-dapi-client/src/transport/tonic_channel.rs create mode 100644 packages/rs-dapi-client/src/transport/wasm_channel.rs create mode 100644 packages/rs-dpp/schema/meta_schemas/token/v0/token-meta.json create mode 100644 packages/rs-dpp/src/balances/total_single_token_balance/mod.rs create mode 100644 packages/rs-dpp/src/balances/total_tokens_balance/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/accessors/v1/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/accessors.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_key.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/accessors.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/encode.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_recipient.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_type/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/methods.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/change_control_rules/authorized_action_takers.rs create mode 100644 packages/rs-dpp/src/data_contract/change_control_rules/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/change_control_rules/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/accessors/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/accessors/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/methods/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/group/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/methods/validate_groups/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/methods/validate_groups/v0/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/serialized_version/v1/mod.rs delete mode 100644 packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/accessors/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/conversion/cbor.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/conversion/json.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/conversion/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/conversion/value.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/data_contract.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/methods/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/methods/schema.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/mod.rs create mode 100644 packages/rs-dpp/src/data_contract/v1/serialization/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_token_configuration_update_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_exceeds_max_members_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_of_zero_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_over_limit_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_non_unilateral_member_power_has_less_than_required_power_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_position_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/group_total_power_has_less_than_required_power_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_token_base_supply_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_group_positions_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_token_positions_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/group/group_action_not_allowed_on_transition_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/group/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/choosing_token_mint_recipient_not_allowed_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/contract_has_no_tokens_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/destination_identity_for_token_minting_not_set_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/invalid_action_id_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_id_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_position_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/basic/token/token_transfer_to_ourselves_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/data_contract/data_contract_update_action_not_allowed_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/group/group_action_already_completed_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/group/group_action_already_signed_by_identity_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/group/group_action_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/group/identity_not_member_of_group_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/group/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/identity/recipient_identity_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/identity_does_not_have_enough_token_balance_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_already_frozen_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_frozen_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_not_frozen_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/invalid_group_position_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/mod.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_group_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_identity_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_main_group_not_set_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/new_tokens_destination_identity_does_not_exist_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/token_already_paused_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/token_is_paused_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/token_mint_past_max_supply_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/token_not_paused_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/token_setting_max_supply_to_less_than_current_supply_error.rs create mode 100644 packages/rs-dpp/src/errors/consensus/state/token/unauthorized_token_action_error.rs create mode 100644 packages/rs-dpp/src/group/action_event.rs create mode 100644 packages/rs-dpp/src/group/action_taker.rs create mode 100644 packages/rs-dpp/src/group/group_action/mod.rs create mode 100644 packages/rs-dpp/src/group/group_action/v0/mod.rs create mode 100644 packages/rs-dpp/src/group/group_action_status.rs create mode 100644 packages/rs-dpp/src/group/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/document_base_transition_trait.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/fields.rs (75%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/from_document.rs (84%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/mod.rs (96%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/v0/from_document.rs (77%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/v0/mod.rs (98%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/v0/v0_methods.rs (94%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_base_transition/v0_methods.rs (87%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/convertible.rs (90%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/from_document.rs (86%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/mod.rs (97%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/v0/from_document.rs (84%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/v0/mod.rs (97%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/v0/v0_methods.rs (76%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_create_transition/v0_methods.rs (80%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_delete_transition/from_document.rs (85%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_delete_transition/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_delete_transition/v0/from_document.rs (69%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_delete_transition/v0/mod.rs (85%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/v0_methods.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_delete_transition/v0_methods.rs (51%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/from_document.rs (85%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/v0/from_document.rs (79%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/v0/mod.rs (90%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/v0/v0_methods.rs (53%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_purchase_transition/v0_methods.rs (65%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/from_document.rs (79%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/v0/from_document.rs (79%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/v0/mod.rs (98%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/v0/v0_methods.rs (68%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_replace_transition/v0_methods.rs (71%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/from_document.rs (84%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/v0/from_document.rs (79%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/v0/mod.rs (92%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/v0/v0_methods.rs (69%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_transfer_transition/v0_methods.rs (72%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition/mod.rs => batch_transition/batched_transition/document_transition.rs} (71%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition/action_type.rs => batch_transition/batched_transition/document_transition_action_type.rs} (78%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/from_document.rs (85%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/v0/from_document.rs (82%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/v0/mod.rs (99%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/v0/v0_methods.rs (62%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition/document_transition => batch_transition/batched_transition}/document_update_price_transition/v0_methods.rs (68%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/multi_party_action.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/resolvers.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/fields.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/token_base_transition_accessors.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition_action_type.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0_methods.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/fields.rs (93%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/identity_signed.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/json_conversion.rs (52%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/methods/v0/mod.rs (81%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/v0/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/state_transition_like.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/cbor_conversion.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/identity_signed.rs (83%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/json_conversion.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/mod.rs (86%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/state_transition_like.rs (72%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/types.rs (53%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/v0_methods.rs (77%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/value_conversion.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/v0/version.rs (52%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/identity_signed.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/json_conversion.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/mod.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/state_transition_like.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/types.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/value_conversion.rs create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/version.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/validation/find_duplicates_by_id/mod.rs (84%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/validation/find_duplicates_by_id/v0/mod.rs (73%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/validation/mod.rs (100%) rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/validation/validate_basic_structure/mod.rs (88%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/v0/mod.rs rename packages/rs-dpp/src/state_transition/state_transitions/document/{documents_batch_transition => batch_transition}/value_conversion.rs (61%) create mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/version.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/v0/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/v0_methods.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/json_conversion.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/value_conversion.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs delete mode 100644 packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/version.rs create mode 100644 packages/rs-dpp/src/tokens/allowed_currency.rs create mode 100644 packages/rs-dpp/src/tokens/emergency_action.rs create mode 100644 packages/rs-dpp/src/tokens/errors.rs create mode 100644 packages/rs-dpp/src/tokens/info/methods.rs create mode 100644 packages/rs-dpp/src/tokens/info/mod.rs create mode 100644 packages/rs-dpp/src/tokens/info/v0/mod.rs create mode 100644 packages/rs-dpp/src/tokens/mod.rs create mode 100644 packages/rs-dpp/src/tokens/status/methods.rs create mode 100644 packages/rs-dpp/src/tokens/status/mod.rs create mode 100644 packages/rs-dpp/src/tokens/status/v0/mod.rs create mode 100644 packages/rs-dpp/src/tokens/token_event.rs create mode 100644 packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v1/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing => block_processing_end_events}/add_process_epoch_change_operations/mod.rs (100%) rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing => block_processing_end_events}/add_process_epoch_change_operations/v0/mod.rs (100%) rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing => block_processing_end_events}/mod.rs (56%) rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing/process_block_fees => block_processing_end_events/process_block_fees_and_validate_sum_trees}/mod.rs (79%) rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing/process_block_fees => block_processing_end_events/process_block_fees_and_validate_sum_trees}/v0/mod.rs (99%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v1/mod.rs rename packages/rs-drive-abci/src/execution/platform_events/{block_fee_processing => block_processing_end_events}/tests.rs (95%) create mode 100644 packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v1/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/tokens/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v1/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_create_transition_action/mod.rs (86%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_create_transition_action/state_v0/mod.rs (94%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_create_transition_action/state_v1/mod.rs (95%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_create_transition_action/structure_v0/mod.rs (94%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_delete_transition_action/mod.rs (87%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_delete_transition_action/state_v0/mod.rs (89%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_delete_transition_action/structure_v0/mod.rs (84%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_purchase_transition_action/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_purchase_transition_action/state_v0/mod.rs (90%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_purchase_transition_action/structure_v0/mod.rs (90%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_replace_transition_action/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_replace_transition_action/state_v0/mod.rs (90%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_replace_transition_action/structure_v0/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_transfer_transition_action/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_transfer_transition_action/state_v0/mod.rs (90%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_transfer_transition_action/structure_v0/mod.rs (87%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_update_price_transition_action/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_update_price_transition_action/state_v0/mod.rs (90%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/document_update_price_transition_action/structure_v0/mod.rs (87%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch/action_validation => batch/action_validation/document}/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/structure_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/state_v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/structure_v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/advanced_structure/mod.rs (100%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/balance/mod.rs (76%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/balance/v0/mod.rs (89%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/bindings/data_trigger_binding/mod.rs (89%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/bindings/data_trigger_binding/v0/mod.rs (96%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/bindings/list/mod.rs (79%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/bindings/list/v0/mod.rs (88%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/bindings/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/context.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/executor.rs (58%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/mod.rs (94%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/dashpay/mod.rs (74%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/dashpay/v0/mod.rs (86%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/dpns/mod.rs (70%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/dpns/v0/mod.rs (79%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/feature_flags/mod.rs (70%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/feature_flags/v0/mod.rs (83%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/reject/mod.rs (69%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/reject/v0/mod.rs (68%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/withdrawals/mod.rs (74%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/data_triggers/triggers/withdrawals/v0/mod.rs (91%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/identity_contract_nonce/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/identity_contract_nonce/v0/mod.rs (82%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/is_allowed/mod.rs (86%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/is_allowed/v0/mod.rs (75%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/mod.rs (52%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/state/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/state/v0/data_triggers.rs (76%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/state/v0/fetch_contender.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/state/v0/fetch_documents.rs (97%) create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/mod.rs rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/transformer/mod.rs (100%) rename packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/{documents_batch => batch}/transformer/v0/mod.rs (59%) delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs delete mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v1/mod.rs rename packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/{for_saving.rs => for_saving_v0.rs} (80%) create mode 100644 packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v2.rs create mode 100644 packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorum_config_for_saving_v0.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_action_signers/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_action_signers/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_actions/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_actions/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_info/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_info/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_infos/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/group_infos/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/group_queries/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identities_token_balances/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identities_token_balances/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identities_token_infos/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identities_token_infos/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identity_token_balances/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identity_token_balances/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identity_token_infos/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/identity_token_infos/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_status/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_status/v0/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_total_supply/mod.rs create mode 100644 packages/rs-drive-abci/src/query/token_queries/token_total_supply/v0/mod.rs create mode 100644 packages/rs-drive-abci/tests/strategy_tests/token_tests.rs create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-documents-mutable.json create mode 100644 packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-in-game-currency.json create mode 100644 packages/rs-drive/src/drive/contract/insert/insert_contract/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/contract/update/update_contract/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/mod.rs create mode 100644 packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/mod.rs create mode 100644 packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/mod.rs create mode 100644 packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/estimated_costs/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_signers/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_action_signers/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_group_info/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_group_info/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_group_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/fetch_group_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/fetch/mod.rs create mode 100644 packages/rs-drive/src/drive/group/insert/add_group_action/mod.rs create mode 100644 packages/rs-drive/src/drive/group/insert/add_group_action/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/insert/add_new_groups/mod.rs create mode 100644 packages/rs-drive/src/drive/group/insert/add_new_groups/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/insert/mod.rs create mode 100644 packages/rs-drive/src/drive/group/mod.rs create mode 100644 packages/rs-drive/src/drive/group/paths.rs create mode 100644 packages/rs-drive/src/drive/group/prove/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_action_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_action_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_action_signers/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_action_signers/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_group_info/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_group_info/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_group_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/group/prove/prove_group_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/group/queries.rs create mode 100644 packages/rs-drive/src/drive/initialization/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/v1/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/mod.rs create mode 100644 packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/add_transaction_history_operations/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/add_transaction_history_operations/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/apply_status/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/apply_status/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/queries.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/balance/update.rs create mode 100644 packages/rs-drive/src/drive/tokens/burn/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/burn/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/fetch/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/fetch/pre_programmed_distributions/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/prove/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/prove/pre_programmed_distributions/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/distribution/queries.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/estimated_costs/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/freeze/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/freeze/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/info/queries.rs create mode 100644 packages/rs-drive/src/drive/tokens/mint/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/mint/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/paths.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/fetch_token_status/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/fetch_token_status/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/prove_token_statuses/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/prove_token_statuses/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/status/queries.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/create_token_trees/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/create_token_trees/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/transfer/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/transfer/v0/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/unfreeze/mod.rs create mode 100644 packages/rs-drive/src/drive/tokens/unfreeze/v0/mod.rs create mode 100644 packages/rs-drive/src/query/identity_token_balance_drive_query.rs create mode 100644 packages/rs-drive/src/query/identity_token_info_drive_query.rs create mode 100644 packages/rs-drive/src/query/token_status_drive_query.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/batch_transition.rs rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_create_transition.rs (95%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_delete_transition.rs (86%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_purchase_transition.rs (92%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_replace_transition.rs (91%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_transfer_transition.rs (91%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_transition.rs (63%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/document_update_price_transition.rs (90%) rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{ => batch}/document/documents_batch_transition.rs (84%) create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/mod.rs rename packages/rs-drive/src/state_transition_action/action_convert_to_operations/{document => batch}/mod.rs (57%) create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_burn_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_config_update_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_destroy_frozen_funds_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_emergency_action_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_freeze_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_mint_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transfer_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transition.rs create mode 100644 packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_unfreeze_transition.rs rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_base_transition_action/mod.rs (100%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_base_transition_action/transformer.rs (81%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_base_transition_action/v0/mod.rs (100%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_base_transition_action/v0/transformer.rs (90%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_create_transition_action/mod.rs (98%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_create_transition_action/transformer.rs (86%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_create_transition_action/v0/mod.rs (99%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_create_transition_action/v0/transformer.rs (95%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_delete_transition_action/mod.rs (87%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_delete_transition_action/transformer.rs (78%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_delete_transition_action/v0/mod.rs (89%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_delete_transition_action/v0/transformer.rs (74%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_purchase_transition_action/mod.rs (97%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_purchase_transition_action/transformer.rs (87%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_purchase_transition_action/v0/mod.rs (94%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_purchase_transition_action/v0/transformer.rs (86%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_replace_transition_action/mod.rs (98%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_replace_transition_action/transformer.rs (91%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_replace_transition_action/v0/mod.rs (99%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_replace_transition_action/v0/transformer.rs (88%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_transfer_transition_action/mod.rs (97%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_transfer_transition_action/transformer.rs (87%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_transfer_transition_action/v0/mod.rs (92%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_transfer_transition_action/v0/transformer.rs (85%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch/document_transition/action_type.rs => batch/batched_transition/document_transition/document_transition_action_type.rs} (63%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_update_price_transition_action/mod.rs (97%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_update_price_transition_action/transformer.rs (87%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_update_price_transition_action/v0/mod.rs (93%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/document_update_price_transition_action/v0/transformer.rs (84%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch/batched_transition}/document_transition/mod.rs (51%) create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transition_action_type.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/transformer.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/mod.rs create mode 100644 packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/transformer.rs rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch}/mod.rs (60%) rename packages/rs-drive/src/state_transition_action/{document/documents_batch => batch}/v0/mod.rs (68%) delete mode 100644 packages/rs-drive/src/state_transition_action/document/mod.rs create mode 100644 packages/rs-drive/src/util/batch/drive_op_batch/group.rs create mode 100644 packages/rs-drive/src/util/batch/drive_op_batch/token.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_raw_item/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_raw_item/v0/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/mod.rs create mode 100644 packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/group/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_action_signers/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_action_signers/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_active_action_infos/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_active_action_infos/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_group_info/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_group_info/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_group_infos_in_contract/mod.rs create mode 100644 packages/rs-drive/src/verify/group/verify_group_infos_in_contract/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_status/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_status/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_statuses/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_statuses/v0/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/mod.rs create mode 100644 packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/v0/mod.rs create mode 100644 packages/rs-drive/tests/supporting_files/contract/tokens/token-example-contract.json create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v5.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v6.rs create mode 100644 packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v5.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v2.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/mod.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/v1.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/v3.rs create mode 100644 packages/rs-platform-version/src/version/drive_versions/v4.rs create mode 100644 packages/rs-platform-version/src/version/v8.rs create mode 100644 packages/rs-platform-version/src/version/v9.rs create mode 100755 packages/rs-sdk/scripts/connect_to_remote.sh create mode 100644 packages/rs-sdk/src/platform/transition/builder.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/emergency_action.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs create mode 100644 packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs create mode 100644 packages/search-contract/.eslintrc create mode 100644 packages/search-contract/.mocharc.yml create mode 100644 packages/search-contract/Cargo.toml create mode 100644 packages/search-contract/LICENSE create mode 100644 packages/search-contract/README.md create mode 100644 packages/search-contract/lib/systemIds.js create mode 100644 packages/search-contract/package.json create mode 100644 packages/search-contract/schema/v1/search-contract-documents.json create mode 100644 packages/search-contract/src/error.rs create mode 100644 packages/search-contract/src/lib.rs create mode 100644 packages/search-contract/src/v1/mod.rs create mode 100644 packages/search-contract/test/.eslintrc create mode 100644 packages/search-contract/test/bootstrap.js create mode 100644 packages/search-contract/test/unit/searchContract.spec.js create mode 100644 packages/token-history-contract/.eslintrc create mode 100644 packages/token-history-contract/.mocharc.yml create mode 100644 packages/token-history-contract/Cargo.toml create mode 100644 packages/token-history-contract/LICENSE create mode 100644 packages/token-history-contract/README.md create mode 100644 packages/token-history-contract/lib/systemIds.js create mode 100644 packages/token-history-contract/package.json create mode 100644 packages/token-history-contract/schema/v1/token-history-contract-documents.json create mode 100644 packages/token-history-contract/src/error.rs create mode 100644 packages/token-history-contract/src/lib.rs create mode 100644 packages/token-history-contract/src/v1/mod.rs create mode 100644 packages/token-history-contract/test/.eslintrc create mode 100644 packages/token-history-contract/test/bootstrap.js create mode 100644 packages/token-history-contract/test/unit/tokenHistoryContract.spec.js create mode 100644 packages/wasm-dpp/src/data_contract/tokens.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/batched_transition/mod.rs rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/document_transition/document_create_transition.rs (84%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/document_transition/document_delete_transition.rs (68%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/document_transition/document_replace_transition.rs (91%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/document_transition/mod.rs (50%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/mod.rs (85%) create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destroy.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency_action.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs create mode 100644 packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/basic/find_duplicates_by_id.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/basic/find_duplicates_by_indices.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/basic/mod.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/basic/validate_documents_batch_transition_basic.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/basic/validate_partial_compound_indices.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/mod.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/state/fetch_extended_documents.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/state/mod.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/state/validate_documents_batch_transitions_state.rs (100%) rename packages/wasm-dpp/src/document/state_transition/{document_batch_transition => batch_transition}/validation/state/validate_documents_uniqueness_by_indices.rs (100%) create mode 100644 packages/wasm-sdk/.gitignore create mode 100644 packages/wasm-sdk/Cargo.toml create mode 100755 packages/wasm-sdk/build.sh create mode 100644 packages/wasm-sdk/index.html create mode 100644 packages/wasm-sdk/src/context_provider.rs create mode 100644 packages/wasm-sdk/src/dpp.rs create mode 100644 packages/wasm-sdk/src/error.rs create mode 100644 packages/wasm-sdk/src/lib.rs create mode 100644 packages/wasm-sdk/src/sdk.rs create mode 100644 packages/wasm-sdk/src/state_transitions/documents.rs create mode 100644 packages/wasm-sdk/src/state_transitions/mod.rs create mode 100644 packages/wasm-sdk/src/verify.rs delete mode 100755 scripts/check_network_version.sh diff --git a/.cargo/config-release.toml b/.cargo/config-release.toml index faab5e6c572..5b6e5f64a0c 100644 --- a/.cargo/config-release.toml +++ b/.cargo/config-release.toml @@ -5,7 +5,13 @@ rustflags = ["-C", "target-feature=-crt-static"] [target.x86_64-unknown-linux-musl] -rustflags = ["-C", "target-feature=-crt-static"] +rustflags = ["-C", "target-feature=-crt-static", "-C", "target-cpu=x86-64-v3"] + +[target.x86_64-unknown-linux-gnu] +rustflags = ["-C", "target-feature=-crt-static", "-C", "target-cpu=x86-64-v3"] [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" + +[target.wasm32-unknown-unknown] +rustflags = ['--cfg', 'getrandom_backend="wasm_js"'] diff --git a/.cargo/config.toml b/.cargo/config.toml index 18bc8e4064b..57390b4f9df 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -4,10 +4,30 @@ rustflags = ["-C", "target-feature=-crt-static", "--cfg", "tokio_unstable"] [target.x86_64-unknown-linux-musl] -rustflags = ["-C", "target-feature=-crt-static", "--cfg", "tokio_unstable"] +rustflags = [ + "-C", + "target-feature=-crt-static", + "--cfg", + "tokio_unstable", + "-C", + "target-cpu=x86-64", +] + +[target.x86_64-unknown-linux-gnu] +rustflags = [ + "-C", + "target-feature=-crt-static", + "--cfg", + "tokio_unstable", + "-C", + "target-cpu=x86-64", +] [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc" +[target.wasm32-unknown-unknown] +rustflags = ['--cfg', 'getrandom_backend="wasm_js"'] + [build] rustflags = ["--cfg", "tokio_unstable"] diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ce363420efb..f2373424b67 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -66,7 +66,7 @@ RUN set -ex; \ rm /tmp/cargo-binstall; \ cargo binstall -V -RUN cargo binstall wasm-bindgen-cli@0.2.86 --locked \ +RUN cargo binstall wasm-bindgen-cli@0.2.99 --locked \ --no-discover-github-token \ --disable-telemetry \ --no-track \ diff --git a/.github/actions/librocksdb/action.yaml b/.github/actions/librocksdb/action.yaml index 217e2745eb8..c35e8459233 100644 --- a/.github/actions/librocksdb/action.yaml +++ b/.github/actions/librocksdb/action.yaml @@ -6,9 +6,9 @@ name: "librocksdb" description: "Build and install librocksdb" inputs: version: - description: RocksDB version, eg. "8.10.2" + description: RocksDB version, eg. "9.9.3" required: false - default: "8.10.2" + default: "9.9.3" force: description: Force rebuild required: false diff --git a/.github/package-filters/js-packages.yml b/.github/package-filters/js-packages.yml index b42237f81b1..0c4e0260fa7 100644 --- a/.github/package-filters/js-packages.yml +++ b/.github/package-filters/js-packages.yml @@ -2,6 +2,10 @@ - .github/workflows/tests* - packages/wallet-utils-contract/** +'@dashevo/token-history-contract': &token-history-contract + - .github/workflows/tests* + - packages/token-history-contract/** + '@dashevo/dashpay-contract': &dashpay-contract - .github/workflows/tests* - packages/dashpay-contract/** @@ -30,6 +34,7 @@ - *dpns-contract - *withdrawals-contract - *wallet-utils-contract + - *token-history-contract - packages/rs-platform-serialization/** - packages/rs-platform-serialization-derive/** - packages/rs-platform-value/** @@ -80,6 +85,7 @@ dashmate: - *masternode-reward-shares-contract - *dpns-contract - *withdrawals-contract + - *token-history-contract - *wallet-lib - *dapi-client diff --git a/.github/package-filters/rs-packages.yml b/.github/package-filters/rs-packages.yml index c813323e1dd..7e31bd9992f 100644 --- a/.github/package-filters/rs-packages.yml +++ b/.github/package-filters/rs-packages.yml @@ -2,6 +2,10 @@ wallet-utils-contract: &wallet-utils-contract - .github/workflows/tests* - packages/wallet-utils-contract/** +token-history-contract: &token-history-contract + - .github/workflows/tests* + - packages/token-history-contract/** + dashpay-contract: &dashpay-contract - .github/workflows/tests* - packages/dashpay-contract/** @@ -30,6 +34,7 @@ dpp: &dpp - *dpns-contract - *withdrawals-contract - *wallet-utils-contract + - *token-history-contract - *json-schema-compatibility-validator - packages/rs-platform-serialization/** - packages/rs-platform-serialization-derive/** diff --git a/.github/workflows/release-docker-image.yml b/.github/workflows/release-docker-image.yml index e7eea70ac84..ec2afed138c 100644 --- a/.github/workflows/release-docker-image.yml +++ b/.github/workflows/release-docker-image.yml @@ -39,7 +39,7 @@ jobs: include: - runner: ubuntu-24.04 platform: linux/amd64 - - runner: ubuntu-24.04 + - runner: ubuntu-24.04-arm platform: linux/arm64 steps: - name: Check out repo @@ -47,10 +47,6 @@ jobs: with: fetch-depth: 0 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - if: ${{ matrix.platform == 'linux/arm64' }} - - name: Build and push by digest uses: ./.github/actions/docker id: docker_build @@ -79,10 +75,16 @@ jobs: touch "${{ env.DIGEST_DIR_PATH }}/${digest#sha256:}" ls -lah ${{ env.DIGEST_DIR_PATH }} + - name: Format DIGEST_PLATFORM + run: | + PLATFORM="${{ matrix.platform }}" + # replace slash (/) with dash (-) + echo "DIGEST_PLATFORM=${PLATFORM//\//-}" >> $GITHUB_ENV + - name: Upload digest uses: actions/upload-artifact@v4 with: - name: ${{ env.DIGEST_NAME }} + name: ${{ env.DIGEST_NAME }}-${{ env.DIGEST_PLATFORM }} path: ${{ env.DIGEST_DIR_PATH }}/* if-no-files-found: error retention-days: 1 @@ -93,10 +95,11 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Download digests - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: ${{ env.DIGEST_NAME }} + pattern: ${{ env.DIGEST_NAME }}* path: ${{ env.DIGEST_DIR_PATH }} + merge-multiple: true - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 269798a2ff6..d1d31d6613f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -70,14 +70,20 @@ jobs: if: ${{ steps.check-artifact.outputs.exists != 'true' }} - name: Install wasm-bindgen-cli - run: cargo binstall wasm-bindgen-cli@0.2.86 + run: cargo binstall wasm-bindgen-cli@0.2.99 + if: ${{ steps.check-artifact.outputs.exists != 'true' }} + + - name: Install Binaryen + run: | + wget https://github.com/WebAssembly/binaryen/releases/download/version_121/binaryen-version_121-x86_64-linux.tar.gz -P /tmp + tar -xzf /tmp/binaryen-version_121-x86_64-linux.tar.gz -C /tmp + sudo cp -r /tmp/binaryen-version_121/* /usr/local/ if: ${{ steps.check-artifact.outputs.exists != 'true' }} - name: Build packages run: yarn build env: CARGO_BUILD_PROFILE: release - if: ${{ steps.check-artifact.outputs.exists != 'true' }} - name: Set suffix diff --git a/.github/workflows/tests-build-js.yml b/.github/workflows/tests-build-js.yml index a36bd91e2c0..3223203e297 100644 --- a/.github/workflows/tests-build-js.yml +++ b/.github/workflows/tests-build-js.yml @@ -50,7 +50,14 @@ jobs: if: ${{ steps.check-artifact.outputs.exists != 'true' }} - name: Install wasm-bindgen-cli - run: cargo binstall wasm-bindgen-cli@0.2.86 + run: cargo binstall wasm-bindgen-cli@0.2.99 + if: ${{ steps.check-artifact.outputs.exists != 'true' }} + + - name: Install Binaryen + run: | + wget https://github.com/WebAssembly/binaryen/releases/download/version_121/binaryen-version_121-x86_64-linux.tar.gz -P /tmp + tar -xzf /tmp/binaryen-version_121-x86_64-linux.tar.gz -C /tmp + sudo cp -r /tmp/binaryen-version_121/* /usr/local/ if: ${{ steps.check-artifact.outputs.exists != 'true' }} - name: Build JS packages diff --git a/.pnp.cjs b/.pnp.cjs index 21f4c62f9a0..f14fc97bfb3 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -65,6 +65,10 @@ const RAW_RUNTIME_STATE = "name": "@dashevo/platform-test-suite",\ "reference": "workspace:packages/platform-test-suite"\ },\ + {\ + "name": "@dashevo/token-history-contract",\ + "reference": "workspace:packages/token-history-contract"\ + },\ {\ "name": "@dashevo/wallet-lib",\ "reference": "workspace:packages/wallet-lib"\ @@ -97,6 +101,7 @@ const RAW_RUNTIME_STATE = ["@dashevo/masternode-reward-shares-contract", ["workspace:packages/masternode-reward-shares-contract"]],\ ["@dashevo/platform", ["workspace:."]],\ ["@dashevo/platform-test-suite", ["workspace:packages/platform-test-suite"]],\ + ["@dashevo/token-history-contract", ["workspace:packages/token-history-contract"]],\ ["@dashevo/wallet-lib", ["workspace:packages/wallet-lib"]],\ ["@dashevo/wallet-utils-contract", ["workspace:packages/wallet-utils-contract"]],\ ["@dashevo/wasm-dpp", ["workspace:packages/wasm-dpp"]],\ @@ -2569,7 +2574,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ ["lodash", "npm:4.17.21"],\ ["mathjs", "npm:10.4.3"],\ - ["mocha", "npm:10.2.0"]\ + ["mocha", "npm:11.1.0"]\ ],\ "linkType": "SOFT"\ }]\ @@ -2617,7 +2622,7 @@ const RAW_RUNTIME_STATE = ["jayson", "npm:4.1.0"],\ ["lodash", "npm:4.17.21"],\ ["lru-cache", "npm:5.1.1"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["mocha-sinon", "virtual:595d7482cc8ddf98ee6aef33fc48b46393554ab5f17f851ef62e6e39315e53666c3e66226b978689aa0bc7f1e83a03081511a21db1c381362fe67614887077f9#npm:2.1.2"],\ ["nyc", "npm:15.1.0"],\ ["pino", "npm:8.16.2"],\ @@ -2668,7 +2673,7 @@ const RAW_RUNTIME_STATE = ["karma-mocha-reporter", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.2.5"],\ ["karma-webpack", "virtual:8f25fc90e0fb5fd89843707863857591fa8c52f9f33eadced4bf404b1871d91959f7bb86948ae0e1b53ee94d491ef8fde9c0b58b39c9490c0d0fa6c931945f97#npm:5.0.0"],\ ["lodash", "npm:4.17.21"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["node-fetch", "virtual:8f25fc90e0fb5fd89843707863857591fa8c52f9f33eadced4bf404b1871d91959f7bb86948ae0e1b53ee94d491ef8fde9c0b58b39c9490c0d0fa6c931945f97#npm:2.6.7"],\ ["node-inspect-extracted", "npm:1.0.8"],\ ["nyc", "npm:15.1.0"],\ @@ -2707,7 +2712,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ ["google-protobuf", "npm:3.19.1"],\ ["long", "npm:5.2.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["mocha-sinon", "virtual:595d7482cc8ddf98ee6aef33fc48b46393554ab5f17f851ef62e6e39315e53666c3e66226b978689aa0bc7f1e83a03081511a21db1c381362fe67614887077f9#npm:2.1.2"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ @@ -2738,7 +2743,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ ["levelup", "npm:4.4.0"],\ ["memdown", "npm:5.1.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["should", "npm:13.2.3"],\ ["sinon", "npm:17.0.1"],\ ["wasm-x11-hash", "npm:0.0.2"]\ @@ -2809,7 +2814,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -2851,7 +2856,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -2869,7 +2874,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -2893,7 +2898,7 @@ const RAW_RUNTIME_STATE = ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ ["lodash", "npm:4.17.21"],\ ["long", "npm:5.2.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["mocha-sinon", "virtual:595d7482cc8ddf98ee6aef33fc48b46393554ab5f17f851ef62e6e39315e53666c3e66226b978689aa0bc7f1e83a03081511a21db1c381362fe67614887077f9#npm:2.1.2"],\ ["nyc", "npm:15.1.0"],\ ["semver", "npm:7.5.3"],\ @@ -2914,7 +2919,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -2979,7 +2984,7 @@ const RAW_RUNTIME_STATE = ["karma-sourcemap-loader", "npm:0.3.8"],\ ["karma-webpack", "virtual:01938c2be4835443e5a304e2b117c575220e96e8b7cedeb0f48d79264590b4c4babc6d1fea6367f522b1ca0149d795b42f2ab89c34a6ffe3c20f0a8cbb8b4453#npm:5.0.0"],\ ["localforage", "npm:1.10.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["net", "npm:1.0.2"],\ ["nodeforage", "npm:1.1.2"],\ ["os-browserify", "npm:0.3.0"],\ @@ -3032,6 +3037,24 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ + ["@dashevo/token-history-contract", [\ + ["workspace:packages/token-history-contract", {\ + "packageLocation": "./packages/token-history-contract/",\ + "packageDependencies": [\ + ["@dashevo/token-history-contract", "workspace:packages/token-history-contract"],\ + ["@dashevo/wasm-dpp", "workspace:packages/wasm-dpp"],\ + ["chai", "npm:4.3.10"],\ + ["dirty-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.0.1"],\ + ["eslint", "npm:8.53.0"],\ + ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ + ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ + ["mocha", "npm:11.1.0"],\ + ["sinon", "npm:17.0.1"],\ + ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@dashevo/wallet-lib", [\ ["workspace:packages/wallet-lib", {\ "packageLocation": "./packages/wallet-lib/",\ @@ -3067,7 +3090,7 @@ const RAW_RUNTIME_STATE = ["karma-sourcemap-loader", "npm:0.3.8"],\ ["karma-webpack", "virtual:45f214395bc38640da4dc5e940482d5df0572c5384e0262802601d1973e71077ec8bbd76b77eafa4c0550b706b664abd84d63fd67a5897139f0b2675530fc84f#npm:5.0.0"],\ ["lodash", "npm:4.17.21"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["node-inspect-extracted", "npm:1.0.8"],\ ["nyc", "npm:15.1.0"],\ ["os-browserify", "npm:0.3.0"],\ @@ -3102,7 +3125,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -3150,7 +3173,7 @@ const RAW_RUNTIME_STATE = ["karma-webpack", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.0.0"],\ ["lodash", "npm:4.17.21"],\ ["long", "npm:5.2.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["path-browserify", "npm:1.0.1"],\ ["process", "npm:0.11.10"],\ ["sinon", "npm:17.0.1"],\ @@ -3181,7 +3204,7 @@ const RAW_RUNTIME_STATE = ["eslint", "npm:8.53.0"],\ ["eslint-config-airbnb-base", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:15.0.0"],\ ["eslint-plugin-import", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.29.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"]\ ],\ @@ -3527,15 +3550,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["@jridgewell/source-map", [\ - ["npm:0.3.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip/node_modules/@jridgewell/source-map/",\ - "packageDependencies": [\ - ["@jridgewell/source-map", "npm:0.3.2"],\ - ["@jridgewell/gen-mapping", "npm:0.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.18"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:0.3.6", {\ "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.6-fe0849eb05-0a9aca9320.zip/node_modules/@jridgewell/source-map/",\ "packageDependencies": [\ @@ -3903,7 +3917,7 @@ const RAW_RUNTIME_STATE = ["chalk", "npm:4.1.2"],\ ["clean-stack", "npm:3.0.1"],\ ["cli-progress", "npm:3.12.0"],\ - ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ + ["debug", "virtual:02719845fd5201c955bdd7a997ac097487e4abbecfc5636e22f31b749d9380689c8965647293b3e329ccc5fe1790fddb1d7f8791f5385e4538cbcf7c463cfc82#npm:4.3.4"],\ ["ejs", "npm:3.1.10"],\ ["get-package-type", "npm:0.1.0"],\ ["globby", "npm:11.1.0"],\ @@ -3937,7 +3951,7 @@ const RAW_RUNTIME_STATE = ["chalk", "npm:4.1.2"],\ ["clean-stack", "npm:3.0.1"],\ ["cli-progress", "npm:3.12.0"],\ - ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ + ["debug", "virtual:02719845fd5201c955bdd7a997ac097487e4abbecfc5636e22f31b749d9380689c8965647293b3e329ccc5fe1790fddb1d7f8791f5385e4538cbcf7c463cfc82#npm:4.3.4"],\ ["ejs", "npm:3.1.10"],\ ["get-package-type", "npm:0.1.0"],\ ["globby", "npm:11.1.0"],\ @@ -3972,7 +3986,7 @@ const RAW_RUNTIME_STATE = ["clean-stack", "npm:3.0.1"],\ ["cli-progress", "npm:3.12.0"],\ ["color", "npm:4.2.3"],\ - ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ + ["debug", "virtual:02719845fd5201c955bdd7a997ac097487e4abbecfc5636e22f31b749d9380689c8965647293b3e329ccc5fe1790fddb1d7f8791f5385e4538cbcf7c463cfc82#npm:4.3.4"],\ ["ejs", "npm:3.1.10"],\ ["get-package-type", "npm:0.1.0"],\ ["globby", "npm:11.1.0"],\ @@ -5214,15 +5228,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["@ungap/promise-all-settled", [\ - ["npm:1.1.2", {\ - "packageLocation": "./.yarn/cache/@ungap-promise-all-settled-npm-1.1.2-c0f42e147b-ee8fe811be.zip/node_modules/@ungap/promise-all-settled/",\ - "packageDependencies": [\ - ["@ungap/promise-all-settled", "npm:1.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["@ungap/structured-clone", [\ ["npm:1.2.0", {\ "packageLocation": "./.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-c6fe89a505.zip/node_modules/@ungap/structured-clone/",\ @@ -6059,6 +6064,13 @@ const RAW_RUNTIME_STATE = ["ansi-colors", "npm:4.1.1"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.1.3", {\ + "packageLocation": "./.yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip/node_modules/ansi-colors/",\ + "packageDependencies": [\ + ["ansi-colors", "npm:4.1.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["ansi-escapes", [\ @@ -7507,6 +7519,21 @@ const RAW_RUNTIME_STATE = ["readdirp", "npm:3.6.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.6.0", {\ + "packageLocation": "./.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip/node_modules/chokidar/",\ + "packageDependencies": [\ + ["chokidar", "npm:3.6.0"],\ + ["anymatch", "npm:3.1.2"],\ + ["braces", "npm:3.0.2"],\ + ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1"],\ + ["glob-parent", "npm:5.1.2"],\ + ["is-binary-path", "npm:2.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["normalize-path", "npm:3.0.0"],\ + ["readdirp", "npm:3.6.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["chownr", [\ @@ -7695,6 +7722,16 @@ const RAW_RUNTIME_STATE = ["wrap-ansi", "npm:7.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:8.0.1", {\ + "packageLocation": "./.yarn/cache/cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:8.0.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["clone", [\ @@ -8524,7 +8561,7 @@ const RAW_RUNTIME_STATE = ["karma-mocha", "npm:2.0.1"],\ ["karma-mocha-reporter", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:2.2.5"],\ ["karma-webpack", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.0.0"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["net", "npm:1.0.2"],\ ["node-inspect-extracted", "npm:1.0.8"],\ ["nodemon", "npm:2.0.20"],\ @@ -8537,12 +8574,11 @@ const RAW_RUNTIME_STATE = ["stream-browserify", "npm:3.0.0"],\ ["stream-http", "npm:3.2.0"],\ ["string_decoder", "npm:1.3.0"],\ - ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.11"],\ ["tls", "npm:0.0.1"],\ ["ts-loader", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:9.5.0"],\ - ["ts-mocha", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.0.0"],\ ["ts-mock-imports", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:1.3.8"],\ - ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1"],\ + ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.2"],\ ["tsd", "npm:0.28.1"],\ ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"],\ ["url", "npm:0.11.3"],\ @@ -8597,7 +8633,7 @@ const RAW_RUNTIME_STATE = ["listr2", "virtual:880cda903c2a2be387819a3f857d21494004437a03c92969b9853f7bdeebdfed08d417e68364ee9e158338603a6d78d690c457a55ab11e56398bc10f0ad232fc#npm:5.0.7"],\ ["lodash", "npm:4.17.21"],\ ["memory-streams", "npm:0.1.3"],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["mocha-sinon", "virtual:595d7482cc8ddf98ee6aef33fc48b46393554ab5f17f851ef62e6e39315e53666c3e66226b978689aa0bc7f1e83a03081511a21db1c381362fe67614887077f9#npm:2.1.2"],\ ["node-forge", "npm:1.3.1"],\ ["node-graceful", "npm:3.1.0"],\ @@ -8610,7 +8646,7 @@ const RAW_RUNTIME_STATE = ["semver", "npm:7.5.3"],\ ["sinon", "npm:17.0.1"],\ ["sinon-chai", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:3.7.0"],\ - ["systeminformation", "npm:5.22.11"],\ + ["systeminformation", "npm:5.25.11"],\ ["table", "npm:6.8.1"],\ ["tar", "npm:7.4.3"],\ ["wrap-ansi", "npm:7.0.0"]\ @@ -8658,13 +8694,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["npm:4.3.3", {\ - "packageLocation": "./.yarn/cache/debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip/node_modules/debug/",\ - "packageDependencies": [\ - ["debug", "npm:4.3.3"]\ - ],\ - "linkType": "SOFT"\ - }],\ ["npm:4.3.4", {\ "packageLocation": "./.yarn/cache/debug-npm-4.3.4-4513954577-0073c3bcbd.zip/node_modules/debug/",\ "packageDependencies": [\ @@ -8679,6 +8708,27 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ + ["npm:4.4.0", {\ + "packageLocation": "./.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:4.4.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:02719845fd5201c955bdd7a997ac097487e4abbecfc5636e22f31b749d9380689c8965647293b3e329ccc5fe1790fddb1d7f8791f5385e4538cbcf7c463cfc82#npm:4.3.4", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-8dcd8821e8/0/cache/debug-npm-4.3.4-4513954577-0073c3bcbd.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:02719845fd5201c955bdd7a997ac097487e4abbecfc5636e22f31b749d9380689c8965647293b3e329ccc5fe1790fddb1d7f8791f5385e4538cbcf7c463cfc82#npm:4.3.4"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.1.2"],\ + ["supports-color", "npm:8.1.1"]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7", {\ "packageLocation": "./.yarn/__virtual__/debug-virtual-d2345003b7/0/cache/debug-npm-3.2.7-754e818c7a-d86fd7be2b.zip/node_modules/debug/",\ "packageDependencies": [\ @@ -8735,12 +8785,12 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4", {\ - "packageLocation": "./.yarn/__virtual__/debug-virtual-762d08cbe9/0/cache/debug-npm-4.3.4-4513954577-0073c3bcbd.zip/node_modules/debug/",\ + ["virtual:7c863baca008f921c1e24f38003335491c058753bf49ebec53a1a774c2d4d1d76e539a4898cf50421ee0c2f73a2b57bfc16cfbb7223a003be922dfa7447aac72#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-451630b954/0/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip/node_modules/debug/",\ "packageDependencies": [\ - ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ + ["debug", "virtual:7c863baca008f921c1e24f38003335491c058753bf49ebec53a1a774c2d4d1d76e539a4898cf50421ee0c2f73a2b57bfc16cfbb7223a003be922dfa7447aac72#npm:4.4.0"],\ ["@types/supports-color", null],\ - ["ms", "npm:2.1.2"],\ + ["ms", "npm:2.1.3"],\ ["supports-color", "npm:8.1.1"]\ ],\ "packagePeers": [\ @@ -8762,20 +8812,6 @@ const RAW_RUNTIME_STATE = "supports-color"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:f7735febb87b1fbb8215178a6f0b0bc1e3e251c18455c0481843aea1b7aa4c7d6fbdbd3eeee04078e2e2e368e4d4b513dd87411eb2f12aa6ea556f640295bc68#npm:4.3.3", {\ - "packageLocation": "./.yarn/__virtual__/debug-virtual-0dd0b2b0b9/0/cache/debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip/node_modules/debug/",\ - "packageDependencies": [\ - ["debug", "virtual:f7735febb87b1fbb8215178a6f0b0bc1e3e251c18455c0481843aea1b7aa4c7d6fbdbd3eeee04078e2e2e368e4d4b513dd87411eb2f12aa6ea556f640295bc68#npm:4.3.3"],\ - ["@types/supports-color", null],\ - ["ms", "npm:2.1.2"],\ - ["supports-color", "npm:8.1.1"]\ - ],\ - "packagePeers": [\ - "@types/supports-color",\ - "supports-color"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["debuglog", [\ @@ -9011,13 +9047,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["diff", [\ - ["npm:3.5.0", {\ - "packageLocation": "./.yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip/node_modules/diff/",\ - "packageDependencies": [\ - ["diff", "npm:3.5.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:4.0.2", {\ "packageLocation": "./.yarn/cache/diff-npm-4.0.2-73133c7102-ec09ec2101.zip/node_modules/diff/",\ "packageDependencies": [\ @@ -9025,17 +9054,17 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/diff-npm-5.0.0-ad6900db18-4a179a75b1.zip/node_modules/diff/",\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/diff-npm-5.1.0-d24d222280-f4557032a9.zip/node_modules/diff/",\ "packageDependencies": [\ - ["diff", "npm:5.0.0"]\ + ["diff", "npm:5.1.0"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:5.1.0", {\ - "packageLocation": "./.yarn/cache/diff-npm-5.1.0-d24d222280-f4557032a9.zip/node_modules/diff/",\ + ["npm:5.2.0", {\ + "packageLocation": "./.yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip/node_modules/diff/",\ "packageDependencies": [\ - ["diff", "npm:5.1.0"]\ + ["diff", "npm:5.2.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -11018,19 +11047,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:7.2.0", {\ - "packageLocation": "./.yarn/cache/glob-npm-7.2.0-bb4644d239-bc78b6ea07.zip/node_modules/glob/",\ - "packageDependencies": [\ - ["glob", "npm:7.2.0"],\ - ["fs.realpath", "npm:1.0.0"],\ - ["inflight", "npm:1.0.6"],\ - ["inherits", "npm:2.0.4"],\ - ["minimatch", "npm:3.1.2"],\ - ["once", "npm:1.4.0"],\ - ["path-is-absolute", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:7.2.3", {\ "packageLocation": "./.yarn/cache/glob-npm-7.2.3-2d866d17a5-59452a9202.zip/node_modules/glob/",\ "packageDependencies": [\ @@ -11235,15 +11251,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["growl", [\ - ["npm:1.10.5", {\ - "packageLocation": "./.yarn/cache/growl-npm-1.10.5-2d1da54198-1391a9add9.zip/node_modules/growl/",\ - "packageDependencies": [\ - ["growl", "npm:1.10.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["handlebars", [\ ["npm:4.7.7", {\ "packageLocation": "./.yarn/cache/handlebars-npm-4.7.7-a9ccfabf80-617b1e689b.zip/node_modules/handlebars/",\ @@ -12949,7 +12956,7 @@ const RAW_RUNTIME_STATE = "packageDependencies": [\ ["karma-mocha", "npm:2.0.1"],\ ["minimist", "npm:1.2.6"],\ - ["mocha", "npm:9.2.2"]\ + ["mocha", "npm:11.1.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -14034,22 +14041,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:4.2.1", {\ - "packageLocation": "./.yarn/cache/minimatch-npm-4.2.1-558ec7f418-27e49fb720.zip/node_modules/minimatch/",\ - "packageDependencies": [\ - ["minimatch", "npm:4.2.1"],\ - ["brace-expansion", "npm:1.1.11"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:5.0.1", {\ - "packageLocation": "./.yarn/cache/minimatch-npm-5.0.1-612724f6f0-2656580f18.zip/node_modules/minimatch/",\ - "packageDependencies": [\ - ["minimatch", "npm:5.0.1"],\ - ["brace-expansion", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:5.1.6", {\ "packageLocation": "./.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-126b36485b.zip/node_modules/minimatch/",\ "packageDependencies": [\ @@ -14276,61 +14267,29 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["mocha", [\ - ["npm:10.2.0", {\ - "packageLocation": "./.yarn/cache/mocha-npm-10.2.0-87db25c7c5-f7362898ae.zip/node_modules/mocha/",\ - "packageDependencies": [\ - ["mocha", "npm:10.2.0"],\ - ["ansi-colors", "npm:4.1.1"],\ - ["browser-stdout", "npm:1.3.1"],\ - ["chokidar", "npm:3.5.3"],\ - ["debug", "virtual:87db25c7c5e6b25bbc12571091cdabc648b79d427ab445d1714ccfdcdfb3265c9de6561ca760cc3de470037cbedf3af4be56ba3b684b3a1c01d4c9c2fd55a741#npm:4.3.4"],\ - ["diff", "npm:5.0.0"],\ - ["escape-string-regexp", "npm:4.0.0"],\ - ["find-up", "npm:5.0.0"],\ - ["glob", "npm:7.2.0"],\ - ["he", "npm:1.2.0"],\ - ["js-yaml", "npm:4.1.0"],\ - ["log-symbols", "npm:4.1.0"],\ - ["minimatch", "npm:5.0.1"],\ - ["ms", "npm:2.1.3"],\ - ["nanoid", "npm:3.3.3"],\ - ["serialize-javascript", "npm:6.0.0"],\ - ["strip-json-comments", "npm:3.1.1"],\ - ["supports-color", "npm:8.1.1"],\ - ["workerpool", "npm:6.2.1"],\ - ["yargs", "npm:16.2.0"],\ - ["yargs-parser", "npm:20.2.4"],\ - ["yargs-unparser", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:9.2.2", {\ - "packageLocation": "./.yarn/cache/mocha-npm-9.2.2-f7735febb8-8ee58bff86.zip/node_modules/mocha/",\ + ["npm:11.1.0", {\ + "packageLocation": "./.yarn/cache/mocha-npm-11.1.0-7c863baca0-50d1305813.zip/node_modules/mocha/",\ "packageDependencies": [\ - ["mocha", "npm:9.2.2"],\ - ["@ungap/promise-all-settled", "npm:1.1.2"],\ - ["ansi-colors", "npm:4.1.1"],\ + ["mocha", "npm:11.1.0"],\ + ["ansi-colors", "npm:4.1.3"],\ ["browser-stdout", "npm:1.3.1"],\ - ["chokidar", "npm:3.5.3"],\ - ["debug", "virtual:f7735febb87b1fbb8215178a6f0b0bc1e3e251c18455c0481843aea1b7aa4c7d6fbdbd3eeee04078e2e2e368e4d4b513dd87411eb2f12aa6ea556f640295bc68#npm:4.3.3"],\ - ["diff", "npm:5.0.0"],\ + ["chokidar", "npm:3.6.0"],\ + ["debug", "virtual:7c863baca008f921c1e24f38003335491c058753bf49ebec53a1a774c2d4d1d76e539a4898cf50421ee0c2f73a2b57bfc16cfbb7223a003be922dfa7447aac72#npm:4.4.0"],\ + ["diff", "npm:5.2.0"],\ ["escape-string-regexp", "npm:4.0.0"],\ ["find-up", "npm:5.0.0"],\ - ["glob", "npm:7.2.0"],\ - ["growl", "npm:1.10.5"],\ + ["glob", "npm:10.4.5"],\ ["he", "npm:1.2.0"],\ ["js-yaml", "npm:4.1.0"],\ ["log-symbols", "npm:4.1.0"],\ - ["minimatch", "npm:4.2.1"],\ + ["minimatch", "npm:5.1.6"],\ ["ms", "npm:2.1.3"],\ - ["nanoid", "npm:3.3.1"],\ - ["serialize-javascript", "npm:6.0.0"],\ + ["serialize-javascript", "npm:6.0.2"],\ ["strip-json-comments", "npm:3.1.1"],\ ["supports-color", "npm:8.1.1"],\ - ["which", "npm:2.0.2"],\ - ["workerpool", "npm:6.2.0"],\ - ["yargs", "npm:16.2.0"],\ - ["yargs-parser", "npm:20.2.4"],\ + ["workerpool", "npm:6.5.1"],\ + ["yargs", "npm:17.7.2"],\ + ["yargs-parser", "npm:21.1.1"],\ ["yargs-unparser", "npm:2.0.0"]\ ],\ "linkType": "HARD"\ @@ -14350,7 +14309,7 @@ const RAW_RUNTIME_STATE = ["mocha-sinon", "virtual:595d7482cc8ddf98ee6aef33fc48b46393554ab5f17f851ef62e6e39315e53666c3e66226b978689aa0bc7f1e83a03081511a21db1c381362fe67614887077f9#npm:2.1.2"],\ ["@types/mocha", null],\ ["@types/sinon", null],\ - ["mocha", "npm:10.2.0"],\ + ["mocha", "npm:11.1.0"],\ ["sinon", "npm:17.0.1"]\ ],\ "packagePeers": [\ @@ -14483,22 +14442,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["nanoid", [\ - ["npm:3.3.1", {\ - "packageLocation": "./.yarn/cache/nanoid-npm-3.3.1-bdd760bee0-306f2cb9e4.zip/node_modules/nanoid/",\ - "packageDependencies": [\ - ["nanoid", "npm:3.3.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:3.3.3", {\ - "packageLocation": "./.yarn/cache/nanoid-npm-3.3.3-25d865be84-c703ed58a2.zip/node_modules/nanoid/",\ - "packageDependencies": [\ - ["nanoid", "npm:3.3.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["natural-compare", [\ ["npm:1.4.0", {\ "packageLocation": "./.yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip/node_modules/natural-compare/",\ @@ -17057,6 +17000,17 @@ const RAW_RUNTIME_STATE = ["ajv-keywords", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:5.1.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/schema-utils-npm-4.3.0-6f0a75e2e2-86c5a7c72a.zip/node_modules/schema-utils/",\ + "packageDependencies": [\ + ["schema-utils", "npm:4.3.0"],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["ajv", "npm:8.12.0"],\ + ["ajv-formats", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:2.1.1"],\ + ["ajv-keywords", "virtual:e822c5b02ef2b3c5fb9c8d88d5e0ca208365bff76f80510f4ccf9b1de44e2078264bcb00d3cdd5e193c256e9ab81e27c34fcfb1ad3a0e8c1dc8fa0066c78c468#npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["scoped-regex", [\ @@ -17109,14 +17063,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["serialize-javascript", [\ - ["npm:6.0.0", {\ - "packageLocation": "./.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-ed3dabfbb5.zip/node_modules/serialize-javascript/",\ - "packageDependencies": [\ - ["serialize-javascript", "npm:6.0.0"],\ - ["randombytes", "npm:2.1.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:6.0.2", {\ "packageLocation": "./.yarn/cache/serialize-javascript-npm-6.0.2-cc09461d45-445a420a6f.zip/node_modules/serialize-javascript/",\ "packageDependencies": [\ @@ -18118,10 +18064,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["systeminformation", [\ - ["npm:5.22.11", {\ - "packageLocation": "./.yarn/unplugged/systeminformation-npm-5.22.11-e704a1605b/node_modules/systeminformation/",\ + ["npm:5.25.11", {\ + "packageLocation": "./.yarn/unplugged/systeminformation-npm-5.25.11-e1c9348b68/node_modules/systeminformation/",\ "packageDependencies": [\ - ["systeminformation", "npm:5.22.11"]\ + ["systeminformation", "npm:5.25.11"]\ ],\ "linkType": "HARD"\ }]\ @@ -18236,21 +18182,21 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["terser", [\ - ["npm:5.14.2", {\ - "packageLocation": "./.yarn/cache/terser-npm-5.14.2-b0f8815852-0646b5db1d.zip/node_modules/terser/",\ + ["npm:5.31.6", {\ + "packageLocation": "./.yarn/cache/terser-npm-5.31.6-535b99d333-78057c5802.zip/node_modules/terser/",\ "packageDependencies": [\ - ["terser", "npm:5.14.2"],\ - ["@jridgewell/source-map", "npm:0.3.2"],\ - ["acorn", "npm:8.11.2"],\ + ["terser", "npm:5.31.6"],\ + ["@jridgewell/source-map", "npm:0.3.6"],\ + ["acorn", "npm:8.12.1"],\ ["commander", "npm:2.20.3"],\ ["source-map-support", "npm:0.5.21"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:5.31.6", {\ - "packageLocation": "./.yarn/cache/terser-npm-5.31.6-535b99d333-78057c5802.zip/node_modules/terser/",\ + ["npm:5.39.0", {\ + "packageLocation": "./.yarn/cache/terser-npm-5.39.0-127c67156d-d84aff6423.zip/node_modules/terser/",\ "packageDependencies": [\ - ["terser", "npm:5.31.6"],\ + ["terser", "npm:5.39.0"],\ ["@jridgewell/source-map", "npm:0.3.6"],\ ["acorn", "npm:8.12.1"],\ ["commander", "npm:2.20.3"],\ @@ -18267,10 +18213,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["npm:5.3.3", {\ - "packageLocation": "./.yarn/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ + ["npm:5.3.11", {\ + "packageLocation": "./.yarn/cache/terser-webpack-plugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "npm:5.3.3"]\ + ["terser-webpack-plugin", "npm:5.3.11"]\ ],\ "linkType": "SOFT"\ }],\ @@ -18394,11 +18340,11 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-65e4fce360/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.11", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-55a46e8527/0/cache/terser-webpack-plugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.18"],\ + ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.11"],\ + ["@jridgewell/trace-mapping", "npm:0.3.25"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ ["@types/swc__core", null],\ @@ -18406,9 +18352,9 @@ const RAW_RUNTIME_STATE = ["@types/webpack", null],\ ["esbuild", null],\ ["jest-worker", "npm:27.5.1"],\ - ["schema-utils", "npm:3.1.1"],\ - ["serialize-javascript", "npm:6.0.0"],\ - ["terser", "npm:5.14.2"],\ + ["schema-utils", "npm:4.3.0"],\ + ["serialize-javascript", "npm:6.0.2"],\ + ["terser", "npm:5.39.0"],\ ["uglify-js", null],\ ["webpack", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.94.0"]\ ],\ @@ -18744,30 +18690,6 @@ const RAW_RUNTIME_STATE = "linkType": "HARD"\ }]\ ]],\ - ["ts-mocha", [\ - ["npm:10.0.0", {\ - "packageLocation": "./.yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip/node_modules/ts-mocha/",\ - "packageDependencies": [\ - ["ts-mocha", "npm:10.0.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.0.0", {\ - "packageLocation": "./.yarn/__virtual__/ts-mocha-virtual-e86a022374/0/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip/node_modules/ts-mocha/",\ - "packageDependencies": [\ - ["ts-mocha", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.0.0"],\ - ["@types/mocha", "npm:8.2.3"],\ - ["mocha", "npm:10.2.0"],\ - ["ts-node", "npm:7.0.1"],\ - ["tsconfig-paths", "npm:4.2.0"]\ - ],\ - "packagePeers": [\ - "@types/mocha",\ - "mocha"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["ts-mock-imports", [\ ["npm:1.3.8", {\ "packageLocation": "./.yarn/cache/ts-mock-imports-npm-1.3.8-ce172e5189-82ee2a7256.zip/node_modules/ts-mock-imports/",\ @@ -18802,26 +18724,17 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["npm:7.0.1", {\ - "packageLocation": "./.yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip/node_modules/ts-node/",\ + ["npm:10.9.2", {\ + "packageLocation": "./.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip/node_modules/ts-node/",\ "packageDependencies": [\ - ["ts-node", "npm:7.0.1"],\ - ["arrify", "npm:1.0.1"],\ - ["buffer-from", "npm:1.1.2"],\ - ["diff", "npm:3.5.0"],\ - ["make-error", "npm:1.3.6"],\ - ["minimist", "npm:1.2.6"],\ - ["mkdirp", "npm:0.5.6"],\ - ["source-map-support", "npm:0.5.21"],\ - ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"],\ - ["yn", "npm:2.0.0"]\ + ["ts-node", "npm:10.9.2"]\ ],\ - "linkType": "HARD"\ + "linkType": "SOFT"\ }],\ - ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1", {\ - "packageLocation": "./.yarn/__virtual__/ts-node-virtual-b591c0cf5f/0/cache/ts-node-npm-10.9.1-6c268be7f4-bee56d4dc9.zip/node_modules/ts-node/",\ + ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.2", {\ + "packageLocation": "./.yarn/__virtual__/ts-node-virtual-488d8351d8/0/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip/node_modules/ts-node/",\ "packageDependencies": [\ - ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.1"],\ + ["ts-node", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:10.9.2"],\ ["@cspotcode/source-map-support", "npm:0.8.1"],\ ["@swc/core", null],\ ["@swc/wasm", null],\ @@ -20248,17 +20161,10 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["workerpool", [\ - ["npm:6.2.0", {\ - "packageLocation": "./.yarn/cache/workerpool-npm-6.2.0-d2a722f6bb-c7dce6eae0.zip/node_modules/workerpool/",\ + ["npm:6.5.1", {\ + "packageLocation": "./.yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip/node_modules/workerpool/",\ "packageDependencies": [\ - ["workerpool", "npm:6.2.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:6.2.1", {\ - "packageLocation": "./.yarn/cache/workerpool-npm-6.2.1-1486cb2056-3e637f7632.zip/node_modules/workerpool/",\ - "packageDependencies": [\ - ["workerpool", "npm:6.2.1"]\ + ["workerpool", "npm:6.5.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -20489,6 +20395,20 @@ const RAW_RUNTIME_STATE = ["yargs-parser", "npm:20.2.9"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:17.7.2", {\ + "packageLocation": "./.yarn/cache/yargs-npm-17.7.2-80b62638e1-abb3e37678.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:17.7.2"],\ + ["cliui", "npm:8.0.1"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["yargs-parser", [\ @@ -20501,17 +20421,17 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["npm:20.2.4", {\ - "packageLocation": "./.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-db8f251ae4.zip/node_modules/yargs-parser/",\ + ["npm:20.2.9", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip/node_modules/yargs-parser/",\ "packageDependencies": [\ - ["yargs-parser", "npm:20.2.4"]\ + ["yargs-parser", "npm:20.2.9"]\ ],\ "linkType": "HARD"\ }],\ - ["npm:20.2.9", {\ - "packageLocation": "./.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip/node_modules/yargs-parser/",\ + ["npm:21.1.1", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-9dc2c217ea.zip/node_modules/yargs-parser/",\ "packageDependencies": [\ - ["yargs-parser", "npm:20.2.9"]\ + ["yargs-parser", "npm:21.1.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -20613,13 +20533,6 @@ const RAW_RUNTIME_STATE = }]\ ]],\ ["yn", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip/node_modules/yn/",\ - "packageDependencies": [\ - ["yn", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ ["npm:3.1.1", {\ "packageLocation": "./.yarn/cache/yn-npm-3.1.1-8ad4259784-2c487b0e14.zip/node_modules/yn/",\ "packageDependencies": [\ diff --git a/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip b/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1aaa42075b.zip deleted file mode 100644 index 68c5ce6ebc705dc7ef7b9102be1d376d592847f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56381 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≠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 diff --git a/.yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip b/.yarn/cache/ansi-colors-npm-4.1.3-8ffd0ae6c7-43d6e2fc7b.zip new file mode 100644 index 0000000000000000000000000000000000000000..c2d78bcf9fdcbb926779901c3caa9af1ef668fa6 GIT binary patch literal 10383 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 HN`d?r$3@|? literal 0 HcmV?d00001 diff --git a/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip b/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip new file mode 100644 index 0000000000000000000000000000000000000000..b21d3e7999a7c2d00ed9abeeee6008b557f0c408 GIT binary patch literal 31342 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
Bf)(@~eN|K~&ZFp?hh4vEwV+tCh>U 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip b/.yarn/cache/cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip new file mode 100644 index 0000000000000000000000000000000000000000..8701b645075e44b1c7bc87466d2789944c312eaa GIT binary patch literal 12504 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip b/.yarn/cache/debug-npm-4.3.3-710fd4cc7f-723a9570dc.zip deleted file mode 100644 index 552e1832cac97e32aa23d040024c1ecc17a143e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15650 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 diff --git a/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip b/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip new file mode 100644 index 0000000000000000000000000000000000000000..5bce5f628798e30290061d2dfcd1e7216d6311bb GIT binary patch literal 15951 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 &Go`I;t+4M{BaD0WLl{qRc=-FKkXGM%JV|x z;0EJ(kjv|-Ahw0C4T3DHsa_jxCi9|$ARvjeaWB;r@dGj0C?;BQj3QBt~DMsg~lNu5=rtpqTRrpp0xpZupk zYcPMZibJNPKhHjkK8tET%l=1b+7WZ4J#*~a$__Ttk?y6Z!>jQ1-P2pWm!sEg7nf}q zw(2er`8FS$`%#Y@27WkppTVr>;Ph;~`y$e%SUHT)ULO@~jn>aVMSc%u*i^pnxA?CD zWm>LQQ(=(C^>3JG3Vb9zYPBGW@k0rYA~jC7U+o7a+Kim=HV#IJcNcy`wKuh|1jT&k zWf+a&Em~WKS2!OsiYvsR8+*$*5)#Gjb+j)Q(H0Sv*MpQ?fk3Yfi@3>IURf_44}66F ze1%9H6_7NQ5+9`0>07dr~BS3a@QOfM`Q%gXrr#G;R zg!oiZYDER%Qv0DO3C)9(liEeEltN?+mbcsdm^HD<%lv)W_aJxjiP7NC+{g3UmuOk4 zAP76eR0v+mZMf52CpCAp9UBs# z^T*U;jnbuyd~%5;YQG#-ZM(F>=D$^=_~0u09~KbL4zbyF*8gI9#(Yp~Bk^(Es*muC z{4G80j}>uT0X)E%5bt7*-L3!BPJZq6@PKRHf3E=Vgyn{^un#uys)i$;_zCQfqkF#{ zd2k{YBE*SprO%kii8xFl9Rr!7Q%KWBrg4U0T5cRrj9W-^nPy;Gb!7V}2{;p(5vg)rx?#=>3p-tHcgK6^k+KIDQdW#0Jlc>Zu& zmQCive>PiAc$@0+#P$B5?kyF{Cs)7o9{u|{)$-|$G8kB)XRz!JvjCdwX*l)wVlb6= zya{cIcRM0}NZO34(*|dW_L4FV`T=#(nH@rK(U6O1Y>fBZ?)stDrd&zC$}Nf4PHp$h zFu)wkP_`tO@5{-Ug~YOkHAlFaYG}J?)0V=rpM#Uq_S~dC>T%Nvw7ujAxHk5i2*Yh$ z_mO?B$6zXwCP4XbfDHpaY?q%H=yf->2Zpq#iFBt`hPyBL68j2dP_NwdJec14CBZ#9 zQroZqpuao0SNG&L%SVl@C4nXz!&>#d#~gm~B7J2TBjro~07|L7c8oofvzypP&lq?} z7v-{&+}4GBCAf}%qw{BvIn^*{?B)=KP-BauH1X@zZI5;> z8@>+iO#_y|lNDhhpKS3uf0O&%=lbpiC3dsrvw_cN>p=JWEX(3I@N7-%iJsnLEPvJy z`oY1_@yOn~&?|X?r%vCmE2OT6t>>v)n@ZmprrCEycq8{UUhe&xcKn`C(t9_a)|b=z z@6FR>4&1El2Zfhr@TqqDY0rwv``oJi2D@(`;VhSJx9)StO29H5C)UZ$N6XmA8GZC` zT>VGzW0J)E-q%G^JnW^#ox2JP&rSR%tOBo9`~-n5T{wZ9fp9cnvH;g(UeRC?Ssm@c zs643Xz5cqE-NT|~Uf^m%Ryz4y+fRH2X+R);;C~j`{;4Yb&$tx)>+mHjtH{~hh`Jz@Vwdq(?5 zw10Jo{T=M@-B$kwJNt9@{vox$F8`^g{vGS@#n^vip%eU9tp9Im_U~YSFK_)D42k%^ bg8jc@mx44X*k9gIe_l&}YQx6de|`Et4p_7G literal 0 HcmV?d00001 diff --git a/.yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip b/.yarn/cache/diff-npm-3.5.0-a321a0df19-cfbc2df98d.zip deleted file mode 100644 index e100ef7e9aa13b71af2e794eaa1408c2ded12031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206407 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≫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
9hW6-L^{(D= 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%0AV8=d-1=4rakBoQD^IC5_kY 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�p@eE{pHqrY7P9G#RPCr) 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 be@{2>Dd7Pkbs)}6pakGSC6N};Ezth~t*W-= diff --git a/.yarn/cache/diff-npm-5.0.0-ad6900db18-4a179a75b1.zip b/.yarn/cache/diff-npm-5.0.0-ad6900db18-4a179a75b1.zip deleted file mode 100644 index 6d4ec2e4cea7ea2965f80c3d6f074962b56d49fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124199 zcmbTdRZty3*DZ*n+CZr%T% zs_BRBuIjz|ZLQwjd$pP(EF2!x|7ha1%Siuo^1nLt|BOz~7M8}2&K3X%OLsQ4|1uQk ze-E{=wX*tO@i0(G|8wgo8{b`SSSTnO1Slxt|6{z8yri^>hIGphMdy89tlo2Nw5Mi< zpL~Xek*zU*o2AyJEY%f%+`g8}d3>*?C85cq`s|ftl*x4r$@guL%^d}2COu*03zhxh z?8)y&xZ7!_c*NV;|B;??oWsm?aXOq8DXa9rcXRsm1fmq%guE+a1f9}zNmRT!uk{~0 zmwk~A5{=ChVD%M(Bv~GK|5`lnx2@Yup&-zudob~LIf9VI<`w23@KeM31>e{RKcn*G zUR|y}3Z`x3RJgOb)H^*02UNbFgREq!cMStw#jBYxS;^EkTx5(s5z)QV_*NifszqHF z=ky+1W+SHiEAW>}UJuTqWrxKhOwjTgHOdZ(;}xU}^V^&MEVh%!J#qbia8HL--$y;e zfCabElG_T)pp60D2o~&Xg{Hi;01P>dSqzNK*Q;LEwtdykgwZg^5gGYeR*D(!furlxD2x8^?JjK6%F7p8 zxgNyV7VMu2J73M$OU?Mv%20nW$yj1kvsSiRJPIO`LGfs-HLz&tlzQijf370M#pC~kVBlwrS8L6aVdKg7 z@x$Z|aF0xCH69RG;p6{x#M^&Ful0(orIHP;vDBlhOZmwi6%#;4A|khST)(d7KZ*{z z=SZ{(ks3t-7)E&86n4%d@fd15D4&OpFehkuD$SD`;HNYMPuB~DX4Xt#@zo;fN}$wX z@T$hZwZi<^YLI(tA<|}BJ35*VH8VKT^%X*6hEbGueNMaWVBUxB1_Q z&5^&WEchSDvhsh({r`b9b#ZajaD7(&cnn4h@?0 z$pk~uGGruLBw{B}-FACHz#<7w72&SQtNJZ(mQ05@$(^bNqu1Sfc`?TC?2X4ofW+I; z`{9YnzDvf}!@Z?*KolR-_HUyg|Hm_@hXa9sejvYxllhKO6|_fulVmYk$QI(|VGf0x$$9*@@(>W1dPPj18)*Oy~i7NVBPIU2Ct>^wuL zAqg?oXnyX5E1N4-xYxz(n2LVzd;SyE-Olzwhj~4LK@tf@z<{K$%uld?S$kZ&^$uz- zY#Lx*F(G751d3rG2A_l{!Kj&J%WdOoYO(f2jiATj4UjW%ay-Vsf&%1De@A$qk!}>5 zzhwnM4wXG$5{C840)CRSUE{`BLSphip$Cn+gfAZ{A5LZyvc!y+eY!o&ike&+j0CoP ztVF-Zt=a=IR(A2hQ zKxhkbDJxRCFES1Ud1A`qeRN8<+1NKmcHHI&SIIxjyC7kk9h7xIz8Rnzt#qU$6l990 zc!x_vRI*(XdcE}t$M9E*z~@cU*Lq%ya`#EKBL948VhaeC>>QCSwsQI9ovuU8v~9)t z&!T0;>S&8s!>ER!s);Xpo$aV!w8^l#)YR&HP)Z0lbRIea;@=U!1^glkM<0!TP&d1# zZN}~Hn$#gvS)ZBV>Z;USxGiYc zO%%0#g5RZE7MrQg60Q3I)A!~!Ei-PW znmIZI3lb6#PXT$Q!=?$ll1*HZ&YH`A`zN|zxVI0Mdvr#rot5*+^2%bS7I;^}>@CG& z`Q=^3S`2fs*_CPE5fR!O^sP`)BP!|B2JsJA-RJ(e>OlKFg@3SRkz=oi>Q}fjS)^co zPv{u$-2f5?T^}iqlrZTQ7K*GVl1t3)vE%zN$?i!wn&5Bxg4+XBVOq62+;6-5Unj&- z#NJRMte#ZbQ&5Jd>S8;jclOrVi4!QWHbmU{{~&r82ZCAY=K9-V;F>7So!;9~UX3Tx zM-M@mxSPiXg(QUHV#QC7EYzkeb&gea5#nzjkGUxohBFT@Xs%t?s+ z=SwKC1d8~qg$BV%Cm6(D96_*y+Hcxl=lhiIs?f2TVRu$H-L+sM2jGo3X5}f=(_GNj zy==w!E9s(`g)|K$O#n&Hqob*9qDWo=-dA;)vKViPcPofXmXyU+B4qcki3HN7;Ts9x zzF}_5a%54!YfCi1nj4?ltk(KhuG8`CYlD}i6$brNZR__yzo^^*Ph9dY(ChQas}1rE;UA_`?(3rWi$4zM{n3vwtw! zbpS0)9&3dy|)RJm5nsZXKBv`>2g`KjC+dmwb9Q}o0 zvsj2$=NP&XdkR)2ZoaSX=1)F_cR)U;!>*kus9>b*>Lfbq6*)^6IXsNw2_qh!l%^AU ziP(e!(x$q+ID<9JB_sgL19`;9U9oS{mBaUwwCqmgb5q1 z+y^$3U?|!#&|21Jh%dN5@((fyS+%eE$hdqBp{p39m8zj8R#_0j5kGu@yB8Y`tRz<; zWlmRP=VOR-)6QN3?g4(+`67FCcmj&8Eqh)X1uxpT`<>w)vN@)6 zdEDLTrU6z~+!OjC|CoMuEwIGr>1Y!$IZ7R3JjFn_Y9Cvi^U4jv#{%93% zlVQ(pOB(6F9Nb2)=_%%UOPiG1`figZe*}Bpe#3oneN~eMs7K%q;;JMuY|~q95)MJ& z3}r?2TXuH|_OkC&CI_JNukw!#k~wJdSbr;%zK^Ay`*~Vh6S5xb$Oju(B>~q6&s}iI z-ty{lxsW|nkir%!LZmUHEaGC_KSJJoMQ-FLFky&OD)VCBIUv;dLPfau(WcHywT_NB ze0f4=gIin0{DyUd$*a?K2;~FBvv-)ICu8wJ5LT_}=O4k``GLE#iuNY6baf5$8-5vk zr&v;Ob3NEI zsBudf=@XeIzVg!TzQ(Fi$g{LDBoVApcTPohG5)r&)QurTGG7-ilDV(qBhm$uS}Tdr zV&k2Ft{J}Ye>dFGy&^#$?vhM?!Ja_rEW60AVB`)(RRP&8@HIy}=lPuV$ zWtL6W$GO>~CU4Js(Gt0@f6FOklPqh&!0%D-=YeHFoVK+$U4f_Yg5 zAFQhu3!z`Jv^zJj!srkduti0zuG)DVc6h}`@}3Tz5PQkKqN4lPHq=02(#~^@FVOiu zHIFo&_oWDolYGM*!dwjRBe~sx*0brF$@d0A6YEV;pOz{LhX%;=`%4NV3I@mUToUYMLVMxTQBzQ}%OP@%J47K(>7&-?Z#C zlh}?hFZnDD?L~aA)7Eji3Y&&&1Jo@3!5mFqG%(W)Uga=4w|Q~XwJmD2Pr)-6=~8Er z)kMr*Z`f+oqVh5>N_?Jhf#Wz&YL9m^TT52{%C?FNH2)%Ox?+0b8;9tXY^y(W$ww$O z7#r>Q;?hQJ_N~E2o4(~G4b>x=>yTd!u6T)mmUGojy#kkrKrD$RqwT}D-@WaBu9NGqjK__p$v4c&YQg56 zV`26RIZZ5cy!?Tako?KB?ybzLw;$U!Y%D~)jL)_5uUAmK{{r*k`#44$=xP?6=lvDw zSG6t+vq-8&;0OUxFTr((=>+>w&wS@Q87LSqV#7hL%C~UC7&-KqNr%R$+DWah0*?oP-$o&(&IwL>KgZw}IkMhxJJ2Iw256`M4HZEoqUkcM=# zS3r>r%MD*N+?WP^8!+W@)CX0_z zGCJji509-YH;2kd6gys^EC)vNV*7)3;acx2X3K*NPgPURx7ui7S)WoyH$cZ^FRizcx?JRe>l z-Tf8$OV*;H7-NUt#O(53wxyW;rF3;UZ0%36`+{|a@vy_}A^s^x@?k+fuc4GEPzFuH zk}RdBOHDxEYpF0JAAUC7yc9V`>WT(=$ui(v#IRQKoLA%aXHKbq>!_QG?FAK;k09UU zJo#Zf=aLSQ^X=Mxx4XLm(|im4bLwmmM8Rj_3c6Rl4JRm(tINRHF#5UM!J3>x2;Wt1 zM_~x;S40g6^OphKWrX0blbtC_dpU)lF*PYc;9u0A0s7B?9RE^SjuZ>RR~&&NC2qfP zk4-3Et|T_~rg}2y)5g3u1+{BAN_F=EmUU}I?ufryXVDx1>8C#y0n)lvIk%J=iiuL|<$8l7Q1{#bAJT>?J(SgzNDE(RsuteAH-_Rs{uWENHcI}cIzEaU! zWjoE>V?2-}%CdTSLpBb$28Y1M&zSu;Q9YQ_!3y&HK- ztxvv2OlBh-+lBN+3~A>amj-AbSP=qNy(6k5M3!67yNhbCd~*qNE@Ume80|k5=7oOi zB|I$Gl`NA})YzARdI))08_=h|?y9YcFVe8Bi~qh|V{c(S`rb|0LGi{`t~^0%8tEWp z{BQr|U}4s+<>oXzHe^H0nu~Nr*4uYe+f{{*F}GKlRbQ+h%qW$ zF%<(!it&{eJ8v{m5i5WCeDLD5^sM8y1k`Prib-FTx%tT-Syx`a;pSbzYsvl%bm0eo zpUOSqAm0`Gj;SQOxMkv1y`UHEpbcXTL?*5x+qMxqY*h@cn_Dma)paEoRmMpMJskg<`9%2$J0A!nY};M^7TzjdtDv?Q$rq#6-4luMM44>_ z@$0I3?d8jz;!3f!vYjBjXwKImk&v3YH_#(IZ;tLu)k*DZnHlI=4S;H={1_?uM@=BK z1-du+nCo7f`5gK20gKpv-v?w7hxm?jaX>`<$e)vU?z=(hBYy0EDU`F^lX6>Rg*Z(6D0o9*jh5bHi2lbG? zZzX2#y|gFp+q8F8hpGDk67z?0_LVJ~-+a3oFLXOt8OSEn@w+!&d%fCKtw|hDWpnGM z+qL7sduC!-Zv-N9mi|85!8Q|Gw&>cctXQVXUrO59>=)%6Myef@p1 zMRW4Dgs0)8gd#}f^KYrorQH>Z69iDg_FjN=ftf65C-a|qum0DgHcOGDT6I4I`e^SJ zTBAnLpYVn+#>{14qaw~x^JVyl`HQwi#kN$DoOa`45vjRpTu@2z@%E5A@&4U+qt)}R zi2y*fc?a$NoHeBb62uY`fBVfN=1u6Ab-aDOs;|83Z2WnHZ`hgiYMmtIFb9Tt9O-q& z_%j2$+VO|O?d8zHGmNO@%f1iP(h*z+vpf4)8lHiBGv7sb^G_#0mu4Bk$_ z1R-AY12HSLC;t_;yB=NMo?cfCXK^t}@oef2b~F1cVv-7&pB}`GBlWiNy^iy(y?$|% z>Bs18QQ66{F|5*Ld5+lFb6#1RSgyFL^?mqo?M~c2C-uc1fwSy#p56hEbo5_WYDenH zllu8M>UKeALmpSIFh|??M)3XpHgy6y5l8T^BZ1v#0kgsEJac0GT{+jWlWNCnKDQG`@2gHjhU`%zt<0M)Wna1 zA&*zB8gS&s@xLj1%2#jVK%0aTvNJllOgfA144bhMf&5^#sW1%fncmFE>%|zo7GcjF zzs9t%>z*5t%?^&1h-;)R^=0N$$ghot+Skaxe$4jfpQan7*9!{``gu@}`NvvfQGP}- z7UfqkeQEr#u7>5CNNAq57=54fOQSgwmTi&1M{`;?m$?2ocdTSN(1$M8-J3k_y{uSaY+MU|q z`{jf*I!+u??>U%he~e;(!^B_3LB8$9HcH(v6QE5>S#T|Pjx>vc_rxxSddw`IeqO^^ z#KRYKU%G6ODI27GpBJe8ep6m{Jm3=vV0Jzg{Q1y;eN4ainCj)XV!hSQrIAah?o*>w z)9B-@RF@salYhUvUek9}W6a!797W%Z{7P(&c8MMT#fhpQ>Vr5>sN(xZI|l*5GwWDE z(;Gsr{}tKS{SaYk{Uy zw&?>6m&QR@!ZqVEVMluTh@I<%z|AYk@DacSTOvZ8*KlBRTrc`heUwecXYmhKBGihN zhMF`{c9|&`p%a5o1P*VsTjd7qPjqvG5OjDt(k4Up?2hajV<2o-{52RR=U&T`-`O@^ zEMf(YyXx1mrCAkCX~_)LZ~hozswdSRdym{^BM)rjOrYZ2KT{;v`EZ>uYqf}u2c76H z-@`FX`n7MUuWQD2b|r3O@7a-o`Lkcp1#OK;4o2rAQw<6W9!i#K#&l0P`q3VcZp(XJ zOR@IZ+tOJR-Y?)BpToFBNQR`wyp}CI7ErF@M@@3IECRWgz|vpr+kYGnoB!aTn4#Xx zd`mK3%$TlP#c`mTN*{<8G#ohv|Z<%dtV{rn{MC+>jXWD;G0L zJYd4dmwqR*p!sg`nMD+xbsFoB`MaJIzsl_sO5PTQn7zku*8?xWuZwlKaX0WS%x8Zi z8Yu1yZbF``^I2V>T^*!&$Yz+Rt_nR_tIv1LuarL&&QJre&cE$?xgfOiBKS~wX_Zne z6?ss&px7g9#eK0wj^Ni>Zt~KQ`tAB5&=DAC$^1fNtT}_gsoo!GW|IY)JnXvEgVj~n| zj;7Nh_#Eiw-z&)WA5S(FMzTjP7+rW=F*HFc=d4fer~!Wc9QG0|Sj$i?^SpV-8h32- zccUB$_M^WrlP29Je@;)F6SQtjtBe?5p z0DH0CYx25J&BXxvjBH7CAiCLejK__8*Uc0`+&CUJzC3FIf)dLi!OR!2XaN{PHLr>u zyde@U54WD{x%vEsWS?KN&SJEW!=4)#N(m#Sz9}ujnEp)9wkLDjfF+Wn!M5y+KgV=K z&nBWUz>rs-KJT9kggL;Gpl8rCs7-<8Im2@GyMe}xI4E7V;myPGtL1(+gCWSQd)W}t zm%FT2tTrPWPtk~9J77STU|;6g7ZGqH-N_rtzgM)aZEy-pJ@--W@wc@*q}S4fCo@|bLvf@KVlNB<9eGX!@eAv zgrYHzxaE?uSkKu0gc;OPVKceUD^d5KDcHm0{qC=yaOD9%wju&3%LfTsdYeao`=U9x zG;e<~r_N6@F7`hpN(lbchi_tDZ%Ckdl?SD46!nV^_b-pOBNiV(J$_ml{3HI*AF_CK zV|~H4ui&{X>LC=U{h?!8Ep`RlL4h{vvi!*pY6xr$UlOm-AO2uu@v`S0lb*<*D$xTe zZvOkEZeJol@|tNuTPCo|hfty|vGZO~_5~^tT$!?A`W-uX!ui=IUib4s-|I}qG=0{W z!S#6f!~)jJ^&(#>&mIfb+6FsPQr-X!BK#OOTTpx7F<#%ijg^L)g&*>DfTjK{Ed_ik zm-=VpzLhy&^}g7@x+-GyndohCCMVm(EkbTxC!UwGZFtOT7b8A4JBzu*esT zH?3N{^G|d$bTa(dmWxK;0YxGjUU^h-aw z+am**PbT#N%hQ=#8q6q-;o6_*|8=F4^uMe<{vX^3>@&;$UT{!Q@BgtpQ2+NpQ#Uu$ z|53Ay`|0Rh#E%8ZHx6-|uQYtb`JS_>SasHXfUmHM0|Td0h7y*-&yhHs_+9JcnlF>r zw#Cs|tnfD0I{!GULHUi#G>ft*7sY~@o`IlGxoP%NhRZrFC7H_Jh=*kR9|@u^(-11o zei!%Z9ygP!OM~)!Y##FTo8OdE3VT_*58b;1(!flaKrdb+_h{VcLe+?d9TQE=a2xld zBAo%M>~ZFfHUx^-Bq$?M4J)MgBSwWRve50g%=tnD?2_Pbv!~Zi?;0U-kM}tyAC2g} zd(15)Zx1eBwbTARy|Ccrvz2-yMa_K2KPHC*98D>FthmvTb4@R6fXcr))v(kX{ev8I z|4duVGuT<}GcK8+J+L47fy#zRupjxEGuox|>96L4_2~2nq%WgHKb_tesTSkkl~iF; z6Ye5EAqF0@U{FI?L~j<)2*`A5%a$!p?gp z_)8wey(*K#GBj(DPwVr2UDa74&>(mBM_PABCpgcjwmPL}SsQ$^!D=|Z#dOZ{V@$d> z?I!QMME{AmcV9Z2n=#C0ap~`+(Vwpxf3HvkRA1D4_{bN=s8KX{7itJQ;9R6>Eb*it zVywRlKWW*RX@mT4)N0B}%zd#9W}|`FWgqPz;QhuI+D(7_e*#Y-$V0G4iI( zf|3Ft-JT`blIDOzg$p(9^NZ@x-`&#cNP4(;0kgdnqOLTg%Qsb~A$gW=md2xJ!a507 zmVZK*(3>(t@@xmO?qKq*_1XXs_swg4E2skbXzb@H9pKzjQskOk2Krn2G11>)=JE!4 zj*yK3s&K zQ-YzIMxtOb_VZrytvboKCW!kdes8Tkb<{d*&UfW+j8h14>Fo!?o(13(5ayZvhu66>3`kgi3#PQW`=nK0i9SkBsPtb95!fvQiW}W2t*}>S zmaW<9{ob=l(Fe`l^=RIUV1R&@O$F@LY>((DXH#?#O1IDsC0Vo3YJKlyj|$c)H`XJ0 zbQ#_-!ix&=?Jh-;yXMb`cM;|uoy{-z`qfDkuE&C!VBKJwB)@yjJigj9Kt0>`LR&uP z)qH(w&kJ6&5%ZwU(D%`af-O@wE?Aa^XVg~8$JQu&?}`e2UlnUYnJ1)aOYEGbUXVl* ztJY^~j{L`rvl8(QYx;y#$?gysZ)6jL#(IN@})fHaFq_lG+SFc5% z&17ntFq2}%ES_4d{Hh%yU|lIxf%sjA)?X-b1(>jId-l4|gij_wX&D`XkYV?j*{Bi1 zEgx^)T(l&~QmM*ktit+>fH9$G?nI8_1R`lZ*lC)66g<*KS~sBrZ?8O|m_9o6|5oAe zXM;`idy3%cpXt-w&cn?TZiqi_)tTP_Gy}ITHg>ZL&-!$}1;hSG|#At-jp{u%Dz{ z%c-rbLbY@o`mTlUqn@2G!QxQpzRO2KFcXxGIFDzI#-S{bg(OEQrx*w({9iq!P6$8X zA#^{+N$|)>0}Vn!-D$Dc7);&W?`a`Eh6w+{wDG87SR}j9dnVpO2jJi+w1PUqe0Wh? zjgX7ZT5EZMn^XRnGC*TPsTx7OuCspk(w4?aOp-c^_lC_{nJ0-={9c$^yBg_P?|-#x zr|hY?<#ENlawWgh2@q*b|0Jul_AWe@HCwgMyBu~y{c6+fL)C$Xf8_aH5K%q4@3m$f z7w4ErjOdrzJ-(k6yyy|DJ|{Bh$bO9SE5!3~=N78&Ei#RNvonN1kVWfPE3GT9G!sZzxJ1IceSE$+-9VqQ-nhRyZ6_PW)H33 z6@zxzUZdbYI~|9zrOzJpX=h?&Wb1K$MSb?=HSh-;=9(n>l+DvAl?F~b% z;%{&UX|h{Xs+6oYLhS%Jf54a4dczF;eAu;}^--S9sm0Nh*E=S6x0UOrT7} zC(m#ZyYbk-ZbAbtPpkr*wGOG{6gs+Gr~jPHklvZcaMK}tPnuM! z>xswnb6FR2K~ER37y+MWyp0!h9yH!;F=|O^-?OwsFt5yJb%(!czcm`xjmp&C>^+Ph z1TTMDzwwjswhU|!PZ%f==_QINfs zcdcR92)kU}9)Pjm#6rFLh5ZJ%I!*DTA=KX%XQ)OEjyDj?=szukMpyg{_8^k|J_$d(cbJCc1%way#UV$?g0|Nhl%hLa2 z?zF&`@3Cftf|~S(g8KU3r&DI8?w0?_rfLlQQr2WzKZ8W!$7?zp_>5%P^M}kwyDW+F zVPmo7U^)!+VQj_2#Nqm(n)tRq@@3l=S-3rUSAPni{SceE_o86AUDzJ5IIbysE61Aw z-SU3x2VGt{iy8U@Rc|JFb1!>?f?Qqs0+6h_K!GllwPC93-nb54WrY2%xXxbVRrBEg z7=jWX%z`N4w}FfwZ-0OKKKu>1scl}r3X9n`?ge5=iUnaRdcWC#KQiVc=as#KFk?PF zWTfk#LL%Nid|OfXdE)$T8y~K>*;sF8K{<}yF z-(SDRzkhM*$p{#$)P~!V1)haVS^OMoWI8kEG=SYaCgPc6i%38C-=1c*#Ai-eZ{M0pXMLMG2 z-LhE+GSMYuj$S4$evD&r%{-2?&;S2=}gz7s8Kle!po*2iS@3;Ls^ z8s@Jby>zU$vT*?hhn?yp#!n4RkL!Mf4CD*bY#N}AYaze8fGok!YK+z(?X8B|Eu5~8 zZ_85%Dq$Aj@gk0b5=PUTGJYTJS3li(&KPaddWoAVuaa3~oigLCBCSa1=RBG4+e*A% z45Jhk>sw#MCL;Lc`7gh)y+v-dph*?nl9FMH`&)nH_Pe${T6O7l>kXe1CQr?d5W;&J zrQxxEcURujA^yx>h2EMh2`Wy8qQZXrea@UYr5@bYirF05rGZ?ZJBAUs?uTu3vm7X2 z>E-t)OYG(Bc#4T;idq%ZwOyeJ0Q7pJK#N$71Vh5ys$r9gt{zkNHKWFY|DYb0V>?O|2&3l18&qLT{i)S zg8v%6asso*r~B!vsX!202Begz-|qubN0|=}$RC33_Bucbv5cnFQ z(bDcP?tafWp3)C`2teEWUQg8aqPj#Lguhj;h)kD5gOynqg`CblmtKsu+x31A!dvFX z4xk?kPTDSs$w#gZm>pQzp}RRv^W6FVG#6&S*F2@ZJDz+GO4C)99Ug(OGSY8SRr1`kh*M(?EB1k4$lW;tbZ9#)Mq4Bn zher&)I06Ml=qTMtEInKh!U9-wdma8j2?xpO6Z>0|QhD?=13zlTd<2q?D7=2uJd>w3 z_LYPz-iIUXrI16g#1Yke2`4~D#d%3MAw+Mz%m?{JdKzG?Ds#9N?){XBc7Nk-{&H8)ees?=mcJX|zmFYB7&8ozvP3>+&XS^Fyd9c}3xt%XtA)2`UQ{5(7kwfLLd zzPohG)Wj`k#)FP1y)N{-fc}2W*TUIV5@WpLNqQw=#|yeL;*!DhSuNq2HA$|bjQxxT>!x4gJv4p;aI z3+XHm`W%#_9EH1TN{|-(tluPKztyl1BqOUyDMML|!h-Wumg+t;476=$8Im<}JmC^6 z#oT_qG53pH2L3ugzqw@!tGt*<8=wqYByIM1bALW8*`l+gR&+kfE+Hg54!L7%$mbQu zA89HrU)G)hyL`^~HcFN{z`D$t}Bm=^DU{0nX!9tt(V3-k%fADv)WC0;6eeJohbzJ3TxVh*O!LjCvFw8?7-2!`k#S zs^fs%$g*Or$v{*UmDAcx6O|hZ_2)}tKt{68dzxAT?1YMNTPJ4Qczi;$ryAbuFO$7T zYERg`$M7FfZpUb(ZbsaZ%j-@Jf0qr$kj1WK4e=WOtc1*v)konQcGDO*{uNh#YGdc@ z!#@hKVL^~@50@TB@py;Hn|6WUL}va+7;+5M!Y?yL@IK>$5+CmGu=^M3Sv7s%_eG(E zYk`I6QS;$t1csmZ#5>4H>&H0&cdA_^#pFL87D?WiL?7`abAhzhAoXQD_4j#H!THcd zFG3npXM*k_UJT~tzCnebC^ZNHzclOdkF!=e?bYPhTGD!S?CJ;1VGRC3li!P13*ack zgI2P99tOs8P)LRiE_z+Mq?XHDoC|qJQkzwlxZ}Ja(5r%Ur~XehHS{0ov;96`N|%%W zR01T0Ec{;&xxeIk6Bs1j?hqvac>_9%j;`Gv5yC_;4g2N%qJ44C~$UJ zo0xNS4_p1(M2czes+jWKfvUgd>)-0PH$Oiv{g^od1MeC60gPAe_Xh%?w#Tr0< zX~vW7kA{LZ%p6-G|EBBwoo&lcZUI9!kx@ecQ{Hg3*<}xajSLfW*JEj=W8cV|koM1N ztd`S?%G&vvt*@=Ffe;z?k2nUBs zx#q-|a3lYDrJ*?SzKnk>rO4_NsIIL(B$OuB#<^32}2uCoHxtO+OWOYI}DCa{{pWnk5HD>G+c~rO>f3N z3I1g%QYH&NmRspF^_6$WC|(~6c0C-f)`Z`_>o3^9xng*chLGySRSF5m@3?alQ3&1G z0?q>gJI^gnJ;vlZ%WPgUMRtNYq^`h0&>P<-LLdbW?vhyWsQ$MDPcY;)2^M5wb|M*MBdL{f1dBxS)4UD;d*EPu(smKt9P{ zCWvNRfDzZ@VJbp~ds}8mPoiut?k-cdj~?3tO``N%jYbh=bueoIsWrU<ib5LWxCg)#)3@p3emzPa1eb>!iDZeNy@`YL&+k&4tyazHAL8a`UaIfoZkw7} z80mFP&j8zML;QE1&POECjPB##4_vzd6D8bJiC2?Y5jli!Y(=u~?L5gK*FL{%#NB@~ zTai4;{Vb=$rWARHoDILG)DfN%4?&JQom}%Vw!HcQ$1g7g;+yPpVz$VN3s|x#_3`?eXVq-Bn6^>oW%yO{WtwjTw|ddexd|_J-+X) z9?qelK+%OxyS%94}GPv4$RvL85lEMN+7IS^dFm()m{$G>mn zW;O3R7(RK`yO*ZiM4n2E*+p?UU|P7xMfNj1`aH0V2=-}oFXP_v=+;^w1{7(~vx$_P<-3%(mf#$t_=q0scBJ)-|ZU@fr0fzk;C@v4eaSLjHy% z?sFT)3sm&WhJV}5UYWP)B7_>z)A%Or?DHSN73@$y4w}3~T&0j6v;yxzhL8~}%~e!qf_-nEW<3tq zyUvsPWh~b92>pWRsD~PRA1gAWas%!fwv(4xbxidYVYIgIY~2lGeDdh6KY7m?V72-h zkbXRVK;&o3Nsi#}^>166jAx0T#jK6KPQI7Sc9JY|Jl!$9g2BR?;071L2?^ zl-?%72!70H`mx?ch-&d{8oyGz7X4c_A~B?os0;S_iD582tFN*%f-Q>@HxI)cXL6-& z<*Mwf*li7jzWASkwzL5_%PM-+2A5;pcfcpP9=ZNMSH^K#8uD*^vV$Gc%CDqX+s2-O zxULUwg@?GFh8HoSiTlZP?`D(sQ`$i(l=qE)yv z&QjgutJycIF%4&S^)RB?n4`ALf1Yj4lwdk$nWNv<`_~*Q!5rYF3xkziGzZuQj3eri z_R!^|o9)&`*mGZTb9j~<2@6|+jA_C5)q{6O`^JxJ;11+i^o1Tf@SaWPi3Kd{uy+C`uF!Ib9ZO0XM;V#k+_h#WE zf6?*p#iHxrd42^YR#}Rfd6FoO2lMXw53t-Hf7oV@=YGyK&)Df~)9UA7_GoRzqxmeB zs{?bdadd!BFM!3o=3xo?G}#3c#AmOOG+OMN+_JEO&$+e~sW-hgxI%0?O>fpPN+dY@ zzV3ED7HQj4Vo$9O^qKT*=;7d9(qzV{#+VcsPJphP1y~I_Of8Tl`|A%uO-Yvmz`ySp zjyrz~Q0=2EP@O$Cs{jT<^=do~Fw@12hgHu-D=E>R0O0=G5?;o7-2<1g(M*6=jeM8< zJ@yp!g@LdzIpNIGY{#KbU-;y|THa`Uau^PJ^ziFgf^j{t^*|j@~FSa=k#6 zom8U%iCCH7JRR@ExaezesddCuBYaA}O|`RMFVox7jb0-IoE6S^&Z$y$2M}=pMV=6E znj=1v93w7Ohq9232YY1H?e9`^!3Jc&OICq4aa{=tV$2*Z7+z%F`f?324+6)^7Sn3O z)g?6yqW}(xEfX}58N!Uv^7Gnz>QR2~IY6pr9s8Z}?hLhC-C@#%%$3NRB26z?%>9G# zaQ8MF$?EE*W2tiNU{z)KchsUIYg;r$in2KaYV z4W{BaOFkOX){nY*G5j7No@Buv%KHoKA|M}qx zo4cRgQL}U%zqRes(F?HuYcwFh_mT}Pr#EYD7Kr;YrjciU`f`m9w)VsY}gF|MXx@8ilL(+yne#+yqW z2?9d~@eZl(4A$Kp|6Y|d?eoC+?X{}6-Tu_>$cl@&CzHp`F2FjrS797UC`x&d*G~=P zpk0yGg!J?+F0qY*Ft0{v^$5xUK{u0N^047YLExKZs9QK&3-2o z?&{Ef-fsV|3Fq#D1Ur{S0qm;n zZ1$`6h&O{$C)pz=y#TP|kS=^Q6p6u4#3zH=Dui z%OSD(eXE+7`P;Igm(!1r;J}YVy0g{`k}cBK*J8}}5mE@Zza~Ao$O@9)X zyIT1PJiC{1`gMQ)_u&k;cC>gyxRs6YO=%{Abe=Y2*vOGWwA#bRqr*ZfGw4~0Tx3&> zv4L*(ADjB?x%#-mMPDDlp1>L>dMO-Qx8HlWPH=I4JtfpAya;g@u7dDuvl2DNt)^if zTIoVb24_kd^lNKF_szrEtz3gx8c?w&Y$Q+Y{ za-zFZ@48>PL1;NU1J#iar>&CU$t69f8L**uO$lb_8Ncnuj?Ah?PjZHNc~Ogg1#KW5}P%4il8sT2j~hi!47yl=L#sxjuc z|K!G{w4_fe9H2FvQ(WP>Y;{aXGnkeo#_ZR_qweAfq>4-)f4LQG&b zo|lQtkm2>lEtIEFJ{HNfZNr@B^l4)Z6*LJ4}+>oI=BxYIDNB%WErcH8M6j-{#MRD|T*eDR7Bp54bXZ2&Uh&(0&e4VPS-DmM~tCZoS z|GRY^pC>ouIx1}zJbgssjX@|Qc+1i)FhRG)O;tpRCO)^OpFG(6=EK|LrO3{~H z=I=*7KSsOxner_`AcSQ%f|F>w#G`VyW!eXM)f3SV0`U74eKv}DI*A55LP(dX`{_^3 zByrze*DuW5kKg`|8lml}ePTP5OjD7Nf|eU{8OleD!u~k-zBLpJe<^J2nlXJOYAG9 z6-(T>4o`^odW!lMjaDfQ)Y;5HKT-d^&tv`BkWn&+`dGf>?%jAOI|cX4s8sSnBg~fa z7{d0#t2L`nx7?|u+_kZL@42aC?Dc~*i#-4cvr2@ed)Rr3I~q9>lG(A0{&4quV+gS#~aqAZpUT~E9D<1~v5Pn(UEI-6S; zyh|cau~c?24_Fen?%crZjrWRJFR1eAgysYt6x8YAAmygWo^W?nYrAo|TsJ#(q{3u| zr(&N{Tqa>~l#%>hdG%)zSus7TVKT*V6n}rDXZ<+fDr-Qj1yiUoop|2t08c_!&Sm1j^_J;5YhV{=i z2C*sy@Lw%}u~ST4>>!eZmT!I2H$>9**A@DeOsKxSWpNq0_87T{7J6cW$eZo9QVCG@ zVMUoZU6<;RJzpjnoIM-t*bSVQd9Q!=$L?~vY{}QD{g)e^t|PB+*YC&L_Gkf{!S&`Q z^p4}A6i0KB-4Lkmpedc1?sCuN$u!tlfikM!h;YjUem4J|}LRsCSo?q6q zirl`EO?HC>*8am;Hv-wGy@zgMsJ`lVl^y=}g7*YsKuOO_zEwZPl?j&H4XQaER0$>* zBKw(8*vdq)#~5_u*{$of#IAPl;0fylEd7EeOwlN)E$8F-nu$Smm`yXr`CWidQ%)T9 zhCv)~_1jJ+l7Bii+TNa#ocFks3SG=ex?rikR%YzN*cw?ao_o7gAhpP_= z+^r!W6(op-V9D8?#{hS4S(E`GcYaBXf?BB*q7Xp#`ik+<=5k-y$utS37aQzlwQaR_ zTGju+5^;3yd^ZLn=XIq_x6$qhy=`4=BxW(%=Y=)G`T+p`AjK7Ydc5dpF&85_OpDqwx~@WaM^2z6943_XC<>(WJW2lnb@*#nP!sb05Kvj???}`8%})i@ ztJA>-zA-L|jKH=pbZ=v?r@H9Kp0+}wn%s%s_T2tKw;c(!;L5^W{c9xNIFif&5Awp6 zxJ5-=d=Y~3ZW{KTrQcQ(-}ggWV&KEo@G&8b+Zl9G#|-1j+ySR?rLTT^ir{MuAzP}S zzQ%T`O~EQcA^Lc#n$F5&6$q3KT#Mp;;&bCofr<9<59rr-#T)|6-XbOj*W#=NatVQL z0y@E~BNFNzn+-Tb&@8j|c-S1}MP{itYsNSPZ^NG1O~OxEFeqGl0k~C#RfGT7Vv(2a zG&P9PMIS9ii_Kf#;2+HTTESD;Nbi<-D3jf5aWt&qc-J5cEt(`Y1*!9(aX`4fmTW6g zqoxOM15;pd&R%kqlggO}L=zZXgYIDS3jPgwkRC6yh{O!)xZyv}euAF8r#-xg<_x#z zW{6Sf?qOZRc71vNaj{VSTU!o95Mm-8+`uf_ig(?EX|{GuXou>xXv;QewAE%jZP*mm zw2$ITX8ZkZC*5+pPd_y-NU+E1Cp@dAVx9WZBf93B-uRkAci!GsS)(&l#2GJRrMFJt zv9ZFe->_4~OV3;q3okzATXc}zqj)%fI_>R;p5zmO)71VLOwV33UDf}xtr6ikzuAJOuk@lLWkc@yGH>2LEww6 zzY>N^*LXK+GM=lHmTQ`)LdA0qP8N zxI|uuw(s#nvj<#wjoO$PO|f3_BULekhdefI(AakKCW3I?d+$0% z*$;5kjfQy&!Pfk%CA2UMp(Q4$=jdHF&;)4JMt@!4GwchU$Vn-VM7)^ zF2-N%&X%%7&>o9iO&9lQ`46Z04TACQNqhjOEj07%&p&uWC`|zpuZ0LJigUD5Y!AYw zD+gk{sjNC{8oU4eSx?Ch#H#74nX>!w>P6M=U11Cf?7Wr@7Ax!sd0VdXdxsyUTXZvi z|3~Gh;qA(!bEn$<+pwDPDh{OZa*((2y4M2J@Q}l#!-2S0dB~IujzcD}RStmge{DspTsa-*bYzOJCIi>~cdez)ur?lSrg}LXM7{-8wmg0G@TUPHR z)u2_$-EF5@-Yv0W%pJgLjQ6BA_1Wye^ik{7>dG0=5G%1c>oM?dn7i~RB*+3c?da_l z-Y4ZSZ>EJcTs3y4b^B4DNhx9GyZujBC=8BSZ?+4^$7*YoJ}*=}e~ZznHF}@z8BQ0o z&2a5Xx8DSC+!B6~=p_j(ZmrAu(y|)%+UL7)nqsNEN;6y5fj`^iuRRyl1Ibr16rP(y zX13VXl~YRbd*ygn6181DDOUmLE3}KlK||C`xQ|MhPVaH zGv*wjOQR((9Jfa1Nf&+`yQjY+YZFtYh9;8bsNtRDscRH{?dYg zaVufTy0HsP7r6W*-lQL{ReYCu3(5-bO%H3*>*3PkQN59y{q=P{gO6Yt0~9YqD*dX; zISIGoW8tAf&dE29E#UZl9->2a+(mc&UWv~=aQwn6mq^ux1b*R+d@&;IUEvvEOXT+( zTl=X+1((~|vuy@(&-~{{+2e#VyUS(}Wq@$8=yKMOB!9}s3?B*The%2*a(Y(>_W+;g zrtwYtY3;bc*z7R|&{wz|U8!TN-R}}CfJJ~<)=T$YF5D2W?;5b$};FOKH@JtR7qX+|mc)NXc zo{K0=3hiKLls*#ctX zE94U)AT`-2?$tacTaMh-KW4Esvx_9y3J?xQsHhSRO*O%?I#Jx| zvNbpjP6> zL>Q9ppK3}FAwN;>w@A~@A_eMNKFl51XSizmOjrkQ_#g}TW(cYpn z@mb>2z}H+?I96Nw*dV%Y&~o6|z1J1o2i&3RiF`L{`f7=L@-TbnQq<@KZ~E(iH&- zvJ(EKuI4txUom4v02{c2vbTGqSky;_@0#nt7-w?P{R_*IzzzWG`gV*dADgz6KM}G+WNQ!a8m_N1M@) zpiC2XS3S{zlDB7@TQA7}wWg|r%TFZy&p{gg&q2!i|F5Z`k|$I^ z`O9j!Xpa5ILq=pQ>&N`Bgw3k3h3G&RPrreDvp%5XG!t$&FjDbCypZQ0p)j+yfHcLV z!e@E-*Syb@eU?%3Sq2*CED|dp&g3p;raR5k2OhZ@p%3`EF?672KO3t14xuh&-FZ%n z`Sh**l8~%*f605_*;lm>O<5V&50^B%CDnC@UAEUZlolC%Be;;d!Bk;H+OTtxUzWw;N^+q+&+O|n+8xTU)4y+l&^#*nXYwi|g57U1iW(Y5`OznE!$?^n zwsp|_Y#9m82`o>0TNR>=JTbx4^hHzlq4p+cqH684lbILh-~fdGZbbr zbmQ(^(8=3AlIF?3I9k?mpjoDF^L)>K;o|6#HG4>^pWz@D?+&zclz!4$&uh^&G16_j z;A6kkCj(w9NlemNKiSyL@B%9q*S17~u74K8oy<--iyyw3n6_OI{ny|3NSfuDNQZ=! zsfUEb^56cx|D_l;bG0yW`%h1NUev~OMLQY##6FiMLDaUr^eUXWKcP}Ul-yaHIl1zW zh;+P^3_TVm%4z9~gr~O()soBgH$Hg8a zE|qnAzjhr_%d@@vogK#u; zbgaKGtedGGA_&U`5hG4ki>#&xuY*=odn_IFppo4fZ;g`X608q8nheQ<^-0?zl2h#< z7{|{GWkQuFV}-I=MNP~pzgbvQ(6_2nNHMmjwduTBKVR2j^CD~8J)}g{HL5`M_4Rcp zpPpDG0zn9lxqOV*s=EPod?-VD?zu6Q`-@umX7nJt9msHQ*9r&{gd3hGRvC4@bDC05o)xr`E9A?(BMADJ zf7w}Jk}|d1HXvRBHVse>V~`9|e;j4`Sdn!er6LYspk4pH$a5|V1}FdgM_Ayy^)O5{ zX~Ui1Lwx70>46#TrC$@AX4hyM9FD#o_-e{?hO1Q_uQybVTXj?fv3)6S>u)Z)R041F zgu52N$;glQk9K?8Ra(oyTOGHkfzigv0D9HH&UOrYNg;!*j;}(PxP`dn@IskTG;Qc; zc5MGdJX7N5?{Ye?$Wvm4LWBo-JHAYxMF#Q^v@f1BLA`^O{QPmeY$sZ_WIWI%r5;CJ zw_Djf+Mmi^MR08_@}*`@Csft2E|R}XQm^MhH~b5`<-+coVxkCF`0kPT(mQdsy(ZfK zW9<3#vA=r*UG<$#kJhJKPz{GU8_9%<_+l^HDjJcPELI+s7s{YA-~j7}|0lYDWV~bt z$@gn8TS+zDU^bg8vg%U|v~m*@zl51O5t{!I6~RTX9zeA+0wGSdPP%P57(YE?&e)}_r1V?#)Gw?y${2j3u_gAGwZKJ?xU({{+)rVZy-#T;aDL(op~ zV!eXtm%PU()OE>K(A&A~o$nS%dLD#yk_I;km{G;@IBn-BB zw~0s!78qsuR%F;_?v$s(VYhYbWA2-yO=mBnVe1C7>Cj2Sm2`(>5MNx^iyLQF5Kil$ ztL=@d&(51yj2OGO*r2*1GE^A})b~o0&uQdHcl-CgBC_%U9^y`6ua(J(&Uy|a-nkW^ z;v?ZVqAeh!z5`HeePx^rv%uqS+3>|+x(Y>1Lw?+m;_0R=+aoP%i6VgB@M#ivu~K~8FXU>SWGAw z6cmy2e&#D_>xytZX{aU9#b<>)=&-h|-VZqY4EA((35*Lj$5z;DlDa7;y8J0syoRHC!x;Dp*YrTD(habErB;*9XNzb#e`757qgl|IvJGybZ&kj+9ZIT>+b z6yEtv#uA~yk!+KgG%$K2FF?W7X{CV9!%r3Q0SaX6xijeRA1PDqdes9rXSg`D-(RT8 ze_^=^;6z~D!KMA5eW%5aZmP_$tBXWLBR=of+dUC2fUX}Z(2qVwQrP_-L0hd!C{V@N z@|`3q>P#jW=gMJMydCjgQJAcJc|v$y!|R92UaSyozlp6C%nl`(*p<>yNKcj)258w= z`Cla&#q*DQ`=}*Qk)(;N7t3dPx*U&8%#jfM__PbE{$dVq6&o%b~i<<3eP zBbAwYx5{XCldi7UGk!=%-hLx=x9#`Vt&jPVDf4l7aWnISr@se#UA3c0}S=O>PDUxR)AW=m*s0F2RUE4x2ON{?f2y@bv5B5>O| z7|K8yuREU3WeZPod%uXNw$LZNXO${&Qn$T7;h%X@mv5iCe|l>I2(QH*DUj-eGapb~ z{2j0gy1hKU^FZe~x_f?e%{zTXci^V1Y^agfseR7)-s5p+<5a}penf6<SEh?SA-uSWRUUZ&?6%x?J4@x{` z4biVLiUWDFGAF&3pyk;WAMcWR`EQx+I+2WvwtS1 z51^(7H_-~^W9NECtwG`)o7T}xx&7YstMIzQIWRPzQ^v+lJbaPYcR6r|t0TrL#9cZ{ z0`K;h^!EKjBG3b`QT%RRJ$G431Pt$0<@IPYq9xFqEz5M`gtJpn5XC=Obhx;6m22bO z$i91lKof8NmNHAf54pTmACwv-kig4jB@IX2-0FH#`eE}+mAJv#ck-x(Oiq?cKU#?w zKuJKVpD-D?V|GgSpe7Yd2;hAwjUl%h(l#T$2}Hsk`b5(6WW_^2k&^O~d;5MActQ$5 zu6Mj-9}kS={%e(5voSM<4%IX4`(}Ou=~+~AetEvUMwKs)p_@GMXA-3q$ogkoQV%@K z`ZF*%yCV;csl8W!GT|=~r4yJCe{8db%RW4M@EuE#4?KpnOj&7aK*-0EfyWM+BYA|8 z;heC^Ynsc_wk9-(c}js*mqMhY6~nb){^hmyHs`0BI!K!Tuz`kIvhxH9$j{7s%Y0* zc5b@Lizd9d+V@l&%TuSWpG|}7K{42+r$pK%LQv* ztV3(z?_pY@svGHbZ74e(*Y{wK>6oT(qCRqP=d;IGVv4P4{A)j`6W_O8u)@-cF(ln} zsI`VW`%#GYL$YuGFSrx}BG+*70iNP;d%`;|i?yy*FG|}ZVnl-p$w$;a z9fRnWWtwvYkl<=N@$U^e{GRzzgB5M> zR;?^8E0Dx=Ht4cIH#>p9UyiJkq>Jf@&wPq|ohmZ?l6AQe-|im_=qjI-onXBhcFB;i z$tg|`L>t3u;IU8}mVUN~?bsr6rH133L6G2dYoVpE`aX{9uB8sTSQPKE4a$14V;ln2 zpkmjq+KPA48f>7$&Cib11=q9&PgV40IsGgi^IBMAEojO-AuN{<*`HnsvlIp_a`sT1 zQ=(Wq;>U=8Kd;bf+-Q-ryF%Ah@7!*%$kRxF@Xsl(O1^7_CK(&aO;uYbqwM4_l_O;s zb`JZwD=>qLh#h*BP5Y+h}w9M#yja%_`U z%<~tK+2^t@zM5Rma;{N!|E@)DJ+z2l5uzXGRv3d{Y#BWH!P393+`so`O{(&f$dptg z30Wmgd`XGGXhFV-*1n~_`C7e>m2T$;IDhtn=eH>H8PA_&9Xit#Zz_>fhvC{5KEYs$ zBjOY0K4)!#*Xm_NfWeG|DR~#jOqfFp%P%Syk2Ir@{g1vM)4nUpSa)?8;I7XvEnS{iTYaioA;f9&=+6L71Yf`vMI|pXJ{0pT^R01h`?-IaK!kh)_7&j9izY_q;qi@ z!p|9tIb)tkm3BHSrKsacJM6^%N~;98L;@dW@*{IgHZ~&BPdDkBk^s^ztMyjOjB5#V zqTsGy_i%+y#AaOi_d;dLyF_|`^@FNg44GD9D`hp4bTY?fpg|Om_*%M7T|b&;w#7H) zFNJ+q7NK31cb%6@xy^ZG^oBGMuNfSMFSQ*oME{V4RS;_nIL2GfC-O0kYgkDr^%v7_ zvKfWd2o)xzI?7wN3_Pzw4r*?N>C*|%LA?S-y{Yem9y%T6*J9fzT%S@a<$0*yUPW9T zlO@Yi!P}&1_ho^Gb}r>o&%eO(Nq6WE5fGs>D66ko+tGI#oM9sgAkBD_@_Sy~s7G=W zdJco`;f0uiE81xuj8EkdmsMoZ{TmN6FGxJ0{}wNE$JJH-EpCx;AD@-hKx)^|TdCGX z!aMc|j|lz+`9lH|t(N4euJgJz`m47l5j#L1gF)3ilq14=CNr)h!mX;`x5wTguBjFL zsN)WdKO(7X!4N(`yc1&nM9t4X+GcFh)niVJes7+wSSYuOkL}cw-;mX{JJpVx0-R;+ zpMFF*XBDx~sF60?knc_ciD0+u-M^c?^uR*U`+vJ7ThY~H@;}I2T=u@8m@~KB?_+BV zE^k;u2(cp8RAH(g7j<9@P0a0HYfwiy|43Cp4r^tuB7vFSuT-v`cZaPA+8v6Uu7+6n z_anCs>y(&*#S62)P3YMUZwd~=vOZ;pKYr}wwx%Xi5INF*FyQ$l2K-hoYHsL^DJwh7 zZIY6gOvKMH6!^2mTu>FoEC%Rd+JJc|wRie%bnu@bR?5{vZ{`E-_D9j_C%il5CPi;0 zIGS^ydFHNrh8KuA@Ucp;{)MAq&HW$V3ep!|1`Rlx;Z3+y>ed{v`{9^sp-zp<~#(G@-D3~bSirNAa zWsRmdT(J%`xoIb)YKQ1oIUOFCc9-W{>!?A2$hGla+x#J^PCx%3`SL`|u5wey$RaWp zsdU@ODvR$hjg%U$?eT1h@F-Xzn|{3uSN^cK87Q0WN(+v*tcOfIKkz=Uv#GXMRktf< zV18-lEw)=_mCE2!X@-?ujadqTdRo%oSaKmzIY-028l}a%`sM1nFswvJc@7=P&k1Ah z`t3T#-1X2G5%hzu&>~*L$k(5WQz6Eg<3cy9eaSb{#k61?b_exCmN}Y9+jf;-cO$B! zQacF6%nSD}Hq-d@3n8qnRSx4HVBR9!y7TLE#(Qd@&HpEh6c z?AW}{_>@#vixz+W;Y=IWA+~6fqyt+rW0Fv?c=Sj+DHeD7MNyTOi2RVbV&PL?T@*1C z6TE-PsMp^ReJm*2aZBC*ht+#ixHvTeM^+3wkQkVbvr_s~$?GM!$|A|3wt?u$*LNzR zJ%RIBM9$xn2!xpgg6FUupuTXD{1rSwu(K>fh7K>{f1X5PsBmQerd8gPQW%eP;PI{A zi?St#Z#Pcoi5T8)%3qWA&7~hduTTQ-Or;IAaw9?!S*` zwcbLHJ&ZQt+C*_NBh*w!Nv&cZ>-QlTMp}MhEBU_l0&lA`yKyLulY|W$XP*`7W*i$r z5Sq2iMPrE}8_${!b1}oE_O%sSt$e_=HCLQuU?{vl&R!xTaQjL7$hl+i;s?2i(wXBg zk<~0ZKX8tiCA0tMfPYbfL5!WM4H<6jQ>ekd0|8ae^8|6rL+K(FQg8;EuJwxu_(AmtU< zdCKTwfZkwXgW>>(pFy*37a+6uhJ1Cm%6jV-9_c3hu$6{hCO^;Y=#+a)w|N7lTDqd4 zNv2iJb1|tahbA44f=NdE;@b|&&TaTWTc-xfpR#ihMm1We#ZBqGz5cw*TE5Q5jFw`E z;pS}hy@@XR{n5aIy{m@md1P2iwu(begJFBH=Vn^ifuMFE6fph^1ngKm_c!79a1<-s za~ukJWNh>x3aH{<-|4!Zx7o((+|{~%{jb_VHlfim=zPfI^Cv>!_~g5vNYIf?2NNZh zcPvH4=hQQrfKe+J$BS#*$MSw0Fe}FMZW_*p_?Fz+Z(kXzx*|!6fn`=ZweyN#1i@7U z>hhGJ|K&(J9&g&C12kLUCc79vJGg7L-LS&`P(vKa2XwvSB~WtU*sHB=Z+y(B93L- zd+Hq`*#YdNOW~xVWY%A!;sNj{ck8x+VXjy_A*vdwbfQKc9=G|Fqa8^G z^#Xpex|u{PTiZ79wXLXG?_K0bZ5;uk=GSDMB3*dWT9Ml0asI?A!qsiE@7=$H0QxHw zGbA$!W^F4>29e=r$W=hJ`~wG^Vj(7AN0r0&``$}lm-S7k8OX>wGP8HSS?f%uk7tQ_ z1<)VGzEMnhpJ-Ht*)d<9q>-syacFO;5t^+a@|)x;KQv4Iwg`uakzCQu0eruKD_9JyEd(P)k}P^a+%aTQ9MU|pWZTk$Sev}SCJy2 zGHX@hnAR0_B?VM~dAILvXlJBX9kN7H9U|k(-U32TYBGF<>Fk{`MTA$eYaX&!BA!qC z1KQ%Uc#5v8+(=C6?|lbDQ_a6&4ymIu1)JI7GSHE1MrJaZ?nt1+(j42h@h$Iu2 z19Pax?ScYHF9n5IHNxtQ=x+wsjq;8ueMuevU4KEF!r_b$GhIxBv7t6^>c_>{7ZP9zZpaOCH1TE<$^p zHHaQSIM4}U<^R3ArLXs0(%?}7@899P-LLL+G9eD;WxQ4=l8V>5W&)%4k;R_hiu)gO z#f!XI{R-vyW86MGq13p?js-(~%>nqLZ#{@Vx0gsy@CNC#IFt(cqNd+l#D{^r=f$$t zu4H3B22bu*WX1B#Cd4ar)K5sND?EPXo-f9=3Kia}8{ggRWZWTw1(Ds}+|?K=&zwtV z;5YOT+duW0DB^oKL(+>MPbjGHpJlE;Rvh&_h(CNoHq~cMTsDc8h9>fqLIi)XkEZww zky#Uif_ZM8>6`Y>b#2{KlF|1lQ_SoWz$rf6M{jS}_yeO}9QGMm@+jOfq9+ z2sgXTZLd6u z{VJ@km`w%e3hqOA{(j(|%SzLUdWzU`$2R|Y&IUJ=L;(vB4QI#7YJD1$xPZ5bcaGV= z*|=o-38(J6;vDc5JHp|?vGDlIP5>&alVvaaxH^!9;|04#fBXOlw>tI>OZwF@TAi~p zH5Of#9o#53&#YMyiwwza$GbvH7)ZX(quUl%D;owat_Le4^bWNsjoJG~JywkT-uM#U z5niS#@Cb_%UZu%8z@9O1^+hF%A?eF;z%BMe{@+Ooj7RxL2i}b_;|=rfhZ^+- z8@Xro%joFxwq)_2!0pYe{8S6-FyHiyk1UA3_O~zGcVzdfghqA6Xx!7k?_NkPW$+W| za#dm~;(SC!n9>6vP!6gGs@M<Yd)}`vsRLdC^_!EZ<%G@Wb%p z#c?m8B50@p%P|#9Y*V*f<4Ou|y=@6QnLxIK!@f;>Ne9K#Dah%H-tr^ewyDuaciSl2 zx)NmJS`8d4?NpVw0OWS@nfE$}J=VGK7Sd6(_G?xx(tU!(&B)j+11X0XVKP|9>3(V5 zuUV_P4Q5cqbxjM{NJncA?dX$PY?|8I`j}A^I&NTmL)ITHvs5PCjWUP*G%Xd&w^fwy z;Z(RHcbb6(jkJ3zBf^9OFr{OsEbW-WbaNwGJysaUL;zn5wwWPiwC6jmfuk7mlS(2+^6er z`q59V^GK6wX>qx;Xu0=t+a@LC$yM;&>3~4JOvf1y3sUjtdiI!5cycHVjD7hXwherQ zU1rlAnF!(i18#Sq^K!yZF3p92(7MXQy1+hI6cO+3w)F={f#1I61?vmSe~tAUw!;0K%oDKbk!X|d0+6KPpfj;OF7pj-dZb~ava%ee26thBCv2` ze~t2Ing9po-QESX3i(pAY2*a`FfG8lHT%Hk(1<50vs(!xBt?q+4kuOZvBB^iD<6&8)X|i-2gw>XrsF;s<(n}z-BcM~@CtX>1$p-_(RGUC~M*Ue0&=$O(a9&TL zpZ-&&4*<;Q$KWn!LPD*)-tt7dYmOTIihw0p3Zb$?>Sw|n^6(y6e`!w*3)-~dm;^TC zZqrV`ksO2w$6nQHAg+x?RZdbBXi+`f`~K>A{HXa=;7j1_ZS_oyN-B4}g!xPPH%Y2# z?kt4c{f>hQMT3z31G0oA;Ewk|zEgAFuTL2?A|_5N3E;I@5}koKR}nd^+D z7PJK89rKAJc1koFH~6Qym^Qig+so1f@$rGXwCqt_-#2tLWtm^f&i-EQ=0h@yE(fpJ zDjF+8!9*-!RV782^&K7@zWID}O!9gFwj}Xkl|52f)prKkCGFBmNnlsz_Mz4<0s_f@ ziT6c|d6Y7ilg$I1m{h^ME(_Sd!YdZTGom^h1QAI5PP{LZB-g(L6Kg@H;C9%hts~98 zA5(e8RT^*zXcl9ju*4L{EO0iY-AYY&Fjkx_Y;r7tkvAWhBr+M;ULLkNuJm&_`gI|29Maey%K+8lLefL3c<5xYe#RC&M0cVbkq58+?av6S2{A;O7 zsUPb^-I!;N$P*b>aS}`KmH?Cz7(tx4_ewd*UCFLA(U`5Mf2|zQ@7CU2~9r# zdID!d^jA5{xW8b5kx3h3-vV5H-`qs#dMwac_6RmKt#HPGJuvuJs8{}?)*Mdax^1CR z(h~iqiGZ{zr6t|^2_}0WwVC??h*t+M)8u!|BK2K^GF!PX`Xj3>y*}CZwD9}j%Z`}_ zra*W+zw9YpYcFvwIP~|g#bQHl*ONb`g9P8DKS}22`or;x&CRd4thVmHQjYdhDXWv+ zP*yi(IMgdYbgo8)-n#N&a+3tN{lN_1W;1}x5KWO*cRMh60>x!bMX&EWqO2M;v%Yw! zvcA0VP4N;!=19MhZaxvZrdz73Bn7}HUTO^QZMYk({()3}cQS#7+k&?#GqE4Jk~_i{ zPLlt(JM!PC_`hzBll?#Ehq(>N?f=l(ay&4;HGPkS1Z_t`qW$k5{b%a@n>f4v5LYVM z+6~dpyuxeBAms04-eR=U^&Dd}x*&4}6WeG((w+BzJ|x&}TtYQW%f?dlxz89o#Py@nR4`5v;1&c zjGaqMYeaAaIetJqn>vHAgr+c9@o<+R(uu=aW%lk-EVJ|VPEmTC|EIdXmt8VBFh?ZS zZ(Rz>Rp#%`$Ln{$ZlzXN3}g4100ex4HCr=1RH$xdm-QUMB868-lg$~EJYgcNG)Q*l}8EG8lAw3^xUkL5-x`hl> zXn|{@V4{L}vC+I~q#8DgRHsM8$H>yeQ? zr^VL^(XWb6?qf+Wh>F6@V^QaK{k>^ct(F_gF>|A`t1t`e-bl)U>2&xc5zh5<^YD3T zEQF6tcGAt)>vIHanMl&UNlYcHxmU_ zqH6Z@pyD^rf~8b&4oG3+_^I?&?oEL{$7r5axahJdiK$g8hDj&~Cu)#2&z21`4I;sb zTH^yw8tnw=P5kQD_kA#6s#IsIT(ZvR5b(22=H$7Q?l@uFz6R?OV|^Q|D}2fi;O*!% z+K%tXC~T}-88L4XBKK%1>aPF!;be%9JN~HF2fI(tysXSsK)y(8`N|Sl zmE@iD`$6rlK(D!HN9ROp>l&HkKMQG6PnF|VBUyTO*m0AVXx$at+fnYaKEpuH z9rzP9`0(4KA4xZi+*! zMqHX`8h(mD{nr|pWgQ$x86GUhzM*K}6MWFik?Z<%bjJZNHvJy1{(#R-Tepl&W zqPwZ}dgHM2No9rHro|O(Oo#mO)+rn-Q-<&c{Wv6R8X*Rxr!(ra*EAG^Has6W5gJBB zH14I-t_DWpHA7#)jO2F-wy7AeG3F^NUikQ__;G;YHOnEdX^IUh)VXNxkh`}nost527($45VF!l0U4^jJHIuZ(66b?XkHW|n- zDp8V-@wnGFR)1j}gdeJEvGDd@JK2Cn^LHb{1Mo~^uY%PssL}nSIodljpc~ZI(pqnA zPOg1^$uMv23t`O(4kYd+&Tzj^mMSpVRVS?ZjKHhMSEZ5}iKx~8PTteifIzZuAB9bE z(`eK35Z1n${U3ClQ+Q`VyX9ls{KvMFj&0kvZL?$B9ox3;q+{DQroU%qF3!w3`=a*M zuBWbQulKF`t>v9L-375=2LF_7weSHShVuA|bE2i6a`6^zva8ymGccZ#UE7>5=KBP) zOuYOJi^X&*eRAQMsE=V98ua=_{br;dxCa*E^%=7=Hz>#ja5vK-{IuhSzkCros`{O5 ziDqQQ25JAnTVMo%3%r7pP2wcy;A5YTc8%O|d!RWFpk**E7NMH~yQuL55pC_@ICz-20}W8vWGz21**w zr5Y#XN+K}C2=OnZXB}wxH*bL|FN$00+8eSde_c`au^gXj!{NM9O?Nl<9j6?4Jvm^s zJkdz@=r_?3DwCBXMuqc`u*4y9cR|W5SS00(OQBXCNe4KqQVa!?8jpB#;?zh{mN_O( zy!_iy3Kq8~S14klS$q&2B@LJ0#YU7c^-{I>+^&EIhB{PiMeo4G$u4R-?>HwAMCoeO z{jbVfY`p%OazDV9-#{<DXiLev;XKXuY%i;n3vmtT0BvN_FaCu;8gbS%9S9 zI-+mh6xOxt5a{~Z5F$Mb)kz+j@;%>VANHn83l8nd8EHJ{$pHl3A1`RXO1;(%_0>5{ zGR6dJE3XtaS5R19)14IY1)?>&TJ$2jScpT$c5O1mX2(S~Pk@c_wv;#WC~4H#$T-_2 zD`}C%6=@;5;}DJU){gM9!NS7~&Iupgosx45c^6IipJF;@p$P zDT!;t{i0fNxqDg52n=ZF8Dd=+-SxK2dj)M4zD<8tS&|@Le*Do#?u{{hl{^NMEpAJub2sWS}yPt6@#@z%8FsyN=HaiM1mkAl}etk5x-)iaor zo+ZntFa|6`jv3f5dTJ-=`D~o0VW2+IZy-KE7N2^iXEsHcO5>QTvvh?)OV_JP2lU!> zsaHZH=_JS{v3<75s_un-$Be0tS%P9SbEfR3X%aC#MMe->q><~^Iv}h%+1ePE^3+4L zXY=?dW!aTgdL@fhvo)v!FK{>Tju}t{t7lPF%<549MPTVep7IrLDTLVyorWhclJ+UQ zmA__tlOSJ&Hw!+wxmk{xE2n35vC!6-eC@*f2koRb!p-lm*SK@3zPo_~7B9ql+7D2a z+4-e`uL?lCGW>3(&=7>XdhAvvt=!R1#K~9Bnt0inME!oTyIAg-D_ZTBTyzB_Pf(D- z_Vy|FyS#nUhD;e@1i#)>oz|LM4^5Al6)rSGuAaDOc8hw>E+Lj7qC2XX1JO@aPHrRW z@$gX|psfVO7`0r@EbM=RfoYmZka_2AR!N6V)$&F2x=kW-1M!ToBs+3zbFR4BZtq21^yu%EBV6iTA^{j!;X+7To zpQCku+yTPsAKpvL-voK0f<3}Wfa(4;h{LzaQ8)#bKbQEQfxrOV0OR;#$|*nEKuqV` z>7KD&>U!e28!VOC%Ux)=x1Z0^!w3I|(XTJZL>|dXrRlTXk6Pf}Uc$cqzd*OT;3pjr zuc$zu>LC9{AH>|1(GydsN34KvTo7I$8oD=ZNbJCOg#2%A!94@LpdVuIN}^n#p&!Bs z&;U-oUHn(;I&lz@9njSu(mF`i5;m!iQDvSjfQ4V0p6xfpvzc0oo4m`b?5e;*{dxc168@ealCKx4ue-~&ah&<< zUH;kJ90a}%eD^BDk0@?f9p*+1{fZciT;?3XLqydC|35ycyCZq_%I3>@)$X zR1Aq*u8}X@Afq;u=3rKwAs(3qG#6FahG3A!nXxM)!fbj$|K*u=BW~YTj<<{PJ4sii zYy>_zudng(v+#{;U$5J{!>-;*cNc&9Xy!5f0zf3s2OxKX5ndVgp79T{JwHd)x>*wC`F>;Fy@doHyZHx)=T8 zr2N^>5`%N-jc{OG|u@TRiyi&J0e zh+;pTDZl;coy~QMVe!o|H&lLe+227NV?leeg2uZsI&!7fyRX>?%u{ybj4Hu4Gs(w+ zzMjeldYqAxuL9e*P{;&AlA^gnGugwYpq~zqiODP=HA4l3tW}2T&Lr38a-B;S*qVgg zmkWEqXft$wdzyLPTJbD>x{aNB$y%DtP{m&xiSc99GGdRX71W60xTIaq|_dO1qw;#xmD*+B90xM`YAHMb@`IM9+B(tu@ zlX<<4ox0d3d9ld3>?61thygJQ@*((a&8SR$pQ%c0Q!c&@Vd!HaHy1=Ag)hE8;OTX6{u zHf~?5ZCXvpcwk4QVQ|?@qg)W@W{J;c;uVd&&I60U1DU_ z2!V3~#6EidEQ^D!36>(yCD=db6+x%um-lRpLyHwbyI~)*u$=LPx&k6of0y8F_Kilb z=~vO&PWZCXW(Bp>w&hv~g{}JPm9tqiC}5!)n9XdMq1o4|q9==tH~*T`wfdQIy||v; zM`~rPcX(|tna=Z+Dw6&1)t2VF23`Tpgg)4~<`nEX=r-g=*XJ=_ET5Y}+W06Sn_+=z z_gBN=oi!fLjxzWUTwrzC4+=0hFkzrUWHu1kK=>_iA)wfAD>U3E!uUR69P?Etn+E&H4 zV?|A`Y+_g3=6TwxSUqmHIfFc(*lK6F@>RFv(vI?tJHj&llv!@*(;ufR1ZfoVf zlpWLmyAz6)c5VK#)g#yqT_h|2&EgUy#Sj6lGsXZ);1h z(1-&Mg9fwMm05Fg_}B)d8R#bIGq2` zr|8}SJr@Nh%{?yP+(>^E32ow4>k%Xn5Vl}xa8N-^BKyJRo+Xr`fszk-25MF7*J{OS3+36utGo~_J9 z9N<4;2;0*bSxJ7@3t$7q$QEarDOY^iyA>kyILw9qs5-L-)~0OX%P3WB5l*kIRb}#J zKTAg>;_w+nKk-{3x$2zSfkR&9chI`(7u|JNs%-I;Z6#tM{cOzyNQgf&^e&_VDt!mD zdfe_XV{YWdQ~>DJ-*C;=b&Nsc?df_p!(-;XkQ9&zF;H2_!0Pt9KBb09sel*rcJ;i= zd17ZJylDU`#6&%^F(88Q=&G(2@0Ij+jN`e@h#&K7V;}e7YeSfSyTVc>a55KUrBq#k zomd>r@x-PmeYA)ExW2di-<$ThpXvY;GrvkPh|bmeE36F3H#-}R;zo{s_vNGZ$DxBJ z@z8t?PX<3)8%dUmnQ{BEVHUEnE3aHVaCgjBC(aP+qm%( zz2$^fixEOu0!k*>1!i+E3}I&Mc|%Lb1B-C;FB(L6HB$!?>h&$XyF_^gr@>Nop>6{Y zXxiX7!uQT-67avlzV|9`X{1-c9ZstuC%EKU4PrX69s1NVmzV(y(pt=AC>FkOb5DGK zR9r!&P)e=_@(b97<1`Q#@B0e`4>vj2jGkjj0y_f$@A|9Z&^%)N+w$?96tR)ml8v6{ z=+bu`-n@o+Ha4*r4GWLOm{=|UL^y(?d=OR&;SqDq;@eDjDnD#>@C+TAlvDYfEseLH zW7AW2rk_5KO#Nb?ZtHIf+T!`hUWCMFnDhrIZ);W4TXi1JzB@Wwy3(V>iHOa#r@8Ek zbzP#yeq3ZVk9>~ppbGuD%}ec$UuQuVN%h+ZTv$Q5=NK`$S+d*=zIZsV{qlqYgijJkpQaoYtiS}s*lx{&&*=;=WD-%#Ze z*r<7Y8Zb&ISM3N3Hf$z}${K{Oy2dwXQ2e+uy3_1KmC9TghVI--_N(8<+?aLrEQT?Aq5p*nTo!F}uNBinDHVJ}C7D2cldg&QCegoGo` z?%hn3PtCG8pNq<6D@}syYdwAaxBv;Hx3Gf!&cADKU0qe~J4b75Dq5N`+e?$;gu8|f z;vf3Hp0}ltN_xmA>!u`DSL42R`iso*(-_k-WQ?6?bQ+gNBlYR;;`ElS884etCv0bS zvTXSYsJ{d2SXtK_%k-3{kYTr|5-{zgFf3&LlztZ;3TeK``oTB!`R3))&-=CN)qfw= z83>oIs4-(X2XIxz%ER_{gl3ae4yK# zgOQ_{2fe-$#1!?tb)a}={LMRbATJx|;d*VHx+F*d{7~56*V#Ki9acIgId7X9X)#4C zBifWDsJ^K<4&R@gRZOwjvW6kqaKy+?v{MAa?jgR)&hKD^4t||@06c`nS=7!6YK}Tl zr$Ip*kdwJ@&QI=VlYOA461J6OG(xPJ=*Ulwoh2dqhI4aPy9h#at*FbbNvBkj$hz#M ztP?XD;s?!!-mM0Y|IJjamH;s;65_>&CNWJFL79DO5(GL~`38Rk*8GjJd^La(2RmY3 z?lk)9$G$A=_kujavR0qrG-PWiDs>~t`b;1Pmynpm(<(?^L@$&AKY>(jtKbnj{;P~h zZa3FELezXrIfE{33?&4(=8qYd{*kjLz4mo{v#jSkYMi5+^tq*dWa(zpBlS z!@Mb}m1TDJqe^dTl_FUCq?i=e;X?)#)bzVRL5c)^`9og_ryxHs`&Qw0z-yhJMUirG zMi;?*!@g)4_X*Bb5=1tbW(CP9hnk^r=I7><65hzV8b=cA3E)>gT$T*2f-Pamzymde zjK78!r#rEzP^dLm#08&$)}4w_;FbL@sniLp^@jSH)heYaTE028oyKETXgZ;mbb50& zg-66m!AJ;A9rkLb+-^evtG6Uef>O4V_EnmWct62L!=o*08B~KcScjlNLRz^bB_&_< z5J#bxTFqgvxv<$Z_ga8R+aW)1dIzuU&)9S#1%=+Cq>Dgf0t~yj7-kZJwC$auWL)BN zv119Y^S}?UndA^=EMHktnz8p9mip<|R8pZMeX^c>+gB{%hrMUWsdk0yQ@yaeLC?3v zFCnL3$iUKh6YSPfs%Xi1M0+u}Ulz8~mkyXPD2$&gwt8+HiQD@n^jt|BlGy2sFCG@5 zvS&!xsSxTF?>K=QY56U{M?Ar5JI(KOG{JCMM?;FH!S9y_$b(JyCFPAl5iIzGZ7X0I z;XI?k)Fv=ABRjFSnm&*vSI7&yCOFg+uUrkk|JBbc#;d#(qXG;Nf;XWPbihUP;tsPo z2fo~|$uoQk&yk)%Big-0F}zM=(!%RnA=qwT@;)M3$0^NR>qD7&rp*pX8m-@i(91DObyTa|PuOmg^$enOxz8oFwte#fxy4T~m1=5|3-<4QjyIVo?F59~7efWXCG zFBfs!s0rHf?Bs#&76O5xIb8(|{-S>UlqE`Q?LAW?G4#77MPWK-L* zDO)BhKGH^vN;HoBIhnHu({54ofJ@F4lN4J6jbXn2zG+&z;V_L@ggIR2N&y)O4$-rJG<{xa^#(Hn@ z_~-XY4gdqR;_Kq?P*|`gyPCyB)Brjr4-J+qIT1$AQbH9zBCqVL>7GgC&?!nUb>jA= zj61Ug(94pIQx+q@qNvo^qMIA^)E10xDF+Uw(IClNuR1Ceh;Q*O61zRdR5kiqqmH*? z9F7`}MUISYEeP?UuxX^^5Fd$kP{?#%0?kTB{v}pj*_OkI-`Ze^wd7%6^IJFkXa@hx zE$#U1@Tjv+zC44-WDJG)QOo8xQI;+wD0yX86u_IX~1LolcMC5S0#4 z^@cb~-SOGHYIE2^uU6!Q$%`aU_*hU(^||;$d!0!(G3qU^4sdK(YIyyZY&rV63;fG7 zePG6M5R4BQyidE(WQx*boE->60nF-#a7KgTc>Opp=&-i6hHvHVO$M94+kLg?Z94`z z&?fEGQ)N6Bu=qL2(8vkPCj?8Dq}0vS+ou$+n|S4iw&H z>upxTQp$EGbkeHe2Kao!${CSQ)}&Njugc;qV~$OK4N`(55MjfxFb@id!U;mDmQ+;~ zZs&;AYN|eI+y7mWt{UU_-jBuGBk9)*|Bam>6F+CnA@v)-V+2cv3`!?b)_CJL7(}4n zlw%b}{c*e*=oRh0$tc?^R|ZZ#?%!>?OOI^6__KM)$qid%C>wu`+lFPi zIeR9KGy{}`1>r-$cv=iE^TE}U9;{$3x9W^?asD(#c86TJBQRpicfdT8BC=btEobxZ zNcEoSQ&3)TG}wuSUnfiG8C?T^PUfed=;BcfI|ylR^;}WclJRWB?6t85aje-z6p|f_ z*Db0ts4HP3mY-orA-iFOtYhdSUl3#FPB7m7kz-vtn47B_+ zfsI@P`ILyQbFJ*>jgqy=@SnG!P) z9Gi@+Gjzd&>#p1kr_CtCe%uRd3SEr{`q zl3FRRVb+3B&4c=)JtSXefAk|LcwG#VPx|+BP(M%Th`EbVTXOqxL2bs2MfxF~rW7aa5}HpF)rP>f9=3R!B1@Q4&yUXclP6?jZz@k3^Ix?z+ z;v}=k#(qElxcUO~1t){lkOcQBh#2p0sI#N~NpPAYTgGs50RtqFE}g~=G}2|~E3W2g zci6r=_g%Nyo3345i}IGqo_zjLAsU^yj|WE>-9-m@a&L_d8@R8+*FsX!*zW>9WMH8$ z!$SM8Hu(`cSTo5!xzLC(6q!P0S0Q6+AcmlR*hz=cEV?K3^wY)$pLT{B%o#jFW!}9# zK|bgn4)o~#(maPKkC}c}_=pQ!El7EW@A-LevGb%E%&lA*qv1L2MMOC4m+ZM?@cj1q zDuSj?ag(hD_I5_3Ng;(1yObz zUHFD&B@EfCK*#rWU*C`LXh66LsU7D%)=@tiGkn9-;u6FX=Fk$*kZlcjq8>I~ofrTv z$j71~L~s+&VITBu)Da`UUIAN#98Z*H`;flkali&+MJm7XN!(aq?5CL^-*kMW3=D$; zc9|pGse@6*R?!{@)nLSka3CWWA?2ui)YfU}9Lo0H6^JG@(uK3H~G-MgbhlwEnnG|h-M1K+!+se#?z6*gU8KUV7@0AkdSDnlAAOD-Klur5`-fU2%Qx!3Q_$*neqb@0q8y~+j*U&AA3 zMG0a>)_IHIcn03q&&k=%MU1cz(f6c<^Y~f1c>AZvri(8qPmx!GRf(PCr9B( zAN%X|dBQ*jktIgT75niTamD_|+FuzPEodH^DbL0FQFy_T0;`zl+l!Oy%fy9GdISp3 zhu$kXuOTF{6R=kKB*jyFY-g`n$RF8FQ`G}-T1{v$H7^8{v|}(=DDtgz#G*t8QAQ#N z|K8P)rR>K#)FCqjV~|*gm}cT!xS*E&qu+!i{x3&>AY=9@pI(G%Kc7K%QD{pIweK?g zI3~ktN5t9@;za?xDgai-qQ>vf!*W6x7%FVdKlGq zLL`|oNb(WcOb4fVOm=7KUMEoPHqJx=Fh^(xMko4X4H@atF^F6rvuk01NF5@=bnl)y z`2g2A3ozCcX#s@E5Qm-?j|tWf5Pxm~A;h&k#-L$TDnr&nc^?;Yv6PnWwgJ{!DPH=1 z&_G0$#Y%Kqc7b>jH@X8#%oj_9-NSZbi;gl8d~G&f69~3{FOrfxw3X^vA7D7yVOAd` zQ@8~JZ6{blXFDdwap7VC1_9S`T9fUMjfN`t$~His{=GQ;O%tKi`n8w zzp8#m^ngVj>X%YS4JUd=Q@GQ0W^68!6G>k=su_0!MgDKiMEO6@P0~xYCKM+Uj3U-ZOSv6wgO#c$l4f}4*GX{4U zMc9TQ_7#93r<8HolKl@h7}t9{tVVMp2OSAN(?Z&n-%j$KcIGXGD-n~u7KL1@21|EVq!+x({&;mEEPA)&e;H~;JG|{&#R3DJIf+6ak zP2r@WKdtdZxbz`T?8zC81Vy_Mj2`T%ZdV{2-3idu^EjI@uqe8z44eHGQpnb`*~c|^ z&o6z+p%)d-Zz%H2FN<5Xw}6CP*$oOOjSRin7jE3t8M zFhBKc;A2mCkS?JjmU7S$#={^WF01Fr2ygvl2;5TdRZC`SvsU&p-T>Iu2JD8+S%lu5 zIC8|SfXpr!gF}9b$q9`tnA{7u3O~PhCu_F-7G>491u}7YKXhnSouG#oV^7_s*NpnG zd`@}Em=F?LnxOi0l2@gaV4OgQ!^y{g)e6IZ)ywq=EII`*qPZoI<4E-4H(2Y@ z-?RG{G%VUg+z%-j#9_(Hc+27^bww@zX7uXbjwEB78@fEhxkE82L5<|hmjWFy&|NBz zRh_hSLjb+Ca^j-SpWL9^Z1_>XvdD6_9H@yV_cB2^76X9#gGE@Z71-pa|q}>+nI1{TwY&p1{enq zNhcWrhEPD_IeG7N(i`h|DDPC7YvG0u4M+2E@x$h9O(ivEW#(J}psX%T|N9KVf0j_0Vw5bY&IOKuIC2cVce3j^sXJ0E#x+c8%c9WuE-<WLG#D{`#vPc4NS9&F$kU4uE3lcJOV`gAQehyHX$k+WdQNRL21&K=}d^8ITKZ<(Blfu}DoEIzfup@jqyO?4t-v$kh@JM{+Jd zllINf7f4t-uZXP%cQsVq`ikbkO*>>Wb#9XpNeQ19(Life9VL8`ZLXsv6+1Ay>D}1Z z!YK8q5u4{S!CQ0|Kn%RlQzDBIa!Y>+OGS5QA~=jWB0hhcvO3skhK5#Ccxnamdy z`C0`Rl&n|tn61`K7S!_kQv5TrM7O9U+@`&8r=nY;uKT&G_;;1ags)P2;$n+PVLEUT z=E1+2j24YP)ud>I4^Ydm7MlP;sJmHqKS`AIT7z6KvOMhJL=9e<^o<01+$fA}A7AqL z$JaaTGg}V%S&0K3$iw0?BGtt0OjvZ^v_6_yvu7VBd8JWDt8RD#JSGuu74W;b5N$T# zZL>f>P4v7G8FG8aK-l3La<(Rs8GHQ3cN%EBso?GVgf3EJ{AB5$ESyBCpNdME`xXhA>!Zs@>@_x=I$_;T(7V^4{{F0dJJ z?U{RY2cMA{2ZjSX(-WhR#fTT)RZ3fxf0$fPlRGr%tNA>$9s1Nc$My3?`!s zCgdpm!>M0gz6t&-5;ff8#i0-N4~Iel0%G`Y=>!`~BL-I&OB;s&unmTG#-?WU)m`a4E`}l`O+~s)zqv5ij_MfEFR=IUgJ@cG{dS_>Y zs3kuSN0v#Iy_v5pgODLHts9bu3Tw-1q-Xa0hS|BjTMWnO?O!;HxP_JzO=oR>XnVJ5 zV>P^a^^#S#CTYHko@rhjkqaQDz`Su~TkRiYfb(ZSA#Q|U*)H99(O;KRy2 z>9nN>DE`QydfW0*+CLjR>bPvRVUnP@TAMka;$cY+9;Y_gyIC{p%?|1OgH~6L_RQm~ z`XSETxiV69NZ{j)ehAAn_S6oRm3neJJOignz{P!`8kZCLwO|KZ%tv@)Y`-=0>vn5~ zl|j#X@(&$-D`~7>!$F#^Fq&2wS(#7dR|j2DR0}}sifr1_qOlJKeC1N2hn<2A3NmVG zF5|tm=ke@0eMNqRs-kbJ0i?9lm~rQpaU#SV z3Krh_$^;ZIaa=hI+6LpbD+`L*Dp3*lGZm(K+N6AXZcVB@(!-feE)C3E^}%CcGK9sD zc)e%^)QT({4}GH6M_`+*J_|lFryUr1}$XV8^CXAv(&+{ucpS zBhDf!Z4u^s{QB*XJyA|HN`ilF|zwGP_gDB3Q8^KmH(NemWh8=Id_?EIeCD(yr3}dJn*>5 zdfV2*O41__Q@CQjA+j5b=fv?VdGx+0187~rf_BNhv`jA$K%_RZ(u3EI$okxMog#mk z54m3n@oB9is9)=>yyD9D7;)OGZkejemoS_03$@Z4sJeHK)5%K5cDB@dqE)oM+&Pk~ z%DCXhNB(!jwW$N$&s)Sv5qK7h=dG+uG+PFuTIWs!<0!4#cGf&CBgt?typq3?pW8`X z<6yJsY$GII6kASO2fJ&GYT6~_fQ zTCkDoo&{cS)w;y8R>lL(d%M?P700h8eZczmkraeGe>25<{d1i20%lW&hy|j}A3jSM zV$6!Wm6WYm+WH6IE>g0)vJdLeU1#z3wm@`Ju3|pkr~J28&^}%+R2@shf4vvAxj$s> zx2PVnzF6R`{xP+D*Rcrp@0xvn?HTMW*0FBvKI-JQOx7%sx86MamW}RepT6*>Y2c+% z*{tt%D_*wbMa3(Ge^l0|GVk#iB20$Z#^r3SS@f#HZdYog^CsUxe3F0&w{-G$>&b8i z?tdfY%ROn{5|r=rTf#JV`;%%45mz6fmfV6_wL!(&<#sjSCjR&vaMgc;@b%yd-$e-U zI5WyQ=WG?l{DtC_b3broCf=_V>$*$wUf4tOR@E~bK@k$7?ZiQ?gFX}al9j$mr>i4$ zV(j4LHrdAKKf4Z z9@i7ZGS&Wd#<%bx>AmLdrw%ZSV&!=(_BxgTeSXW?=Iw=4YcsL6h0Cta+xgSj^XUS? zdqH6%t(&!{JMTK{r#zxh(02Tu`5F*D$%quEHRrKV%tG!=7Sir1N*qdkxn z+%E0oI&D0zGt3>v2H{cz8OKY8=bgS-9<|f+*7ir>PZ8!TFMsB65yU?KUHeQvQ=A{~vz&-; z{ik(E|3{tkf4?=cb@(T4d{uP+(cfskFX{?wX;X5A5{Z)8HUN=?K0@Sp#Ei_$eVWzC zzJ-AOmCu*%ErXGqX}gN4BleSQ?;Fbw$X*g1uX24dxX8t-2rP-H`xn8R!U0k$1qD5x zXD^0ta+nD}tnNZqEi_F4x~VfZ{(TkY9lG<~mv_jCrUu#kF#3afoS_v%dEu;#ri$Xt zX!xieDcy;3rqPZ^UPdD2Rj5CGYBmd=brey}ikNSw0tMG#TWSxr4v< z>hVdv7!DH=m;mJ9SnOjqnsjL)Apt`IqR;s~NB-XnZ90SNqjA-*l98NqMm>f0Dq)6m zG>fhaF9VD)^3jb!0=Rq&!vr$PeSSHPkrrvoKf@j06j!`Z8$|17eSv;@drwDyIi^(q zI^|tIwjzSb&j(aTCWnk}Bd%8NU}dX{B29Pmh+Ep6Pbi!FZjN6pdo6w1qJ;ChRW@CLZR>L# zyQ>+xIBDSYVm>!Ufg;79L=5Z*vtf+J-aaB z4UyP-@gCj{NF$|o4(G?9qK`C^Yd^Bu43_WEoI9M40NDs~8iSo=&*_Cai1v<@(n!Yr zW>Zc@u&BRyu2Og6=qurU@`PbXpjCq%+jwUAmdepoyTx2tILFx{{i{t+Q1TRA850*9 zm$?S6Wt|}wtdQ7@4J&vhNIOlE3^XFm%CrTc^MG7%7P2AZf}?s}hIB7e`7(lL zF<(`F%Z=z)8Q)UxwYSA*R(oEXdXO{uodz)e#Z(vD?P+-*4I!OeZ+rKy=dAh=mf0Dr zGTmP6qx3BRJ%x&VevfwV%)P+z(O0#Iv$dBVkL4 ztUNa9z8k_`YKql|``$*jH%fbJHH>={}Jm5<-;0V4E;H@_{Oi#-3iG~rt9wh zM=Z07>7T*=okV8r4Vfb@1No;muc^DluAgBy6$Bjp_IdE}*>yt6<%TmOt+TnNo9o-A z=)vWq+}d=ycZRE-n5(92!mYc zkKC1?w3@1{x}Q#0pAuJg8A;Cb$1hd zE`*Pz58VG+{k4CO1mONF`+94EfQbLcUD49c#MFb{)S3O?p7@VXcf%D={12Z#^p8(h z0Apy_viskBdUr$dqDtHg?btCDh-iaIK1?vkKR$hSt@SIwclE>l67urkd)RM$gpP%z zu|Z;Ni{+ti(V3R9HsRlcoPex&a^ciKUBUcT&&hxDloZ#B|H-C9TdCUIp?NrNcwe7H zs!YivF(YgJ*{D8UB3@~#s8=MJq5m+;*DRO#vc_DFvDy-b+;BAPm77-S#W^_{wQPE? z+mPq;R!l>1lShh(fSBaUH9Z@}oJTJIIRP4AVQI%BZ*k~m!SL{gD{rP8FHwt`HJ?yo6y z)4ZXIMguZj|H^V@+UlTUa)9-C#oChMCMDlFbDsLm!^y+&d5Ji9z2YRHA6vTHTo}kIw3;HlE3g z<*exS=xH^f0}fT+c$*t+4f16lU{7csIF}BMIb@IfU)& z##QTxo?La$-G|&!&<3Q;dC4qBn}UJO-Ps_Q!{_9hhteS2KclYfgF#i<f$4{3Q#O3^q)DHD z%W|keUU~CMVafuQOC`e`_SRs$RwT}T#EaEn&p3=yRg=3nq%h!k3-{SC6K6ua{5x2k ziLoZCYQ|EKebs$fKpd2y|MObcZRe1FX?-k0nz7st_t`^TGG238Sw35$T;9@o8PlF~ znNt+GwYRc6-_^L7KYzBgU@ZUSUkJgH>emm_yKfcGtjL1zj`T98#)jfIkems&h02|_aOl{mXSI3;pc5w|Q7A3pN zl#PJA_t+yVi_fLlb%_}2^ttAJr602fXe5tBu|)LLlT?!_dhK5YJPTVb@U}W)naZ%y1IO3`_iXQ@UAY zHbRmi*r2S&Z_SYHRfFKIFLR3stjR1NX!Y~#xXR7xI&l|O%)ZrA3<7cnVMjP^~5Hl$#lh9!~LIg=r% z%%c;UUFzZC;?R^!uZedtBy$I^%3|% z>-l^qWVm}}m%edQSKJ9G<`sC4`F`n~d4BH$jNn<{;4{j7=P1&p8h?p_)xOqejhw79a2r3J}EX^)aX-`SKUlsNAhHJh$D= zccoKxJ-|#$dmVPT^V`~dtyz?!*Ib-=l%Tz7Y18Iyd?o~7o(_f>l2ZH)*mI*`_shWi0q>C&8p^Fie_%~0btFiGtP=5P>^Li z_$t$3?}|I46N;=W<1GT#=%Gl^3^Z@J0#YoF7l?HIgM+;lK6T1ll=)Rfh$zic_q-~ zK_xDJW9rf!q;0uI;}0y*m%tCx+k?T^Z#%nW(%A-+l9l?O!&b#FgF4S2o$~MB&@a_B z-z2I(8WsPoP%Q&xW+}TzRIG1yYez_DT;q92ZQ@x3`O|)7>`+5ibEg0ry&u?%AIRlf zk*|4N1MS_wu3NYV64v*;r8A`d2JzTW=fIb16?Yr(>(+o>Fn#?qV9KnL@g1j)i0)H= z!aqRmP4CUx^5@Z@U)P^5pUxkp`kE2l-qgJ@i zI6ofu2md&OGv$L5d$rH0159yo#UMK=Wk|M*OveM+1smfNa50?)c0ARqxOD1CB){s) zKZ|)=EeGD?ZHnzHmk&M)=`ja-X|zRpOJ*p)TCowtS05P*9_3x#l?H$?k5A3e@?&TD z3f&-Xh3-f-sxiF3l5_(OOQmuHyv;MMNwO-Pn8hSv+LzDWY+Nu`Y~4H$d+`bI7~&?A z`pX<@1^D^j+&8xi0~JQizVLiW-c`u#Vjtzx>Fkg%^f$|-naAKhmn?PV_zEKN zAutsNF{Uhsj{m5F`Dv0dP8~y2Il|Rz)_svz{$QXaQfLjl@`0(&PvaQ1@ z>zqjtrkF>mxxC>!M$%!%-7DJP8+U)*8<*;RIl61Z_kIUKaB?z;HLier840@j{`#F# zUt<)Ne6ZWvb3eKnr1Yy$gfG1IQmcDE5*8DOc0}HO;=;I=+iTRw#>X!;=eRLv(i?&s z2RpEBIF(H&9K=%;1YC@6O+WPv7m&Ax7Ff*%-*mu){jy)9I&1j+gj+4I zaDNSH;NLaPUqV6D)!g6kssgSqX$ykB;7o{(ujQ+jx?rS*e-av=8);BA7*kRT zEz}k8J_&hTq3#adz&IHBC-j!@H%DlMV;u&WHvT>voj1nSCFrJc$IWcK{P)c6*|^EH zzNb|AK~_2Ci#~i-G$rYrss4HKe`0RFUCeiHo%Qk<^#v1^vCaOtq$VDVNMaCdl$+iNIdhf*yy7p9aoKfk3sq6S7T83?5P!% z2b|GS+};;B%fU}%)d4E7t$UhTp)#XXjCa+8MkukjH3(^Q^Kuaqws@cJUKt5)vEOen z6bP2<>*cbkdf!|IQ-ToLfTWOB7fdT-h&yfH{;F#8Xu{)D4(5RcXFJtkz3uoga&cf= z^;Xk((_P3L&;gs>My@T8-4NgT;{h4QC`8EnzbTB?p|(B!ya@xKh1{)%@g4i-0mts9 z-DJuKJSV+yu#Y4r77KETHBiB+zu1`&f9?6sD!9F2EzPi6dCz-l|W}`9~A`D z9pVI}l3i2{(+Lv!I}*FgbsWB1b00L=A07gte@j`w(c-<_zJS%ya)USm--ApLPNSU@ zS4qd&q|9%h8Yhpj{oRM^4=H8h2;N~l^%8{{^sx4(#d;9*Vz7xyg3dX<^J-xOJtFN) zu|M}$?lVG>X9w~=(D2a%;!?fCQ`>Tq)euq1T8Z;$gNrj&p7S(seW#Qt1<-(C|6Gz( zUloVN)baLvIYIcAVb_`Wt4EW4bdM{7%9+z($e7hYf1sG8uwn-jn#W8)gR7BuWVPsO zM5SvR95XK8SAA%RjJDbsrq6@p@kKrGhesymz1B`|%}QImpYKgghT#6}CNZ;h{OgY$ z0B83Eii0p;$&Tz>F0LfAfy0Xu+!-vcm^1xF@}kc$USXRYBG$ix?E9*DKFe}d+_kA# zWZCg5yB3=?BBn@H3JnM8Zm9?F88}p2P z_*Wn*<;#NHNQ`dBQ0AEWqw{zw!8?Z~jUym4ieqO~L#^*lwq__v2FjM9&T9$^ONy@U zvZSB9>yzwY#u5LZc&NX~-Rj55?4n;>oUHg0zRCCsjuf4yF)chMVy8muR} zGWG}q{nmZ{baK9%W{Ku@4r8Wuad1RNb1*EoB_Bhx@D(0@7&6ULbKE1yhszQ%xdK+W zh

yPvLLX7IpcFIWmCFKa&QC+Cy$3vUX-LgaA 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 diff --git a/.yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip b/.yarn/cache/diff-npm-5.2.0-f523a581f3-01b7b440f8.zip new file mode 100644 index 0000000000000000000000000000000000000000..958c4b8b39334d0a0cd33667869d2b97105bc31a GIT binary patch literal 144414 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�#|b_9mmsV_^S7vukiQzXU*ko` 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

E=%ELuFPPI2$x{~Ku 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/glob-npm-7.2.0-bb4644d239-bc78b6ea07.zip b/.yarn/cache/glob-npm-7.2.0-bb4644d239-bc78b6ea07.zip deleted file mode 100644 index c98ba1357f600a314ac290e41c337539fa0b4c64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19539 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 diff --git a/.yarn/cache/growl-npm-1.10.5-2d1da54198-1391a9add9.zip b/.yarn/cache/growl-npm-1.10.5-2d1da54198-1391a9add9.zip deleted file mode 100644 index ede69ed636238b191c5d66d510779952426668bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12058 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 diff --git a/.yarn/cache/minimatch-npm-5.0.1-612724f6f0-2656580f18.zip b/.yarn/cache/minimatch-npm-5.0.1-612724f6f0-2656580f18.zip deleted file mode 100644 index 1c536408434845776612a69118e0d07e6a973116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13696 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 P{yEhCEHx(UzwZ7Y1o>42 diff --git a/.yarn/cache/mocha-npm-10.2.0-87db25c7c5-f7362898ae.zip b/.yarn/cache/mocha-npm-10.2.0-87db25c7c5-f7362898ae.zip deleted file mode 100644 index 83292ef59349d89065e52cf0e985d018803280c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510226 zcma&NW3VW}k}bS#+qP}nwr$(CZQHhO+dSL0&OZB{J8$NTcPH+h`8uMy`$w(ls_w4L zwKB65q=7+D0RC|Z)U84M$IXA9VE`hGdZS755ZA_i%75;5kYhIoL0Br>vm6>o z><~!e8Y-HFLJs)y+5$25_SSnGsHOOr6tN7gjE5;h9aCBrVg&|p={?4f0Kgao008S>&qPL2SX53~R98vb z{)hpg?@N6qR&8o2&DfrdakQH-E@y#mJOSf~YDDpx=4k(JV`025B;ezW@d#wb-66O%D#ZD7yHG}$*cvj zWe)cB<8bicx|?@q)`NsZ{a8}_3UN!QTCBByz_G@wJPQJ@SjhlRp?%du1(74T2OVR@ z0@2{LZmIV+zC@_<@Q7SDnq>`VrxQz+K~dA%N|z9yr7Tab%3VDie3ug1y-w9cZ3m(G zi(sju3V4?|J1Ab>VXcleIapCsM%6nGBK*?MswX^tK9}zzJ19K7t%f|8hU}h?m?KjR z|93xBW0>W><+fPK;;R;ho|ZqRSG-RgICGGy?inV_C!A*gPAH}dVKDv5E)`VQ*;>vY z*&tNhvPN;q)sPM_YUrrDD!07Rczl`lOlGksZ<`i*lYGdB_@b?BekzkrzOX%x7O&O= zbOs;Wm)FTQRIhz%Ct4WS#=T4JoW*JF@aXl8Z-cRdH~$&V%X&-{Bh@~|$pG{O>4z!g zw1F5jk37-)vFX;0v;gEJvlF-xD2ujWeI99|A-}UER8R;=pXBl!Qp9^2xpv5TJ%h*& znSalmk$El^jAlQ8t+|Yn~-idC$&hgVE_3=emRxAvx2@V_PZGU)q_`L4`g+ zEtvCaNU9rQrYAY~Fn0mHM}SeRvdaXb?dN)6{*4pvN&Pj_8qq9<9-SuVF?7mqsZ(ww za+Lcb2@9~khJd6AqG65M-R-Q<>J{P-=;=BpeaRXor6a~7QiRj;=h*ZbAS#bT=uJsL z7rwa>2!SAunB7h9RlU}aorpLOlx?72k4X$!MCylw`|IrF{(%4dL&yHQnk@te0I(ng z0KoazKlFdBN;+d_=NnCF`(rkQzB6?MY!vMBMB-_;BMyp%*A->@UU~s(6&VpE)u=h+ z=x|g{Eb#E*O#856`zPX4T*UKT$&|_4-S5rKJZ7>5 zdUFU;$=QIsUo}QP@pH>8z3q7TcwkbRX>6sVy6Fo!tZ5dG&J#R&oFBIl(62kq_u;^O z67|1+Oxx}=td$m&cj2I(p6%LozqqOuk3SCWg4wyV#S`R6Xf2_(V!Wl{-P=FNrr37P zGTKL4nq;JhVUT4N>(Y`p0%bBG&SK^-xud$AHg<^3=;t_dkcD*OfRTe%fyEV3_LOp3 zQ2laQcN#PlPiR&lX~q&ZZ`}A2R~kuKz9;e^;xFJiY?44iU3_$t#jX?ErA5nNLAN~B z_EI*=-GYP%0DQZ_b37zF9Oaiz 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%0AG^ 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

    NZ8+O5|244+_j zxZg`Q1t@apL@T1D<=!`%LHd0;3`>qlbKnHoz<8U%KKMuQ&GXe6ZksrPzy9^FfYgpK zl;FnFsr`sicPQj3t|Yfo$U^+2_tO{wl`)(v1yP}j^7==r9`2HI*wkBoI}FGu7GJYF zMaxXs0Yu`FPd3cV>nUjb7DbKvOSliC)Ag3sf+yr5Ok6@KFxFalBvYvgw=bB`K|OKC zvTVVQvd4UsLq4T*9})kkhkeUQK*E+k31J-HM#GpeC~uR9AAVy|oKCZIhpJrUyT89W zhx~cr!=wo1wB5u)$_Z$kl2=!R7VeHkx7fXN z!(4V)(y^~5==}jDDmXuQF9E;o;!<%qG7@$`G@yO(+brf{u8VoNXkKrP%q9v*AGoL6 zG)rj`|J4%V!mZVc3;K*Jx^PEJc2STY3*NwF(rxWlRr!tmLQ*Gjfmwi{14V1+?m{yt z_jo`D6ejTyN#>qt?uhU?z7`T^Pnii;BV@q9v;+;zt;(?oI3UIn$#9dw&}#A4YwQkz zi*@dNQ;*qTpOyGX9GZ5>4<$p-&MO9{zy9~S-6sVb?=~1M=Ht4#Jfxu|lUbixdRnLr zbQJA0xm(FTb8eA-Z$tv>OKuL4#x-J!Wanesg)i=O(%zz%`gHuv(U?|AY99GGHN7y* z&DS`40nOs#cEn$(RnP5A+2THurP8qQ1dPX4Z9b7N2xG@MsT_)G<&bMJlixXX=)5$G504<|7rxlWe^jB}uHBbaf2W=X9K)W)2bU!^_#1b5N zDAFl(@}hDI zkz~T%OipNmJ)Q^ycx-b!Vvct4LcCa=d@g2*^Q~;Dfg( zOCxx*Nm1HMy!5O+uRVLdReQC$-f=3R9^j_SRR~VYvppw)@A!ORX#L~HlP7auk`nsP zm#>h%10Cw1nIJj`h&-DSjzp2vakjqsbokT{TR#_4#w}%9_8)B`yMI>DI9*o+aO7p3Wh!hEsSOn zs@Eh<{F~AE9sA9pO@VlAgX(`DlU#j{HFhgTZq3IGDj-%C(Z?NRO6w@7 zo}iHrFh6)&vP*2s!|dqkpm8V=Mgq;E!Qt)rT*`COM8G(xZIb5V9S<4&txw2}eH9F? zPe6DFFQCAm&?UAH&T#uv_N_;Q1}V*tg$AA$(G7#-u!hbE>%cBt;B&-@0+(+b9Cd-F75Bb-jd9j99Yz&|szfLFQUU$ z3S`vY45#0aQ#|;@6X%Xm=nudOg@CVm3->?&^s_HNzxVmV!!JJn;){op*R7f$bjc8J zM_{efX0Vz?=WK7Fv<~391FoHK7HrCeQ&?nB)x!sti;97uG6SgJI{IT>U^Obf0pE9i zJeZxL^COK8sKdZA8~HGX-cjW#xUn)>sT{tCU;gL)2lve2y`Ij!%7q)Wt6UjGsTx;y z{Auu>yisARCna^JNJyH^Tt__Z{KkEn8!KT8L^Xt%u)E4NeY6Q92z=+R-2aNO>mPJe zNN>z;!0cqz51YBcLW9o7_d#_Eo(<6Fhxda4S)=ea5cUFmm1T$E%Jz*Rnl>DG zRrH2T*R`U9BsL=d4607q_tjh~P};+)1CbnrUD5Osi`t2is%9$j=9;6hjv26KGN~ zHr5JK2B~}pC`T6y+{uKzyU8$x;fu*q4Zb0Fgz;_kh8!BNkmMBHs#o2c)PTj=ub}cm z>@9+Obg7L=U?C+^rqHG&&c0s{ZL)qGFq6rf8HNRJ+5V1v2b+EeM#jR&LV8!`v927kP_F{ zL?$4<7&_uapb|NTZ{m=9`@)=eLQct(cS!K|qLE^gSIHD)j*(g+u`r0_N?;u_-2jPY zqfY&*w`!@nG**wrMX;#GmJ*6%;0z)cvq2z^MZ>>$J%pQZ&nO#h{OQlb_w8n_I3j8R zdwq|NghK`@1t;)tgtSF|AaGqM8Rl5nuI}NuHPCu*I6f<2Q=#kdkoJ>Tf6tx?7F~Lg z8&gv=6BFZiuOoIC4!Vd+KhQWSCw-vi06;*$zZ8u1MZ~Z6WV0py2y!#hI~ZUfLm#GN z>R|2Twe^)(-@2n`VtnNFnv>xiz;x$r9SfB-O*Vp&eY^~`h6Zk+ zl`hz9&4GVdIjOn&is*MVz*H>3wDJN%3r;U1N$kF*|=JxarySOCOv@Bw7RK zNYYtgZ=HHmF_4&eGspCcH{iTLOW~lHfXJg0#wS0~;Sz^p1Oz^|o&=$HC=SA_IUy>8 zwT$@V7*8Kpb?2ur#$vhzWKd%-?@FrT0Qg^x6gdj>lLI)Z&32eeq+Ef5?4lfIA{e#{ zJJ1LeR*wbppl$)qOkfAlg#w*adITh8pq~*nhwb-ihmshIvj}XR7o!PE#)7IF=sKVU z333R}qL*MvYaBHK1FIjo7(*uV=~!qN2P_#=7P)xTJ*v~E}b z3PJ!E%vLtiEFMSO6m;e;4jGre>5yGGf^E`p=c1SSW{SxmMS~7)i0Yg@z>gBUA5y$1 zsJ#}5FSmfjZ)Cyf0|gO@y1+JumlM?P0tq_jz$kp}5u#Dl>>SF7b!zChg%lasX5jA? z5Co_?amDZfnDlc3P2U&Ja)WwNi20IU^vhvMwxNXxC!+&DMT9vQd?X~&JWWowMa~3= zZgS|iA{V%Rvoqx(o{qO%PB1}+i#%2BhB5ciYvL%@V?3+%H9uzZp&kr!RHk>jipHM8 zl!FPTj{9#kl2~0dh%#JmRH8nYEFnU-XD}hbI&t!*0wDTOw@#D;Kx`QHw_5;oES#X0 zqhM4e6qF-ra%h6Y6OrXRk;$$P9Sr4y!X7}JocA4C1t5+ZUe}1(gjmEQlub+M8&Y9X z=@|rMV-iAiYkK#LymF#9O_^E9+0U;m^z z^;r%iex%+1czJ923GCwamoIl20Eym^b|k0?IRp(TP1tFIuZUx6(aSgp`H+ze=WoZx zv%f4q0qmvam*4Jg{q4ni(4_cdzI6^B?gKXue!VJhAAL<5=<(v-^*F4^yAk7M4{?hS z^Nzu=c==tvVe5ZgU4OB)@%&k~VeV_%u;mfU98fq8>_q3V1K4-8%R26T(QUG{oitQ< zf?jz5H=b>+zkIyBnjb*-HPcRv%!bj^z`6{4Q4d`!_4N%l^5y!A=P#ip**5COw258t zSsIWqq*u^VLut&r;l7AyyIUaF;UMbY!L6f9NkoJ(X9J(Uda||g;>r5%+Vf}O2nJu$ zrac>D*bkshB!^-t5eBC~1(O#Y0n4g_rTN?R?D_8FjVJ4yyHA(5R=?YQvAhL?6E4Gi zlC+gSjNGmOr#9AYVY4*4J$ghVW;Vc+USd{XJ==Wsg63>3Xq9=NHbtRWp={()(NAv3 zRz&;g4=5O;yac<>I_)w`ZF6h++3Nc4@{^bA%WHqzefjFyvyErpMoTWA=y%ZEwT;ae z&o`qHElrg+_*KD3p2*_Smcgj67y)W;$e_wy!7MKL<~b}bf3!V+xw5ggw*Cys-;-CH z8-Ll@`dfI^BZB;%3dIelkV|z0trW9TTcf3%jE0d)cPhNey@oabF zDeUv7>(929OX+JXI+7(if;q>I#JURflA-t{kbX+Cedvuo>* zH=b?G>ZnhZcJfE=7a{{QhXhRHppRl4jH!v32YviVPRf^9U0WMZ*Pp-I3R)%aa@!MJ z0f+)SS+*Eu>Ve@okD;CBY(B=1oS70Z(@Yw)o{a2b#MV(H|MeV1Ol|41vdC_aNpA|;-G4KU)p zaEpFeMTDu4lgOo!l@Tt9lBvJR>2@tj=G%SwQ1dP9!Aq$pnrp2-JJ}wde)fdNEV4`K zI{3&{cB7N+Z!p)I?GLrl&xYxo`zC+jN#D?lqFFy1UTbqFS2mZ__Y7>`hc`CQJ$DaK zG+BzP>=5ty^5f*q`7B&0Z7&dtnjA906) zTxtLre;dc~`eVXN$?fGP>!wazm5jQSuE&pjG#UNoM(B}ih|jk_JtHg{4_V|h-!us+ zUt}(_-0yXjX&jK{9IGDdOc26oJR-Hp(Ya*xcjFJg7Aa0(>0;Dyd(_AqU6CXUpKD1< zq!AObnb}5cl3$GSd@DiHkPmPb_QP7g$tCM8n_0FCF~O%SsI*EW46g;&6X%4XsO|e# zVnk%!tZQ$hHDe>vT#svX3W;z9Y{j_$W-+8oJHGMxB4yx* znWMFHpspB24RrkbF3t|i8QWO8M-t)zaFNqR7O9NLyps^5eSKRmqOWiN`ug_S@b&Er zDVRFgM&x3xrBi!+2HgO!5;!l>Bn9u1AVegoU54IsIU9YX_~_HWfMLK>M!OdC0&HF2T{DX^f9KBH`iqzAtIKfJ zx^o9&sG)L0q@&ei&s!eiNY-w0J9xkBo7x`kO8@V&OYHuzII6~ir%}ggp0T%@I>GfI zWY&yaTH|$uC8UVaP?2C011gTLdh??)4T6=NA*cQBh_n)PpYI)GOj9=c*jIyqu zEq64{#b>+d-uw8+#k4J!(Gle3Ssdc8BvlxYk2DYF+{7ZdliY}3V6xkMWX{p$LnV2R&@Qp$po?CikXQM zI53B3c23aEY`=oDQmG|*DJs?ruWW?~ev{!LIh5(UAd8%W+ha)u&pS2~wL3fsuFf>i z*zwZkH5dz?G;J};nO*bDBu~MAoaaEywu!sImkvUvQUB_b;%o4~(Xu+|)4qji7#Rn% zpgE-b4g-Temy_{$YK(8W)Vpx+1xrV`2#?A68&D&g^&l{#nuW8Oua8lZYZaBGypI%S z8cJE3QNS%1tWOG(P-e1zN*B*31^j!C;60Hxk5=YO^J3T~{X*fu&c~ z)y!0zT+rfgH$gM4n=;}4 zKAW@nDPaX4Q;PxK0K_53U@`C(KrdvHuqhSPUKR}-Q5HXnYc}s>@D%2Oa;&SDdJZX4 z9&Vyz@>8p8rbVCWKwE_-7{RdC{np6e<#T<%!81NJ5en>oW(ZEeJiO{c!tC*yE8E>4 z;1!-2VDb(78FB3Q(}tu=?9vOT)Zl2IdxUSctRJ-Ncg=6wfW8SmP;>Z7aaz(UZ)Bmh zpqYjKzWGUyP2b4L4x8J&$wgozpB6j*_Gy+}kF0x8(+<1pm=x_n(`GFyEV&b|EUsfM zUQH%evCp#sm6=Q%nPG7)YyPvBW!O4%tAXW-e}8e~;DjoWiiTXoAQKvHw2bJ? zl)|c{9yW>ilJT2X%`jG1nQAeKbP1$fK3Cfj$xI zCRk#gBY_#d(k_pzIxotsNVJn!Uvx*+)?Cx1BxuKsX;R4ME_%0h`3|SoG8`9N2EeAW z7YF6oUG3pbr<&nYY14v_r^r5pm7e@)idO%Tx*7;hAuAqWa z8O_X|1AsObtk%*Mb>}#K6kcB7qR|=GxX{yg8)hCpStHmE_*ge|oW~HBQ z()ZYxWh|>nQ)Z`7p2Vw<(=?%~F#R41>C^9t@H0)4<)O-wResDIcxlo=M`1qa40`P6 zSpvfuX{~6Xhk#Fh|ZayoR|c?{Ue+OdPNBYBw&8}P_?kbIlTz$zLkUu)DDTn8v+*CbWA!m{gyu+bSEu^AWe#t340BX_pT=ECJ_=z zq}HWdlX@dU@UM}@+1Up`C|UO$CZ`}U(+NnA7VYvZJ#`hJN5yyki;J*WJ4mb=w9O65 z1`Lc|I0)fP<(WnVi?0t*({V8JFZRZLLePc}0Oo`NS3D}dPt_~VNBfi$&*+1Z54Iu+ ziEbRlp%{3nixGKQgFFrHxfWw#!DO5-MKE0+b)M2;uXM=ZqG^`Og9JeqZ zMhm|KHo#Ba^5I)rvI>pONPwCJOG$CR2q})4vaX$Vzf>KjI@c)R zaz*2%lcL*v;r4xr)iQJwdoT*x>oJ*9afDcctN^;D)x2~PbGKQj^#QI*xMofU{pU1M zib<-oA_0GaW1XA}NSu5+b=219frw250xrRoF=eU{z7=jb=;OD8sRkByXN#Bu;>j}D z56q1`EizoGUKQhF;CLMXYR<8-n_Tb}|EV}TIRR)SCX|EHY>3GKt!SEN0C)>w^{Uik zS$)NvEguGrqLb|iND?9>sN3V~+YgG@x0@O%>X>8jQiu(`F?pwbm*5zJgi6H19ze<0 zw!gwN`s;gNEzsXqjh`R<{VQNmzJ7TBs|EbqzAxW*9E6;f#O1TsbD=1NTsF+?DFmvS zy320ifruqaYT1n7;UTxQxq(UnCTL;##m2&qgw*tW!eZfX=~UR;&8^;fA?Oow&$I4Sw}P1|v0y<~24p^J+R=t3u?Dz#mZW$NA0W$(-L_Cu$Wz_+bw8 zQRrtJR6Zb=q0&XJOebN$EU$k-f@xV4tl6qkFmf@@xLY}T$p!Zma6kJiWT(Kyr{i}R zAq8PqAsWw;rs4$w(EH6P#gj;BO=f$+aULo7MR%$&H}77Jir zhU$517?B%Vh!jQ|K>{ z=sDpm;(QRyES-p?#wOP!==Y$X?|I1RXL>g*{3R>tqFn&mQv?d-7u*aK0{KT@9_#!s zmQpd9k&;pW+&V`fz5}pph>V6q5!GCMdQ7EMbcxwp(^%IJX3B6y`ztk=t89TBa2W)F zYgg$M0|Q^TQ!f}^_+~rxVtI2j(DBPK2ca;DKrL0|<|{BYAnn_57R>tR6K zsago}=B)F%4_hrso0CUIrrX-9%P)7bVyw39g~P{JaeAtvTBdovQ+Bn`CREeDmE8oY~Mu@#mD z%e8`KP{#)n5!msu#9p{oDgPERqW7ZB811~EhlcxL>DnVB`^w=&Vm%a5-8CSpGpJSS zt#J@`l|XR;%Cf4K(V5G+;^i{$n2ZbMmr99VuLg`4X`R5-bUHX@U}%=i6~w*MIi>ce zGdNgY>f1XPT0;4RY87@a<=y4Urs$yg>X^{~@T(I%raYqBTvKn6R~!<$JIeo1E!E6m zn#TgWd6qI+ANyV(jApE1IEg1yQB0!9Rn{O$RHyHCeZx=p8WlsukvOr6W^+9Gu~&SD zh>cOCJahN4Y?+QQ^xfR-2(^!t6cm8~s)x`=#k6q9ePY68Y+I>#ObKiT{ORZ??=NFs z8eyEj$Y!l5@tYe&{Y2AbcV5)-8JjL0CWAvty9|LjK^uYT;4)HXCyPm2SXwjgiq1^X zdNP%?Eq9bFBpgc_ih^6dqE|kL)|?7NgTaflG95}OpnU0{P1ushE>Dmo(3+KmT5~v@ zw7o??92WI8_8s2Bzh4J*lJ)a>S{P2GY}k14ft*E`dD`ZW+6{E;1=~orN zBbuamzp!{*Zn*M>@~}s)PO!i2(oAc2LPuhK3&z9C{xWxhu;m1aMO?i>?(DJo4d0rb z__5TU#PbklW7icJ^p}#&kc|k!@&X$M6?CD6ab^nGw_n@wHxfFd&C$@CK0==%B(Y*?O?(pPeFwyUK(zR z;KbEQz2)4^y*K;nPK(nGk1>z05qWz&TE;STS-Bhr)!g)&x`M4OWb|~s6nKn7dIl{3 zCLa$QOaW~kQTPY5m&!?y_sMIlp<33ZwhvMp$Z9bO2US44PzY2j*l zC36wf!Q(v;yKJ+`Wrp1mI~|i<#&dC|^yJs&$Zi4}K*Y^qjN~>a5^<%OD4wQphO+Zh zIka;PtPtj40na;N@o-%j$}@YYWLN@xVCb~tQA9dSK$N5(Byxwxd*Hjl-#u;Q7o91Z zJ3PvhMmbP2vQ{1uSAe0ESy=YW)|Wjam%|a>Y$2ipSW`gwYLpBd4}r_ug8|tCd`Ar> zNHE>7o6n|EF&J7LwC@}YlO!dRGeQp$l+7a-mrst5^ofwR?{b|~ELiB{GxcJI?%5N&x5hV+>|A0B0ToW(~O9cS$}6+|Za z0#qe2+^E5Lqw5bqnLv6p2N_I?1KEjaR?U5_+p?Sfp=pUj_5ipjU*1f5=UC${Ggl!+ z&TMP8s6i3BDA>6e%13)(TdXuW4n@6mkPTaAW>0Dia^bsDgNd^0IYU%``83;!RyQZU zC%N@EYOk}i54wy;;W~)a1e2Isnql>qtI*Q@XuLdK5|w-*TS&e%ueZ=a!ZAKR;|q!N z@h>OE#YrJ{>NxC= z(PDy5dc52h#P%N{C@);oz_@RM00%sD9O938mnB>^mI}$_xJ*M77sI5Z#cg*fyc-1m zchE%kRdgW<$vzH16vSWgB5{UKP0&%*>dSWGi#Q?zuWi=Tt?K(mh`%ekdZ+mYuIISN zxUeeuSG-*()2s#JPb2uO@wE5)Na6L_Ssv39SYIJbkQT152e7cLgj5lIU7VIXvaavc z{^A_rNln3lD%60|7<75{kY<&jE>=AQl!DW!C*@UZ;(J-PCf1oiO`PVsHSG=HE%MN( zEXH=2^hv$z&(;_>U2Py`eT5cA-?F_M8ANnjy7VY`G1y3xhH7#)J%Z?#6vp!1&|y2^ z?F|ty7+~E2LFwkEz2(Gny=fwt6ApjU{a1_cPG z779>Cr|x(~HD=Otz|#QNOG^mc@1=5sTi4paq%^RG6-!pNUu*etFJ>6O3N$(RHNAZP zV)xnd)Afs}S$;hNG$B}qOC$&%AS|))#P2h#J2{xdyq2AnhMg~SKKfU)-^5lWwwr$5 zkU3);MxVy$8rYG!j%QZA+88lCNZoKc6GUuF%T+$Z^e}I2h(*j}X;`Mr@jY%P)`Gi4 zNU{clW3n~&V)`y5?dH^T*uGK=Tp=cqH`LVyE@4p*2MO8m?02=Ug5{QB&%EK1mTPW^ zfeVpi@51Cci%NAc0umz3J(_;TnL(6rX`E_f z(K#n2Di4>~X;>E%-E+(7EEWS9q$oJ_w>EW)Awp{E>i$c3WiY80<8K1*u$V2Ao79SP zY^M}=r=);kKg@h#AI$@_ONA9Gp_dZ%v87^uKLJD6Hr832&ZW~OYVCB^D*L0BMA8jy zBay5{W6xrtGVFBfdsv{0p2o`Cih8-ii>31LkSJJ36CFfRa3!VR$V6Ca6* zYf8)!%<{q^Yc-R8h7*qSzr`@4GtVOyL7c)+2Kp-H0M-l_&rm(q1hkN8xQIisvaGg< zro$m7<>v)L7D1c496`D}EM5ZGP}$66c*xWzC}S-jMOo!N&p}rC_b!#ZOAiAs?AL%~ zR8BH=)Yvk)gsZG~(?ukYel3Y!F0?LAA?&t!R34F80pmIk$g^N7@u(>Ri34fs#LRJK zok&yQQb zm_|<}YG4MYGU{AN=MJVze}*u2(Euu zh;i(~(LhSJy<=`4Br^-&(PTc7$svidv28B#6Dsle;@5iv;86z@`ZladzAPUf#~*r# z*_X>fA2Jy(<(akz_xDWmQOLEG84&ug84X{l8`}*yvdwg1yHO`LcXy;N-n8!;A2Rbg zu8|W^V8#?!(@+B%gkrG857uVEy)?sOHy!VQ4zv?jRzr$wM!TWnyIILqsodh7T@mvJ?sDRO>BxMRs3PEbKI zlmGAQ3RmI;m-9OdU6=fjQMf~Z1));z-)k;i!ne%3U5HiYnEe;fQjEpVNUbjCcs9D` zV)#(r95SX_JdLT9ks8Lr4e5wR6t(d8magKmccuOLfi~GCz4!jb9Q4fSztg(|*bE{M zM&}#ImnM4IpE2<6R)V>&Iq1p+xZWw*qbab^-4F$gyZS znQ__WTc$|l{K&+59y~~nI1!c@>4IpEk4R{)!Vu>HK(DJ98cI;b&rpIqJ42r`92UJ7 z{5dDlwJY(6wQ#Bb1o}$gk+aPRz&l{c#XKz8sFKGOvCs23lFXxFi@DRe_O!WAmQPvU zDhbr6!yTu9^t$Pi={VYPy2g5);>ShA zby@O|%ChjpjnFOFMo!UaZXBm)#Zd$En$P6_;B7?K{{kSDyPK~z!0upqZEg3v=g)uG zU0DZUU4(6a(yICFRV1ur;V|9*{j3`!Rrr@#HavzOeAT!s=v5cZ@?(gadIM`lw#fj6 zLZl$Z&^f;YY9msre>HN0<9840@iv-G_p{W=H@z(lzCa{KT}F(Wvn!9Mte8U zywR^#E!Fu|Ojj4@tBdzZe@B`zZ7AWta1mavIB8f&xN+fy3bIiylg`+bjXTO`h7wdw z3?<0V3w_G4`$nuyQ$o$0dq%d_H@8|fpQn=U{)QM8n|{m9#$||S@3+ULxJ18w5jWoN zN-&DRFGe(6?(E?fnqx=OiR+diRg?f(L?LHxIjMeBo~+MEd0>s_IbG!hi~%UxN=~DT z#k>P4Qlzqhq*}@sPs6&pGC2fWjkEnh!;<(DrF4n*55B=EDwG`S@?IY;^qRhFcQuQq zLX%;q1)S0vEJ%9}&Vr1iQ>Q9M}9iIHzQ^GN9;XbE_1#2jL1O%jeIP#6#G%5;vkXFxZ`(fO4sD zBHNyH3_TXmE}uj65W6&1H6VVfA&@4ps!-)jkk6G6dOq$nRE0i@w&U`uV#j$czGB@0 z)PS?|kM;SbX=L>jfQnJNbV9{o$F>gRbliDjS?>7j`oy zq#+1sRuL9;$60b^N1D#jXrOr)UuKZQt8L{FS6*PF^B}l6=KWHz-Mz`AcdpvG0xv!! z^C4jp0S9+UGPCu!7wfxsx}iVn%t-+4@pn|LX|uj-m}oy{18moKQ5=OIcanxvj9`j! zWuqvNy`0gu_Jk{@eQQpzTnie_QYZ+yy6)V_YRUU?9v9U!@$#dEtSL*zK!t-8sQ|{$va$ zEYQF=1gFmYaf@>I3Sl2ylVI(i`}QMIA2JjUO%oWDp{I7ixu-{Gn%}3xDn?*eJ;C-I z_9lB6(Q1DT4&Vf;0X2eA+M%yKH!ci=HaD?|rpK;^WafCv!|%(JiAmBkFc2u1YT&^( zB(!Y!^A&D64d754-o0y1CULrh1lz-%&cP^ym4OHRGVWOrF4Nyeq$l)eeWqz~+NHTm zre!p5(Uf?evQYw6V%2m7=RmTL zSv0mXAIcRFZ_A6`#B_!)S*6!ler^oO}{ADGX&Jm`Z; z#HuhIs(~Obf%rfc<~8

    5FPkcpx%Oai|E#;~s&0JRAGuaB12zYfsffy?@h&2`Bd@?B^ zcXDS+$R*REHt=315M-w`K8w%9NL^K#T>KN0iD9-Xb8!+4kvRn`bJ6N3NE^M|n!q8* z9~w=USO61EQh8$`4d#z7nhjx_4V;`rvNc!{M&$ZI%ZwXF!1wbv zMt5^ig5bjhY-3aE9vqhGVckNL%PUAjL6%`aY@+DhU!Okt4t(!lB9d#NSrNb7l%kAs zP>g%|dbD#B_pPA zb+tMWPNBR8*lkiiCY)IZ`K<@{;iNaU21-KlT2!!ViB45=F6(;;$pwLwBykA>Un4*3 zifZQXD6gKm5h1Mn>owP%_-ZoncG!z9OW9_utv^}*n`_9s-Vp7LW;R7DscaHrK1_y( zhl7d7E97Pc*Sv~m@qE&dUT<_tmkrJW*D}w7sa`7;jFp?{S$BcTYD#;-m2f{;A#sV` zurg?_&LD5-`Z9Gy^YV3+_JnHSj*vj&8vQ`;*NRGz3lI>{tJVO%polJ8Q3-Mlg8zBB zO7_6h61{nai>;_3!TP*nXFO^uM{;3(>pg@GDR*YJ@ zvGxS7%ftS0c86?I5rq6FM!XUy7yE=N87`XoLG%>*E0$E*>R{(T-gpBiS<#0pewsGlK5|qavo1uq8nuoGc$z$wx!r$0qwn zq>8o4e`R&~1)XnZwfst2-V0$&91}4k0D6XpQG}#giQXR^GhaFjxhS2e5^CFUrWFV? z1YW~@fxLZA91u(G4$Q?Mw8^6Q zD}lFz)vPO~SZKz@Ex|uQ1`dar1j9s9Wz(spZ_XB%l~5c(rf~6#Lo)Lxf@}KaY47wa zyL(#rg4y#HEOY+$1Ov3ecK`b8uP-86Bk-U$RUz)iP*T{U@hGwQ)U&shxAst5FZNF$ zd@1x8A~t|*TD)5Vxjjf&QSamsScH+Dvk!g<7Ie}i7K6L61kr@5?NnN$4JCkW#Tvc_ zo2q77$~Ju4!F2@>X{-PadWC-V5;V?uL>NQ0vZ2)5h#gAuE{bBE1T}c~qqqi$d4A9X zoAz&EJ42HfI(HWA=RAm9BME81Hw&-%ZN$nf+49boWAJn!LSD~Q7+-9=e{P6c0#5QP!A9?0sW`4m+cf z0YQcRlC)$O#MxmFwO9GBMD5Q88oBV1x!7jHO0IsS>0`(;D-LS8P9lui)^H!Nv>}OT zMr)_z<8zQ19A7P3B&b%cf>xtdc5DOCMl)_gWbAQz3_?W$G{n|-fh7hzI3!kdK%nle zMJ9wej-YHM>)HMoEzN-ry#bq2wHT#^Ma+Woy%KDE;G^9T|HHOu{SY8B1hwT>AVde+ z_S$dVtWT|Lt7M^PGS$l_Cr}Sv9FF!@479=Vh}TwV^+@e*)pBFU3)OD^db&`Xi>Qmi zAtl)mb>ov_2@rFfX}1>Wu8O`gA-Ft+nr;=@EI*shivW2Gm=Bnjy)zfbj^Or~Q9wdm z&M=?_w{#Z|@QQ?pNhk>^lW)oV`S7>TN5!~trT%zJCrexF7@CXhcj)jZ1=nUEe06&PYO@oT&-1665W`WY?~#=*-Apocg-4IuJD_ggT(0;BR?N~DOz6St zwQso1OYNX=Z#YIGyB*jnGuja@;%zod0iv8R=4DjBl$mM5MG)oDR8d-bb}*%aa6B(k zUn<2loScXJK|pBXU;>pU`Xh*?DPf%1vNP7HSPWa*^F|Pcy&(A;gc{%gTqtl*kEIZj z8cF~k2)3DIPG%SUymncfv!G`8#_!2^4h>G=KK9ld?I$~DmeoFw0$7f?5p7fuG&Syz z7pog1b90I(Gs+t-B(rnF+gEngX;E(OY>rEAbySz&k2{@%Ce2j{K~Y#zDwntb{)L z*!> z1vDK!5gMFLdjQUmqrldrDD$gO8x(b_xO;c#MhVC5e^F&l(kRKnyCPyBUcyR^t#nXU3KG!5sPU7z8r#EK=tN;sD3QFKm zRZ1CAx933JdKv;Z7XAm%iZS9+&xTFK)gfzH9m2@(tSEKmO2)-Xam#!qJ*Ekzeu6bb zgX4#T+>+nKoiiX=QTGFZt|L&?3(JICIz+`I^rwKbAnDnqh~k63b_HZi+dGN#6T75L z25%+V6Lt?qWk9&AO1oE9LcA-vPU;2@E7`}mAP`74FS@Y`h=#dk!Usb=%@Th2 zF{#*0AR096^=lG91O(G+NXlFa=jYT+@5Yli9)tyF75CC9Ld8!;i&Q`xiy+S_VyXAX zAcO)Imn~_#-t?Pe67h?!M9ifEYK%SrZjVzb@G;|!ciCi_6H~y_!b8Sjt9r(3)_I9* zp=f*X)7i->XUvb)xJqfTsTX)xhUhZ2OGUm7mDQOtwTY}uXCWxN+oLB>)FRVX zzKjr7KiPg7UGJnXv^vUo#h&=lq;cempl(5#FhxsNn$K!yaTg)jV4;-+QA~8mFe&?k zOh_QnAotY1#beax=<7j@z|GqTs%_P%2KA7|-f9-w6%ROC>G&|{SD_imuEwxKy<*ep%6$hhx8K8r*rTJ*^J+Qf3= zK2g~AIASLBe)Pb9529gu#S;!VSyFp_vUC32bQaclpxyFGzcJYst#Nk4y_fpH4Gr1s z2Fubd;088_=>JOX~zdCW>=9KswAf_rA6n4G;D zW9-q&&tIE~UUX4{*mbbxY_dYM8msr(u?(6BpdxZy9POBOD)aHba_(!)~z`W86Tqh6#j3=V&3I+YBpySaqjigfs4 zYt61@<-Wu!^^PJ(8o5{t#AXta$T>!siWH^Y#_yE!LZgOz+FTLZl~m%~H?C4g@vqF zYP@sGN$qKbLTQ(%q+M>FTE4tyYBd7{5d(w_u~BIC35<)ag%=JVzd=Qns}#MInxQcO z)U)+`?YVfmGmaRZZ=~}b+&$v!a@AwiPp1 zHrXFpqaw2v^B0*q8{J{XH8`>B&CsM{j`0eK zkw>_RkQ>V^)2snm#qfngAqd9v0q%sE=C4FgC}*XZHy$dP7@GjMGwj~S&QU7STo3|^P@sOu@s;c~-dey+0#E+S(nVSeYQZp=i1O|vz@FEw*E@h9RYP?l)5AOg$dkxk<4(J?s&rx`SX zQt;u-OJHOrDvZZvH#Am4k>`35OpPxCr5zvtlGemH*ROBOw`>gZi`Tci6;^R1x+QL5 zD`>4f6AT(~wBJn5m>G#m%WbLh+;mFlB=yMBuzCjv}XpBsC;h?0TN~xh& zBN2Mbdb(#+Y1J&h=u<>wzn}d=dodvBIUwD}kv5yQg=d5{58G zM1}OLH@UBWDI&DlMn#m;OtM{~0TEMt{_&~TLtO;d?`*PkeHxGlISR?{b#FYK!k@F# z)JAf1-kax4!93RY>a^+_>TZ{GLi;tdlR+y-V`)%^g9gq4?$OsHcjF9JX?`>eoP!+> zJOPiP=wpx{yc>P!F+mpXCP(E8Vyh$G16W7b$OVDiApk@1jtUvZ_t z6|)>wy;^>gJKaWsL?@?E=gJ(Ios|&=+>Y@`u z4_7`qT=7g~TCM;OsG3U+(Ltfw4Ew`%edAIpM&Y7+6YxepZ_FR@>D$Q3bD|yfzz^+% z^zK-~(x~*EPf>(`B|Q-unZe!hU3ksFN}`*EiDQY=8#SXvJF%I+54D3}WhVG(4CZZ&Z|# z9UqgQuQj#}Z`BoThWu#k^-nPbyA@l43C6zlG*aYv3P|#HAmUXFpG8eW_3a2gni5n1 z%T|5={eSqsK`a?UQ-<>lA)b5hhbMqBgUgxqY`kBF2jSx9>}0jeM!v^rdFo@&01_qe z$9ote;*c-`oln2ciG-s;EBZ;)E4S3ite;^OPzh&C06p}Cg4Lia(>{QJc50hr90v}1 z@UAzS3V6OP+LXYfrtw|g9f1Oz*OHu0fagFXVqC8|l^qC|UaAFEA_h5dHAVwM{XO#@ zeLNIw>d~uxzloJ$=rBUFM^WL?APCyvR~|3}w z7@dgJ1}Od$%8sZyV#v@pR{oJPKe|6NQ6hQei;Th{=G=@R`-QPcu+r1`KuG(WQFeR$ zuh}wt3+G{jsm&?T^xoTHR-s41WY|HMq4jqOl28=QS;{ky1=BKG4WXTmVmU?tubhpn zk|g2P)LPL$ox_&R}u)cv#Iqyd>MWcR?ucfbCd8&n^9dtv3!0zs+ql* zlhai*A*9kN+tsPLK&%~?gmMdNlq-~{dF}d)oiv<=Tf{2U$~2i(JLrb?P<|K9y^pTG zljhd8mhYxZEa31ot<gxTRb+ zzKII0nRH?0T-Dv${Wt@&XlEnls(p6PU(Y$xggO*c;w18@h`VulDNAgB!!C=hh+frkS@)=;!j=F_`es-P_AFMC=i}Pom_2?({DA(OD`T zVI$u&bOy0vmzt5gbX)A8Fx)uE_}idD8)IpnMI2{6JWC zisCbpXbXFahado66v_03;5BKH4ynD%PWy~vup#z2SPVK6Pz=2Fb&n3zLP;ZO2_VH_ zgt6^VSVp@Q*jjS0f@+VMGw5b&bMF2WvJOFJCk{lkQzIcNiGttt$akSXmdJU-qTN+Ec=(3m%k!nIPU9?*pPai4+{n;74_1LJv39%Yowu0LCO=In zwkx=3UBMn{w`o_vWsm2Ox2G+>=TUD^V+Pexe!z*L zwb^b{(QQp#_n?*5%`P?{ncvMX(;C-n@xwb~P;KLSH?tA;u*}qOh>m5Gv+2>f=`p#- zd((~_SdT3O&O27?Eub{g6y#dRu6GqdMf}2D<%y$`7F@}uaqKF~8_(M#?0Gtc(dC3k zolZCu7?iU__ANbbKZtB*IW1nzk1)Rz#-v(>UcA1|H1u}ulQFKTbuk9AW;E=2c$V1j z=nZ+|rMc|<9}0QxRacXGGbf)H1*e*)QGXTCctk%fhJCAVtXK38SOvX&xmL(zqo()t zXpC{yN4^YghT4H-Ol#-bK?1lQ#GXxBcfgl*xEaA(K%v07@muhI^xCFCK$bDASnVPA z0jI_ogZuiZ%_2vrXov&1#x0CQ?i`o~!IfX46Pe0%v7Sr|vwXP=_c3>OW|am!esZ%+ zE#utm*)TZ`D`Rmfh6THzSJPalpTL3X9ZS3u%IF3HMt*}~Csp4crA%AvrQN1IsroL{ zAoZAW4SPpCJ%qKE#dOQIOYC;)*73Yfvh;Crir4VB6cn=v8d@?_p{^nwd#LUmavCFC zKe`D0%BEq-k0%C<;L6!RLZVsJ$c_C-+VCD#dflo_jeVF7%k~_boMT9!bun~f9!=mWbIjpmLg!h#f zPW6&lJ5~YVJ0@qZLGD8kHRK{1o)SW zM53%bk)&E=UPzvJMI2D8Mp!@~NzuX>1QLh=;+I>j7onNp``>qG zV%Scz0v$)VRC6fbBnzKG=I1;Q!md#`pSW{j(`Gj!IJquy$YtsQE@O5zrXnZRa|@@1 z)0OKgTu6~esqQSD;r51uht+{M!Gx<~7v%_D0UYwH!8HIOMbVf%(4hLSoR1SMMJ$Fi zf|D?(e0)Y1Y9)e2y%{5bR79c>rfMnT!ghVMkr?+gJ8>@DR#}5z-=@NV7bY23y@d1N z)z%0nhfZA=ONG!l;c!OCW)gw}H5~)9Pk>4p&w`SWE#_{W55W)%LIZ3|7Uf4pH}Yap zRE`K0caqRdeX<3!0^7a=&=3ZwOWi?^?TAtK6#>mkg1fpu>Vx+c|I_62U1pZ?*ya@$=r#?7w3XMTM z$Jk{QJV8|<=wTL#Z){;7btAnBJn#ih-L@EWMC9LTLK$^U9E;5Q~fyyD1u$;xOn~pmpV`q;& zL6^%0;LvnhAXEk(45WC+D`y8-SYPCZO=h%udj$$SrX|Q(6lZLQQQEqA&FJE>M_h7# zm|8}@0$|0MGSAWRTZoi09Qj0+y&b&oVTb5JWxu-GMbgixpP9iTHkZt#DM}{wpGH}H z`7qAe)AN^7no!6)wJX<`UOxNS`yh`}7>}Ht5ht z=1S3#WRKTEfnXKf$4;kX%D>20W=&$*1n+Cp2dN55>anV%Yhn_06-f0wsAfr?c+yHi zY||kLSaDiQLcj9ckcxi-QuvIpVc!OjPlxr?621 z=Qxt{A)sBL6Mbw?d_N}UASjMV$UX6n&8N7fC*-(6JFrtWVz6|`GPrbqqg;pE^OR5p ztqR+IX@u)T5oDr?9*+)&hjd%TRvuH>Msh9@5>FaR01zEaG{g`K7vPBOm>%;XOO`1~ zY8j01VCuqRW<24s&#dr0RdhFhS= zSw1*`SN)|(Jz;*xGa?~@B#K&CPdBXulV^xrrz&N;Lj}V7Qe>IyJ&cg+e;HbDus{``mlGSiAizqr{PtsrE`Kn7PbbYP3@BnQzQ=G3pmjZf z2I5ji1uTGdBefxA2s&878yI{O7?e2sg}=Xk-M_oQu69^c#(U3TFIls#A$E+~VqGL9 z78d+rSk{rWswH}JdZ-uD9t0_*Nc0D&?m7WP)N$XtBaZRt0(C0rq1o4RND67#aR5Fk zO9J~}4A6|f@Vyc}>j+ro!ya%^D6m@iyRGX=J$9YJLyRpTh_LlAlmfcsai_L9(FRVz zjvcPy;PciOt^cH{Lk6eUs+pwNHILRVDo)efh>XXHbfx2>3$DjtF3)2%#QQDLj4s zPQ96PLxC2!G?2W2&{$JS3^K(;MdMa7Lm+p> zlF&-9E;ayl%Y&qV?5GtH6nT-yIlC<2Js8SRm^}CeI^whaH*KWGeY6h(igv8FROM7o z`8+n9kLHI>>_Rl(92Nm1HKR%IfQm$ewXxph*3~|=V$kkfXlZRw+Nb5o zN1zG&?mX2)f(@18AxYHo343ep4Z29vKmLU+MBvUa2I&eQa6#3S_X580kN|94BefT} z03nBtM@!CSSX?~Zi=_Ukxv`X!-icwX+%7nQpCNzvQ&G>x`_h=$wJ0Vwd@8(k*wJ)) zS}ZOsjG(BWK(;tJTuANtrxuSZC(`on_*3NQnE zZUROL_)Ke&Xc=76hH^yNL??wyLepr!bvg_5&ZQ7Os8}5z6MCsjsUO<=_{FC`KiM0H zWgd?Y+w$5avvX=I=TjW;UF}3;hR9S0Khp8L2?4$u2AQW$?wj8YP=;6cR#E{O-qLe|oeNSbuGxf$5Kf zz1ok&yRre^+ViJ1Zi%y=dkc48($bn8z5V&8_gb}2|C3OP1Jb|Fr*9WmV%IM;znYWf zjVYJ1rw2fb9l>Jn57Dp)81EDIA&0Fq-XD^gi&*_lr|03C2C*5u!vINcDv%Cqpj9Xn zj3;1LwzmF;gxS1D;!N+GL7O(o?sa?^1(RpRhXU>(dp4lxW(}kY-+tGA`1!q0o7yy8 zvv8_B86V18f`<;28&tN=;z8OJBsV>;iAjD-EV2~cM=kh<${Hpk-T{I^`>tR_^;>>K zIJRda*qt&oHYzQEqIaG?U;S=*clG&`=Px&j1#l)};V^BCND+-Bq_AS6y9@24VM9v0 zMoB$Ls*xp6P%kjm(!kB|kPLx)5;Kmj;(ihebZ9o{4^p4j2CfuX749#n?LY5-`5>rl zjmMYA95}esbRhR-6nX2RnZ;u5%X?(chMJni+Qa+wP~V%7#2r)AA<2W_EhfdcVcPQn z8ad+ohxA^ITA<9&TP`HkVvTEKFe{FvR*zl^Us3n15nvlM%&WTw6MMu#_8vZvE)-Mu z85IC$C-9A1gG1{IB&CAOM#=@3kIoLzq2Pg5kKTep2h@!&Bfn(TQ{Ob#r>*e=?#GUV%l!z6-St=t0se-ZpnM338=vouV9SI7KcM&)mSv+UC8R1o-WW8of!Pv- zz546dXZP;i-`lQ(cW}5@x3RVzcwIlikB}XIYx;X9$U$9%1Wb-ESidJKb-D-twY6NyrnD~ zu`MY6p_;Fxi0EvD5=~L}n;MYdB7fe~$n5nBKz%`Hwy_*Zy?vItb2Q!w`>LToB)JlX za@dgAav?HWM<57V%<1FhoDYw1Z2r3mTAH}I{^r4F$9h|BNtC}MBx=_y^C&8lUBjNh z2E10u4}OTsC1VVfXg@!=cH#HFjS63VnJ+J1kaq3x^mKfGje$&*CTe@5%*eN_)suSc z`^OuGE($P*YkYliG{?Nl`M?O(Xn3P?4RKDfVl*@IIK+~;&!|JxD{2SUH8?Pl)g*GV z6ilocl%#J%ZpmFuqicY>?qcO2(bFM>Bin`^@CC*2pc$N1J^6T8^1>t;fb7Xw z!*YXb$st;@z{wl0+339q%Bbtit+8Js%up6MzK6(rh{BUHyGuS9Ld2ZXT;5xUMSq{|I?v3>jt zcMjlQk9v4!k}(oqAz$A%QwcVEdSbTOG!{zlh6AFO)l_>qhO7&X=p2AtLxEHBVNs7! zw`JIOu)ezM2BhBfN$X|#l*5OdZCL<|HAO~%zU$H#*~i)@P)#wP_8YF+nX zaRe*ekUt-h&tYPzTwZ>6bkHIVjU7um&y$cfL5fGU2&&6W48gEVbvr@K)}a1WnZxdH zrX&Munq#NLT~104i3E)e54jx?ubqJ9id&qu6S^Ym7Nk_w7dAQYj(2_VjS%+ADLk@j z5U|W=&Sl;j^(n0{lffr3XCcQJG=T$wjS9zvPBp=;~BYa`yg{YJbnaFw9M+y^poPHa3;e&evAgb%NN#1cS7b09Lcn%!TioPIQ5Xgqc??QsjFHY$8{5*NksHrK-7z@>D4NynDBz z%xq~v5@>W9J1RbeVQE6oaL=`T?iS8vt7hYtHgm>bY-WpW4Jue!ra_aPl^CIo3ksJfMs~jKZFRaS0x3(k3;A zs5hgi6@jZ<;3XFrOrx4pRl&v;rEu^0kwXBgnGrxFzI2oOW&k)(J&wdO@v1EEBu0B^%T_Z@T>FZ3@pFb9swk?qP+K-2=OpTxP7Am6d!RZk6yP&BgpBGT&o*)$b_<;4dXJi|n zvq+xnaw_zVjumgr>Z&Y@j3iXUlMv^%3kQ;{liYn#EC){2Y}m3^!nj!FC-MjWA}0w* ze@LG`=~FT?eTov1T9FbpfGu+@M)vrm4s^IpIM*mEGFB@M{;vD2Y5OtI8#pg-E-1p- zp)P8>)ejj+CkCNYW~a?Xfl z;)ILxwG*;0FM9nzPD83t5C?VPt}}1ELZ^|8-a`>pno74NPJ4Z3Eg^%9C#nb^CF({g zhwP&pkQmqu_@)9+yfAfsf_N7VSrg3pWkumbZy#|*d3Y8@wp>uXd09cVw{olym>QWA zU15lpmkLc~L1S^FaiKZ!k?etrL$zo1w<=ullt2gh>)NM*@KUvwGF3KhGrTWz3n_up zd0-h%lj}v!>=suD1c7aFbtK-X{aU9#bvMz*lZ;E}wctDB_w?}q*lSV(8R09XjObs^ z$N}~>kFKYdM(Uc#YE8COV2gFyYU%Q5n&W4UFLbWSG+pT>kTM3Fg|GbCP2dzXb{9%nofP$T+Uw7-Nt+^B|=MCyn zi%2d{Wv0=Bf|A>pD%nf!E6P?m$DjVRkTH?3x7+pVe6Qg@1P+6n6TZ$BG6L+Htdheu z9dr6CmB+FiPgjn6qc`Drt4kRRA&DH5O}o2-)RFUa?_KQ|A<3g&XWP?v%*>v_`Oqf#UFLbN;*)cyssfEcph=v}OM1@hp`N;kut^*5hy%5TYl$Bs z1JII@90kO_Y6R;!jn_Pd_G2NTZ>N#r2$zICvm1DhX||(n3eS(1G7sU!lEhsfIbDg9 z-&g}KN+%j%RyWtc|Cab+W*^0yl*PFqRuQR|b)_ zmbg)L^z-l4@xkYC;7^$x?pvl+9J;5pVJ;j{SQET1sRzE~>^i$Jb@O>8K*AaFb}Xt= z+RGq7?q z5lqn3$*Egod8S)sSpcUpE5lJeLRrd7i8aDhiM{0AyMW@Wy@|9^r8T>olRH(jNrjw6 z;wE~lR_SDZ-khr=v&7vu)DtJr6~Xi)m5R?Q&h|F+k%;;X_V>+8nUtE6eaor}y}b1N zpRy)I_80U69S};_gU6Su06d$uUo?V+NSqsGLh%i&Ozej8YDbXum}>x`;hu1#;jv?M zmw3O18A4t7WcVJb9LOc%CP?z#`kW{D{tchtv%MgH$EUUdSIXouUo*M#XR!NLatiOy zdkXK*JcalF?M~tS>z~3bJHa7-5XZdYPmNe$!qRWa=LFuhdZlhPK<$cxl!dBA0=+}{ zyX49g(m@c%auZ7Q5cN-ruZn@n+hDpMVekixO?CV0ddqcAsn3Q8A(;7|FKc*CNq8M#bhh|=uJVvc`D-l13RAw}m8tf*&YrtVpfW7iDu`gFXC471Ml$_1?^^ zMXl{8t(`fWrM(cujroVFpC79J+(U)yA&A7`m^V0SV!n$2bo%3cGGw|0!?m^i;<5}E zHqx?6`0SXe8Qj?aC<)0tl8)=kQ#2-PSsq`{<%CrQhzm#41KDsLb|J`eg|J5E;|d|+ z46YE1`uE}rp~oLaHZw9%_+-S}JN*lEK+GCP&fUlbj%2t=xPJoT)WC;GdLb_wrUjLk=5jF;$I;Xp_}VN*Hs(3G%dX=fOt_ku zD&VPdtKmCfNg9g zAE_%XB!F;v2LraPCr?)F=qwExIwoDPQGPpgN$Z5V8P%e4@rvqp$1og`za$?ZQ;8*sy27z1rs7@6 zXhCx-4Y@!VmM))E-8M!s)YqIU$OypCcL>;fvOGD|KrcS6v-3`9G?jl0k!mP;t0pBF z0}}Y(A)at_+3w(yX}Hpy8Np$J79HZ*z~nb8rjwJm12B&O<&K67EzaI7)yf0BvnPJt zwne^$g;#SVQx^|nKtdqRg23bEMHumh<@u@gb_L0YBO z7h$HL&DzWWGFD@4Ld(PI-b!0IP?&|8a@#-A7ndF!eoi&BLzt=6?mt*$UxDQp_aC_2 z%AenV=)XSnUo{d(SSllTa0T1G{vGS9pb0YG3Q-t9jZjH$^d7zzr$$C+ku2Z7-+cbe zU;&tZXJY!PF`cv`UVDEk&OmK3InT3lW~M7VS-u*ae2sBhzFL4Ef|En`);-2XRwXZ9 z68OGUwpa~(eTK#IvjP4Y8G3~(b2C_T(WVHR*ml_96B`a9HtP;8YfVdl#$LV&Zoe}4 zIT%$iyjfdZD||R}2kL_LjM$wUPQ=daj=aEz*>lu8!5mD6fD)t+DCi0PM4d2m>qxL)5Zv$8Lnc z#IWV#OuroT3c*G(-I-&Yk;TppvSrTQNFyfJRaPm8llWlpE;LsjXuVIf=Sy4cqU^9? zs1y7O4iCfqVvaFb&pFxfO~6IlUffz)TLg^ya|D7Q7fKuq3L=4Z+R&B7H^HENBs3Ne z+eYBwayRzaXf8!LF`?L}`+S@#XcLldj6jb_^+yaer!8Xqkfcpmrztt~387oHBk$FX z_Kow-FX1wn$rX6Use&(%B!#XPm~h+}a&3^)`u>BE5uB4X@bVzDN=h+-aXR55#UbSp z85nq`c33R}1pm5eUtMHa5X&&iLZcz8U4=jit{wa0$;}EIDCPYL1D#HWB9X?H*lC`J z3e;*d$cU9prI+?vj2{sgPw=|5I1)Mc^o&W0LwzVIuH4r>6em^R^|L+CUitl;w(NK{ zFS#Qg-q?J zK%D=rcXGUPJa(Wfil}mnT`bUX(_^vRdStymXvf+jGP_n(T=&UGs|{`^-c-Guf+X1= zP;avnCDCARoE%2Uz|N>foiTFxZo7y#>!^L8Qh zDR6}}mLWGoBOg}KNO%!zDp631@p*w(Aec69oB5QLDBZYW^RR+I zYxiGSmuZJ6R%+VldDqlz@(l}-UA$D)2@uT700hP-<(p0Lj){yBy_SQfl;EXs34xw8 zi69XKg02cmhW0PYFC_8EBy>P*XDrDdRX1=Zo=T)n3si$N?pYj-tEn1!CN5WCPPOPU z6{@g4uB>&HwKcoYx%86a>*aL{HNH_Vvc{5rw=A#;eBpt2{+r$&$b}owHfGZ3pe*{~ z$(2NNv8Z$6Q^+E7@DkEnY|={>Hq^+QYsp5^`l+C^JkmBms#cBFSr6Tqq#Y$G-%2`;g+oA;w~z6d_rVW5<9B`|&UQbOD&Kd`DOW6j{TVBJgb2 zR}pfM8C_x2g-iHT*qj%675GaDrHP7y;i&C`4O_c?ugRt?2Y?cTulCRP;ebn7Q7^ zAc+1bmvV^gKwSVC$DPm7p&-;{t7aoKN5HBauZCQpxSIqtz;6|4AfOkRms;lFMy2#y zF{-ElY;E{}JBMS5f7_$6M^M3cgF4)^=>}Mf2HKXR&>6)vaB$I0HiK4DyuMT>E zVRv2;l!6o7RBs|^c`Q2V3k7MzFEe}c>a>s6SF(Xo%8OkZWqRWj;5X5cGp;s}Xy*ya zXl57ICcSqUH>A5ieV=LfY7Znv#Y>b0;&g!M23PNcKJfn2_czg(KGtu00_Em|fAk@W z+fxeQi(IGp&J()QQ@{)DHR=%c5ScCsvf1WvV2hNmS+`>PVX=l~v3Ja^Tc%(xZ%~-T zgwVJegv1l^!Ci+XT z|Fg8NPe1)Mt?K}yO{8_XNPlKTzOgM>wA~MGtbUDg;1m#r+qDO#O!w~DF&9ei$-4P= z)FYV{C0QUpP5pw9^!U}hI!|9sdVP5b61V&2gP}|zsd8O`)#m7eCI(Hx>3h=t`%FRK zd&HAS&tGi7CU^kzL(W>Y)f!3@&co_9pv{_pKW6>@ZGLKefNbVV`VDuBs8?oR8*hlv#(DYZT6! zZ5Rq9X0=OBZ3no{C#yeZDGI7g$ghY+0JHi@-K-6yI#~D#*am@+XA3g%iOqN%;R*qm z)u^-X5ceru5iMA^ZKwd&G9#X!!ymW2@NHXT4>%bLfLH@+u#G{|2bVKejN%0e>{lRw zbRDG$NQ)f<7e@&+L_W_Y*9H&-VKi++v{M&V)hd9LgGL9q-yAx?og85z<>s~1E3ZZjQ(wUan`OFl7hY5l7+*nxfUJ0&?~o06cD zJ);HIzd9Z|&s4W7!83NBSSJQVflr^_0}EuPY5jOWUOg-4TfIY+Bq8W|y_u>PDI-LDDakZAsk_*$KHn2Gw3?Z> z7iKkjPR{sX-byuRQ0;>`t96kOG~>g0s})jGIjEc_%*X4_PFhUNI0exn+=xv(+hoGD z%_(-QKaNVnq;b>tzCys}K+IV2n>S5eIp63v>Qrgn#uwpcV?w!G28ur#Fn`#RcfsQ_lw>jq_qdt6t&oEEWw#ctF;>)jv9sNP}-7P5^};Xd$91 zEIvG$&jEDWO;iHlO{Ue;@!=tJ{h$E$`wc8aQCEdQqD9twayLDO zZF2K>HbHAuwr;>LuUed!o6=Z#ebdf<{AEP2QZHnuxY`&K)_beZo`!;OkEY zUlpglQI0?V1h^1Dw}P)<+pxCvaJ9IcwDr&Z)ra20E{xWYWdz&eq(=JeoeoM1;PM1q3UE;9-;B2X$Kzff*T=hor#lGdO^E8~ z=^!DgCES#=U2r}E9FR@hiM9!98o<@&L$LZ7TVWtm8vxa%iOt4nUF&D%rc9AJu zzzWl2nE%b*0VunHg&hD2x3Z7g zhit>knsuql^CPHZh=FZol!6IOYIZBGl!5*WipDo+~NC|9w;7NyGv zU$Xr(?cRF6_I#19?$a?#=yH14hIk^gwf}-MJRVPbFba1_De2JVOKwBvKE#bt9a@tV z^`xB7#mr`dgs5pJD!xD=K6I!puF&xBWa@$91rCAiA<7@TeBmX>KSu$jX&OhEWn#@ z>N(?Ip%ZZ*&?=qe6vE9)YcTFS|A6!KKS)6FjS164&2U^XD4BpdzIwT_3f^xJX%&c) z>H}dQ^X8W?gbAQ~pPP!jIG)n%$W)=o-I}h+#XPi(GS^Fu4yO}K_e^8joQV`EO(Pmw z-7-v4(lFuhBSW+pr%am_8(gQYTJHA?29jm*l`9r(AE)Pz{TAkm!=cwP+!1tQz}NY- zBiQCA8*A+{P_SUo#iEV|hhxxPJSa7<*-u9g&@A=1M0|eqKt<;wpgVey70VgH z(LjXA{b7NZGXkhe-r-FHl%In-O5FC)sh3tYy$X*o7OoFMX}y8h9R%>Yb;WIFn|{|{ z-h&ax0vQxMBW<*6OJo=(3E1Vj3z6I^jP&4Z*4!8N0n8^dj4{LVN{oWG%`ASOC=&dyv(TL9`RUakV9`2M?3lbMuN647Cm?)wZW`Ls<=B+=`CpA1iGK_vGCXx^p&sPar6+4<-Yzk*&5miuje= zLSgAZ&+W`yWX$40;3O-pUa(P_64v}7cF7~m%U1b|>9>8&hC5Rq zcp$j4LRum#TWl5=ri{A%1WxL~h)jS#@p)J>)v&PQxLWdQ0l3Y!l{ z^E!Uvq758l=3B#+5f~&U{QsyiCA5Y}LPF#Jk@F zYrU)j|M4ae3_dWr0tefCRPzy~^aHrVnlJQ}wLHT$GN0ucrkr8CM1}o(882a%KOBPl zy(>k_i$hP$BQi@$3!UI|F2owu4$TE5oVb%Dn_C!(m>mY!^#ykaCsQ?C20J0-wNUlO zEohVCJ_)y1M-0QVz#LFstCqVuUR(W1E%gyXat+1-3w+4OZ<<~w7LV{J1rB8V-D(^G zeD%b4mG^yT^=0EyosX22*VZY{Zbldk560yaP>RT09Jj{a4T@c9qqc@O;b_=4e? z@AQI%GY&5-s`BiLG5NL-85CTFh9|vamUH>s1*m!vx(P9j*-5_Leuush_5aC-Aq?U5 z&ce%`bEq~)XQUd;%V0374t;rc@812r?FZjG;)te7a7hwQ36|4PW_D&F_m>`iSD&8* zk@ay%g7DRKNe~RSr9ki)6CmgT+$q3=8mG35-}Oojb>T`aK6ALe4=gNWYCUN$~RNYNX;vCL(;Ix9w~ z@SH3}L(aKihSLXZw5Fn0u+MZYiKB9=5fn`Vs8p=+Q+_1oif29l<;hKK_O1j=bFS;s zJOeZLMQN!#^7sMRJ6VIa;96BPow1l*m%nV~u3HAfb*^zpt!;kO#-`tcyJ4+?x5MWA zoyuMWuM}IoGB|9y9IG#al?(4Ty8DpE{p%W3ju`idqg?G?=Znw0r5W)`+?F3T7v1lomkev=Fl>mdaj2L87mI;( zo*#hU6e(jr^`9o-g|at(=fG2liXEbo3AFM2wqc;NihTfF*cGVM?O-IXA*p8ZVBq;hy(J^PD~gT7NRacF z6tOB-EG9nwE>X-}FtT>sFbIqrx2%F5>kL*}sHLyfoP1*x;|d37XX9pqWy)U81x7DViTR0ys7NQ!Caee^Tc0DGAKD}CVT9bd&q-RVdp?5 z>?#DwutxEre$zBjav;-cO6pv^(J~|mKh(MG0Qs)whN{$QKDZas`o$6f&)2OYSwl6q zg7}4(61W^;0<-Gm>PW?-btG9iq-M1IU0B4N2`wk^SDGYdQBt=j)U>Bwoi;jk&KxS+lx4?W>s)$g2=l1yj0w=7T{i2P=qQx=POzqSAiOC>ej{FG z)(llBpEJv2WY63T^e8&s#Jfo)&J?_hTxg?X9(1d#(T*cWAQsBhEB4yem;KyCIzM>w zcD})LBx&MUt1P>7H?so4h)Rsoyk%oCWq&9$tiEg-OasZ$m!Ja9w~0p)O9`mRZmUiI zwd$qBCC=#!XHQ1i)_Cn-BvpDnsNh#@spf%ZF1&{ScIn^RwJT*>vb*cMKIITYL8|{n zss3);MaiHwQR^7W6)o0C_kaBc>Y&)V&0xH~4Torr{;l62b*E*nOT32tDMK)hJR>TI z2bOZFbJuy~*h4Oo$JQHw(AIe`4tvH6Ej;(qT;p12T$+my+%(hQYn{JqCSwu{U)r@! zyP29^KSg&A(XxT3cLXS!L4pp@MN0-!XEF;LnjxMeTqw)+W@YQ(+Bdq<_N`%omucZj zriI_iolj3I#q6807)eThQA&x!n`GIVbdZ|cI|=9DFBqRgy35Jn0LdH4y#f_Vg$B?RweoNX5{-c zlTT)Wc#elS0u%U(e~~8bAyVS!IS-5lH9 zhyS_s*-~9a$P^Hck9Yd5sqUSm1ZtC%{D5Y6d>X`HOve@voMq=w53@x3nEe>ZP#_jt z@jfrCzjM~KKvL+vTIVT}CcnPzIIi3CNsj;e3V_{zbKJ|zM@^H+9ZYL-G163QT^3i3 z)0Ib3`<uOz(RTYR~q+W7DS!010gsiu`{gSj|g-YSQAL zPxwwrXNcapxPLDr1nTn*2;IwZ7&Fn_((5xKB;$P(9b^O(h3xG}K@a{?1>&o`1JGh} zn5V^RU{r7^{S`dYFxpPw{`8CizDy0Gmn*3W4?}b>MDsp%5!C|M)*mmwdZLy9&z7IA zBgLjUtzq!@qMpW=D-S4F1h7seX*x;dEIO+D!^L8=$M)VDz~lY)nOUalTrCEX3NncO#ITryprRcXfY{}5wt9H~1stpSo~^HS14zA|?W@`=JS%|^|#Bm@OC1L(_Df-4>N?V2h4freR`n!&)$W6!kyFz)D76fyaHTL8$!tF2YVyGqh)Z4UpHu_|!xk?#=1 zE~HFIBZdUqM2Al^xm-BpYI{sSmN9^6F)Cu9Hdr|-)))qVQB0A*eUU|Rj#T>n6Ta^N z1JcNB4VXKR?HP=GZ0MAvON8!3n(<&US6jub%3rtyl`YqQzIWLHFw*nObli)~`IhL! z;|9x#kQY{BM!f3vO}FJc$t4z#c?2^f9?L&tVa@T3t43h=KOYMRY2Kg*fI)5g?|RMMSwM`XaBe+w~mm7|sC@=CA4k+zfvjT(T&eS&wvAsuQDiFqvHx zv}YJ0r*GMh&r_Z9K zp5?fxh5mcVrnKAF7f&4n_QrAG4zqW5VDBmvF(1`M{moj4r5r{g z1X|yEzSMCJ<0)PN0Lc8jT^G= z0-6&=cn2Y&37LEm=S1LMJLW<5V-BBEhZRejT*v@}xyOBM+^1ErQ(uZQAYxJDBTUZ% z^WymIu%UC*NfGu4lNZ@5QxFacl#^L}HNpw7Lu7g-+2To{nsp{ZBP*Fs$e5i@<$2w* z2$nIg#BkO8;^cW=i5RVjFnEEjLgYIxioi8o#NuU!v*2_XG$mQALonC zHUR;$_FNL6#3A$dv(`Cc2vx(2K50td0E%Rmi z22#Lb4XE_xy&2r059I!D#T~jJQ~wN)p~zu~K&x>%8VqY6a15@1#{-gP`W!F=Q`|}I z`(8h(3LzM4ngFMXa>^#+>@K2sX-@T2u9R~5OsO5XxQ|@KB%?jU*NFGO&2(9ln{LEe z+$YTT-~adjcbE~vW0Yq#A0cz#4%;73!v>ISBU3xQ$EtV2iq#o2&7xl*la+H)oL*G1 zkjXHselO?lR0b

    TPFO-eF#ntPOl%DQohoNS?d$%O`wHxe(nqQ>eNUxzQTw&A= z0K1w5I@hou9K?utZ(h|PPQ4Y)K^O{yf$b-Qwgd-8*)~beNt*%)suUpuw!!F-C!s8! zk?tbjmK2Gq8tLWxY7Rktur-jcbKJI@sG411-hCu|d%TK}WafIk!8g7o4d=KMMNamJWCluoogVGOad*Y1aRG-lF-st@D zTw~6&ZuZ{&5WaGHj9LAozKhw(Ucf)h$3#BqabSx-P(t&f!MXU;Yg*S;@|%}H+>yDQ z6U~zohepW52_OxR29>NQB~Y-KH0PvO9987suA6jq6iYq4ACv^F;yb`;uV}%9Q_R8o z>VW*4A(C>he;2Oug<5EZ)YHZYkoBZT20r3>@!$XZ|H;72({drl#`gULvnXV;6BHv} zFO5LF!O}!NKdJR9H*41;xs)8}(mXB;+UIZiS8;nUtnope#T>6Gg7_SK;5;l}AkT5p z<%Vp~Xm+6TPeNsI9(1HBDjR6c8jkA&0G1|jhIj8u5FVIl(4I*K1FCm4X7@n)62tmb zE9q<5^&r$DSQRu#ZdE|)j6I+5kH@?r=oCE7Pk?vBk>1{|vD|je0S7MobKYjw)s_8N z4<|MF7OyB?jPO>M;(!02|F?QGUoMTxB}!GMJTBeYqFkwK&ZFX5=65&DYY8g|3r-GH zu+nWHU4Fm${23cs z{XT@0zm+S;&9kK`x97)pK8DYypTRYmg8#i3C*Sc8!#kCT0n15dIRilyk;6x9*GU|O zc1~2{#m=>@wS&?HV9x7+nmboD-zFQlz=oS_l3c+{{zHdN_0nLq%0&>^inA|6QQZhs zbW52I2v7(`8N1d=6_g6AxGvCgB!bu}Bg^apLeV|YMi?RhV>uY4L=62^n!%?luVJLw zAn#Q#Ub8g+7nMh?aJxP*u`S{nz2`zwQMp5Dw!#Z3w4Lb`7oK;30-szoVbRrimuAzi zvzYCWu-w2S91l;1=zoN1dCe7h_5&8jLT&kY2y>z59(otzE*rviaXbN__TkS^(gFUQ z@+$tw?GH$cQ73Ut<57q$MaLWj1~>-|KdctOusL7YM;P~}vK_E)Ai@*GEL&mMDDlSLY;rrHd@$<5+na%RZ|vCf%VbeFM?87CUB{Ks=97k`e9!5JGf6;alWv zizjyh=s&3IlqoH_csNE$kJxY_=uysA=pMR7q93-&-5f3xP|q2Vec%h^3oL|AS!VUK zOY-uEs;umTm&=P^LR7zOe!>3B6_CIJ<_a)gfk_GYO=8}r1)y)>1#7+`FZ$=OJOxu@ zwR?lZ-l!xOIv?cnz>3&EJ_G;R(&jqnpSB<)VmnWY!M+65)RLwEVL+b0UJ%C#UU;+QtD{D)@>L){)$!!_6VLT;U~oWNNyp(v4K3 z5<`dnUyK2<@n98~SAFDFZ=QLn`WMCrHg@g06*N+v*HKX6y5Fcj9rEUpanq2t*@y(% zbc<|x+3UB7{2l~__gBCx8lZvqas)R!6=7l$iTr9EWAV=0B`c9M9&Dvd zQ>B(VB>~ai6nAAdfo?Mk!w(G^a`N}gIe2d$jCM4Owy9G?az5t6gR~U=sMv`(MRGZ$SCyhlC8>N#N$kryYM`{|rn z!L1)0gSQSMBLeWtCK%(5N-;x4hED8|mgGXW@QliIvrzD4 zfbrlZ6+bjhg5nqymptwG%YNd~EE=*`_`xO!gnx>*YQ%v_S$*GP`=W`Qk6EXffw_38 zTpw(SJg$l`#ZUe#K^i^s*bk=B)A#xTep+0?DX*xDr4pI5#(fl#E;4C!SQ8k-q&F%~ zkS9g)GuTYlHeRgq9Y;w&n>0E}HQy4z{|e(q9zwKp+?8~GbwB>N+bM=TUW=cO zNGb3|t+t)=Ks#Zsp;+f!M51)spcK=|v!_}i{ceQ{0Z$a&aPF{4X1-hn=h`Km&S*b>!7kQStd4@=0-p!>Eq+^ zWREOK*58AK1JKNd)AMX8r3nMN z!F!OQ?emY|Bk4*mpjP;kS8gqjGWsoPuhJf8<&kjp(T%uhX)9V>XCkFowI*#0lI9su zq~0u6s@0rW!;eQT9uXN2yv>~nqAQuqXif<6>Y;>Ru;~@lvr(+z33yMZANr zy;t^{ z_lRn_REJ!SivAS5TfH-x>mQvMbmAiOK9Iw9z--47o;4sM8X_XGYmdpfIY5xVeL(<6 z7N1XV*xh@BV-6rw3r47xu|xy1TiDO;P+_v>KP~7_B(i3J@DW|Hih!u#Z8@at2gFq1 z^|BelR9ZPtDd)k3H4V&!ZyNOh1bTAGMP#fc3*G8(<}yIkT2Jd*9xXOMH#{L|Uq2;y zOR&%V-OdiS&&&=!rn5r>=H)CmJz@pLbT{YU>`vC6JM+g{$!?}bvsjM!2o#HKnnNIL` zvKy6Gf?sWV;kJXBrWf&u8@4z>(E)CWLT@?56-#@}C`IIki&vpoqlBbj8EG!8%UZ2#QU{(XfMglBU(Qi zdz}n^!znlh(NCwAsRQb#a49{X2et0+k+MLg=X`RwdtoO;x`h0iE&1T)$i6Qb^IJOF zFuGNPTRwlDw0jsN;zuIHCVvP_NjO%*->f^X29vcd<5qnt=%v1#w2N>*rFM7bU|X1> zU<>Sj9_K>x-YhK&CBC!H-GCU(9^=Al2WK-8qM3`)$v_Sw_}3xHzp!5O6@oZCQbZAA zrDvoiYX$~ekHH@gLC$txuK)Sf#>;g^#mz|NIF26tvvhJ=WNYf_!pt}pv&+maQRybMGo)iSufet$!!DUfnF)`Xy9>6ZouS7Ili0SH-_@IC@ef+57x_rkKiHhhWEWT@W4K8})*As0(I zfrk=uZE$&)-upf|W?nzJzQtc$vBZo#G7YR8gR*g;+vP7IyAqE?W;DVPi2|vVjf`g` zLeXmJTzAH?(tF>YLVhdkli6vnAn%g1(VOxy z8cxkl;I_;jDtiTVx4tEdO3K5RgGuLcLaPAp5N9}{tl2~RKX|}P@PLk+yD2Vk8g@BdEM{%$0YQObXn%;$U^wci;R0CD zqj>c;xp@tGeblxAclP=<1de-sTklwua9A4o`FFsa{h31ARI+CQcNVc5%*lMj*52jp z7)2W+aFFf$tp}}#JC^4dziGfX4fz9FkcWl`xyV;I2Mah)omvdwhC#jeniWYNP?Gyq zNgh&?2NkWCp=5`SD~=^pT0a<%>vIg)wRyIG;Oh88s`x)rs#s3AOL(s+IE$#rWEFmm z*n7VuO6XXDc5%a;+hQ1~bZ#bSvsy-0#R7fsVYoB{b-6+K{Ycs7=BTdC_OLP9AFR)1 zWKF~wu#l-<>hC(+1E7k#2?6q;4Z?^tVD&r$_(DLd5lp;h8FQkIC+;Zw)JEM+;MX8W%mS+<*tmp{tfAw&qhn^5D?M5Mq%$ zmoAufKJe>{p}r<(U~TD>1o46s?#)tKCNT!(MLI+0`AhU{$*h)g;JC{*wYpqy^*c|o zBEODG%aMJUk&x)mApP?l0Om9fgUq_j6()VSNG@S|=N7w!ZKD;xG%vew5k#}Crrsg> z1Y^D1lJNEIW))HQ7*SwP5aFEl`vHj5G)^#$68s}Y(E3M$pyjELg*xDuB~Vi_V(qGT zeOgE{SLLe#TutbnB$)wF5EPViEOs} zL#5C}Cq>B+Atq?)_-I9TcutB-4~%xS(e!@Y(HLctoQPrhWkv>FYexto2Nrk(U_*cl z`QU?ub>83zu`hf1@X+^p#s(4k@G3(17e!4XjF%0Cz%+?)w!E{kc;Dg$*jA!6zgab3 zJ%d*T_o?x_L0`}r&|NQp_nL3^Mpv0Ut?_!m4yNM{Y@mDwHOZ)K4)e~*x2S*KrFC_D zdJYbXN7KfBv-aTL{rk18?`z)yqCR*o>>r)IseLv5=}&m>0)XMkpg-(^&Gy&4GB&nq zPlgZ^s~~(+@7ByQ%wGog8h+Pi%TNe%bqJ@2yW^0zf=P_e?&IFs@EESdFBLXBf(Fvp z^J4>1-zO0Oro8MpG|&9)EOyT>PF|(ejevLfsaSxI?I?29603hWQ^dOw% z0Ifzxgv@|j$!8~ajK7m-ssi~gAH%!;`P#6+)4o4X+L!FZ7$=Qg2w)MG;x9>;%H*5& z{d0i9%6*V`7c9q*?oTq_{lVT@faXarK=4_o>0YFNtktn6>?q*NO}iX;vzC_$5M<8)5ejsa=?eu#D^dm7w8#_>~`{ZCOsnPuenQku#S*&`S(OD-2KTSr-dOPq)IJ#Vh*qPJTvvr zfqth+SDkrrpxB|8wvlr*PVhFfn7|f8+Fs=?+%;^u2;Umsgpk{@4AY7*0d`Aq)%`tE zb6O>kXRW|V02rzwMDl5bg_x{>q7!{nQ==xLQh~Hs5#azQOJZjXV9K2wk6Y! zz&`2HjS19gmu!*An`suBR%vq>J&sDu)_>Ky%Z6ifzRHcs{Uxh+IZGNaf8D8y;)WW4 zI92fBlD9S($mZ$h6e{U(-=|`A5@Mt$B^_Vcss}3%wEdX30ENsVBLl4XmB#C zD6H|nfM=xX#%ZFd!JPybf}i07mmL;k;V8Higz0ibs^lZjhVQXGo(DyTXjma_VQ&<;XMeuG6q+_C?*kC~Mz|ay2A+M7n zK%(Ub-g46!mk(4C{h+{b@D@g(cN&515gG2xq6BhDCej2#5MG85&CS)-g>b=V0GB(f z>6txP{7BuG(?wt-y9m$JMXKJV-gb3#tb`A$>qUc?guSEO4XF%Gi7te}GOvL15=nat zUH#?Dg-7Qm!5iAi?D%&+zx-N~fVUx#Aw$6mLy5dtAh~GN!6ewebxP(I0aO`;@LiG} zzI4*OWn@rZ5)bL1tOSFXBRg9uZ3iW&Vx+^+%|I6#mMRM(51);V;H1<~XTyfyI{H%S zivy;K2~Vr+15+ftXym^XHHrC#Y}`9ww+V9G2nOfJ-`jcy6Zx->ttFL1Wd{uhpg6Y~a&!Na{K}3B8V{Mqg(V z+UfCve1u`;TN^{Gz8lnm`Quw3=w2wgfktVQfQx6N3kY(t#>QHBPDoLbN~0hR6{;L1 z;|S6SV8@4p;NYV#PA!m#c1x56-fm?6Xb$$H%=L@D(n|( zP7rXefTo`~EGp6{U}AM*yptV`jRU3$@c(=Yx%lMZ1q1>H2~vP$0JP^5Z9%R?(~jNo zWVhtwGH#)ZP6;@2ZYa&z9ru1df1)MTggzvLwn1$#2Cx$(szoFcfKI#_0Vf6vllnR1 zh^2|ZF~H**Xdzipu&G=r0m4ghu`4-W;F@dn3+bGHstI^nn^9*`>J+f2#Hmt2;lmfS~6I=GCO zCv~`c@u5RZYK%l@&RzPBP7Wk2RVqYk=|;T=!Ea7ZCAM3QTNdtm2fwF?`Sb|_%MTi! zhq;KAVjNOj!DOi^URTmJMSUrvU+!BR-|i0V8m-Cr&Wsv z+SvEWDG*60oyRifNn^ZK1j*Qy=^^6~S_{_d!?*I5<}(dKBZ32n z>FSK)yki?wXaNFjB5#v`@xsQ(ZwJAQhj^KBmPSyNaW<$?u=H93j(PMQyF5O?> z+p=l7$hmk_Y_iClwnR|!DBkKSaDq014K(Ls3Oy7e3mYogSw)Q~4~CR?5y)p$U6j;4 z^VlQC;MGR0i>*qIJ8(U@kbbaWG1 z%I8h()L=Z7#u8}^a#&eOxSivIbw@*oXVbCFz71`S8{OeZ<#Sp`{o`NGh8J~MnL!<) zV^-9#hG*M@d*$Wv5nTI2CBFwL^sc?Lb{k3ng#AZR{A4&LR@3wSwKWxAiam5~eG{(N zbcj`43Q(kk5|jbD39v&skY;gXKyNg-*mq@~y1qu<1|!(aAV;g@`uzQ-*k=|Uv?HZMWZk`MA?3?TSjxOZkbVS$8My{rlzc`p zQOPH^*=31ONs>tFQyq5fsmOzK;df&*)z*SQSEIJN>If0Y?o-(TxxAaMx%Z@E(ZIb|{569k*m^_q9>HkrrMrX$ED9Zht*p-MGCBqb>zhA+Xv$w! zyPz*H#Qec10WRY(vbqzWLN`$MU26gYB=Y z8YP9XQdsC#oU9GNnZGw>n;RE2MK>S(gf!}WOZ)-(C~52|9(t0RPCK=gb7gmUY%vTQ z9#Wt^L6@~*!c)9pE2WFlyXi44F&yv)jy%jj)A$9{ND~7UjK*ih@wo`CDZE;sk<{yI zNQfFufgI>ywgy~v9(}F%S_qP+k>>HO-iSb321iz(#3lOqo7#QQOWkX_(&)67;xZZU zm)?BC<^^=@7dulIR;POv!WIb7oxsu@xav+7kC>_J)%hnfKCObqvIB{3WMtx6$-nekt+M1Pn%Rhd>JO z+(_fI%fe2b14$w)T?9W1(=T_7htv0JbR3*}^UYRz%%P_ms+S9GR9}c1kNWG|2WZ%H zd=9u*Z~)Q_w2+>>9Xb!Gp0f(L!%8LO0~0+L-FSN-His30VcwYtKO18>D6ioMMZv_J zY|<9$9I5`WKdw7p!O8*WsIT#cFj9%TY6pwjf1LDt#nBQKESGZj2Rc6gYC*Ejd2srZ z@#->ev;K3w&UAaURwR!?I}-Ko$}ZiRKAe6nXFL@-y>mWmi7TSqkZI_^Mi{&jeXO8L z!$Gls}>=@Z77hU-V@~AQ=W`b8t+oC7b^qp>rIXW-t~Shg&bi zI30HUc>MY{498gf=l3wm)G6qt#(l%Zu(=XKCwA(kyaXi*k&vbn>j>{3<9P}xrZ=5J zn=PJ`hB}s0q0MHsnl3Zbstzf5bQHc#ZGY!f-)*2Z9$L&5ZpPZj!#4x5Xr|qyJbp00 zc6KR{FFj*99J-k|UBTccX1d^9^r1-`!_J^XEGLzt2dBGrz~R0>=<_U6_QK^Kk{2!P zTQE*M7Ob2mH)k26kL@4fm7dV&Mzya7Ctt(D+Ml+`I`^vuc!qI&4<(T#Q{oM26p*T%4+qES<9e>9zFg~9dy}sN!u~=y6P++d_R_%w_GR*JGK9)UbVI;C z;n8wy4(gstIB{hN5J6iJ37REa`oQez+-c&U?Ze^8`OYu*TAyAtKmN6I zXCW{u3Bs?l9j#DbD0BP%4$7$U7ovCJ-v>L*j6geA)MSvQ@(C4Z2LVUBEycLp>HER9 z5V5a!fUw=s-E@`BBt8+1(!-R$m*V7vt`*iexoUKC)<9%Bs&RxP_o;&Xr_ciB2rpep z0Q0%&EmhJcXRI=FA#cK(GaA~j_VBtC-OP-(uRIuW|2jAJK_>IyY>TcmAMX;wOJUWM zK;`JANX4ip44DR!^;m)C9_I>saW?WS0?TMlKrS&n#VqJq(oxn%8UdFA5>ZYDwt7Yp zA?r>k8H}D8r~^`s3ZUSXr z=3f?1d!sYFxVoXIi49R)Itk`R2Rsc zvUtc1L5j6fz)R#`cTZMZ*ylsm_>ijzvVaiI!g2(Chr(LWbo?dPC2|;shF{C2r(i0}H*qqvq+rL4xW=%TnJky8kxB z%szVS8!$MApbf+Rdt}8YDJr@Rt^rA#L=z#o>JG|GYOB4$V63>Y=_;>zvYIz$RJZ(cgU$Y zJJ!^&%pglb`ZNEqrjp@lg(G`j?zNveDqJSLk6mh3rIhvw2(;iIYrZKC{9?GN)itYd08Wa*elgSc|60-( zJ0as5-YKEZ@yO~Q)K&NXy?ggAC5U8^cDeLX3$EWU$`u=V3~Lyd)WgUlPvhq~&39oT zjONCAnBQfEe2m+p&`$-+BqSB}RDl;H_{=VY3u(pWz$mV<8kSKFMalwGuCELi2VY{L z5rI<(J6PYZaPde{nyJim4z)1;Jl`BIs_L%49l=Km zDgY}0Up)Dff?B7SZcf4k`0R!^CKX!0*ZHhsUuIy_vzt=z&ga^ZglPx#fg3w5`RJE+~sL zk(aZSpv7H#HQAcO6=lCb93GGWJlW;olHtQP0lPd4q_`c0v5!W?Q;vk7;_~}J% zj76LQLEoY3ahsKL()z`VXP<7$mgd3}*;0=z6B0fR`IlLdl_Xy>v_+woW>#GvN-e?TGJd4~N>l&JK2v$v<3r zz)u74MZ7DAT}FV~8=3;Cs(Ka#&M29P(+ZHt8=3;ep-g8%zLZad$r?P*KOI}_L@ zYRi}VPgD1$#7UF zvNld~iw87pAGt*3?M-m!8wt5%JhCPLfd?Pi&T|fq7kP_n8Yk`&X`PS)GLewzT(U{=A3pUJ870W zskqDV8f>}Mm8?+3xm8&ymwQQ&JmY=Z`h6c6#d+3*o?mp1ahuUyV}wS742YICH1W@1 zBMmtP0}CC1v74w7hvT8ebpzW6Hw!94x1P}L$TtN1HBWkP{8nNI3DHWB#r_){rF#tp_5hDja1S#GJ6(2Xyr(}6-Onu1RDG``NnNzF^ zC^YS>e(~KkGnwnH10+@I`-_bCMKi=slk2 zTr!d^0caKDMd=GWnw=xA<)I+il5tU&hXR;pg{bdw*n0sJhGG~MSqL}Jv@93~Rluzh zVGB5_5Z=a?!4c~a*oPxU?+-Ei=LiOHlmr0iQJKW6M+MCi1v%Vl%L;mUYFbIGQvfA7 zq2#yxD+vTA@5oaiNM&Q`ZSQb+R)^>Ux^K1tkkfe+A5jd#@L&+QS4~T40#9P!)Va%XiGqT(BXbm^NlOZuvoS7hT1=&s zZ+v)&oNxjpE`kZcoJA5KiYtNe&VhHY3NSfs`JrIFiP%KPR19onpBDFLi!_ac{1f&Z4wOs_sCbv_B z$lgVzF`Cb@YZiB{o1!Rpn=Ns-0O{{o?6-EIox4uzWUKAep4dhV1!9Bl-38uTY@iOg zJ@yBT*Bwj+X60%!1=t#Il?bu9+XSw6;1JdMj(|{wdOj;C$2#x6KTQ%j@CL zxp~c{PKCDV}%^X+HdB5&V(I4>9}$X>QiPK9-x`dX%ClToNrsM7w+_M@yO= z)&PcH_Z%v=L2S}2@q|f6=8-GVGdjgP2(BaiK9QWV00(B*5x<$@uxN_*-q`_O2>NXe zeam?kOM)aU)WS(R0p&P>?Gyb$0ky={@!Jm7IRtegySUlX?m$F<0l3KeNIXme11y9H zJSnqI;JTr`X_nj4Xp{zy$1dA zfjQV1?$Xih(Wu(k#-NmnaSXX~zD&uj>(}%Zh1jBIK4!?eZ!;}#6wT7JtkfY$L!r7! zvr#X!M&h_-=FGd8&(%-Or4olCtxOZz33eFo{n{t}XlB%Hv)*!9MKF8asdv#?fA_Pm zEe#hy-2N-A0TbvpS_bZVZ)&%TA$%RL2lKUbNtn7#@|g?6_uH%uQ^4HI1Fe{FBD16b z9s!FPLn0j`P9l(VNa|O}mIVLV?VU}>4k%36gk3yR66%Vp2WTCv9#(DzQlqXybE7u} zUlQPui1k#7$m+tjXy621V}a+yMjEeZ!deyZq{2nf6BM$3uF;{S=OR3W#wtgUYB>gN z&;lGbIsb^ofNfZ2?CQZSzv9eaUqq#qtDn9NNDRvaeZNEToD&Lq2?8_4zZgPwkyFYb z|9KdS3(cc0yC^aaag2-M8Y4>rj6J4;G9zBwb?(+L0T&(Ql;MY2{@w5Y?&B8-dwGDV>aJNs96*X7U-|3bxB(`ik{W zQOXj~`7edb@vof~i;9`+Z$DWvRqJbip7oWEe7e9gvqR|Et}kA^n_YDjfsQ7-AzBm7 z$rl+d#w{dH>^^jGuQ$>KFk?(Q)1H-%q%++Rvpys&2Gh1d#)&hX50mP^^wO2rZ-qm=d|Nx zw@h;ZxWWLWOwWfIgIM3nTIzHpQoU>>B&`^Z_{=qGSEofp3=F~=rcg@ndK7etjW1XU zDEdV-)WaB`a(~E$@5T;7PLH&oQ9J74$F`gvW8X#Ep%c&PzHr;VzP%#ONDx5vHnqpy zb>}Mx6;44(2t#(+qErFK1(E5+Ra)dUV78pJJqyt!xrIR!p{uPIu&R-Qx23M1?AtZr z6PkmjdDGG$r?xal`@+(HRn8&v?dyxQ2Vn>5g)@`f1rV9Ru0$gSF2AhJXj?mCmHO-3 zx=CToAPqSD;=Tuy;~HLr3&CAQDRFVsn;64sIrTe{d2PyfMFa45JnXw3<3p~CBW3YV zNa2rRfUyZI*adez+%r=Gn*k-+@fiRavrw3$2lfuZ*6L6|@N=8#1!Y;oojLS#Ub z9TtzPu8=k+OUe8zii^A$E743$M^IfMx~Q*?De4KL-1d{rz^(ra z##Z8p4BKz{H&y1|yJeEk{}>Mcmfb^xxs}n{4ad;0LWIIp9}!zP^ys+URp?1~weg zqU2t3=j&hZX!CEkZr2I31QzW6v@XXOz@Hx@q}pf+7Rvl zFL)3g3Su9G@!FZE{Qm*d{v;8>gk#5DlTS7A(w z0pWGo?45<<;ogE2vOsCt{~%B=%!&D&-}qMVuqe;!lC`Ih&gJGUo8%&$X+82=Q2&+C zA;#GIt3#x-%=D`Y>pGFTP+>)7G=5R@KZtC4G=&hRk*mZevQ_9GFo^&gd$?w6o5K-> z)xk(a1HxHopxo!%@7fO@e$ng%m9MdlBr`o7e3B7>b79NDpU7wb&L^V4ZEp$o%%{?q zl8pQflG5y3n=magcS+JvviE*SuY9pW~7J|aUnN#qM3^ZQKL zl(YtC+t!g}1j38pHBw1UN~;}7H9*%*RsBPYS zlxawVmR*X0c6zi~T!W>?mH*dv049QNRec!aYyodtD zii5_mB|(o&guw`DTB&E@W|PfH@ux%46S-Pme!W#J26zME1tt*12yMfgfw?l$I~U`&cDGiqHR|vOQscuS{w8!c zcxcv5bXn>DEq2E#_XObkTJ@^oK;xsxYcHPY5Itycslk~wy~(^1>5_?EAl=l;+8RcA z9TFxyHfh4Lc8Pz+MrELHg)|BvrmY2v#4ce}m>ha^4MkFnuD|ai%MfJvG3LT#2&npC z^TnflHtg~t0%!F29iAaj+&aTe)3u6NDh!c^dY#J>p1 zA>0_1A{Jn^HGu%^d>q$3doVl!E`12c7O)6s1Eu`I7k|XO9(mpkz3Yf#nAm16%O*Lj z@{x>ZVx!qP6ZAUMRYxrdjxJfZgW^-gXlMH!9XEbT3Iv{m_$6tTzL`*ipUO&b z>ONq)!7qyKTob62p4+c`gMEZffPFiHtGgq#xY?;VvR}jyFerz@tyPy8+VvWQikJ+6 zKDc->L~(UC1Pc$_yq=@oGJxguGZWcqlMGLCcs}Z;;Q~;a9(f&%YcvJV+wZ+FNsa8Q(bk3 za;$|U3p6YRyCDq-B+bv?jnr$N=NVf@?tIN4E;e=s#XmcgfPSTsuIDqTp-F2QKN*~8 zp_9?fmii5c&anZ9L~XD@*l?yEkN11bu84^%=KqIWw*Adpl*1iO4lAoS0huF4F0Xs~ zOBqAQND~6Zd<|C-e>lkGJ1`j!N^^>9Wti25S<#4eG65NtKToktK#l^E$u9C@YtNqo zq`*Ey!48?l>AeO2EV97_Li6Kbul6Gd`_=!6$F#3m+_h8RnEQ?{8<$v(!2K)aCf1qB zUpe3CH|iphFiA@Q>TW$!MHyLO`!yU0O3-kuKd47;XxKPI*F(y#_pDTDwEkX#SPWD^ z1VZKE36txi>GZT%Tv#{+l6JNSj;ALqT>D2%gj~jk6Oqn z1Fj++`n%*_tMuhWUV9+)Gd|-M)xcI_Ki7U?{DwV@%LKw@3R@}j(52kny*@rj)Zg2*?@i+Oocev3oRv8E z!K-ud$*EG@1DNLTB-FA2L|LYtI=BtbJ8lir(~<-7;9#B|F`YL!L0GeRe7@h0*!=<9qNh9Dyw(GVT}qTB+fJs`LtEk&*rS2+B9 z`h4}f<=u@nh_wFv#qP7^r|a-?^NgpD!a>7i1ZxTxGa`{=OR|C5ao+oV4xi4yanjA3 zDZTl}8C(I~J9@%i^6}%|%X82Ivx9>7pW{h&0(VB3Z#b-OFZutL;lI{!WqEnfT3udV zZ9QLJe!krL^YZf3)(^|eKeT>aUjDK5?eg-s{Bmi1d3Czh`rGpI-zaHoV|jTaN=ff9 z;g_o>;nTE8en-F7mzUReytz&hY%gdXqtvArL!xc(|MZRCb(w8}>ubY}a zgnx&t{2Tv~w!+V4{JAD2{sT%pS#gd0tfIsd`1d3#@x3h((+6#QtPd{vDkb{1HHP!;PIeN^gqrc|1fwA6>I z8@7?0OiP_esqlMU2l8)Pt(ih7XToFaMk1;SOMo{18ONL!#;dd#KjMCfs32&-Q)~eB z3qLK}T3nUx^Lj}mUctPtFP9JEmn&Cp;8PuU>glpCXW1@|@}izEua4yTshcwT0*!tq zCGTU&X`!y){ELb&t>{PEpt*{$_-EHGp7;NzEXD6-_Hb)|A8pBRE&ZXU=u-MZmy)bY znnhZdZYfRdQgTZ+?h(|rP_}?f*^e!8kOh>l8s=j1c)5JP9ACCs70X5{$rbQicP10= zaIw5d7mF<_H=9xMutbj5vc+Sm-@dq7sq0i~vNGUdMn@_2hXg=Y;FvcU-x9mdYG`S)tLvtbg%S zyq0b8Q`5HnaIsKv+#_5PkNtqG$4T**d=FO0l)q!6zWcVk?@-AoUX0(F;)3S%sWm@v zX~E1KNf|V?(V4OAYo|?OhV*+L7#+R8#Dk|xV%eW*RL*z)7q)hohQec_?bSk zQ%c|QpS8Hp+OxNoQ}9O~?lhSTKHOb)q7p01Wo!7ahD6{8J2$>~uJ~`-&NZ{jXdVt% zh=p@&!Jf;RlSYVB&rK2SLulyQa^=!Ek`vLj?z^&Knwmvq#>I?1d^ugI*a?qghBR!- zXDg0MJf&szoQq0Xk^4f){RBr09_BV(DCzsdRkKb?v*?seWu&MUPY%O`=3P{v|4P58 z)O}b3mb69%=E};P#w#(+#Tj~LrZJ@5#IkS1Yba`jPTCRYc@Zy)AJW2C!=3)qs@cNN zqs5Djya)$e;99FW2HpY{8u5>m52`6S@)KLpgseczMMPu&utqTd%%AEQC9FSs9+286J9=4CZ{Z;aADEqqR7m;uKI+DmAg`x-F`54&v z)|dTVn1GL!jSW9`--ij9dHI1z_dX?f5+)G3_0;m0&%z{MuGmeA30{~4a=PId{Fw(a zTxGtJ{KfYT{QD-NA8*(E?t3c3`-59JH2%+n>GDKpQ`TvCW0-ZHKZJh|SA!j}zOZV` z^D`fw5;EC%*_f=#bi3(1T{U-Ml11q8z{A2B{;|r_BNGY*F0XMJZV&TRuG8`BzdRKw z$?;0^3A-lCH~ys3h@$!B-8gEkJ+J!AvXLO zLzIGd1~1W&fZK74iji`ZFh1piRmGPoTcC8(Fwz^2 z?V?=%ml+RNw2|U0o5uNH`AkpglH+?6txaA9Pi;f!iDyA758bQ{Ml?m&k@kxpiTH+X6*ROrrbDW4|?jtbPhkgG~MAZ zPi5`@B`R(;DbBTTHEEvPxip5f5T5ZD8Y#|%n@&jPj7F3?l+e{t09ODXRSpEdlI z4<6zqRMG^Jz%lZsTIqN?a=VOVT$35Dk0ez`)XyJ9KGK}i2_CDvAxeVb41RZ#RbDu(rw8(?R(9@}LEdN@&%aob8w%k-Dp z(yf=N@S_sw1N}o?_0>n&bnuVXtp>$+DQ68r@4PLClT90g4j9HSWzu~;;b+TF@h1CWb z1ikY1q&gmAv4DGFxamK1uqsNyI!NO$1BnqdUJPe zdHF6)z+~OoKs?E2z6*ulT@_mbdc#f~Gy|)l9o93qOxETn8H12yHtT=(18ZLsVJ|>ZF$kxqrFEtI!ZOh0sFtibkYz9eHz80Sd(Lc_{!z}pf#6eGBdekD| zJGBU3dJ3d|jduOMIla`h<)Iyx$R)@fZbGB{&WLO-PrT!dHP581X#O0}x}T$`PQmMq zKIki&{QqMmvl)M0jgv-}PO+Jyj>8}SErD@>rQN}%d4;35%xufwtTFQ!tC9VtTRVH1 zqwKqwNM(*xTodKS zKix_VjH9g(*kApS-OyD=;FHIOLU@MLkEx?}*!NS@bkkt^C-SXgQcZ2o6f4H3(TN_k zj7^<>z-phwwfg;>7W>dzdq-Cb*AF|<(X0iWvbNC=kA68_;b+fol9eytKj@`DC;UQ) zjCt9m&VNpqcb|*#_b6kR6%e#NlQ4FI(c|@n8PR2XBpPGCc>R`8{`;#ppYO-O4l-JP zx%Dhu&4(#4x|W6eQ4T07tSpUnwD2XqO1&$LIkCAbN3O9!iSJjlyVk4?N*=Kb#xj|{ zcso+FsG}7M|9cVdKHn%mte%DP0~}pLGUPDB?B8FHtIHKwN*MiaE&ZyUJzkHm6)CGW zl3gC2Me&*nZ0bj=ah7!HEUd&Fqvrn0j4kSfLt?Y%nI|uU$+?91xuzt3DMs%C_VLTd z+!Z$syhgZ9zLSnt`NI|4zGc!yhnt_$OoPQUkiPicGBeA_`lI{Lz64LHb4$bfZJI?G zwcQ&J^XG`nmkxfgK7Lv&A0gi`zaITU$z8K`MLm?>dooCki&kq?YD8Gze{YkH`u^M_)%=*|2l)EPGyLH^%7iu^h|+oQrtDadc7dVx7e-q)p)H3u1`O$nDrX8 zX|fWp3D3fl=!~WeUC_<+M|V@N+=&ETem!|UB{<_w*R$6szbs0R(_p9nv=%SM=%1XP zB6rdA^2msPi#N#}jnlP$f3=*u3w1`~#S*2~snENicev8&dcP80PG4r%nQv`y#hWG- zhHltbZ;C5u>xP!o90!2&#C?22_p5xG@E{SLNtDL_Qrb3^G~SgdSjF#GVi`>tFP6P~ zL|-FDW)2th%rzpn;r!+Ds zQT;iFA-E%}v$dZt<5xV#TK7ZbHMtQ35r~T3u4YM_?@u5bQw?0irbMZ8^#x;dyjFg2 zc|Y1xqUvjkzWQYl={?i+G5Pj#G{l!cFfY!+4=IvK zM$h+fHS3F<*=Z}0{H0tMn-MkTMRPfEu-~S03~@w*J>keM*i>Zr(_9-QqWOM92DMDG zwUjEDWmx8@zEtcUR3A`*3=Bo4`ui)9Qp+v4$3}aQyHHeLBk1zrL@VpDV(6TjC%P2>JbhX?TF{1vd z)b2BD<(e_ME-xXn>v9G>Kdn}*$fq~4BFBP&LxVDKgK|iav!snnMr07;0*2QSI}S5# zRP=h{8LSd(m7_$A6AZi{t;JXEG~t&k@xdC|V`lCrLOiHtzM;`&H=^z#hqO9}0NE^t zKsNzaQMeFJS1K05#?6qXjSABAz4?m9h4PtA0cD1Kia+Ox*ZnN87d}TQEEAd4pGODUR^8yvY(Mq}G?~3f0AxhFXC^Zsn z{tzJ0ZN;?Bi4nybnO^$CUu*p@9(UQV!Lci{&2ZqJ0(!;V~@XL)=BJPUnr{Kfje3d{2QWecj0D04dfIY2xX z^A%d8hb9OmRY*S}c30^tu0!^O5XcLwDbTS-$+*CNpYk^VUj?&y@C>)Z}%-uow=+j3Y! zB%AWX^3OMMSiX^%2$A?}Um$3Y?dQMc55q4%zy<#IC4F?aVLlaZ@L(I~$2YKiKee(p ze{rii*aFY`+>vz#BYL)y1cfT48(wZXbF==m7HhGuL^mdG4^&AzzrBe)Kyxc|@H}8H z_-x314R*lK|KoRntAw3OZf*k%vZEW=+y`!=kr!mi`ahku{zI#AG2JL#{gER>)#`s} zYtG4k=Ue?p^Q``FZ$Q`&|LZLq8swR4bvbysoF!365!i1tpM8$|(swr`<9+4JdC6H> zmH0coFvV*ss`z{buY5848oA|r5oahUF^cC1-6nElF0I}#+)}|=#JbE|s2|MI&iE?n zPURt7{MQK9#oIhZN}|%%d)B@T)x|H{zs7V>&do^9=(*~E5r4mS^Vec>PG7dm|8V8o z>;|0Yay-yDdg1lxXf?W98CUz&@|J7Lm!{=GEB+GKA6cx0;h|P@HXOo%-R0( zNuGUwn09$`Tb3iN+<33!yQHe5!xQUIe zs7a9tSHyrL1|mZM>pNE6HI(%{`@7?wkXRiMCk|+hML< z7t-U$S&xStj9?T|Z?<&W^L>Y581~O9wos1!4m^v0PWEltFpH&NrYdu8lqv?Jz>tyf zHzZKjgz4&QH)#0%m20ie$Q{@K=Y>xEm~k)bzmxjNP7|9c->)j0snf)ExJvr{ca|S;fNgEUlGB_!uREZ594)w9l^(7*_eL5au+A{e?M5x+T{j-?B@ujpd@h_%tYGto{CrygB@hEUo$eTCQgH z5G<`JM|4U=i(lHF<**^=6D=NlL*kz+go~@c$sRjO?1=q<1oxLOR;o|z-xQ&5^f)$U zj?8`ix{Ge(r)vgYpfpoqHhlU3>=mhd3?yF~^?%is@q{1MjB=Nzs4YPtvI+*_T&xu8mD zJzIuBd6NUzY`;@d}WP6XD8?H2&a=If~rsxq+D@UnJ|n z2C6PY(iTZ=W<6y6&8vzzUCqvF&WAAdah|SbE6pKkdB7VZG0QcUX0Yt)5wi%@UXGzy z;BnT?G+l=OHN$By=dTyJlLTjM32tM4-5Tq~f>M`AtWMYB&6JZGhSP4b7JWk^DP<(4s5ad)2%tH-7fEfS z(M&PD^xl@s7fJj|akrz0?iqWpwYiO+tM@>_dk1Kw_NHY7Dbxk8(}~u9C_PQkb#m1H zQ~3AO7+LLc&iv2tAR(w&9Aw=f&P1uHxtY|lE+m?xlJXy}{~lWtMny1#mcpvNUx`rl zV?Xd5v`uvU7|4ytqdtOfGyu@0$U?tOEm`Q?%K<@E@)kLR)+BI7R8}bg_4~Y9(wA#Y zu8y2AcaGXFRZ1lT^L;sA9F2}AoTcLwEruNMX(@=R|EKa4kIwVQ*;Yo%&C9=E7)4;D6_p# z;>Tk>6m!glF*5Kn*T9(Ti5kf z;&7-}4PdEbXe(S<5~aJ*-&GUAXdqIwv1k;(NO-}ZzK3%SK;&ZWhax)w<<8!@p|I;O zM%eU57wMt*ekB&zd5@G5a2oUtt1ylK;U-Mu2beA|y(j6;4^@`It9ewKSIX|~;b6R3 z;fb5!5^2ZPh{stOIyM5*$Fp>5fpq;hR;iV$d_tGo)!&P*!{EY~Vz&fG@@O@5()w!< zy(utVRdfE0AF&9cZhy&I>Z#{$-{@9T%d~#E8A;Cg&j0c#Fy(wwYMu1iN{ruDEj2k^ zpMfS?D%j@xa;bM`M8|S>#7GDAQ=)^)Wh&J{sXc5?Ca)yyVREWQq|`G%r6CX;>Ef^_ z^O(>2vCw?d5N{*P+)UK}I7m-UI~T&>+Y>z-{&EHks8Z0MVt{5JtDqdvF0%bBF^m0a z^>Qe@x%+ID)Z{2H%&x@Rm3`(Sjbwu4Av20K`4me`sXb$r)f(glYO>!1*w8l zSgd8kr9=?R(WI1O^7@UD(yzDc@rH`+F>|pY;^=TbHblT#{v1bgh=Y-20r9VOrMjXQ z`+SS{=hdtadl{PPN*r+|2lN`=QmvXfyj<84Bf_02Cvz!z7>63OwmFqYt#NCZtjui| zUlx-hK7|c_tDj(hi}#Dyk4NaFB&eXJDyPUW+;5^R^l%P|-e1%V6u=y!qa4V7*eT(D z{D}~v{jSW=$5#`t+>*#B;lv85npen0yE7{KXtPD;ubx#d-E2`nbsplJeMtsyTu4n6 z8^R~dU@6B=B5BW#)?`i3`uq^S84k9@){_ zRR%dWkoSZ-mf2;Od(L)c-o!ImyyGPJnY1aLfVWolk&1b~Nc112C4IRXhnfqo7xTxO z%8~g%pfy^FueGJrsRV{-l2}fpHiE}1aqOft&D$8yrYxB6+m&+5tJHXEw377)CgCeKH>Id6rAI}nOF||jM+JW5e1rDhLUWh;@s-Hq->-f^k>e&ZRR{&E~1`^q$?`mV==~GY;-4yviv6`GSAKdm znXH!U^IV+V@<2)@N7iR+v3qnx$S9vTp-Fw6K3khB*x!7ee7l;x0*8|?G^{LkR`~8k zcBQ5T{fjamJF4*mY-oBhl9fq_EH0Gau#^V?_Z-#&GI>)MRn0vFGO*)ICW zWLT^$$e-(f|G6YE6^E*=$_$5Lc93{aJa9*RAzOg(EEltK9}eHUkpSl!7gb-xl0ZUEVi6iVfdO$jBeps4yaqJZ`ztHi z!sZ11<|d;PI|OA8EQg(upe#Hj+%$sKGrwMhoJ9G=QrTDmH(P!7m?Co^$b;B5asqEa zzJ=RjIEjyk)OGzErUUc`zUQ5oU`~O@CB`W;C7G z{tvOR{fx@mv1Gi%>jirC-gF&4S^qd#=B~&V#8QcIX9cY?r9{9m68{$;ci49=n3}>huU82`GbAS0~6xmUiU7~u3jT+8g^RH=cs$1jSzyN zsOfP?lZo6Y5Wr+BlouFl%2w7ZyVkudq=eOQ+@F_carb{J;CstPOfNA`nYN3&_3^b=@SeFLWj0yvWrbOTl7I*WHoiW4;jJ*hIyo^QH&32MQirJiOo3U5<;Uuwn3m{l1Pjrc2UjsvRF&m z1f(sNKg&V`8rnF*>4}6QeS!k-Ft={0+6KdWEX|kUCJHfszCH_|0|@!)(GWlUdStX> z^K_)Gs~Sfp53;`3M&h1|Uk?Z+FBRR58!kG^70D!4{`T{JwrYW&0)?jb(cAN|$bS%A zbr!{ET3i-`sfmLiZV^>ap$R$q$JeeKOhHpw8-tYjN&RB&4H_uL|HZ~jshBnz#Gfo( z-;oknc;W!OxImd!v9$CxE zO-Y?yEK=6YMTg*I&E+10?Olj!_5*@}r30%cBu+O{o=@tld9V-HE>&7vJ`~pq<`4b* z)8Y4EJP`m}w>o5-uGCiAJ{U`&9EhZzkaan{^m|z5{}!#uaWuv9w{)yU{JY#Fzq*kY z|M#gIXwf&AjjOE^MzZ1!$cn?d67cJ*&s+9c|Nt`9DnNmr%@li)_48g7yuUZo>Wv^p%P z+7|=<9dM*_SVi;7T_QN+5r-4D0qmN4TCi^V$E{RYSIi11d>-ow2#4vPfHNC5NaHHVWSy#s=B9U z#2N^q1vDeU5mKRQhGw7=9IUB@+iX>iku`NDepk-$3bUM=30-aUitFiSgB96|S$)6& z;@Ea~>W6M$mLc7~7&DllJM7H;x1ZKM88`BS$7FCyxh3FKoga4u!y+fcMNqBMHe+ze zGq@0IJE<{O+HK!nKv8vf;}X^wNf_(I#$@%2F10n?_OMQ0QDkT!ZjrGh)r+1>7X};} zByf+Kk6Pq#opL8mQm{P&vD-rNHS$&Ie{iIdEc=^HCMgX{tb=tTREpTmBn>Q!c-CQ( z@Eri}_#r~36he>7z~Vg^$ghomU^PH%Y)~EU>0MdO4!RCfJG`0w@mTk9tnOK10}H>w ztWN2lEd)TDuyMk7u@B$$42+>eK7(@()-#7$1buq`Ni^S)2XsZJo zwYj|%XbX{|%4Q7~QSqYH5I69ennD|qQ^$tM1qwbE$ZG^yQNd9qvv;L-P=>2OQyAEQ zMBaz*!0>M5+Ut76x5a9~LU{^QpX9p1G;bFS2z6x!+ktuWHs4s0jxpJvYLu>F^c|D2 z(CZ^Acru^0JJ7@#;RBDj)`X0A6;6MeOF6ry$EwzyT~jJnZ|i65W?z>1Edm{y*vzY} z=o_|wa>)U1k^Qx0IW+CU1YW*|B0vNGypCqk#}r*gzexTKK-mrIMVs~xUG?78o2WsF zbxn6gBfp4+k@3CA8pPgXdpICamaaR`xAK7U!YULc0eU8?F^+|_2bU6MjCJaT{00X? z<%5U2g?>R1V2_B_kZvXYh%FxQMBS8-A2LcD*CpyA8Ba~gl5O#TZ@Jk zfxteM;!CD5~nb*HTqNFALv% zz|aZVsZ6T7BJb8Y*iKL+#98Bm!hbrZnZv>#y8@zTl2ZnoS5ZLB)=4_mCUUtsU3-DV zg(1ozu`sG1WbDHbE2=T3AvIS?q@rG9yilcc0pB0!KvU8lpqCX(+ z?8Hc$D|pc1>Cv5iHwC5#NKNmi913|Hc8)n#&2FAO`KRqBGX*OwQnH%>9H-Jl(ntyY z!{1P(gkBH&Q6VL;LyA!pB9)t+xXRxNS=N39&x$lySR&ha7>UYN#=c}Ht_!U59q+^` z7FTO6D$I1nZbP<)3O=3PC>a7zY+2pi@@_Ff&QB@srOK@Y7`a$+-22Co2fJh#q#|1D z7*R-|hHL;>PUSne;)X3e8ZpVa9mj&nRq5NK4Bgxme)fcU@SNJZ^e?eBGP2tAyLVQQ zEWu}V(#*1A8`PO!Vozb&p3I5@PSy>a!LqyVdqfb|_7q0O0NS5;wlKv3-)U1TjaONmaqgQH1l^%u<`AU6#~dJ)5Qp%tVRSg)KFYt zSSn+}zD}gU0ow9NHbpv{3qwsNY02VQ8R|sM;9+IgG|kT-IA7XDEVEZW?~!;Kn~$$c z0LeQhg5)lWw2=qlI^Envy;Gy7cnbMyIB@Ay1_#dag~Zimw?W@JYS*1$<~+%I#W8DjUlnUHzqa-uueB-0+~TAr+`w#1jkvR#ki zF8;>}-06x(nf5=wq_g0*KnbI>#?@+r#7!q%^IVHW5@9J~pL_x)!}3?y3Srp=#!%c( z&QsNuRz}g*$iQN zOt}8e7);LxJr@GJ=g-PjMENqA`02Vx{9^CO4%^}E z_e92f^UC(%4*v~ZyO94uJJ;)sEXy>X0%4P-kpyc zh&-Z;yKFdGW7^%j58Aa^Lfehj7_@ipW3(on^>Dk<(mQj8(SivX&|dyGMtfhBU_%wP zH2A->wzTl-tfMui?JYT2hvhX`Gv~V>L}(uJUuU=<{#cLqk3w5f=O3@K3v@#DHY2u9 zj`AMHYtev;_jG;b28Q*$EdNO(9@KcZ6zc!|xo+*xwzW2w^G|8I4_kFnJ_ol<82+b) z2I6;L8v6dd>ra=lz9iBW=PfAIU#gHYk)gKdI)h?MX z3oa8eQqNt9n=Aa(Oxxgn3jxHAgxi9mQ$U&UR1KUxh2gsw9DGkb>*uu!kN10IMaNZ@ zc6Lz@BmH+c7!f3Ed$L}ns+m{n<^fb>6@woB{nr|B<*%wM+ytpYqP*M4JQ}hyP}I>h zl4&|Qh?aT?r6>^bRqlD}%>tJUY_@6pwxCHcvT9Ij^SAZCe_I0l*q0U*;%i(QmR=yf z&W!$Ls$#iJhf*ucIvg4IWyoNNL7IAzbf9cC{?MQ?n4A>|4x=Do1_RQ~Y-tV{Re!rX8FVLmACN2|nX=!j|P*~q!BpjK= zBbnoMUituC_L$PD2M}+`N}qpXikl7sl$wL0lNDXIwDrqViK4She~ZgbDz` zAcY_Yt}gjw76> zba(Qp-;vPjUWu*3gRE8fZrLs4bxBjw%q(8gEEYF_G~+u)jd2+ZQ%e>g_jAu4AT(sW z%TkW)0Yk1dy(xHPdQ&}vyMBsvMPcd?XxR`{|h=o?I$kFSy&eqvl(wDb;- z01+|zPrp$QnuebYEm-X4@-!kXD0go0K4rUOa;KC1dp)b%$u`}bx2H;oL`RzAV~t&N zJ{f^+r2pBdNP-lx>e4>;3ly_*i~7kQNM?uAEBj?)-FBnWhzysM>D@qef_cFT9l~=l ziJl%aX&bjDzMgIie~aM&)?is?2`s?2YKh!*Uvck*e(g)m6pZ50N8!Lt>`Zm17~v~S zZD55*-G_(Eu*zAXUIQ=n;O1PR?OW)XL8?$R%i`{}k;}q|X>xeq8pm>N)!9FOuFNQI zfpdoLW{Xf%RHg1`{5`e1fWsd&z#2?m%x?+{Y*u+cVFb3@!5_58p66b%bU$-pmb%sh zdzqQ)Y8MF)#FIE;!Xy;}Kka}1hAPSI>SpK=G1Dvzs9QT7Fd*Udu=FTE_TqO^gJFBSNE7B8zvz&4poYx};)_RED`%vx$7R2Uin`{@n z{m6d9NBH)LoL)ajz z{hZp0oq~pa!ZN^uOu0o%+P=9(FZfn79+U3bjPmMOnP(O7-@GB zVB|ScUJn}Q0x>wZ>lKUl?nn$K3xez;PWDVs)*Xjyu@L8Bo4>Kvt1plGtc4dtjD-wM zgwRERv2Q|3Lh|@8h${!yKFs`Vo>{2KJVvhJJIG8w?F7K}NWbk4e3wrs#z6Of^*TM| zOrOp!$*Otv@<_$Qbl(rY6fyBG7SUs0tb*w>P|Nzk{}$gUFq9DAu?*A&mfh~)BmjOS6As%*%4I+J@38)0K3LISy zVa(e}?@GaHr@8*eai!=<5@cdob5Cz&c(7|fe)P6%cL#DvUNjn26V3E{-4*3-kZhWd zNA3R9-Tri|ZcDdA?3f?{baV?bXR-K|UJ!Kw-Q&xM0z)EO>hv?GKnh z3+t%V`-$04vYoSRz}5kAR;mO+(^X{&60IW17YHKTs5NZc*X zXJM@L$5E8C;vsrqpcFODd25b>^FJguP0FQWi0k-IXBp|egZX!}^|KEfsF z^l`IUA4%q_BvwPcI-?m5IbtZAw3drbb`zQCxnTLzdzwM-1FofoD(B4o-|N5s7Djwt zM{Yp)Jv6S^ z2*F5{kyA0vD57r3uneZc>WA2ksHSbi;67Mnvl+;bfGc$+^$-}FVIgV8=yF$Nu^m}_ ziAH2{ot$N>@K2duOzTV&M<&B~sa6VD2}*=#8_EdnW>4#oYI`0*hl44!t_)LDs> zWo$}biIyDh#5iQ(suOr%MS^hC*vu-wn%ig!QK@Z)&;dPLW{tl_0wI=wMzp_()=`WC z40%QIwiU5b!D7kF%=sDDQeLakCrJ$fi)uX|C{y-!izP% z!!mayQT1C8iPiQp8S6hsYy96M$yYs&&LM-24hFN^0tE%IUH7N2uMY=I?%g_}>|OQ6 zr$x9D$R)*OMzwTCySlB>WN5{dPFyY9#W~@|K-1!0m+7gkEwV?;V3&Aq6Tz8>3JNBu zgmr3}lrsQ}PtJI-7-{O!Opqzm{C8Ugi<8NElh)XADU+F-6)X@G&C^!}J{}{juObE4 zeXtXPrYFv(BMx#iYF82r%)%91a2|AbxS2RT1OF!Hxs&F(-sk&Of)ThY6=Qu|7P+rT znW}~T@;j}xf>tP$E~nlY|IWH0OW8wGAi-jSUzSQVGX~q2>IY*u{Zaj3#{N3z2g5er zZ1uzRQ5mlCR{hZXB3~2PqHUo0RI6Wm(s`>4o^HG)SR|+BrXw%M(fwyIChTSZ2K&!D%|S%7_sbowOtwJGO#hkhO^ViKj*Thp3UAB zV|+q}4Q4a&$1YiFm&BsfbI%k6t`vH~S>&xws0%|u+gu6+7bg?zVjptZ+#Od1jebP) z8mLTt*wLGWF_4)62kZc%G7&Fy!OF*LXSz5RT=yWDHRXT==Jai-9}hpnCm}&mD9kv| zY6i~Dtup|Q4X&nDP$_Ns=+Q6&AV4F?tt4=DLCcS$e6(KD;~r^4EYm?*Uxt?YaF(x? zMYb;u_ok&;c3Z5xi^u-Z9@LY_Tm7SY4lbySF8eY6s9I)wZfNYH+`3P7DX#3L7~&N~ z(6&llp`Pxe8@|B+3Z+q`mk_F{#uL42C))HpYgO4lwJTDDcQ?q zInr1n6o4rmB4K#tT9I3{;_>Hoxu^m_HyL4dN3$Z)0xbf>8HKwyH`@d zEoQb?1%1%TIy_4R6n(n>`)TaQ7P&Ono0-PeSV@|B+CM;$EXEv}^~VLDZ^2i=tmeKq ziriIZ`JO*+*?YBRD?!$Hv=(L{8z>`hK;UIFs`HG&#SY;F47mc7W%!)o0UpN6t0C1%h3S$)?B zB?0OQtMMcL@LNa|ifDk5mO1Pf1?69&5isZ;1}#ZSQ`5ZHRS1}L2M30wKJ4y!2lT{_ zCIemSEi;G3ChPC!+OwiL<^WzCp%|DjB93GocrHZU+X~ zb+0HE4u)d2!MD?8$Jo!mUtk$0xFHz4r$Pw@|2;HQTVn>R^ke+|XT^K$=vRi@A3D#J zDl<+KDv9@B9l~ZCuWFhK>N!(-kILHCd0wLTN5V&qckH~xK=&@IX}B;aXL)!0H2%-2c{W+*&DoU~Z=2EJXmCNT3RHg^j48dd@YzWFV8qX8zwWbr6A9mJ zKcT_Aojt9yf?6SibH7T!F@Q#vaT_fI?j#7$D%1pITvnZ7z{?$bu(|nm3rx>4y2fsS zw^lk#?pUy(<@8G1vYzr?@1fc&l~)6NoARBI`iTG{xb-&ks&QVHig1B>K=5|FC$H5H zCW-RR$PXr8uNTmLX$zbxtlaFXmnF37C_kSB$qM4&WxCJ1k#$FTWg<1&=j5o7ng(6Q z;fTE0&-EEi3Rrc~C+zYoJCh59c`@W=5%mEV=S0HD*u@1xH+ux|fmxColdlKn+_~-; z)-aP=>Mpzas-#sq!5|JQjtzosnDu4HtX~Xah3**G?fyd-;IdoN{b@-Uxb@TKlVl~q z=E`}Jv9n);M!5>+$MpWE;2FdIpO$FM2$%6mfBdp^IhVj%Vf=*H5P`~=88A(fD$MSM zwNM2u`c=bs*&9-oqGUIo*^$ei3%b77(5R!in1giL&hkqD}3X z>A@}qi$vL_D3fNFzO5Qqj}211_Ff?=Z;*#u4APd6tD~q;wy_Lt+gkWaC0;SjD2621 zACqVRmuVTaS;xZo5@V+OEX0dK-GIyF5c?bHra+gJ5umPhw68IaUBo92RV3DVKfB$6 zLZO1mA`w?InDcfLUB*t2n}R-53m*|f!SqDxI5@;;+tQyLct$$Of|#l&3%VbfF09YN zGR(aKBeGqHKNSwod@v=8JPF$+*UW^&wNp}sv-8dN{DN+w!7da2U=u;rd2>wV`pc`Q9)!WfRk*Ho^PYs{eQu$A9icqCwp|)i` zTrv8rt%_e#X+=3+Us=aUFFUOp`=Oz`SG^@bxgd>I>C4uh2@wH~9^a?TzpzUrF9Tpq z80XKy>>HFNcY_&RmYHtZG_%uLQKc=j8f(SiXS*6<$y-O-Ps4e32w`wuR$7Ih8$w6aVJFkbhe@^r&5`o^+# zf)+FaR{?CbF`VF@4w2#~y#+TynE-1F9AFb@x>w@ZL0~j6fj2SIncF`a6y%wA`Vv#I z-a(G|WBubFk>J((>MVF~XiLlAL)LJg*VwgXZ`Q7c5=&PSZLHVm_aZn}6~Ndf5kb}j z%NY@I%f!oERdHmTn*#y)1U4GUII!ci99eai`$}%ga^fm(peg;+R&iiDQ`e69M%mg8 zg&!BRwzv)0GMR#=v}#mFHO^r!YY)OznFNf{(0Zmu`j6;-9zDr-QD8q1q6$EWv80bR zL@(gI#KV4xgwwb1J;h05*qCr4)vyVR(Z(6zHa_kPY#8+4LjJ5@*@wa~fh4|9fm|bU zS31!X+3k{)!Eqq4FC!};WHrHbRCq3o4q|kTJ*Z9f&QDvC7Jx6G40cOj>|i`ZMf8kB zoFNunFQkKD!a~R`#(hc4M=+3Qr@C-GnvB@gQ#r!dAz{L82x?^AjXJqqcvDac;#jbq z+V`-wiFlA>WC%J==mU=f(@dZakIg*X8)MrB1M<3{7?8`3MQ)`_aU(0S8pKh{kHxU9edoQ2CWw2=H_C5G0T|Jz1C6)!#%d!h!tVyY7 zhLDqiG+`2r$g!C7^8XMhYZ)kuC5J70g#82+We9*`#luo46Xd+ZB1g`1i0ridV2R94 zy>jl1o$8*%6jp^5t_(=mlS)P;p(Co;0d{J)6LM|n%CDQ|U3oD0^?fdjx0sB2g9@rG|F_ zZaqhC7$l}(2CQ=8qhtgSGqns1G&kxcBT5zGI$W*+kRvu8wa&p0flyC4bK##NYPy34 zjqD^~4uPENzHEYs&q|(K$j+XmP=xQoKl9Gs>CyXe_TukKjnT+M##$%Ea`H)9^`Q1+ zYB(gL){sXUkk-0mmN8qixd&xdt@HZhwr{@euyYCkJY(B|W}b#H!%eo`aQ?%|+kXGN zT<-0dmmhrayj+MNm;V|+0hj@F)Z~?G7;HasW?2u)k0|3azaK6ZHeSeYV!~JV4LQO%fS42d0W;*c>2tJ4E(u zY;<6EZmbC&#FjA@{gWH%0aZ93#AJprF1dd8cx9_8I(tq<^Tr6TSUNbjyj)M9`# zN}aafDuLxdaIGM9|CG~^3^ewOv|4P6BFcN@WG)zXiVfEmarvgYS7tkDi1M8o;%zk% z-guPAPV4!I>_0+eH%MfQ_k+l`@>95&Blq!_Q zS&*OwD~ckZ0r$z=p$uCVlivD94@e))$_*Ei*-a#Nm1Xko535dxty zE_K~k8+Ga;R{5 z*6wV~ozE~3jiHdqae^5Q7_>W;f+mCPIc89YWYHLp>Y$)Cz=ZeZAye&^P`Z+C_lQw5 zp!{A|6sa&5`tT$mir>qW6v`MY)ojmPGmt%v=98 z@#aZ_IO>v5O_7c|rx3a-{3Z_y>$O#x3M@F(pQ_VBl^Bt`;iU1Xx@@DBWu9i%9vxkcY^N!sjk9JlIcr`G~ozq%dpF)7M1;E}obax_VN;cl(R(q=PlCbupuF zTdUKwlE|h4%u;WmkxX0qe=}>9Vh7(h5_`h6YC?SBO}}`@NjTFo-oY3Ys_2~;>AD|r zy&sr9a55;*2G4<2ORlX~0g$_|_x4>VN3SNv;^FN$_a1MYz07lBD;TxqG+zXcDK9*4 zUpN_RZLoz`rM2#PK6O8zXyh-#;fe;{oAWg3g2~ZV@gZegR;qx^^N=(NC3J>ey^REn z`&xy|Dyk|2Y@t!mk1va{>Snp)9fsQJh$|~%IE8Gk69s#WIJ-aVNZL}Tq8nLtu=%yC zor-4FUIMvo$yt;yIs>`p>pn5zfo9O6+ML)5N1*hY`5w+OUkj^tuk&?>m^0sYH|AfR z=T;wBkpcxwsk5)~>Vu>qMTKBA73S^dAPy6@kw&>==Em=FR<>d3xi3U>qE5pRJ>dn|SO=wm5G zkfAsS+g_u9o)?)9UO4dZ(Jr^QGr0T=op;$0!Ls^Wp?pt7i3`_AnH7;h3MnXYW?K4X zj@Zo9XE3}AJwY@ME8`#pv+66+9Mkq04Vg5&JFY~Q0|bn(s@Xca1=?yHnZ$h0GwXuOF%EetFp0u_^d1&wV z_21v>E)h695N-n*L|hO2*a{n06*zX)q7RE9Nghko1NtlCErq%5E%m2`T1tBbi91Bc zNPw}=b+5{Epj*}wfz{98nHqz{v-GF%$?!@=L%smnw{LX6KrO^9%WH&ZGt2S@*WRqk z8&qwC{?m&BUDkqEXC_?u`fDywdP*8B{G@NJ+unTS*YQ>QiRxiTC`sdB5Q^3 zgJ(>bgZt~?P^{IKSu?EQ)rSQ=YKOn@Ch}Vmq=3-IyE3fsz#A)n{+-vluVnkPVACZQ zO`DrPuNI5Xt6{Bgk5WCnJ8$;>T-f%(@A`~^8A7&L7%H54=7-Msj`^^2zhmubPltR9 zu-xuN#%99C;93;icjePhL$qD`x!h0bF{hssrU$_*;nP5c>S|^0!c8}+-}HAx#Gw7A z`(W>;`(Ue)ZjX&%`ns@w8U1aurs*}vU6*b8Wow#VX9gvIf8Wi$e)H@R`;PIPZN8g( zzH_fj`piuKZtneH=QsU{@d&2Au;TQu>Y;%1O(`Y+dBt^qJXaENs5%waTRpHkOBwi|5vlWL@MOZ6h;m zV`a>JE=>pNc}#z99yua+O>=oMlf&3|bIU5Z?@p(UG#_Wrr7dmp+%^{N>EpYHV1AZ(0{(&&|EgbMxZdGqcUR@=4Z(@se$L=REJG&t>|#ZFu(d@iE%X z9dqux55Y^)d~KfRrr*=|chBVVm(JZgBln!=hTCS>r*qGTSZNK5lzy`FbkAtjPD@k| zyIv1r-Fqz0*W4Dmx#@D7`MysUzucRCn|HT~2AKQPHrA=RHMY4e?2qM*-R4|AgoQmV z#k`*q&`r`o!ijxAo_-_z?S)JCEG<=8k^I z-48DFa-D-kH0F9=*>`h$x;{j2-#=w;AHVx&f0rve{ki5Ge-`&0pY>R_?YVvK+h~;A ze8>4aw`y#&4s*xqZDXUJn@jW6%9SJEr#onFnJm|OI`?;M9!x$-OX-jQ>3x#*=kXq; zSDei)x8H5-tJ}PrE92(N+?<~@7+-&6%ICi<7Qf`>EAjUgV8iIR__I@H_F;{7Zrj`3 znH7(v8?%!=cP7b)$V+qkVEiFhddZ#JHoWQ~zT1X29?RB{yT5bWwYRw|w~?sF?lIv5 zoY!g|F3qnPLMX{7yZ)9niL_&B$@>*vm(o;xypZuvO(Y(18LKDWJx zu#4xOqg>nBHtpqR#Ln%T651Gxn$tSJJgds_ya!PobH}f56X*UR=8(*tPmp_)Zo~2B z{%&sCNPoJ&h|$N2@SJ;pb8qXpeO+_=5FbJtoo+dp9to9;>61o7VR@ZtJfQTN=6>47 z(>dK2Gri^Mqkq^>>70~wp2{}Q<*v&^#M$QJR!#qIp83u#Md!|AZrVuSwd~zoTH8hr z+lF!;HfL~~(a)2kHk}S~`?x>7=bbLF~u@}6_^fFFymZKFfXlkN7f-#wNr z|9*~n9)7h=me}0#!TT9CxsA^Gu=n&ldc|YijgOUQIz8(#y$18_??c!R9_yaDKRd|d z%h_|E%lo?*rpuG_$d0*Q!v76B;XJ;lhxLi1ZE4%k>H8!zY~veyEL-#YX;+?Zw|y+H z!iQt0d5E($51!ZK^N7dlcW(J5x8-^G>2%rl@w3II`+z>|4E(vX3g$)^nH%r!Aui+rp%39xD5vUHn_RDW66!XnY%jNHs3u2I@LpbH#gsS2;{Pd$nSsO zBb4XvckT$~_kEq;_kJJiySZbc?=Qys!~X7J?c6sQelu?sA`+;pT$bjuITs8rQwDem0AaT>MN*E@ag>6n`08&HJC&Zv z^k_+CjGtYmn;s=TH`4w#HiT_#7r9*XA!-%n?osaCayf7=Rz4dQN9oSzWz+fF<3}vc ztqaX9!EIALJU3Ep8~ryI{a~B*%f*bGJBw7yM`Nd?bD<_$kUN#jUE83^Gft4Uf=O@8 zrk6`4tUWfPTrbJ}#aJ+jX1e7rJ>PkdnsZMclSw#jav7EBK%Cd}Z@Ko%cABGsb9tJ# z%1;cR?Y1`RTyGKkj@|3|HTS06zr0nx(&PA?bJp45&oT;TtF?`6wv7z@5Xen)+gP`; zvZUAf{`l}VStHxXN88xJbF)QrQC-=0>G*~8sB-O}x$@vP_|J3utk_sM@7u&e`>@fI z524F%!;9wj{pY@$YvoJ#D-vE>-<{sa+2u#dbKAroVh!fb zoXEA=&Fvw~mG8E>=hN{9xiPELW#-)V+vaY4pZ4gnWKZTl%(s3_vF9)efZvGIGb84) z6AL}aTBK<+?O&bSFSd;@mA%XE;at1Dw3ka?_lKRojpbvyh5Y{Ze4G8vje5zo)otVN z%dZ@~jWjZUi`&$0*=FyiXRA!NxjjU-==6SbEiN^TTGg+{ky2 zmGANpvFF?5qun1u#XS2qcOBn{MWvg*zw92JjtKa$h;iG*1q*oN-6sX?7R@J>EioU+iYs#^d-;vEJue2XifpeD`wCbnfi(^|Sl4wxvBAb6fi7 z#(d4a339dk+$fH@rTkpPipTQMZ1WvEHM!sMxXvlxvX$Nb9?QQ+w$W?1k)N3?I^|AI zSCq>=sZ2J$zucW|ZlviISRcY4I!`WUIxh3^{fFD=j&qM?dL~4!J!87wzD>Si?kzJt zzG)tN)i$?BZWeg1$J@b2hir0Zt?Kq0m*xvD#;;0mi zkLJf-PgxoMETa^@T4_!)wga2Qljhp_(^^EXwIKJ#NK^cDsU`?vnf&Qn zC4blFj`hstLDS_qMs2xw>vYO`tnsDw-CSJyG*93+C#M18jO}EBx6GbDd-`(`y62IAWSzIE&9#kRhoJ!G){sl*dZp1Hb0Z9MrJ~&Z z&AqL+p~+l4qg?9-_eAAlYUcKw8*T9r@rB!Poo%xDa(6RV1DnT7Fr8D*jhMSlv_S6M za-(+{@{^EJ($yCan@BP&=ndb(cJB~QF*2n#2Gk(l`nv4E& zW81g6kEVO&)98F$Gv;yw*RAKq3z?gfZ9@&*JCqyAkelbjqloe|nx;h3PeESJ&#Boy zPi#u2Rj%|qWmN2aKBg(rUHKVE{7EL+%ays&3b`2&xqO=K z=EG(&++QZbHe5Tmrq?zIF>_mc=0R`T5jLf_*HE*!!!;`mlA=a;tT3Q>T6&kLYxZN-l=tHrA)&tV; zQ#=G_V(wVB(X4XmWgCmfHvEspKj+S48;@Z6yXiQ?Tpr6sQrrePa+~T%b7$Re6Fa#L z1?E;q%15`#*Yq`=D4PY`SV+enpwNBQUn%^10vTduDU<@N%ty+hL|n@yO1NfxJyk$y`0)Ax_0Z z;BC)?5t06stIy=(1Z;!)I5*}}TDp=?4BH_0Io8LNir?FuuetHT9wNSH9*0cz>4PxoY`s6QwhcPiFeg zP0s*g?KOYCs2AnU;a{cVe?h=t(ocF!)2+tSznh+`&vFG=Y~(!sZd3Pun{}SY>zK|T zn0w6g>~H$JhuDuaGWWxtqiyCfJzswM8sxT@JHEN;^dV^XA!u@*c!X{EP;NfuJZE~F zv!6?o4{B|Iup`h40D_ENFTrZXMfj|)&6TmRiCV>>Jv>> zbN{Iqi~67NiJiNTpEmgQ|xL?lRm3cPXs-{l`g!y*^W=SBFWcxC4^ z3Y08e3_iBzox>7e3J-=?242!Ua#pBkf&M`q84_skV>QK`|c|9gV73b%@kArNACWB3%zCEXapE8!P%&vdIH56X%W`VOm6 zsHsV>vVeX6d);P9|19#;4EeBVzYJ{;i`D#c+Wyjf{4zA#e0rirGBn%#@OESYWyE0t zWh!B1`_bI#1r(C)e?INz7rq=W`mlio4lzZH=X&{vEoy%G9@kfPzaPYHcVfZ>frx?q zgIW`shDR74P58vzjl=kBx*>*WP7AgpxGkNtST-j72`?JTx~e9ws+ct8mGB9^3o9MI zlUetj?$%YB@Mj%?rpI_%(e7j$&9rwleF?Ma8@tsvjJ|hduEK7G zO~T0=Hm_El$usbsVO_h?;w6S+Ix}}p#_3ZBPsU=8T{vtda#?v0bR3b_C5A;7%CNTm zYOW#4agbL`SEuDjSAo39ZO}Y-S*lHtt4n+jAjPO_19%;iX@D9;C@^EV)zgKmSy(v} zyZRyRm6Tx;lTCLEvs0@JFfeGuLGGyV)M}WX5hkJSEHXUBZvt=E{9nt3@`gGpp||bc zVB0Ob0i@dR`)PY&&}Qs*cT^)CNbC%YGbMi%9~}Ds61!J7g%TZ*FEKjmqJD%;o1vd| z6Ahi{6^5G%ZgWF4>*WqaEvpJ#2E-b3!gpJ#vibN-@pQI|183GW+<*BMz1O?RD6tlf zQS+(0s>7GEZXv2l1WQHxn?4xk1lOfnhT*avorK!5ZT9}W+xx9I&raoQI+N%o94N4) zJEza}AjTCrla{M1p7L&W-?MekWhdB5_bKAJDl;Bbq;??uoQO3SwdSE*1-~-w&}+DQ*&-TAkcd8lY+xCb4xtBPK;d(5j z$4)m7jeWMZ4}Dezm9w_I^&9CNWi7^OVY*f)SE9B^%eniRwTn5M441gk?GHQgMt0<{ z^~(GOmb1GWC4R8lfx;25!fmMtNoT1rEk#{A9~W$^1)F3!ZI6GLog9zz+8WHhq83WC zmamD``q{?f!)78v?qzS*Vy9pxy^K4swUVfH2HsA#w-{NZv?XgW^C`cD45{fou(oKK zlvcCxFM;ySFPFZ%p&$6kNjvbcf^xJV?@rcI$v#7W-5@}$5qZo|*j{1vxbKwACKpr8 zN^T-MiX2dI>&xK5eZvAN(sq8ZKezV~I8rmTihM(5}YOlxx{|^7xPGtSni#`!ldnSgwwG?c1~P+Pm(x)$m%Nr-2%T87u;QecBD$b-lwb zMaro)LbRhgUMnqCG{7T1EisxaS!x&`DkU=Y-g!@<_>MwZ@H+C z(3%3bIVhh(QO)A-BI)Dp+tc1ff!wL1!C#A`mJW0huXr=9x4YYw@MR!{UKLx2xY-`G z)i5dv#%T|XJl(hOQax=bRyW;C3*V<7Za&rO5s11Zmv4CGC>+5ry#Lkf6V+~BYcB0& z-bH(If9j6r+7T9(Qu3xHkYyRfZ84!qRDr$IyKxUx-SMMiOPJDxxee}g6Xrm@g%-kk z{DNmmOy{Z{V?REVHLDcqd3Xs8uQ({w#bc!Om&lNG*n-*IodVdo4(TYnjVLLJ_dED! z@kDJ|f1muKtZA@g&G|ale26SMS?T^2F(Cj02@kHqW;N4kKE4d2Xg+<{F59Y+tlUq% zpt!K|+7s2Wm}%ocsJ((tN+f1@Wf{W8ATWfnVkhwGHd@5M6Tq=;$n1c>B78~YiGGNC zB?grVU9lm`%gsjLX*oqkf86jDN>%k*JPX(Ne>wvE)?VKxgzZ94M*{VLPgvG|so#NH zO?a8;wQ#$#Y~e7RRdB}3NJJD_9qb`AV~)tHqKpix@cMteEw>uG-njnPY*C5C;Q3e9@RdLQw$} zCxZmY)H#fdJc;FkFTPzHhN&!Z(g@5#m~s}^{QIgHB&27sjda7+vW7hg_eDbm-Gw0> zRQ{OL(hCV7OR+lWgl`is!&Sw}PiREqZJ{0TpuPxvW_x<03lo}1h+$SKD~Y;!gz|^* zSovhudS7!Hxy;0JFkFR3CJ<&5oA-LL3b!0A8#eMHx{|=L=wDzWI5W=AT*@Tyth~<# z#a2RuGqv9R-G0y=Ui(ZdSHll1uj`|j#w3#){^>A4z@tW8Ku)a6XQ3yrL;EcO!Uz`2X>SEn1h6}VzuNv}& z)sH>8qjIO>pKIylvdFO-fDojdFH3IcyozOD*Jx@?eP?JOrN+>}H&2=)u0!MHtex~q zyp}t~jC#`W54LH6owfpYVEwdpb%ekl^(tsb*1Do-Se8HD^WCyFpqMYeRQgpvuP1a` z!SKBPxqgl6rD!{?&Znnj#1t~=>I z12v!Yi#WQgNuy0GbN(=Ji!j@t8b=UlxW+nhU9_xA=YY9sguvC{VTVB0XMHognL?qiJkhfy`p>LG>x5Y}gRk-I17I!? zAc-XI?2)VC?6J0_g+biwNI3UBlW%|3zSjy=IB5{1LF`ax%>*%fq zP9Sg&PTLpdSljE*$NK29)}Y-N;`ao$1`G&vnpi`d;rW<{=Au&7fY8T5H}MH=%=#i8^bmHm zurWEm7Ano#Q^-0mB;+QfK?R{17p}?uwO{;e9i&w+Ry=rWz$5XUnukTgt7(M3vyw&t zSah{!CvQ93;i|bgGosU&mrND_CaaKj)vrT7A;Z_?N_tZ?uR+OxEZ% z%s`s7MxUTnRv3mPbNbi%@4vuKa$UFlec2d#+`WLPFE{S``8>V#MHecY6+k1(xY>^#m$KuEp#X)0Gzfnzz5J4RrCskX)q+*yG$ zGG^s(A?PN_9&dF}Vj5&r;y%C#0>CF0n?%xg5;p}=@e8C=_TX{2xP}YKAq&WT?sb9P zKAyGnDYD3*HE(>vqgTVEiH-fdbW|saLr{^f5L3!RLv8Zhg5qGynSpfHgAx^zU@2L7 z1Ze%uG-3!$-p7rGtWHk7c&^V(ZtCx-5SKMLAq?GO)!mGk&Y;)t>{49|E;m0Uy8bXR;iqUknyl;PQvqkQ2!1Cd_JTY z+!YKSNTnP!Q(nkBHkWg^pionBqV2kyVYOZ^@R|XUmR&+DUjMYM+>{De0(F7GZp^bCbETTS2PDMHXhv-_TOJxgu$a}!~%+d5fJ+vBgl<+ zrhQ34-q7JC&@8g_gKQCD<%lx=+xp+XDZMQylV3__t??Na1{jXf&EDknFH;pSUs`!l zDQ$38+?OGfHTKOPmdf&Ow8JHd@Ho>>AOy(*u?-lS^#o%t{Q~`nh%GTKTohZ5ZqvRt znD0YQ>){sNNV?`1;|e%`q{VyBhi8nnxB3@j(7f4}9{R)l8pmfRGYG{i$a0lff#bnB zA8vtagIfSl?vyc=F=Qs$#DNTZ(aW*P@|;4VVz6;K0;k2XbFYw(o!&#IfU#;=Sf8P_ zAt{oCG4Y!{6e(H=H;h+Fxp!|i-=N%1<4EP(`|mWy)Y^SNIt5ZR_rYa?6oKq=hh*G7 zm-hq6CgH@Doi)+#<>}MS6#~dol|yI)e@c8%G)42^Mf4zn zGwWQwZj0vT-6`(B#bL28g9Y;^js2C;=AvnnqH(x3b&yTUR0?Hx1*S9AKf zu+!NX)=O*}WCHmU=WAX@h?{U>#EaaK3b1=DWf5N(XT`|u-I+3UU+_>2PCAaa>|g}k z7Kl`<^lX3wvy$8pI@u*Vh?yL&9Itphkp*z%M-M1u#3UMsuv!-NCy&_?fi3B z$!u2-?#vd$sv6qo#nd%92*@l(mC3sz=Rt{0@EGf%Us z!m^Kz%YUz+7l*4y!fD2Yw4_LZMmRuj6|R8Vf-HgS^n}nSW)N-69g&2~v{k#ex>_3S zKa&&~ltJ2Q3kDL@Obyz>_uG#n)!mK{PMLeG)rmIHfxTPaA~;D}-!bw$MvTU0cUw+> z4}TDLO1Ng1P?L@|7H27N2r%MWJBVhY=7PT5j){W0rPLF!DzOAl(4ic01g*c`D(;kF!6LDZ3QrS%VUwj;$OCksxSn$%3V z_aTRKHWrKB0!^39tz`pD*+J0=xeNw0etLf{NeR2@F8XWz@h`N`eM!Y_#(hC>j9m@4x|S`)iL`#Z5ZL%f!0}LdeM7A1-pO^r z1A7glKP@S6BANoHJ%f?=O5uOr#|1Ci=UL`TtD8!5{eyi#agaieB@%@pNj0(E7t&Ez z#%DPgx!|lm9fD$FOXwR6OHb3p^_MCXUeLr!15h!9t3RV)&|Rc_5J!(2D1eWjK7RV& z`Q(D%NwU!Tf5(gEW#NO{f%+jgKFgZ|BMp1kDSmmS^DGSC__0U4KW;KiU1JGc{-O%7 z!aOz_R*6l26+O_54DEDDaZmd@a?vefg*7fA^&R5Ie;If`dVp+_+rg?>+3JK z-@o*)Q1sb_g3;MT>$KqWrQ-bevTGVr0~U=1-w+&xZn$b0?`5D}y|Y+V-?s=z>tw$O z6HrvZ<37Ka`^%V(5#j)Blo0}f32FjuhT$wM#i|ld?yF7OV(9@4u-8qz4%qMIAZ;z_ zy7bwL9iC$w?_WzUc}bwaU_k*J=D3Fj=b)3I&&elE!vo_!UOc@ieedaU9Mw&KO`F)H zx}`)9D?DrFBYhgYDY9aKcMje?K_FpmHK*?Qfu$;%@YYP+9LX|l7mJ)NBw|@ew zVHC-C#Z}Ooe=q3bH?JM?O57e_AN0A)DDn(U@BN|Kiw+G$xqv;$(8e8Kh2D(Swe|U$ zGk;#VaK}>gJm{MP&DZ7bN##~$TBw>zu&Za?vj8In@aMrwv6Rb()HaLq?!kfrEgELg z6?hDr_$=IXt@We7q5>q=NmzfT(Wk4zDD%Wqf@s&P?neZ71fpt8-0DqK0m#iPTuRtD z+~f>8BhK;c&{0O7rty8tp-2a80t$!X7165^tRT=WcrMj~bwIY_r<`4DEX$LCzM-j}J?LMrZd8eMa?b>PAqnlMI@T#7v^ZOF9q(y&} zC;Gx<62bRr(Evw8`27K|C(yD)yRf8S`)ScqVWgHSo5)Rfi*{@t#3-BCUQrBu7adha z-qjXZcW6Nmu%i#ej|C%soJw#_D_jl03@G4+*?v;=a6Wpr#-nnTn5{6Nc(!L{)@(H( z<4~1*fjHwd^fq(0&F*&7ZHWq}YfDw%@8+t?uNtBUoY%CT?bOXJ1CRK#VDa4L?31k2 zBr#nlcca!{zG}zb^4A1qDjHpe5QpZOH8qv&^uk+KnW_CzEb`i;z|!-alqWNulnow) zqV~4%RQ>_fT8ge(&sG$IwueCH`d+!v=&{URGG@P6N=gA+Rxs5w^2eO4Y;^hSv$| zEDviL5;%l?ecs$QV4d8pVjF~)6w}EsW-x2*uN%l;>+k<+?dt6kH6Oq36^!LjVQ2{H zl346}6NfsjVF*=>7(?fY3tuR&oU*peCn}0%^3V0xf0jwH_^iIyg;7)^C_VQi7O%oK z^!`q{ij4*7x1s7k zhwM+W;r7Oj(}IpyYq9_UX|o6_gshZB4@R>Vt+G3Ib?-`9pw|j8zvR0Pps{JD%hY(< zn8W*ZKf+})IGJaz@4OpHobUY7+mVXrlKJ~D4*CMKUB2~v;G>7oh^}j#u>n?T{p{G#v z(_6H!)uMFq)<6C!crhCOnqTAg_PHL}g zek(f#JAm33z2Un3M=P**Z*|80Wq{{t1-#}T>l;KE$l9vYszhI`J6xZ-qs|Z(Fq;b{ z!>@&j?yYt2>(`c@5Z4LvUB~|o^(gD^fOUq5&M~oWcw;Vc~`XZPOUce#h~C@gT;CK=<61_w|Vru5}@k-s%;+mH5~Z%iaiJv*Q@1G zOiatsg&vw$!oPpgcAw_=&q`@@zm$0CKCe(BA(}0%e;@WzB`J0alFINA{9K#7ZxU zdeNdu1RUq#9R2#F8Gt;ny8+s8XKQ_7W$oBBe^5}+)!5o`Rj~Tj6l)ot16LAMw+2(C ziidH>1ua0XCIY&$F*udSV#sTTEi$;n6QhGvU)o|EHPx;0m+krD@s~7C2dv74>YSlGs11?~{8%t}=3@COLP^5B1ro;O-DOMBO*>z;$I(U6kd}g9^MuAA z4Ax+sUCuVk(8+DIt3fM@SK%&!p>FG06=`g_DD}rlIzKNq0GFQUPrGMqrDe`y=2YO} zutEfYOUmv^Fbb218NejqratZMg4>f5dp< zdPjzT@7H_k9=R-LAfQ)TBZmp@Y&k(=PCrac(3dbb6!`r4W}kC7wJFq(%W}h8Zp$IM zEC!N?l2AO|%{M0{^~3H;g;YwJ89~{aGKzBAC=g87+&V^;B`ES({!0uORFbqY-$izD zmsrNS_HXs0*1jWQ_3bqaki0BT#SHJT5dD|}Dl&PJoN+H(DkT=1J-90n;3`gKnI@dn zIV|18Ii6PAaXe%8J}v#77K}bysiT}eOMV&w@5zYDH&ai9#j||US|KSm8gnOjCCA6G zj%AGuGVo#H>o6c7L&$F5!evP{K^7ZsB>BC9{_F$Wy81MfI5Dohy8=NU)i3FzDl2C8 za31 zPS&EY9w!;!LLDPwG>dHQ2>1exGe~tXB(PmoPEr>W*yHh?0|AIIW&Zhb#Kh#@4~_jZ zaqdAAhaXZvpc*;34P>*$fxB4xFs9Gf_3=Khy28Mc#ccNND|*?x6W-MP0^TBezQrkT zs{CG+SliE0#dmcQm<3&KJC&-g%_FB;QE$ATzs8Y?hLL{-Ls!esa6V}f9fk~y*pi_| zhczBViEhn8cXdODhB}(;H}$Ow!-j<)!lk;E4)0mGux@{ae(Y}iUMR;F6s;w>=q1Cy z&Y(O+s|*}IUhK<)1~s6Rn{x#X>)hLRRC=Va9M$Bnk9*JjRwA+ zuYM=7-&VTb)jco^n;iQtbTHna(<9Z75wgD#Dryf3qbD1DRtN*oxZt+FclTvj+RxXo ze%`)&6u4R2lL?XfzCEk!e|@bO72&qvjHEOt9Mig>Ceob5oSD;oP%<`2;f5Fyhv!r> zY#3P$YwA({9p{y1d~a36PckOKAD+tR4d=TC0`8>OFmIs2HVxL#2q&kxwn3pk;+cR| zNp$FA2D4QgK7EO91qWd3pqxtje;=)*g@WRGbvzI0+nIe06(*;f-Ii2i79(V=F`rdb zy#>@JIaQypfBqcy{9x(B?+*P$-~tS5fQ+IOQI6T-}-kTnwZ zi+q!avM%84|9)Q|so%pO?v8A2nwKEX&>Gy$@P0y?Z-&?HVGCJ$_okCE-gSad^TbV9 zM-|?ERU$0zdLipSbvAETi_XT*opmBe6D?l;Sw|7P=gN`eN4vDaWJ^*63ra@iMv>7V z9&_|N%ho$B9kRMG@H$B<DlgtL5zx0AZ@V>DV^tSL`jQCE~ zYVrIQ+HxiLq9awGMGvNZ!01uP?x3F$s@l|MW-s=Ra{5fv@7t-Gu#q*rNQoa94l6#; zGwdCuWtKfZbi=ExeBYU1n>(x(lSIxkir`+MvBz@AOCzF3!4 z@~TDbfmr>>yn})C7bPxmBm_&vtwjTw;}x0>hKY9(WV*3qo=uc=S=lpd17UCiywErl zVS|8a;>RdADZK_5cBCd;K`SOWj($`41j<0n7vYOFO=W>Z^fwIcp!5SMW52n9zn6J; zc{DA54_|+>_8NQ=xWK74dGzP;vJi)dGDnFgYp4g-hUkH}!SyhYq&nE@3)+zeH?fEa zCY&eEVE}n4cI539zIa2hi#EzY0J+-6>FJsv*-`70vK!RX0?mS6L3ogrlBWG|r6TB=Z z9u_D+W%Pox5;HR6Ij5o^UEq0|HRP74cHTSWgg5$LyhIEMIezbAw)YsCRs7!h1~H18 zP>Cy_q$2+=OIqg@>pindS*b9io9GqSnu?+c8;KXBq65C>e3=JxEZqY;u#*2^>fy)@O4K{#cKS~xx6ZGy5xMQ%E4hJ4 z;E>yX7P)mWvJScJKOngQh@3-i=l@i4>uSAhL~aN7N^UG-pPEK9$gN8raLDbj`goas zyi7mf%XHE`DivM0)0To~FoP%c$NVpvIhoFuGEVPi5s@y7L=4>3W0<&%^1u60lN;CM z@}e7WvnZmws~xs-{wTNDh_U0oF)ub9rkA}E`JjQghpV!{CRlyN3C5hu%J)+`q5bED zpKX_7Kl>bI%LMD37IShD*Tbh`*4bJ?#ZK8ObD16J96vdtEKbMPdwhy^bFY^2klA%m z_%ZQwE50^nyv%Vz=kPG*^o|9DnNh={NnC!`)m6BLm+etM_yk011B2;^EHI-o^!)D8-k&c5LZ8qwgT zP<_9M7hI8o^%DmV&3z~C1dDlmR{C-KW-+c1sBxq}OjdR`7S6H>l0L66LYUPoGwf!k z3n7F>HpAH|7-E4W)#21+o5%zrs3A|D^lt~F%I;M(w2D<12Lvk_t26JzI-NqOlvK~# z1?O<&0wf8n)l5f6a_i$0eo^IEWa6dRDYkc}#h`vST-k6}Zoo|lok@ZED4sSA9^e-IU?)L|6IerwK5xsBZ_;<1 z_H>i%JFXsew{hP>5Gtf4(f7BeWOM=~&Z`BvsryqmXj^}EhAwMD5yiyAlY#YQb285pMg7?X#0G2V2a4SKcpquQ(; z4<>=*^;S|*4MnM z%ZtmRPr-eaTOCOxfa`)6M|!7A}L0!U~K1Tj~-2=+Syj6djzBdrS z5yf7xmAxx?XOaKT0CmIPF^PUXK;jT_NGkZ)G`|vJ-5H!c9lK_ zo+0qm_Q&1sN717KZ?JYk%I)c~>%O!>!i-cu5*o@5X}){Mz<9&urD3H#t8> zH+uW?0U4B<&|UYl7@<_t=g~^3hHv?gLoUIhA*3TsN0N0M$X`x56czvZw5z?y0xc|# znyxJ>MPub?ud#RPZ<3hNeew3uN;VhKgCcKYStxkWNie-gJczi~-h;0dhLJHCpO+b< zAbzX8#CoWDlZHMRL^$kIcxxr{yA{556;69RtWoJS*jzbstc$V<>W|}YJqW_V!h)|n zYsRpkii7B+?yqSBLG0tYs$mE;aVp&%6b!Yvv0*e_!RwWs*eg=)K-sOH4pn~pjeIiO zK5o!|-Sr=}KoR=kLG}r9kXM5rcG@O3?8ZXJ+%}5#2h}jA%yU4?&C!jlXK}SLO9i zHUR4|51k?QwQx}`+S!Nm_~vzv?=}_2Q&bi#C)v4;C%hIibR(pfnQb>yediBZ*d1Hs?e(Czh+;s0kZTh-`oR+k zS8)5*p%|=AhE4iS^r#tuS?*pTO)u5}Wu;y|9-N8#7$4D7td}q26gPBOBl(CW#U-Eh zgzCM>rJOz`p~F>wJ#9dD+A}TZGr9L|rzb%co!tkP0fWeAgXv9I=+#SeVRyquh7nERz~pjb+g3WB5& zM5Z^m%tA)7;&q_4A+{vxU~(2&yb?bu36>9ce}RKHW{~#hh@qLVjPKf`7Mm-+8{R#_ zBhW0)6SZ~H>2V(+s)TF4Z<4a!bECTw7mq|U?w3j^?>eg24hVfDGW^-XP2?iCuIy&@ zZ^}u)QCJ1K6_9$N{rh%3SIu59T5#L41(p|K^{c$q4|e0R+aLx+*QIV4v zj6~(gqD9IzG&IciRXqE21?<_o=GNICNnpVVIVhNCB^6Mk|J7^RB}*QH(-LQsoL9Klk}XRxEf;={E~~`0 z3j91xmZT{4zmAmc))b~PmPm*w4zG(WYu-EPbfGvS;3Z!8;gQb$coKL~t5h`qxaiWB zo(~w+VkK)Rw{ih+wXi5;z;OX$+54*UL>w_Hrl?`OnZIe zNHt+1slG-- zT!u?lj+|psP>PgN4NcybW5-#C z8epd@5jEUMWY95$v7AVddgO?aLoQ?*>kJnaI-Ho`5VPSnWQ`hPItg;=k*kFA#v%7R z+At?Jf)v8?LG()R(0iSogC3g~&pPwsdWq}GSLR=cB*>5M+ErG^scJ?edEJoY!msO0 zYr6h0DEZ%d2UtaMHV(VH`x?coj?bk|0IN5nw7nOe`AY7LSE9DEa=`kW5gokrmkAi{ zZ8sVS31N9MHZ#1$1$36}s$DiTO+u%6$vKx@r>uZ3Vv0bg!3E6>ia+#4VQ9RE108;) zozTO%ExY(XW9_s+A~kl9cRcsH{(v6h2iroWi^dIqwzC`nSb7wt)kTokB83%-WgL=Yd)53L? zQyQJrZ){ldWl5D37BVC*c$PrnReqxK)VD$Ymy;tzWm0ZW3-yaD77fWt9ieB+S*8@=HG@dMCuhNl@jI=C*o;U}$X!^uvTa^hR98Iq=N)OC31U44OJ5Y66gU1In!=A& zeWy`h1r($co&ZMZUXQw{#sVyBqJ*%6&`kWgaBCcn#Z0P(R=sS?+V~zh0Smi4848~J zDi4+X7&j%wi8VVizkIC-j~VpLMYLP^WQrlAF7tMrkGmZkZ)dsk0wEcc+EDkLx+x=@ zYetL5Ljl3@FbJqn#ngZ0p9GMdq&tvWnF%lyCJirxx7hWvvD0OyewaIT0C;hxet3^l z4_1o@nQNT%eYKHIh5>0Tdnx8QwTLT5#4I{kG8E$Al2t__XA~eO9S?zyW4_B&*@~Oe zw+1r<7`u!x_I1s?ueQ7jta0m#+oD#zElSz9m6_4WagAfuiM}mJLyLw4s%>oz%MEP} zaD6X_aBC1ahCJ&WJ5I;bmr0SDM5W_;C(v9;tBGeW#MXz_?{Y@|2v?*_fBPqEjRDES-oK`2^lT`&|&5PAeB` zzmbXF&>LIFNWsNp4&h#vBd#=4KabRg-mvpcyMz$e4MC2yxJVG~*9uebGIAV0Z_v~i zJWp*})Ouvk@}h#{0FYTP}V&1{aZHg;=7y}f5qQ!9H-DF!0k@_U*!MV!vI_}yg` zwaDO^24g@$jR9s&zfp!Exxx85yO`7`45tjQ!weG_9FfL$_uqml_x%*xXy9myzy-uz z@-b)6k8EZa=-79i-piG2^~H!W3KMjR}PB7d?^|m+GG@sh+vf zW0S;9F;V^Zl?iCUvyW4YA^JC&x}H#Dnkhf!iey^jJ(28G=5}qJb}kMA!$4Hw8?H$y zTqCOuTcwWUY+9R!O~cIP!M1W8rPo+f-dO^HLt_PoRX&l(t(=Pn*wKm99ZH(r@>xHf zbsgN)ZeC5K&sfiIIbs)cX`4mZ$_yF6ro}29iwGDlq2G$EEJhi8cj|Uayypak1X96O zE@B+~|F89P{|dX=-Du5ud4|FN;-C>>MYNVxkXWLyf5T?3%Pc>VMDH~J{0WiafoA z7PsnwV7kD#_20kBNbQ28hz?orBm~KRvi|Cm<6y@+PGp0y13X_U#%+Pq|8)KL)6x_3 z?<#cV0=5KUE0>zBu;`B=hdYq!W$7{c*X>ws6YmNIo%s9u@9z-(f1r~-|6Eh=pH)=H zP}+41DA+{4gCczypB0pxPk@{|*|6Wh|ZyXIW%uC96cp)~B>>q~n@s$(_3%EcA_%wTXf#nrX+v`>-KLX?nXDAV%?Niw z>!grDJJh{eP~yQuvJ6%zVR@#~&S^rOg}2Zr>%X70w@{it?A2NB z9eDBSP&Y5k|486d?DWs0>ru(UX-;{Q=Xatk7Qtvlp-8+MB>03ZEsQCaYIcffF)aQ_ zmqsUJ(xF2`_Xd~HEtGT;c#c~m=>%9(Cy!xGF;{ySc9HJCUSXGZZGuLz$z6HU`}TXm zLuFAYCIxpJVUwqY0^2wmiEvYBG@ULm0%!?ZXV6PfNTEeve2ufU&eTp`!h*>~gE3;S z+av~( zB{Hz5dW3$pDR6Ctxhyg*mrjb&dAGj|6G;ymF3?raU_7PsX@J-Q@Gxd%i*M!w2TCT5 z!GzMw-;OauR|bhw&91ULbhFUq1`k{TjC!$rbP#n35I%kI<$mEuUkasB9NkeXkn4ef z0;|j5zKi$>8YpWIG25!W7e(f3yTg+@Y2mx!pIxp^CJs>o^h`SF8E~IK&^&EZ|Dr>% z?rNuIbQ9WlkzNM4WDO8R5M&~A9LA2a*z?#N(%;^&P7d70{I!o>^%;Vt%Q{ z`wPn1(A|RemN&cGaHuqn0T;iUp_GY&(OzL}&!wyQD(fI8QRLES%HjA`7?Ev^otK&?iE&VT zNW#b1GKWWE!RW4b#{srS1>Om~vBzD013sdEA1l+eNN{XlrCvj8HSVjfY0tQ_m^Zih zx!$|dB!;cPJ)rE^b*T6f-ScV$;fyxKz>FW{K!(>Np{>o4P?ey0@|;~-`(HcVX<>a45* zV=Jp@zw0XIJnu~F3*(q)x1jY_ zf)lVOrf)`m5FJ-JXhwb!g18S3|(m(j)6rHsJevbQtu;y4OB? z4kOkE3x<*KG}t@9D3NZG{c5dbNm$&yiq`e$Z?!x|+QUC|_1khTs@RaX;{c!DYY(E@ z^gUeX_Yl`dK8Sk|7Tx!-H**idk9rHh8&t6YVZv3_v5>I)G}x1$548+b+*o>QG#Cit z#;{PE_(A)%`@N&jlR?&s1DiUA)+~L;Jy%_5h7Nid^rwypm}gQhLRLOy6&8Ut+k;ql zS6p+8+uYC5%_y&>NX2)i{l$VB^eb&S1JXz^{{lx z5Dh+IUC9$Jz*ilS{8eBT5>r8_^_55IYTEz zk}zVjNjkKD{r5l7w^3L~Bb7YCDFbZA(;hYhVF*Ijvkk~>u{Znj&flxj0}weQ`4J~Q zj&xUA8D0?yx^vdM!9^;}&MsOzPnbti34j66gLRSpA%WhL`#TGTa`p_oc1lG3&pqFh7xK0;ohkAH*%Sm+~IzIZ^q; zfldVrp6GB zFI9LAxUjoYEz~o^iq=3XYn+sHkcjR;06e#l2E%lXN@_IHGY_y8!k0Q1?ysOpw$51F zi}Iqlpm@-rQ7+HxL3IDKuwImf`?l7%mAQ#kbQP`#h}sff-m%8Lz0nP$nwr6!t2+CJ68oUuoVYA>#nR#!az05}h z#XNoGx?NMwH@+&|{C<3{MX9AHN}-syB=8rp%6pJ_5TYh|IU;r!0#}0wBLMIq(vO<^ zb%gC=qSxXqI~K1XMCU#No`yy|KCH5*8ON7i^-Q;!M1^xOvio^r4syK%UvCC@S!NFq zjS>yyemMdm%3j2DqS$hC;S^_rCy)CO3>viv8x}LnEA51Z+dgKB=LHMWWZcCqpF>$) z%$Y7LHw4QyfA%ulWr=n0NX^OEywn_$azsVz&^v$!q$Boavu7RRq_^jYfg6Wj1v6XFQZIm6|G=gP1oA2>nBeL z>2xpknLuCR>pGTZJ-V+ci8H0quSd@;#U6>fhWo)S6NOC4dMx`2Bi}OoRgHEH0u98G z8rXx2LK*8t;Rjng1uYmfz}KLJ?NVu)x%Xq!{I^8cpj$Mf2`bc zMD6h%ms1>N^#Fs{o8G==XQBDwrN1SuWJVGke1yB_LH=Y@WcPH5i6u*A7I)LCBB6A@ zM8-wrjgHsJ%6NFjYS+?_L^5SfBx-xTC`=63f?~rh>hj>UxWvHtzXLOQSAd$RU_)vZ z_zqrtv^D=;JX8exCJ*XVy(ociVA&Of^{Yo!1p)BT<9>Nl%^6;Kx?`4ivQWauZZWx+&%xwE^*BZ>V@BCIP z&CD$UzK^;$ZH|pMjw-8~z6+3sE@hE;Er-79v1XYvNb*{3OiJ(_+$FWv` zH!T{Af{0C8vxCqB&IAvr{j#7{pj)6c9aFx}H9iO(E$E*`{|T;|^|o_?Vz@9UG;~Fb)nG~%5d}p|FRLL->GfdNe1_$`B*Y5t zCegaOGY5-}2_Mtj74{7k@)+B71Dyuc?Aq^%8CMWmFQ$oSBl`qWhS?=k?q<_nVp9aw&$y#tT%lu>g4L`4``3Ea|5Zp}>&i;TZvZYKz1bqB$-lpPh!Gey_8>8W z2crW$!@t%k1%FkYDCy3yH+FviVC!dmIycd(#a`5B19`S$43!uq>Jsft*GJc7EET?D z_zS}WwIeltAhxBnxk%Z{CK;gsj>txR>Dyy4)|I2iI+n5|uG<0ep!nbnTdMd33l3;r z|K6=fqiwpfOb{(T@Z!$5Lvjt2V@=}s+aPKN>;O+Y>fe5qsPf1_<|Tpz3*a*RRK>MBwq>#-Qrq- zFm7rb+!X%LPeX8RKc*v!r4L}bP{4c)P+x*2d(HH9Yb^b9{mP%EUpPtpf6qfwm|wfV zLU(ujhQiwV=GFl{wiHM6^Ygnx`7VJ?N>s59W9@@$*YYxZ6RLk08TLE^cCwctO;tV) zx=4)gn9(`mWZ@uJm4K0m(Y126U|lq+=B(4C%0BF_@bzk|LC40A__8 ziK%0|E0K8k$VAEp!%&EFjfh8XITrDl4oPmMaA=TWr2#c|naLS1lAPI+ige7k!P;^& z#s=`vDw%3DtZw*zxp;b0Q0X#*DwN>pQkbg&WXKn*P#47wz^S|R&jt08u|!lasZQU@ zP$-+l76~I~9Z$*T(`Lue@zVia#Rgu193xT`pwZx_UzIt#Zuxu=4+}N=u2iOhMB3BL zc-f$Hy{AM}_e8Wn9iC-ugWl=YW6;$zK&)t!dYIG%iKcNmvb`cF+AQ5_jIeZ3s_5!T zhr|ndj6!SOXgL;-mmYtNu5^|dfBLNDjsGx$rk%8J3M5GmZ(Hv{9AU5+tKc^WZYcIuR40s{hcrBy7o%65P<|_Xx*2$?BKgYPNZByI?knO17HAZHb7(pq2tS{W4^2 z-oN$FhUpJKzjeX01BeZVJ=&koBRD9E@M(d>!=PWHg-~*gS!S`(hxQ^E3|8<;#oFit z(H??UpR{sqjR7_c(+P$IW}UGVV+c?;j>y}nd`OCqofr2Iqc-kdbjpux-}R>XtD74; z2jl;O#z2v)qnIra$|h(uH|aN2dXw^iTpbH#U0|8m=9L3| z!rV+}6QRFb02*Rcu>?}nqJmC@(IN64h`6y3b6Zk)$&Z>02? z>k2yoJ1#T6ej99>F5ntSe?1YsY)-&}n#~z${CjtAnL(OhN+x zMGvt0c7*?=@PckjjPR41762qdxs>%h%m6neG31YBtI9;# z`M=e1uhN-tAyO1kDt=4nrg4d-QkIZuRV4#O4WMXK?+x&<17 zPXg+;XaE5)xh0MD4W#E>ktTYbX?JGmyM_NW#RGHkzf=gov}Zuxk9##{S_a}KhSMe+ zq*SX4iznB&$ZPKEESh+B+#&V~Yy|A2zeDm13w&bUCD6ncjR{^c3uu*{cZ({>2V%^Q zmyuftSO5%`pzKgfi?tmrX;f!F$+O~poMaj+$cd%f+i1G!v+Q0;F(m0(MGq$|Clfl& zxwz$LOymnV!aT{EVjZdiIeJf-bS9*s<5CCOLNH= z6SFkU+o$Eo2pR*Y1WeYQ=Txe3uIqTO|Nf`$oHF5?&)0uHZ}Sn4+HZb4S}#zLM=!f? z-mUXY-c=nQ4J3}O|NCAI0d$bGVw{~|ng%6ql%ELeu2f)9y1OCOB_UM9GfOIqud>Tb|Z{NP?>>1750;ukMzNEHM+(U2sj ztHoJIhXqZnCyaauY>)EzKU@F(EXF0V?W)E_bQJfS=+o4q0*hedk2RTrEH7gQDrXLE zh9CxbwZ_J>U*YaE@mt!GQ)KI>dOG@DjaCh2hOz}(yIE*Z@i?UJs#Ll1UbZsbFd2Ai z!}dOI*duHho?K6nj3gv@8t#@w!@aNrELH*DdDJb=huOBmel#8s$GeL{7; z+qgG+{;`(j|EM~l#XzHcr;@xqucy@c5&i!w9KI{|$i~KdVU%4~HwdI=gE4M z$c|O^0V6W$UBJ)HA-F7aNK#%Ncv8nb0ClP_)O%S(Y$9ymzt)W8UsWftx*OWJa@f7q z|NE*K9LC?-Gxkl+W}2~IWsSWvA+P`b7KH#1ze#sTctdMrN3*+a0eMj8F`eDe&M2$- zP_C$6c#p|aF(p?(Hkz`_)Bl?#R6Z_85jjkiiJ2~Ac4BDN7)~8FC zT0*7I1u%esX;>widn|s>DKUQt8-is-nB|$3gD{RaEtg>n0!HSx%7F|Zd4VCNkcgL> z9g#Nh9Skipm!1{%^?G59ZrvcIHT5FOOXJr}+WQr83_>~(N<~yGVj3`M zRJ!Pt0601>;X5?_iH*y}%2A6pJuuHj4U)kL)fsMPJS!|_Cf`-GXu>C{sZ{qmC!uPcE5oAj9Vm_68rOg%H$=gt=`}DjIw+=*FC@Ge z8}%g?@bc>lwQj2Q-(O3{q-1z?_JMZ`C#hgyF#H$|%6R+O7K)G)8!dMeQglCo9~GT2 z{fL9w0y201U>UP(X1MYe~;g23;3|+Qc`3j{GNqW`8?Z>HG zeuEB{3^9xVou7{#OFhlFvh#jLX@}KstReNzohyle#Yb2HY!9E&|ZKd^7^70v@-FK3wAipi%Z z5AH!xupGp~D_=jst214n>gCM`Q=Tdt@VDC^coaM)=kG_+tDMr-ZrD={BK&qNh|=PT zoR&G!g-fAQ+$BM|n`(fG5CZRG(p0a@c-CQEkV;dsE*FPz79* zGG;ODf%MKaT;P2x5i#9D+M^2TZFyfcvwDP#XLP#EI>+z`S~^(SoMv($B;ji@QgaH- zV=GAqgPTqAeV5~vr4QIg?78DznCX}>u)Ei^2umu~fW^i4(pkQuF zQvd}k=#~DjA&UVo^{d(xr%0BFx~EG$`>syks{OTgJ*DVlc;%OefXA=H)s}lXbpUS} z_XRaeceT3aM`b-PMcxPa-I z!0ry7m?#=8Uj5r5+vvJwCeOX}_v7_}T` zZ=UIc5Vuro&MRz&IrA-G-)f5`?<~I<8uY%*w6jOTgG_;ot>#zd28%PQon2R39mh?J z7rG~Mx^fm1!CpQqoK0-KsYYze8M@k{@p$+q*e+y_=xe)2SJgd;t5f8#M}}2?AazkL zL~91UC?{6?ncobGh{lj&%F?Vrb_Qx(O6FI{mx5;`{}&7+x?UL^{aE0eMDrB6r}fhg?Gx0OTn{Bow8=D zVB+@5GqmC6n_G{2Bl~SRYZoI{{P(tlY&hohp4I)HEwcUotY`51pY#<}T-e&zSYO2{ zhIm#?s_Q1|5U=aDt~GR9V5J^7vSAgM65UCr+Wc%xqrg2Bq$h}l{m&PPpAm(Zu@qJ$ z_gDf-OeHEdT}fW)iRPfBR{*n(Gz8gmRWMeNk}O@73x@37vyGP{fUF+k_0YgxF+y#A z9ZeybREY3?v>{9ziG}2Yf);s#_u#@_4w2z>Ld`UO#Acbm2`1U&A->X--eTk-H)MYr zQUzr}XNFMPWnbk}BY!Z-o|w4zb*VxooXA4DyvfEggld45TNzdX*3wW4;j5sLfQ+MV zu7(?)R%pG!TvMpgz_1`}u~Jolwb|LDyp0u|px@Ztgk;!k!D&II78den{B5^U7&5H1 zNK-LGI2^0h&4Tlg&v<-*U#;66rFHGZITjp6aYmuCZXRi*TfYLQPfcDvy}<%aj+!UFchot z31)=#w(+m-Oy!R|E{3r<#LiR?y%=;p(hOL>mT9?QzH8JMvp}j;l$Rl9EhPdAL=2UU zC7xMhi0SL-5EvrsM!Mao31bGm8Ec}w*J|?2ad;+gEeW`tE;0mE0Sr(iAQ)_&eTa}$pu-O>M=SVVpF-L0roQE6G_@FdF^TuRE`^@x{Xey$?J&?iL4%s zvVX8j7Qnq+rp=IXnC!-i*$*maO)a1C&DocX6uuxsVt*t@{W!opqSy-AQJ6=OQT;uh z%weIcfXLfc9A+Mgy_54Y*CR2C%_|g}t~U9fxZ0#;u)5Zy#^Y1vDAg)pG0N&aK>5w~ zb4+rx3>tk{pg3_yOwTP`jf>HV2^$%(z@7bX7dP{qBLMdvn%CSxqs&{zL338R2gEvP z4rdAG+dwXKi(gWee%;xz(J_Vo8mayGO-u!!cw;SSf|fFk1W_vaGFq43uEy{Mxio&pSB!z zy~&lThX&O?r43|0$LjUkzAlzt%?q@ZZu10yM=TEdPw9G^LnuUUg!-Hzz~x0F;`G=z zF9RtzpX#=>qOh<4`17h^Fbs6I4+l9f+V{Yn^UC7wSl-|KdRk$zgcl{wlyw!?es3>_MZ13e^uJQo9kC=Rv-y(>M+NeSRNb*R;m}9)L3Z5DH=X8X zbE|5ICVO3=I?U=N34xfp(FcAgrWV-UaHc`>Xej)!P@5h*Xrje?+RQwVQYbl@ewSL` zgHX+8FN6#{Vac#-WX|YVXMvzDoX=Ciag;k)qA;a0BZ)u>DsYuklhoom*TK@O}GrJLlnA3h!!ZISv>h8OM1#6v*v(3YhaD zbW;kF4j@NkgNowsZ@X@$FFL7cQ3| zO@g7;%eK?yZ{ZXJLIo=p#V|l1JjuPLno^>*&kJ(L;e=4`mX04Zu#6v$&>#!fJbbeD z@sid<1`RFtnH?lFw7wPtR&5H0`WrOeN-rjH;Htn%-^^_6MhV9-5|@>q9?A;CvAcj7 zA4y%t3Tjq&g`S!5ilOi^=q`8E%orKF$*yWtYWwr@QjG&VR_^|{2wTkc;aAE9A8B|{ zs)3-D?DVU%Di=Iq)Jk?Q*_DrxU)Gy=PSHAr*_yr?NbVSG2D&T}tI06~oy`)b3t=uj zS9#;tiEiG0okY4a-a@yiwtIXW2lHNR(3jjU#&r6FwOdecuSpt;_%5p*WM#Ns*Coy7 zI73FVa+W01o~d(&RbO^iEq6&Uu-Vt=TqgxCKgd*2seL&73rsUvHL{XRWPMeR1<{4S z!!S}{k9{oEMS)Qna(-U)#oE6e;Gq}II~BenqU{T*h01UpSy4~t4!9{>8y>4Vl5xE- z^i@dzj{{K-JG&uV^67(_s^@xBszsBZnTXAz=+IXOVQD`3g$rEZY5_Z)9(Q&eVu#_r z=30!Zy-E`1Ot7jZFyZFu-NLu%rSmxV$Bt8)mePowEqsOSCV(qJ;Z323RTx*Aw&1d` ziNED`!S0G@#@TG&%?s|~E^?-oRbLxSqlUBFQZ#G{YR}MEygL`V2^xJfgVi@}zKPQX zPbUIJcqa;kx3LD}n{Y2>mJDZGq%k=XpRCX6Csb&@IXGAE?D_Bx z=7ReI`FZ`|B~Kv}ex+nsBXaK+4=Qrco*L(XtM778FRNd;6mUnVtE}>4+|g;f{Mw=S z7S&Mk-C~-(G%2(V-a~k=S;)%@p`OEw;%sCY=xwebRGWhL#LQ@IloiINh!<5}mdk>9 zcWs(NjTqX{7Ra`Pttavq!+WyQI?7SH6?3KT6n+I7pjiwzViAE%i(YqApBL0#?z;a2qgjj8^+h?r!GEJN z*t~we&w(6E?+&Q`_9~s4N{56nFdVB`#yyP!4w;O*3_QbyA6s@l zd~RBA2>A^fuY)IeB^bfX*_2^C?-|~imIGNhlV=Z(4eZmz#SF1x)yEu75E9eY8j%sf zTGPlyw^5P@_#|AbDwzGikqgVOn8kXq7d5k7C&DGf8w$H6S0wD#Nw6c4!Y%CzMzNW$ zJ;qh%ES`sWCK3%obq1^LFEZo#uM$r)GIm|U=`GZXyj=C@rZhcf!=HZWkB{3-3mMSvJF&G7=l*a2VATNFhR8 zaKjPY3nECY#7yqqA|i?yn&<;C-4%20m;G7TKlJL>U#Atcl3Y&?-%k~uJ>w$1%gQBW z)%-jkrIr`$c8$Z#BAG%nkiD0l%hLk7X#$&u^)XqOVWcO9X=q zis7++FK7PVH9?l=g^CJQjxyO27sY>VH#)jS1j=TSerb8{QY+yL``s@`a21^fU%=1p zQ^(}Z{=1(;4P{jvr!}VMyt%fbZ2D?R-^`h4*p6tTkMZV*HP6n_)(TbdYX9A@MPObk z&Ge!YquOGKl+o|@-~C>+^>Y3wbQQI2U;d35pceMK-->WGspR0hNy)YZgZBDh(Mo*~Ls7qL63pV)tX%L&H9#Ao%A z3J8nW%*LrK2vzQJ1S(LhlBV%a@L+?F%SSF0S8h34fAyUmU18MIWw6|+Tl=bHDG%z7 z=mHEr4|bZ?#J?A&q|zdK-Tw1+_n#O24Sg~!areE#jL$%|Xl|2^k;rE0TJo&EME~YN zP&~u>v`h1<-KqZf>te$)GYe_Qt5kYd_}KPw9gkZbL)I=-N8jO_Ppie^)2hP)ks8ds zu60?+DykX`eaOY@_Mg4Z^v06dSE?*2tBezu5x+{5{$?p+u_5=Y^lK-`#g>NmC)A=3 zBA6x@4GlB#B1p4KKjqj0(CK!Wo}CJny^bagPC0_!5yBD*WlnQq5HIs9yZe(C71sl6 ztErj6NEdenBAmp4HV1`IbAas*CBL_ups<>LSK~bqF2fQ5mHiEdvk5H`Q>f-F>B=JU zsoLWN#_ag<%cFI%JVa^E?6&Gz9CgH+13gD`hPuqGzD&HIJM%8xXi&#~;qzLCQ9i_% z)_!(roIHL_IY)a3&ss zo!8}QfMZOuH>KQ01#u(6erkbu~<_^r<9f!pL2=Ns)%?$iDb8D9Ba)l&VvywZd z=oO0b_lzelvleH;UKW-of72e~p;}nZV4+}{oM@weopyt@F*)iFfZ#Zq%4NC12!&at zM%WhxbVtYvn30;;n~YE*rBfrk99u)cBJ%4kO&_70lGF$L+1Dh@nXv=2o z`wugAe?G#G0Kmb_=Q7&vW-5Qxtw_K^qk)n~i!k0+^hR=&ze^r0RgM5t*7_^W`fAO}(7r~Y?v zMV1=5mmNhQRS|v6k>87utRaBcUt}4fV_dr{6tSkq6m$mGpGnoZs#T}0Fxn{uL73=Q zp-l(*nMp(4GKZf(U;p%Z?@tcjyjxp9-vxnir)rz*_hYSu;lE8%`HwhLW@}58dN?ez z*R$a$->K@OR*LKvpeM_(>78Sk#`haARqNBT?Oi;^of9A5TgtMPe3-$R)6?#(jMB^K zso9S<#un%WE$>;YGaZXZdOxhS@|kqN)}PgZHT+p9Tkf9L{*;WO6|=^LTFvA~C+3`g z*F&K0q791?D~==oAL_#*k_1~&^#59qNBC5A%c8aqB7ccWs0?^55w&Azh5g?PH*%GX z@1Rnr4pgnC&0n?e$|ztLCB8J==L_|YIrnGLJ44d7en-M{l{*|tIN&=bLgg-chxr&` z6kW$UI?qHfZ4wYzergqPOqHSnSK8Zae*z9-_(cQ%0G ztL!#G(~E8|RZ!+&>FnaIP4>J(ap|E36O&b~hT)%!*0@R;jxAWONpuNMCh;emXq; zSK<4(QM+fd6@l35hM%^WDX*uT7##kF=M?1U(LLHz2Cth!k>oPzqhlR( ze|wwHeC$GWtcx%ot&a%+Hk%rnq|BxCy&J>=4%D>;`=>!D`C+hgciH8~U82sD4^rrw zBAk651eTv|!0a*Eoby>lvM2ASNH%asBa#_W>AG~~4p&sV%@fItkZ}{eGeph0qTl_B zWD8d$OD<)S@7*btLC$hK0^a&!eX z&MTQ!#tateadliSPb~SQ_&3NU3nfS`$&GOl}Y|;rFs)-LrF!}Y!X7XsOk>h{w zqk!fSQTj#MP(nHQXf%3sqtRlja1!xTh9P9aa}FY}RBW=piTM5O;*L;JXMCB_<}@xT z=qRqoS+)&jj~SLN_u88#kUW$u;6^i~M1#YRqQS$922DcCFRsPn^f;;|a&hFu{SCu2 zQiG(w+{<!wa|U%a=nXebJh5*40o((5c=><77nFzBYe<5=D60X8IKDb+(Hgp#1@c5K z511x;(1r%g^ylU#&~;RMKHO&ahe(4j&x;Y^X4T=1{EX;*i-v>cq`(Vn3mk0GxC63d z;6Tv;r?0J7+PV3*$|N(I%WjdAy~rw98l>6Va;8L?^s<0w(1=dkCfM018n$6T~H9NAfW!GPq}v^bgzEfy}D)rQZS%r(i}?6Vv^jI4rthOlNNb1Hjq{K>bpYQ z`=fzmt;Yb?_G#FlcLk)B;A21Nr{n~yJZOdNGt5gCZ=p)_7~958iIy{=4ausJ?<|sY zYm&G5&fnlaN#yhJ&m#^^=M45DF<7y|$aj*UJ!JT9J=i}AOVRFNZxe%+bPVF_Vu+ax zX`m*f>ly!QY;>22(TS-FMm%A3r$=OTF%+OPy6eQ~#2~i$+8wa98;drLhq<@$FiGzD z)|8c<2RzjO|G*C+TV!SLJrl~FiITk%opU(O9qve0PDp05Da2(&MrBi>lu^h^B@)@I zj1c}Gzi$fPyYKh=fA@I1I zG3=z&UKoA7Wi+ZMXm#rdQA~+na;_P_YH;;bhixi{l2*_7bNWw=?2#-_phq1iHI5Qhcpd(FmOiSJ7&U>-|6Ka96Ta|i zQ~m0#6W3kltBP1t9^9oqKU4Z-1bA0}v%BpNAu!3Q&&64WnT7%3EMHz6|IA?bedVXp z`n@*ad&K1z4fzPWu=gMq^gJA~Z>;%_rH==9(g=v(xg(44N0fZmoNmGdd%5+@OXwTh z&><#)Te=*kky#~ANQV`X6PrzNqwO9VNBjC&t}m+$v>7^Ghc<96Nmrkc}S%zG%aV@`1JQp7M=#^mGcOrFL_m5Jw` zU&##64HL%<>lGC_N_)7!$dl{Y`}dkRn&MA% zW!b7nFN$X*P|s}|3a$CptA<#K4RWOP`M50X<=>aK*xlmN@MeFE3LYGC@%E=K(zB@R zNj~xXBzQPh|67m?ITfL_LR+ie7xXvun#VRUK2E?f30x>br!pRpWJKt#dVlVmT(K?w!_Dc&;0jL|*}$k)KQ( zJgV?P8>*30A|GDHM_~TxP~|Fmz`P%m0Ww(k?U26{!R7j!RHU5C(rg#~OMYJX?&)ZLGm!>7wKy;_UxNVCPV4mjDm#5qAz zzrZ){3_mFYIW0)tMGEys|0${{>iDNsgR#n7A(hJ_*Sky;8d|(&&k1-G-JElFVq$ZX zH0XWO&HRGAocb>*<*zt7KDWk&KL|vPMC!~K*|&$A zu@YHJE_y0Id^L@i|9_AliAo`8=g1zI5!C^w8MvoP!q*0S_e?w44$x9hK zwWPv0MhHdp+S+MGhC=G&o%MDNno6XNS53UeRMB>JF$L{XS)y+WEJwPz*mQKL$&NUr zBDW>NQY^dNMTUk5`penMY5NktL{pvpMF%&I_S)_Kejeq zx30Kf=2%PjIPm?&w)wt}`a;Ec8-$yj@K`W(AgfV;(pySBZs|s?%c#uh;|9&d@EN$p z*ye3U!}o5pcb>yAQ`*v)*@W0jx0%6^3g1@C&yu=*-kj2J2d;z~kutVDr_t*yu1eGv ziqjAFf2%-7d#UMTkK9U@VtU!rsp;E;g&Tvcp9$xRDHlb1f&1<=#z>d--|S(H|9)TphL7%Z$645bY~6Ir(yjVH>5#&k*QgT`F7s2o-~g`&30%w(B70 zNk3YBq`W#9AVpeQ!mp z)+>>ToEE$EN-^H0sI16nfjzZttFDn}NmbX`h*Poak=kN=LBvD4F{#e$D>2PvN9w~tfq>XeBDAbQ0SQ!2O0fZC4MZ}0&}Pltqr$e zc=)dVlK!Cy>&ceJ$_UL_v?i3W+iQtcfHUTFiN+QxA%ytGTMw;SOiZ{_-Xk4lWbJ71PZ zAjOw-zM20dRZuOw&Ro$t*W3Llf?Tn?zlW7O9wOQ~cz$7HNESO_rscp1frhvh0Jr=3O`Bn8;w6V--`CX zc0|4;r`&b64b~uXn0J||WTeBESSU43Jl~q8`5os^vnW^E@hj@l!8M!@Muw)JUQKoZ zy%G7;6MKY@sO4Tzty*Wei;})fUP4^wp{L{mgks?la>0d*-aplR&Pt>Zb?@N~WDoRBk#Ek17wg?Bf{b)%Z&zTwDE~6> z=}7b&CsL|f0%x_GvFOVrCGHuUdS*A{sEl=P`<}(Ly{l1c0>3^~{K^t`cAY978-UH; z$eA*-rXJE+5HBmLGub$6S(!}eSX0L-c;ZeDAs6zg+tcCka;7WiDLyWT+;c?NpomL5 z*SxI5+s_BwmAnuZ{zZNJ=JZ0{`@sAMRH6?F(76u+pXFA0`aXL;oW~RpQ7`i0NNvhM zd~H=Fm~y+YZSaF<1CJj-~t7m7FF^O#7Ip|z_~C%brLe{!_uY(izk z$P5DQ8nQT7MnH#Wu~&(yGd| z@Ok?qSuj(w_TkP_JJQYyoz2H~q|0?yeYUTRU#h1Tr3tS70) zqPjvF7`-}|?c!&z{;?gh>Ho^*n3#8xgE2#}L|eF0U*2Z8j)3OLJNFXoS(Hn4IeC0^ zOu6%Bs}>olO^qZoIKVdNu(F_L)8ol1I$D;reJ|CNN*CUn-Tir7UB!}IAUE1?Yo-c1 zT~MRu2He|)JJt=_A39_(aki%XW|~*+D@r80QCd@kBoF$5&y?zo*{{Mnu4h}m zekpQ;{$t~|gj63{d!j@%LB>L)8U>|ZO5!OVBXT#Yj3hhd=r_H<|C|(K*zjeIV@bIm z?UgI2$F%y~HoUgRgKOn0w>UrM!BEm1tIrezX$#%)zPHqp0qt%**K=*?%oMpyB=h0V zRMslFKPp}GzffxTjG_9lYvEcn>%vSQ%XO1ZSsyE5mF$~RSG@^Ctt-0Op8LA<26kug zQJ_Q7XdcfxrQ=fR#j|GpD}?M`eLsyTTd#A}8~$i9^y;XuEn2ZR3zei#W)L-_)#H=M z_+&kn+{1|o$j>?N_11aX4S0`A@^Q-0!Lwd9({ma0c83y9%Rs;SrW(O1vtz80I)a#l zCS&QvfX;F9${%I9qSoAXkJHO+OV`inUo7z*cr1VS=hf}`ZBj#hqC-bPgrLJ9wc@_R zhaz-50!ct1L3$8~4Fm!qkPc8gH>86X9Ey^3LqeRvlE&KVTIaMS+#Jd+T@kGEv|CT} zQr?%+^C$Hs#WNl*Vy^f}2`>mw0EHSd_sr?Gh1Y((Y14K}`zphPk#B}=mc_(Pn|e0k zGJ2-c8U7ckYmN%vUl-AMUJ9mp)T|Sds$RY*2T~ZGqe=p6 zt4^=Z886+@EO@bXX5%S$BxQ1{%1@iDG})qF%*`(kHghD@yCgRvphg;P39!8NHp2&I z%4WHmd7?9qe8T0zuiLuj^h|2{zImHZA9wS)9OyfirIm#VV(qmX61= zitByo&eJUH=C0}@JAI_&n?uXdwzbuCRIwKf}@9Oe>OE@ z<*gY-H0EDc4C+dM)vhT$QYPyp=Y=x6_%1P_IdyT|{L0*u&hqNn%eR~^EDt(1wl^l; zshxis><|5fn7U18C{o}0uw6P5OMBEYFjBuUEa&ZK(;tyPVet+qfi-8t0LJJAMd`$c zG$Biu3|L}cmW!QNg*nLx@|to?Q^d--sMOm`#yR+~zIj^`(zCvNOoh&TB1h?D` zeG8U*vm569TA#B@>QY1Hq{c=K;>L|xbTx?B&9!`9touS(ZdPmrudr`DNiNE57Yda3 zddbWB{T*L)^k#pF7+<6#ioV!K?yb6ED3heGpp1xd@Cz~U)|S5u_`cSCu;rD-#>{|N z!c-j>fgUhd2t{$UDZOv@t(N?xuisoJ>m>O+usJiOS3G)7sn)w>_P>3{I(fp4b_|pz z6B+qR$r$`#bl7oYbSXE$yBl6xkw-B7seaYkkocR0WE7J=rq3$41hRYnWy(^5`>pHt52hh9>+xc*GNOh+ayrt_j} z7=)Q?+3w*qH5U~(eJYqLCL~EwUpEs*>nT(ZO{P_@fvH*qDDuiPJXFxmG#F~XX%%0j z#?VZ5Qp>0#BkqIP@r0+rJ!; zsyi|;d~`FZj&=R)egDh_<_$THL_v*5tGv!D8OP3Tp6=|)Job7kHfta=r>xyw;{>k* z;sTWRrvQbnc}F%tyn)=1?_1 zYUf*+@eKPRwe#-2wMJ~S&!kU3tzva?5YeN)7h!b5zNgDuBIWKk1Fvf&S#IANW%c}0 zyJTsYQVUGI;V=n%2bPZuaPNiYxB#!znaf|>=}owGvOABeNMp7RA?|U#aBjJ5=0JC} znnEwqGQ6)#gT7+=mT@|n4)2KCtuu!cvbq{|ischz!U!xLFTI{?xVX50y7qyIsnU0n z7#iebv=doB^bPL_m1S4$vh7r7XT24dKtx764F%&%1 z<%cR3y#GjQ-8hEhWQ7gq#fqAxlL13z-4SDk>LO<{^(|@$sWfGu*Rqf_uyo}2p7nkf zO`~k=SU0_D-O(>_dtmvL`Rbh}gVRqqC7_|*v&K1v3asz_7o;Bv-+!4u^9HV$4Vhm| z`jP_Nz+QP)hJ}Z_TseiQr{rkO_Z9bawT@#hUU&J;1@DcIiJjG~78p;L$rMViULLHk zcL}JpCEak*Jc`yyq^~6yxM1U6CTB*gIlumJZ0>J@Y{I#I7XEe19OtcSjqDQA+-z5csoVow%26j+~evHq?;QOfkRl8Q^|*O8^380pjj86Bg5?jh~1F!qNwg12>$>XIBf< z0b(F11@{SB&q zI)@hu_4Gt~;<9)eXr*5mP~mGJL5l374P3xW`xWI-l$*F08V1M3m35=xI1Vg50buX1 z8G2y6+&!KI_1Q`CxX1=cz3p{?qzr)ZCH6`D5`vffOX8ha68A#Dkzfa?Ck}(y376z_M_iBg13K9NP7U^ER4k^;5ii{t ziFCywX+ikrs3}l=jrb21kx>|4)*pY}DaOC4KuiK-C+CNCg{LY2&v)kDB#OlZdgG+R z5Driu9H8$}?UOP9WM}TLM)SBqJB58G8}A4HIc-sL9hg1?z|w)a-%sr?u&+rCjgdbmkB&#F$q`jiu>34VYq^x zmf5ad8DMb&?IFT8ksXG>f0|Dygj<-yY9jC=c0%`~b)UZDhO5eiE{bM;du&1j7 z@-nWPTA3bDcm&XcCQw)RR~M3`|3Zf0f_myhJR$%!6aa1X-i-qmW0Qgty0bs~YcKPs zbKdQJhF;v+5)}Y}+7b@Jcr$Urc7hfkY?3WvgU_1~RLVqtAU8$6zzM?#O4deSJq)-z z8_?kG_n!$xB7BYQj-_{sh`1vhcXHR86fXpBrT`*iI7pRK$4mWVXT%jSE_0|%$U40Q zY)l1^_XpAE(|D;nvLX>saUg=k9e^jeYEgZde*O@U`0Icz2T($O4=iR;@1Mc$Xc!WK z3#q}`5%Cjm~~pZpEn$$9kVc#*#fvpd)m479s&@!#FPrxyaTuSV|>5AI9$nr~L! z(dpk_=8wJ)Zp!?rbw;BAC7aNJKuY_BFZzE_|F#Sqd2#ao4G~44G^_(teBUeGLg1Bu zx5ofp00kBI@Ph8!vhBtj%4wDW2sO|kFuC`knceZC-J$prZTg1j_|{<%=q1;|1T*~) zIJlP+3?YuU#k%Fung*;BlnOZC{z5L{i&w_q%lAY&c|uXRyf2}zulWJM?f+Yz9Sy+C z{o@br_{mqM<%V|JHVZ%%`z8K>!AsuLdU$vtaMtv^53Hxu0WH`8e?8jYdaQ@we9kBNZ2Q+T48N3eXSe0f}*cPf#+6AL|7J4*mY#6ZrZX3l;*MTL`ef*x$84*YLvr ztQ-w?#{spGO)~xgES&#u>NF!bgwN`GLKKbjNbUTb9uY0jTGs4s2+m= diff --git a/.yarn/cache/mocha-npm-11.1.0-7c863baca0-50d1305813.zip b/.yarn/cache/mocha-npm-11.1.0-7c863baca0-50d1305813.zip new file mode 100644 index 0000000000000000000000000000000000000000..43820c61a3e55dd13d3fc325e578ca63f45df241 GIT binary patch literal 522102 zcma&NbC4%Nx;EO=wr$&XPusR_+qP{@+qS!>ZT#A{?P=cGbI-Z)eH*)bZbf8O{*g~q zW>)3d8n#F)A`5pzJEHQ4e!R!Qy<3oxnwa;Vyw=*F zReM5J)T-Jq@ews((HHTz!e5_zd-(Zyy*+=te&7xLddml+onGWf1(b$Y+W%tj!Flp? zGHXU^o`HKF9Sj~=OC22BqPaF^*5FgmQ#aLr2|Fx#Eo`5Xh)yF^@TZS+&R?`yw0?h_bT(Do;3i!}L0s zJ6{UY@4xL>+Mw7_JN2y_Yhhd*_NroV6l1W*qt`Qj3C0TE{$@HU?=w<}FzqNw`oTb$ zzMo1#8;C`B%NuPlIhnee5`dCqb_73!Y|$F5&nr#*+wUX^4Ga>>C$}tz4C$6ujst2| z&mgc}W;gld^)|5?br;NDC5OmPa#?1ChIau>-m@dxV0?1QnLaT^NX~TpKvs(E5GOM_ zsK6(v8EZBTS#>qb^eE>R_9mcb|3?&>EPzmy<5UmazhTThsjpf}Ba+q7qr>1dhF-}n zb;6BQj!IuVVUEq$@CR9fXjnsb*Hu&~&0^7Ov@|{QjwEfP(moS$Nx~6?%Oni?kJRql zP}-88UiuWoB7}lEBek@>RySEbHlX4@QL+R4J)|+EW2zpvD^Jto`v3P2jT++_XZBZO zSWo}~;r{C%`oB&ky|J_NmDYyc0VlHWtU4kdEBA~>oR72(1jtnH6~ON|P_xLe2<7~* zQys54{f7RjN&cJgt8`lXB#+cwu~}YOh)AAlnCRikL2BkcREROHp@A}#y2k0U(W)xE zqLkpBTA;DUENCw^1)()~ofFS53%HwnFDX@3_Ryj1_bcdHb|MlhsZChv*_VxQ zqg0c@(3W~odoZSk%gF=SxKh%U#DYb?4w(q139%#BR+S^yCL_iw21tpiosG_&WV1X3dHeTh{GbUlg}V z2?OH|kuifytWu91A7h!;cTw#wG5N`w#R#d98HuE7fL)P(Y1OSXaPd`3Rg;8NImlr& z5QZprf@$sPFl|CpLLpGUegVsDb&+S@lXvYyj?ciB#d%Q0&~KJP@K!D8%Gt*XVA+8gU3}QE5d^ z@f0ok)JUZKMN4qd|J+^K@oNXme~TP~IqLkpWpEM7Fa1T35#-MZJC531kCYLJsdkJF zGSH*&V|hQEZ!l7(>l@jo4x$_k&rp+^;kY(opHxG{eR3zV|2B+$%#3TwyC*!fZpEz0 z0;_BkFQcv`)N4yKx)1uuS>=VKPGY3MC8AEEOIlPv61sAryQ$ip(+>VO(`Ncs#ZaU* z;zlIqz%{V>6_oR$ugG$ucXWpBAvG-+giczyq7#`NnV86C`>FA-hvDB&@+UE2jo8R7 z6DZb4%<-rkxD64*X}O@P-Ola96pA#%-~o@yWHUv0b1;x1=En|9^nA2#JQ|J%I*$Af zsVn++up5WceL2v}8ITP9j4{DnLk*mOGRh2Binc7nF+q+l<99$yOMoOYw>oSL
    e2;lZCJ2GmVx&027YC3H=2ArL2WvJeszu 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

    (C19 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

    E?b_C)RlW*YJT0#rX-kmnH6-UVp1qtUp*# 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]wAMf@Tc8KXrl{`*0O5BEevMK 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⋙aMl;;;oZ%H8+01o8VFc~YeBcjQHpzK3Ki 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

    PD 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�D`KUUhwi0)bh@UCMu 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 z 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 z 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%0Ajne<9YP2T;W2!6CAPLfxg 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

    -en#ZIDgaLy^DO@5)N~F#ra3s`iI&5p?5~`TA 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

    8wV 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

    M)&!49|L}~$rXf`D`Av% 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%0D(exn?_!o!*2#K;_U@jn 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Ⓢ%7yl=h5|S@KCE?Q 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 YkhQTA1J{LJA$;jTkzR5h_Q<&Z1Ji%8E&u=k diff --git a/.yarn/cache/nanoid-npm-3.3.1-bdd760bee0-306f2cb9e4.zip b/.yarn/cache/nanoid-npm-3.3.1-bdd760bee0-306f2cb9e4.zip deleted file mode 100644 index aaa2856372177f170b23dc1cdcaadd9527755af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14130 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 ae{9C@uwa0?={E(652OJ&G^_vPkN*Qek~FXY diff --git a/.yarn/cache/schema-utils-npm-4.3.0-6f0a75e2e2-86c5a7c72a.zip b/.yarn/cache/schema-utils-npm-4.3.0-6f0a75e2e2-86c5a7c72a.zip new file mode 100644 index 0000000000000000000000000000000000000000..be3e2a5b007c483dc1713790414c4daa20a33301 GIT binary patch literal 24419 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 BsY3t& literal 0 HcmV?d00001 diff --git a/.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-ed3dabfbb5.zip b/.yarn/cache/serialize-javascript-npm-6.0.0-0bb8a3c88d-ed3dabfbb5.zip deleted file mode 100644 index 149060932b602c0bef9b03cea7b1daf7327679ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7321 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¼&j5Cu*R? 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ऒ-x~GayM~U=1 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/terser-npm-5.14.2-b0f8815852-0646b5db1d.zip b/.yarn/cache/terser-npm-5.14.2-b0f8815852-0646b5db1d.zip deleted file mode 100644 index cd1e15604a58b13dfaa07cc98717b8255accdf72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428464 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 {F7O8au~I*Zf5x5GH|#(UQpE_- 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

    R>@>_4ryz8qHkofPIFBKkgu<_F_ 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

    7{`zeicBiV$1ZgN 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 c^8(*BhF>*8`keqco?AE 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

    g^zpIds3!~)0Y?-<;A#DTc^@hrv(Y>? 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 diff --git a/.yarn/cache/terser-npm-5.39.0-127c67156d-d84aff6423.zip b/.yarn/cache/terser-npm-5.39.0-127c67156d-d84aff6423.zip new file mode 100644 index 0000000000000000000000000000000000000000..ce363f81246e36905222dd53db9c4a849a2320c3 GIT binary patch literal 470431 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%0D(%0M<w%8i{~UkL#5r#h?twa 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%0Ac@)AUEQu^`K*u}FoCLYmUBmK_j<EoCJ3 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%0ApNk2g$NGmq_5 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 F{s)*<kB<NV literal 0 HcmV?d00001 diff --git a/.yarn/cache/terser-webpack-plugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip b/.yarn/cache/terser-webpack-plugin-npm-5.3.11-1a5bba0883-a8f7c92c75.zip new file mode 100644 index 0000000000000000000000000000000000000000..80a01804a6f2c77a1be6512fcf2d1b170f5f04b9 GIT binary patch literal 22979 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 S2?=oZTE8l??9ll6>3;x~3aGdM literal 0 HcmV?d00001 diff --git a/.yarn/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip b/.yarn/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-db2bc0e570.zip deleted file mode 100644 index 31a6289180c11f79263d104ac948f56b31d1b86b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23168 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 Hpa1>`;xYVE diff --git a/.yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip b/.yarn/cache/ts-mocha-npm-10.0.0-1ee8693e11-b11f2a8cee.zip deleted file mode 100644 index 901b46c55cb2cde958a5a098cfc8c69aa409171f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6054 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 Kf+c@u{Qm&Z6Kqfb diff --git a/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip b/.yarn/cache/ts-node-npm-10.9.2-3f3890b9ac-a91a15b3c9.zip new file mode 100644 index 0000000000000000000000000000000000000000..753a6cf69dd5c5ccb33b734a78b8b11c7b130e6e GIT binary patch literal 238737 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%0DJsJ(;}?Dfk} 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 Uxq*ch0R9sK0)qwcXINPO183eNF#rGn literal 0 HcmV?d00001 diff --git a/.yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip b/.yarn/cache/ts-node-npm-7.0.1-dfa4b9e69b-c1e0f15828.zip deleted file mode 100644 index f2f68fbf7518df0df8609e823b412660ffe8ca95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39072 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 Z8g$fg&=)HJfD--rf&&0#qN@V{{|CNEBLe^c diff --git a/.yarn/cache/workerpool-npm-6.2.0-d2a722f6bb-c7dce6eae0.zip b/.yarn/cache/workerpool-npm-6.2.0-d2a722f6bb-c7dce6eae0.zip deleted file mode 100644 index 67eed4bcf4f6a5347eb114bab24333437b56439b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102713 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 Xw{7ZTE7n(lDE@xpd#C>a)-6~A7e1v7 diff --git a/.yarn/cache/workerpool-npm-6.2.1-1486cb2056-3e637f7632.zip b/.yarn/cache/workerpool-npm-6.2.1-1486cb2056-3e637f7632.zip deleted file mode 100644 index 2f49f88ce936a749d10b26922a339598edf0fdd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102732 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%0DR4=c7ovYPQ)|Oy8NZT|P!jWXvrx(M_CB2xOC9 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 diff --git a/.yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip b/.yarn/cache/workerpool-npm-6.5.1-7e0dd85ca7-b1b00139fe.zip new file mode 100644 index 0000000000000000000000000000000000000000..597d5476b3954bc1229482f9ee06e89c1dd10e5a GIT binary patch literal 111251 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 Dbnrse literal 0 HcmV?d00001 diff --git a/.yarn/cache/yargs-npm-17.7.2-80b62638e1-abb3e37678.zip b/.yarn/cache/yargs-npm-17.7.2-80b62638e1-abb3e37678.zip new file mode 100644 index 0000000000000000000000000000000000000000..44b97347f66eac032120fa9a2f16d0a41ae9288c GIT binary patch literal 88003 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%0D2JEQWw?9lyQ5n+s=F!m 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 literal 0 HcmV?d00001 diff --git a/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-db8f251ae4.zip b/.yarn/cache/yargs-parser-npm-20.2.4-1de20916a6-db8f251ae4.zip deleted file mode 100644 index 02c6c47e37e698820e43e15635633e3e82d66f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30011 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%0D>ftQ80v;jwx<w^i@KU2COniyAW@O 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 diff --git a/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-9dc2c217ea.zip b/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-9dc2c217ea.zip new file mode 100644 index 0000000000000000000000000000000000000000..32e7f6b59ba37dd44c8bef593a8547649fc24916 GIT binary patch literal 32536 zcma&NV~{3Mv?W@$ZFbqVy38)ywr$(CZJS-T&97{mukW3CFXm3f%)95u$@AmvjLaQt z?{y;AN_lBeFf^e57=pDcQ2)93pA-DQtF4`}iJpy}v5U2d6NCK!aVyUMzSYCP(aed? z-oVkx#PR<UNA!P<Gjy@AHvXT{AV5(6`G7E@>Ks)BKtNGtKtNRgjc5y7V-t6JBTJ_% zJ}ak9vBcdc8lpTq=xT|H8Q+ei!g4h6^(PyWk7{0O@kJP!-zc<^dm#C=HG>~ltJ@F0 z0OIkkj!Ib-W03T-f8+W;ChY1e+RAh0yyc*;nwqTU=oOdVaD+nUk4<idCU^hYAmhB= znuT}8pU~O;O^*^kuDaW=l{ZhWss}^t>4gjHJCd44EKTXcKU&D295ksa_(#jIcgRHj zC*~ji-}tM;Zo{M1#g>wfVFK!ee%dudqdtLYdE$4i5OU2yKL#p@%Bl{eRYn2cT(h=% zIio@IL=g!29rI2*?eEUy0%tMF8a?!B>WX1mbopkLb0k&RT&C5dK?A*aHW}M14D{0H z_}=_~3OcC=%v;A6JbJrdC%4a;wN$%}RxS9tqTP05TwPIB0Ns>DSb$^ssY*BVo^;-< zSj_c%5HSx1&sId0-d|&v_`Ellr`st#9caxtI;BSn_$QhlfsLMR)<my*PHiSH6;!Vm zxPEuLBNn_AtsbF+Sg26$fq)p_54yxS#$x>2%1M`%B^-Em_6Ykn50<%VZ;=@XEd{s+ z;cZy9h6WE=RW!Udh2I>rr&ix?iJb<I1!HMtM3<AWN+6h&h%8io{Ll(21<}tyV8IBD z%tPIxUw;QTAy8XcFoa>p1l@^tVc>l5$fc#hK&!{XLV$+{<X!ZG?@y~vGx*rW{PfLz zecmOXd><Z@ARDIZK5_w#$^M9~LnF1b-}k_)R#z8AJ(Q7E=Ut!FJQ{j^vlFkXkKkQC z(!9Oe3>ciomlp67m%MtW4@0KZvaj`yK5Y|`PP$h0zivUx5)<L7n?A1BuMXEw1s3Pu zoKMbd`D>dhA+k5BWOri9x(4=fEI+5OyT;8uu?Vkwa&Go^?>65ElLmKhcXNKtkQe2g z5r6Y~Qx}kIqXEwMskH**@lr6Oza6N3&wlYzPd?gat3B4K4zU1_#pNfdF+u%RLoPEI zNfs2<gUt6gI24i++%_H2{zVMLL1TXVqA5|FNdDGN-IRrijBEPjdfZK=I;RIxv%^9h zSZdFnA!E~k?idwVb(^qnHC`uZTnb$=k4#J(>&%Q1C1GOg#A}mLY{7qQQ@^h}4KKlF zVR`D1!{B1md$)(uKOp`)uAdYS;dFctT9yOuh$5)CA`0e{Hh70UcKKHxxtQqp0yE9f zCO-76Jk@K42*_2tUE_muPr08I=0){;E2SUM$d{FCTOYb~Km@3X2m?qS#h+f^r}M6Z zq9ls&-J};$;FZz)abKsLMZ%qK-Zz%2zeA-pBja(qem<X}%lZ?QH6!y`9O8ZTFjP_; z$-BP_boVJC`tU{a*r7FhDcM%vY<jnLGwBv8BYlOa`{X8JjtOk;=~kOMDGykvtD1m& zfZWaSB5_*KL4?4Sd$em;o{-wX!%7^@<X`>wKhM9ytX1QHqdpC>v$9j^@0&N2oCf9$ zDe}c`X$S}Q+ywV|`^?{_;;S^JY9`S>*5qMI0o8y9PYuYvnRR`LKC{WJRWk2(_*C`3 z=D`9OM=p`7>h)j;7mPrL`+Fx%O?zckGK733l4!GQrf7M<-A*J29A#3mc6zFgz57Zz z)%~mldH31R@juMgj;h*ykhF1YQESGU->fuE%`=8e9nen&IH>+ZY>+Ok76}2sW{304 zUHSJxe9Y1^nh0a*1O?k{6Sit+jWB7(I@k%X%JQMr7*%uK<>LBNY^<Dmbr^4O+;IN% zE34~`wOA5<cMqbPtLu)%Y6n+dQhLc6?0r_Wjv4gl3X$sc;?a5_IzrENVvMZl44CIl zM7QRm_h2OulZLGIQVD^$OtpylBazjS)Z+GMg(c1nnhfzoML@bLs&T4O&Z#;WQ68$X zg0{cO7@``Fd+>CUhdt5FQQv&n3@`Z*fs2?QnmgezG#KhqhsA~bu>6bzU?ugWi>n$2 zUSgH)Wl!W_4BqxtKtM)X+??~<=ym^!P|-@N{GnD-5bv#*4z%~~l3=J*qoE%Z+a-T5 zmlJjo^4rc&Fb(7m7QKLqu~m=ZVQY#LSETS5Lm{$Yzft|XlzGJU1r9KGCCocOQ`j__ zMK)oj+QQ}uf?nh>y}sNoAv*7)KT1cqQA~_73QJ^Va|5X;oktK%P~sL6wKxYuhJ#D) zM=%lc5^NY(hAx{lE{C+669xJ1#KN3d%z3>^|H@yc`FV3*)#AwVn?9yBzP>biB=6$v z)fo<Q8(ZaREnc&9i;S9a?@oea{mzzA@HW^9U+<2b8WiEg&O7M`m`rWT#OuW=*|S%Y z0WURRGQn-rG)8vF0+pn*$s@r#0K?UdsGB1CU3md9!iO~FB{CK>vPr^PhYY7^2D<|p z#L2_^7hFfC7%e5L$ZI$y*)%vbkt@rn+k!Ijah0&w#wpcKusT!BHC41^x`ctV8eTf| zP{X{33u~GdPRLZ$Ak@lLj=dJctQwTq_m5P$xJU{Y*H{d~jX@Ujz<NUDvB`nHVKY`2 zBR&Q|Ig-D_Q8M>>fuV7M`az&sfVhLft&7}qnNyPIjuI95KVi9B_G*MuPML&ywm9r< zpayqOHBqOgC}SE9Sz&GG>ltO{A1oZGDNQSKEz;r1S9O0JM(pd9O?<$Y2(#W+k>)UG z5yhkz<#VK{w~Xc|=_g`HNqQaR$<Q^Erq612B17<pRiELnQd3Z}5u|r2^^3!ZOC!~P zjOWT~G9wJ4m@k$Yq%kZt09l2sN4?ZSdWC32&t`+h-1}fLN>o5#Y&{a?ACvZh`weTm zdxxVe+4T-FspSg~?#<<2uotNBxf(~O2N_>A_`;CgEScq!BhHHyp;8AVC)#<NX6a=V z4RX><7CJwpnWn8@o`=}ZkE-%DbT7Bs!o}^#wmp59ox-KjL1@B^;F_iuhVdZj^mDi> zjB<p)NyJ-AL%ETAy9$hvMf$M|ppcE4h{@qZJG?%Y0ZiS(FJ9;S_gO_wd?FBJUcS(; zjn^0eesfeQAAk*?5CG7%R-AD>K*w>L%TNf&pJO*@NHUE*r;0EmD9nRAcFsVE(8oJ; z;;Y5kL!rS|N~)+h5(PWPbw6k~m%Qu6YO*h6#b4Btm4An8t)zl@rxl}$A8`}S!UQP) zU3aREtEs#d;b6QAR9%{ID5-6EbMcJOK;`NTp2S1;K=k8qu8^xjXE9tS3M!)xp-_Mf z-ZNw9*}MVi{L1s*+w!cQ96lNZ{O@??Oc-)i?0sNgUpl!CdINe2idbZHQ!tcZ?=Zqz zj(*DM0R0vQr<nq^Ix3X6gp=zDIr~@p;$z)hx)$EKHKxqw+g#u~*4B%txqtd3_}LK! zG6kh<3%l@~bdcnLI190Fy4cp)maVqyA`qe?P?B5GnH(ZI&`#~PAN{(|{Yhe1oSgm$ ziqusRB`ADG*l8f7KDsT~iH-$>{|B>(G2d4FT-qcC%=hNVOC&=$Xpp@~S0_}^BD+wk zd3E!)poXIu9~6j_Gb?i>-O*Z<abH6_D%~Q#F$Bw1uP_hkM@&OhcuQfZpLn{fxN)th z``iNY+2-jna`WN84xquU)4V0HHRWJ>ES`Z~KHEjhKanYz@%R?xyxANiO>cSn!btO) zl2TQLlRPr0JOjEciwKMWb0aJ>s0;FeWjG!a$4@(fnUM`m6FxV#e<I8)$XH9HTNDck ziul(WA2&8E?cxT}`s)jLWw)EG1MFvyen6)KfaL=Ocq4&!q7LJG6Z{?e)wUBKb(TNh zHsqtATIFY{k3%lpSdv=tW5BLjlrya3I38p=A<o=|BU=Yay5UpU?I)br@kOt$LMvVO zP6=P3_{J26P$_+<S_SdI!?(e-k%JfWO@aTV1J+hWj;q3Ajti$3=b`PD9W!O_`nMI@ zf7(`kAQKy*^H$4G%4g=zMoHwiTHluk$J@_*m90`vY&p|`#ijFX#2*XIk_-dSKw$%4 zP>U=j5c9a@)~t{#y{g^afpbg@i=thzBCsn=VZTo+^v^n#+Z#7@nFjkmU$8`RZ&x&? zPKl<$6y!?pBjc)3vwX&<!majY9n<@(MH~EtHjPZi62$JS2s3bK+*Ov``g{(%iv*`z zxG9iV?iG4xmM!f(x;vj>O#A9bBkK&e$@Tb~jG5MxDZL;3x0EMqp_6eCD&m%ASsVp7 zY|;c3pKCoxcZ9AVxp()Xby_EX^T(`IKuBS1+TZCr3k<rhij#!wGgN^x-7sMyQm(KN zPRU|G9;%6l#$k3sBV@V((%L6bThk(OKe?Kl`;D$;u^oGz!6q7{hkV@3Pu6tU6d<Jm zW5qOF-XwUTkBe%V*dxzb4p8?;)(yF!sD(DA5J{`I;4J=R84b2=A`Gne#SWhXXAzOt z*m0v`ZRzgy{W~-w3J_*8Y>#IqoR^g>Z_u%#Mg5QEsG%xKTe54l6NVv_7224u5b-0Z z2g=r+y8~cu8)vLwiD7)yi@1IcIXgYG5|hSGu7-Hq$>(GOq6ief#<HJ+(I4hW2#LO; zn_zy!q*z1Yi%>_;rVn*2^T<FX(gSlqfAVodB6ELla_eOOHjic)5Y6o(CUkMgUP+EB zG{H7dMPKHWTsvqL120z7%_*i}@)^8ZJ*mHwLd<2--(&0$MTrlwiDm*+`LA8shHs0~ zE--!L=H(0rk@`ZxW1tg>5;fFU0(opjedGV#E%JA0U-vBc7#{>YkUs!J{_2r@5PkOz zs2x702bIhNmdxuqY@U^EKiMcHX0}rJGf%lMhW)8v?t^`Yd?j_81QI8Wei1b(K>!36 z$v|`lhR=U0?v}$(V0&&Hm(Z1w2rU1j{M(;89k$;<yfu8ftdj%($_oQt-$#X=FCs)h zJ(AiT4zBE^fJ~`0ulVA0Z2h&PANy*Sccm6D-!tspo#4uAY?ie*bX>fU?NGg=dbg0g zz2+~G-_a_2r*RijH^2zYj@6RabpNPBoumo%4qQI|iMAW7i<NC$1p&Ijyv$<-{u0AE zQ>XqEao9pt%e9igaV%AxoR*B9APz}@CUjSC4mfIuMI|au#?!v=N~}&?U)7Ay6t#;Y zlcrvN*@N}8J#v#v1Kbeih3mSNS;eUD#WKf!7fF`%bM<jBM7fAp2FA(238+C>gwpm} zj)jtQ+QA)ZdD2(*ra|DRTs4I4UY}^Tu`=<YPu%eJzI_qR?6|7q1?@<rIK%8nlosbE zJRDdsXKha`hD{^*ed~J>T$ux;hYrtt7`L=5GzW4pE}KK-7jL5f7Nj^%r}vNV<sf@o zbTpdeY(AQe#Udkj16%HlxlaY6s-SE^N?qFhfI(}IT0Vaoy1{H(aGc6u%LHFjVT&wp zG*PotPx?W7^|zPKlJm$89&MbKg<3s{hnaR>grCc<Jwo~$0xe{UOJaKJH86fb*^bhM z_bxU`%cEOg>BAfJEE`gl5`(1lL}g{_9V-3Hheh@)E$BJtq`L8f!LBLz(LAclr`I>9 z^0h<eUW8Fm@+i97Ca==(npMH4>T0L`!cBe5ZXKq|Fe5DXnhY{<*(KK7t-(UET1*C6 z+6CzP`nL^x5-JH&-=z|YkaqWYZ0ap1kOaXLXKkJ16BoQ!>jQn>DDs6+_oAy%RLun| zv)?HstF1S?S-9^6&KLTklMnsY)IGZp9m!DKKw|eplDNNidhMdB&fPK-yKFL$$IeD6 zCt@S-Qsmv?nA86>p`?}c!g0U*VPe;-Pqvb+PB6N|Yb6hohla2Bw>3KnLv(u8Djqo- zbLkw;!PI-nLQ>+g%X^)X&C=qfn|EuV^TC07pDC<)pOj>Iinl&?G-gOr-(Qs<B-vz8 zc(>nAAhcfkp!Rb6l(VuVc*?gw$Xph9SP>69rBDa+J|XoCs@)|2yz&!c91j>hFutg& zTN-QN0fe$Bq_Mb<&oR8NSslVd=uodAkT5j|w%7Cr!E}paU~L%GcM3dVbGV=_hV$#v zJEU$2<}gOvl7J|XWcBZ9SekDRMzegcIX>FUeiEdF=!q_e^%WF0Mv_2}&gF1O)f~Wb zS__dG%3bU7N{adR2}}{(o{3aUDCl9y>arr$xf9~OX?VxqW^g&y5qU>ts&We6p0X8m z%;29Pm5jMHC>`1|k~0^_TH>d({Y1jkmx00L79TE;8fWN%K;D{Xfo-vsa_lg{vAE;Y zvIOmX!J8QD^9O^7@C6>nOqv+&X$K)n_XLX;zq*lfGUj2F@2;PiHT@us8gyGqDy$-n z<^f;_8no)Y?I;t}0Ij+DKYlh7`@@mlrW^`$<Q>%_BQ>!_&lY{eazFtgp^fx6IF~}b zyT2_2s;l9BFDI+1F*w#gLv~<G%U{dV`KI}2jG$x|kuIU$Lj*@<0P`Zyv&FW+7ug)e zImV`u{GBW!R@AQ0ODK>X7N6XMIzyDUZ0GRNjbY8@YcR*Bm2zn;#S|T<okYamo^V6H zRvx7k*HO1Y`yymLU_XsrdY&<Rr51dpqw5Zt&oGr3L4KQ9eLk^d`jD5IS$cI%_uO@J z5wGyYf+No2S~?K4UE6kuh^>z*9AgtbACAxuLi};x7mv#kL;@oICR+_vR8b$fKGL1j zY$NG#RJ(pk)tNav<wk$Sm|_~w18Nv^snMMo9!yE->+$mah$fG)77ZFd6XmYc>><b! za#1dUo>c{4&Re3cj~*ZHxB_q^5nMK&E#p-<Xp=x!gjvSn8n5tmXXGFN4t-hUwPiZ7 zn-Y6`IyQ*<E7Z>!$KI#Y-NSTeGuc~DLc*awH{ADPIbrYKTTo^Qz8&pWM8T;!>m+|w z(=x)K52Oy=o<W!C1ri9Kqd%ylt>+yB19lyP9H8@jaL7qXf-!1o;2B_gjD|<;O@zM^ z^`3_(^rIa)=VlxR9XYipW@aFAm0Ri+*4bH(re!lvP|ZorzH;Z&is<n4UNQo6d}^!q z`1?x-!U#trpOXFLCh5xFF3XCeTU~TTW2_)k-S}c_g$VZJW!CCt1mZ^Sz^^}QrHjzZ zIhL7##;6=&ow)N%T~PZTfNpD*sH1v};G-EbXgHypm?sn0FYyoYZLmBmbX69n<tD?Q z$$~A2!FZXgx79})Dd?;s+!s2X{<h6N2|n6;ih0S#6hqpvs7h_fdLaYvBziW;f@PU# zuZ@{poQvRen!KHw^=q0r-T=_;LUoJ?qo9Rv)BArKK~X;C#92dH->Vx~5z=T^`0XYN zj(A8LtvRQ5yQ|Jhb)Y@GIrJASBiNP!MH-!-we8^`6gq_QT8r!g(7+$^@@uRx%Gj9& z4)C2}F0|c4iI^O$6oF(tb96%H7u-r^LpBe9a(*lC9L=^Ki<S<vTK#o9D{q?JY_+`_ z%o~Brw)c@5(ImI5%o|6wfgrZWgd8#N5yfifV|5W$`a?lK$7)+U)|lqLc0STs;5CB| z&l&yJ8KjIr;acB6`<OQ~kPNZu{XGVvS-;uDXzShXek}Lakd)6**j2t`-5S8FRgAzc zhkXm2-K~adDXk6%ZTRttHdGu28Xfl7XhPWA)NwGLd#EXsH7*a!rj5uc<A>7g^^l$$ zGM)qec#ElU1=qtpxdu|M`LO2DZDUw<Bwp8KskyTe#l-Jsv!_x9z^!s~!Z0J<dgoHU z00nd-P4x&<c@L+HJJ`?&(%~9AXZL4OYY7hv>^1^f`}~PzY1QODZ-erO<1<5`tz)Gu zSUIq;VU(<jhKz2eZy1`WDZg6xDkGRrr&fC<zwTcTpV{!2qdX<8c%bB?Ca@xl9{w}H zb6V=Y9EY4mUR2nfF1%+%Qnd#R@eF%Ouj}(S>A-CTo*weSxVvG+?|5H<kX5QVk)&Si zqO1~(F-cX22Uj0{x7ifln??9s^CZ5m(?AAGHK%=%=(ClO^iRBZ*j%P>i+gO`$n^wQ zwb2ibpoe?mTXLfVDM)sVSw?tvG8lgzOF9bti)=kj(~jSss!gB#tf2MFijOMo_pRXg zc}}1TsKOy0nCl_`B#Xz~-m}3d9Ip^;IaLYnQ!8By;x>QGF|j7W_p3CZC7me-ywnkr zFc}hIJ+KL3hmuatiQQ(}*EP@PWLm&F->$~oM{1hmD?3PF778S^U>ku-cB4;y&wzH$ zX-yWYZSh&cBSA})&3=^$>?;-Gx^_T1^YL!@SI@m4*a^R%xw=kwKTIf$?XwT0szizl z4=LLjp9feM%O@Cy9Uf&*wiTB(^?|wgzFV*qW7twxgnMcmTJu|VY^rltq20z}t=?Bv zpV{}aMtnMys7bQ{2feN=C?BeFMdXFd0sk(RWs3}HCc0@cQ$@s~kf+P^RZ&v3Bau%W z55%X~tpOPM1dQyrqlSwaV~-*s%B>V299as-;P4GYCD21u9eu7IM|!R+qN&i10%>fU zYDZTn`2J|;PMeLSQOnw^t_=#YeU#}mbdDukB$Zvw;G>S!aOlyr8o{*6SCIUCMx%V# zH4uw}@5DloEej0Fcs};M^zAeOlE?m+_Us=#>cvFnb}h?2B8V@=)6mn+2<x3WQyXKP zVQP2L)R2U5RYv%>xvw*&*()to-vL)`Z}Z~mwiNipFM1dNvE!^;rnb%_Qog0sCs!Q< z6_4<+ZQYK+svI6U<mU$T*M#Mlm@98sz?k~-=Ws*G!4ckZM%rZGRt-JXL8GqClI~5` zCrKS0t%Bf&RW90OUX<haJ~Q1SwpyU)ft}wDHqX~#@z(R7Wb(7n6}BDW7=GbDCt<m< z@L3AB$Ho*7sV`d-J}9rYZrlh*%0Z}j^7aoj*Sh05$BcvQ+x2V1!bX8_t(5bq7<$zJ zEW$5KnM9=0GN51{K3^{=7|$DmJny0yiD7_#{_$#^u8*6yGc$Zn0=z2k7hrlaN#GAt zbFFwy5@FxZ`z!oXqHhO5O59F2*Skq%nuINzwqvcifDpGVF7`4W$}9p|AW&p$eBEjV zpM&azi+v00h(vGSG7q4gQ(>u1h+Xpw_t18(ciJOjy@b!fx85#jNdB7)B-uQt%A~gZ z$)#W0pP>}9)5pO^XLtjN$>?Z)S+ygex#VRgj*y>5e@)n3ULVV1wbrc7+G1=+f%L#$ zQ7GrrB(5h`?(A8>ZnZvU^hzV>=rG6A!(&p@cxkPv_T;O%A$FBan1ZT7NBmE>Ai!ae zj>Av~WzwBhdZM3_Q1!kDJXg#j?#swmL06cN_etdpf?vnFm0e5fevJw=Lm_JwaJYo> z5&t9H2d#mJTm1e|dJu<}?Ug~#Ftu%A=efUfg$j>-Z17~~fQ3heb#g$4cP^A5r0txK z!V`7Ty~=0>#kw`J70)saNfgf=BThj(e+y;^fRR`Zh0WD5JC~JqB`fl+?cV0N)Qz2g zaQ#yOSBPmIq5mrH$PH@JhWLI<HT65gf%Uv#5{%_Q*m3NnV2g)-m(RYUXI;_H#TW!L zi>IsqyhaFmR^l%ggoJAX-3+J`t?$BUoFVaN$706`w45FkVZ+LOrTVaHu8Yb-$5k+- zmPP&JFZ5WOnWaGy435!V)l(3&GiUwf7nhWh5QpTBN7P%K*NMMx@jY7w-m|mt@~-N* zVIgSpXCN~~@RB;&XBMFDMz^xwytr85iy53f#5BX<5zdrHVZFJ7mPp+~yLoWA`DRL9 zEbh#Vs(!D~NkZlZ%F3}S3it+Zd`p1TlV+|u6(!LZb(s9=l@(b{F|#v9ZZE{2+2^+Q zIL@$^d)^OdWsv7rA`}a-1dG={yjI41v3^{h4=0OFH+s3*Io<Eaua{;2zWg)j<<z?( z4lDfBqU-zjAwki}TF>k(?kbzOlSa;+2@{omUzY;WoMNMdeXS)y?J~N5+A=6$26$HG zlo$<>FwJm*kZgKdxQFWJG_4yEnF82g0c?x(+6Hby5}FxKKQ8Y9)gt@|np|f}kSEjb zkuN^fv;5l+l5Bm=ufNrho=h~n51&u!+{~-Rl06HfE1xXE>04nEONE|3aWGJ!j6Mq@ z-Ni|f(#rB=*0LNP$)!&e8t6@!5U4cK=XSe#P8)00mUph{IX&rDZw$^mc1lv$cag1r zcHQYD3Zn79<zt50e=;d?r354?AkOCY9{C~-j>2BlXV;L6_39f|AIXoGzB$!`pb@85 zK#BTsRwQ9-S@&>9LsIy}#ns@yL%8*#*FissSXu-@(+`FD5jzkHosK?9{ZR5wPu~cx zkaRT7u{7YzwKswP#I|$J^)koRS7EEx+CY&4=)wjVQvYn%;3A;U+QvnU-Fbj-OPuTm zHn@4VWg}zRqtsnI{9ye8V93^UJ0ZaE8j3@mjt&O!6)YyI%?-MGzkl^x0H>27Tich3 z5lqW63E1oEuh%#jm`D*v!_Xqc&z9rel(}-r|FyzSLaJgj71#1dZfPa%(uS{?9JgJC z!zlAWsOZsv?S`9}2X(fF6FCh<9yP#dyx(fiuzPN6t&Mu~Oo$=&4OSirkURLQ`2qbO zI{W{tcpF9S6Yc{80lk6(0sZ>FE8dQFZvXUldP}De#R1z*M!232nsA^X{Qj03aAy5e zPpwVhO%rjAQq-Ep!vw{~>f64!)E-tzrbpu_@3^=)W1YbuW`sF#ZiJn7pd5<!pJyOQ z>wIEA{a=zd@E)tM(KN5kFQq2o)>{|^K2ghmX3lZk1#P&C1~Nm@un$o<&+#ckm-GMH zsz6)+_Vs)JbcW4Y7yEt71XN&nqin=<wqIxdJR#>;k%vy~)itUDO><JAw(^-lfaRQ$ z;d_g=2i|->ze6>GqA7zYl%n6`cg%2%O=z?mo`KAL&v&S@En>8(*;&ICpWYEMppL=u zW;IV3+4`x1{1fJpea|5b@~iYY7IX@D&3|yvBW9lrbS~@}Ba+RUKN83w{E%qYfR=1k z_BpV)qy#0{9XiQelvBN=VNAfjR}kfiH6!CIl(Q&Rp*JW294R+58A)($oUNZPp^T(W zw`K8txTe}6SK5rW(HU7#oJ1p+Z{j=5B7QAUd)-m)P4k=#zoRN?Bt7QBI%DU~`V{xH zaB;vLQo1<3k?fWDmivi4X-K_U=ysBMfx>{MRqVJ$mvda7nOBK=;IfH{N2x{=PU^Dx z<lfFXjr!(XCzU^^Vu}AtFXE?5H=vuJo^e&Jr=$0Qc5wGBRO@nyHJ!!v8T0?_#rXfh z$bWh&tSt=xH(y1)V%t3e7!c4DG!PK&{~cxj-yQykx5Cn?M%BP>lO5@+R?lHLa$~}p z3Odpt{=`Kz5rGP)EIi6kbhWctWL<_#k(8>-_WY-pC!*1WP6*N(#5#Oo`=G1KO*}+g zoB(gYu41fR)1e2&8(vLDVsGJGwjj7Uo*F(Q-KrFvLmr11v);hdAQXHt)JpInLdxCV z3hMIm2rXS^&(Jf3lBOVK3V9mrwQ++Ml_@P$t+jH^yg^;_bd*1vAn%j4->khQJx%ot z#_s+7GY(L-VdkDelq><himWX+d+T#rlOBqV+ixA)=YAN`Ex+*>A9*$-gsxcgXpW|4 z%(G@SQP*srhS2|5%!H<wg)UvERn{o=;W8SVRo1<we2ck+KTB<&B`^664|TpBvS0w| z&`?4PXG$9P0>9+iC8wiDn5O_Aa$4ga1eSGs%>5)GQ4;HKvXi=|Ryrjd=3n|r52UK@ zP#&PKfn;#tdt=H5^)}P+C-&cxO6ck-nR{C-_9OC?)hp!w9MT9kxx1hIIXXIWrb!nM zQR|ygS!YL2U|<%36zGvhBZ<7pQ|tklr0pTv5{jc*VZ5Qf1u9c90Th4ww;?E#XPDdl zcy>X%bA@v5zWZFl_YR#8p~i*Tn>?OoZ~KVZ3F3rOH6V6-@p-kV68f30uWbwQ0pw}l z0So~<7wksB4YvRVqnH8G1aTWHZE*?OZ-H<Z_hH1lNKoOcb%8qtf2v2Vj(b3@R7n+e z*RW??7I*U{$YqE7I-<byt{)u#=V{pYM-n2GcrTcS*Z0D_Xpmf*j%7<IY)#6wUnMJ? z?E<F;j{YJ2J+mG8tXv0m$f#S`+9r@~eVD`nA{6g?9pB?Pc>7c9l9<_A(;BQq6ANXG z3G=aSIQ!C>!C&XbyvBqi>XzZ&_gRDuvcN7IQj4%S^pUr197Z3tMwdo4FnWk(B`_hM z0%l*EBV8vgOPn7XOnDovxP^CL0gj%HqRgBp5F<Y)A76YSYK)R&f3CK4aP=m5^^lG6 zli&B}*7+=fGm+^C1g-rJmJ{xh%Vw<unof8<W5=+o4UBkL=d1ga6G%h-*=CmbTqu4i zzn!AP#M~&z6?3-H@Jaxem0}ku%m6A9vYys=O%3}MwqtX%hVAV;I7wt)4c5Ous8*GS z2Xi-thJv$6U=Jqse|HtMDWj=6p#Q|>5$uXz9X)!YD4X20&4xve`OkDdp5*>8o(LOW zg<i~GhEjuBx>S?StpZzOFSafU<h-d5?FhK`L)_x3*lJR2V=X9-q-xGeCg~ywqOah| zVNCtW&`9+0!CDbYY{`=CeZcX6EFq}_nwD>0!>s8E3f2lG{$+#mVto_e+h+sm`{LmL z+Vw#nbX){%^Bg5ybiF#%{^7%P|C(lLUSN%VRDQ&F{|)h9*=s_!y`J<xnCqXljOD-C zSDc(3Eo{x`T%0Yeo&J$ojEarjA|ujwubx9vDVauA8a#AFibB5kS}}Ay`LE(y6We{( z(4|_uuommDo9vub({&=k#I;_pT(9eyRzF8aAc|Xl6XGN6<sa0B9jR6sw6y|Ivw^b< z;u#0BbrQATrW?n{7iBlsE`S4F(PSD77V25RxoP0VH}H0Kh%(X%ud<9i)OchmYN7&< z(n3HOX#eO7An}&6Bp)S`96RJASPCW>G-1*^q`jY6UHUFdloccqU2wz|YDvpeI6UN4 zqF9ZXzSUphDDjT$FN#Thf^wY32p#yZlw=Vt^#*uD%W|g!JeXXIUP*KsZF6zXZbrR7 z5mpX=N)!P7cMfKEo1Qv!v2X-Y1N_zlDveJ?I$rXyqdHf$@K|xD$I{kXwMYHn3ms)- z9!-x$x|T^2m5$>rCb(&(<<(4571W717?E^V&21xRVzMX}O8`fixt<0}$5caproOaI zm%t8&keYB9)Xlsu&|M2WL*jvzcDQM7--DSU)^rc5Bk7cWE-+GO53BenE<8jCn~s*u z;t88{q&K1U>R~;TR=O(K!n`z-)q8mK-j8!VzAlQxsb<;yNpoB%JOdBF9r8JG>Z8EE zB6Ar-Lx!Q1RE(GU0+9{hQqDtiiA8uo!VBJT?WR?W(XvAqg}9JN4DyH3Od#<mTJ&!E zmxib!d&&-mK@a=~yVOA>dkye0vI_=#X;?_+WAm#n!*^F-WIZD;Il^|YO0Z9is@5tn z|6+oP3yi!@(g-B%@E$(cHp<o60L(T%AM3fBI3i!b)wLL(%0)J~&zcLX&d<KiO3xMB zIh7~%P~BzbS7F}6a-fu#lH|fUN9ln_ZfU3EFy&|wooTk1T-&gw7IK`|;~(((G-29d zsekgzBysgvEB^_mdjV1B@sp)oi;fa<nz3qwB_F`D6;qMSIY@+9E1`Md?qt9er`;|b zcNRjN{{d|pZNdwi8s(it5i2in@9{FFcfArz+_N7|M6sI1$t$IdL_MHIoHxgd<wxVM zYVHKKAHR#4k(akGF8t$WSBzZtUC}oJUY6YUfOWOss5o0??UCMpt+{w8r~d7KCq|Kf ze9ryftT|^pD-&A_PZPR-#!b5aQGowS&qrze-#HSg=YnR0KR8ik(*lue$VF?g2kf-K zp8-4&56$xza)D$@@j_?J51+85OHwjOd$-2}Cu~dhG)ejZCKV@jlyBei@_cxqGtvVX zzjkk*r+B)f*w(5X?gdxZjh^3B9~=Ke79TZ*W56+vt*cfeL(vh6_OpLHRr&Iksv_r@ z%pFv!v$D`DLAI|T**6hXTllS8NlZ|;>K1g3=fMbC*B*-5Hhn-J@*EP^5Ux?<!SA*D zSW5g+#GqPs7|(<Kcon9<@2KrYA>5F`<DT%<&@lsMAd32MwZKU#@mwJtYW`0WF~`DN z_rJK2jC=56QwB!qgep@V1>ayr)ROJu3G8cA;9Z))c6ZqHYvG3gg~#N5zIel=3h1?u z_L;GhbKrl~_=aXt04ApF^cW=ASWBa&9!n@%CU|sDN`)=Auo(p_RIeIVVXpICudVU* zb(B7sn2Z)mxR8s;6b`tm!hgPxz;rWfXZjb{BO(ujD;@T-M*uf1hPASPQ`YzdJG*E1 z;<<EDI9)F`gock5wfdfthHjl-I(y5mHY@rP?yY3`<FHDG^A}-c*U@rw^XX2L$$qL% ziDvZ{5x`&S&Q!O^%wp*zVx!@6@iU)2V^(g3*HxS&bAkUWXuxt(OSb-jrQ#oOxc-}< z`CnbWbj}|3CjZf{L*oBf{S`zSzWJaE&2AKGxEcs5n0qZlX;whd(v(8XaxR2DvrWIm z2zuY{N_0BU4)wU<xZR<I!UDTh9tTkgTJ<TtNIm@4?`PoT-P(?Wye@?s-@=idUQV(( zxfygBg*&iQ7E4930C8Y<dJhLQtQha9Ax$-)wKCfkHm>nnZM3k}*28D$X{umVpuh4F zAW%TqdLI6<>s+tKRM__!Aa(CpL5DdC`C(b7k4Z8KW2H~o*d<9^O*<pGf->=QEY=c9 zE}a*Lgd&;e{t0<034Z8k1AYNG19*-7{%gv#MJAw%$bf(@TL1gp_P?g=U$XwWlHE4N zT>sOR+ze)v*m&tWtExG&%q@38-muNN?kvrs8IGq|FX<2K-`LFlvFSy~(yvbdL^-~_ zo$Jog3N{62dcEa!(tC0`$$%Kh5ag#b%#v^j;^&)cYuo7Vp#cV{Cgk;X{>%dAm5!wC zUBj?QHOk_s>-(+)xNVue8qz0{=nj$aK<jpUK-|P3>_3rDNA4NP7vG4Y{D@|oOmZ-a zG{U(KkVvlz**O>Qz!zC_O`Tnx>g@2;c>2*{%)6?55^LIse#>Tlxi=y2M&jB;<DO<A zaww!mS*!P7Y+)H<)C`|%Bu5D`Vm`upJ0MjrJo<d=eCl>@)iQ{b#*Cq2+eW#QjcP`a zsE@8XIC>J*TCA;8Pdx0!y<V+8p6wk70r{C)fNZz1_$#@~>Ac^=e-}UwaB`*v0h;i? zWFHV6+A+sXwcrAsm4+Bocd|xCFuCCF&i8ZD(Mi)qyJh}XB7aAyIwa?TZ5q>KIFK9% zy>HS+*>>A8EI5-D4t)@iH-x9r)p<C2NLSfl0B~?MBdp1BbnTM<ez?wrANVjNR;^-p zw?DT^=yQBBEL!6elXz$`V!S~TRX_Cd3%vAtGCXe6=v`4~bI}nJ-~%&PFCYs2IsxtK z+o}!F4xkT$1$Iw6F(d#|{cEZnDRZNtEhg#zGn=Xw%|;4}iL3{VNrzI0)WMILg(>pj zK@fgH5)~+5xA^;zlL3ca7wm{qC_9a2Zd5vH8J=&a-*{1bNjy;0rqP-FK6_34BfPsD zYqxLg2+Y8xUrDj&!krhvbF0P7ALkT-znlEn16wBos5I%&0eLVkLmj#IB<+rzP#FtM zDb5MD(XpKAv$xkjhW`N4Am{qXu1Q8D1S;vua+!j4Oq^9v4^$vdtEd};eIcn^KRukR z<tC@!v$Zfbmd~(a5PQlNY6>~+!e(3=8-@O8&J?-Ev1y){E>u#J)!V*zyWavFmVnxL z#zVsG0o=a_X<Yt>yzj=mXDT>-mzBLET6LK5uLij=IoGTr3U{WymE-zMn<@AnAXFWt z`JC*m-mJNh#c(WokcG{*Q4;xR;g@DhvmD1JI*9RUh8le&z!ZIY$fPrK@D8SWboCxZ zPPAhJz%1Q{JIfKF85X_cw5z{lN^q36L%w<Fljtjd8}=oRrk;As)^5mO3Fr|;zpt;K zRT1zRrzZeOf+UJA^U>k^e56X3nf5*MD1J{yoJtkM+pR7%`L-mrXm4$e=&e%H+hs96 zGjb{~6GG$$_xCyBt15f7SH1rQsm@Cj(o|B?;VLpb+9&I8L;iq1rZn=#Do?rq4BYjp z3-p006mGa-9x&B>nx*~tsV#)+3sRr7MuwY(s!K$a-yxigLNwmaIDk>r$tqI2QG%bx zsG})Gax<4`Tq-B5dM_I$g#5!D6Un+^Ark)?U(3@Bo(ncjz8HCEvm|;ALvhQ=`EG(G zM*#n0^3LeZvrqW`M<7MO*WvJz=D6=92}x4S8_E}H@?<ru{smTXQaI^b#*{yVyvP2r zes{6nmszwFs7zt3jEw}5CG^`I8FbsY;M0`w?#Y9-3l4MBSj;)n=N+Q(-WeDxWeB83 zT~!h~lrP`To%Js}#p|Ml4N$SLp{Int2psC)r9UW$0+O^@-29XHlGU^o_%9*k+?wLJ zHrKaX*<JMVAb9a)0kLMNMI}Y?!HKvh#Z>;%3e&4H(EEHY%9=H<Wh+H8Xq&VZf80Q5 zvR1OLFQ>t-@t%F+M{5jvM>}V`R}c<Y>jRr%!@F%%vZ$t^nLrQ>jVvKm#Yg^b?S^Rq zMq=4FKNDLUEgK$++P3Pip{@l{zBz4P&C&~&Vz2pyBCPWaBBS$O7)2va|E-+6w+7+f z(%<nIX;W&wfQoP~_>Uu+bsB82@Z=_N9@tNaI;sVmvd0D+m0E(4PS~Jo<zI51gYMK2 zLJNFSH|{8~g*<%_KT;+~o3!b2xbxVXp9lJ<W1Yt?yBQ4$IyjQsH+}jgi6vo+r7Vu? z;OLSS1BJ8QE%+KuV|!-CmQYU~?aE!QNtZcCmf%U~<=0^AUm@WAcq~~1WdD}uk;{g! z-=gIUzW1*NTl)qlRc(R-J|!q-7jj!MKk|z)72zd1HbMP)bQ+8*@R!(FTkQrUFm<Zu zcF+SbAYt$_Pvx_+?mB=i^=nu({#nN{@`2?l3<)ubZeB1fHnI>vUc-DZWUCm0(B*$Q znJ^Xc5rt18pW}SylYe4Go|%F|h?Tgb1g{BpXjTkRrzoX)r3e*}!h|`(@cz09=gzPG zwqAF#u6sWX*4)cY{i9u2@j>)kEo`ijRaghInNF6t6RqiG)>(&w^_|KI#JL3?4>=2u zdrgfW;-q|TxfDF>?x3npF9fq+=0pE5;4PqoTYU%{E=DX6$etSY;t^(;lU%;}8-r>= z0?8X`fH#+-=Qm-(2JFUkqs5GEzVe2p`Wz(e&@lYEMNrc!0|Y0|rn`WMqymRM<RopT zoxxa^KLo=9q5=f_wMQiCq*564*E!@0x#0G^GQ757xO@y?xJc>s#LYN}phl#TmL4!L z7-mZrF9K=F6A`0x0@06_@Dll!VaYWCw*K~8K3;$y`!W{790unZj(PM<+t_@lEe|wu z9T6a)f7<b7Xd@uyZ+%sU&>9?^u?4mOM%hCkL|JPF!m1mLEC0i&LwT@A<j#o4f4bSJ zOdcn!eDHHeIL~R%3Nk7bVE6v|YsPOsu0G%r?#lFWLDbh>w~wB#ZfVN2jM2^i0_X>4 zard@~(lkhJG@;cdUm3F>U4LQ_FlhgI7WJLrq<H$vfD(+*@HWAET`b;zn&26KL>8$3 z&fB?b8HgL*VV|4bJV%JWpD2b!>>k@q!$?_c;}q~39vpi+$Jp3@IjywSxB;}Z3z?SZ zSUfhq`FWK^)lbYI!aC|?3ikd&yYV-8hj={_uU#zOj^pqJyz~GEwg*G-fo~5}+5tXU zfWqyS(w%fDqH54Y!CEf1e;IFj2Q+I8LmxN<)x!r3A79{o+Afdx{c8R$X>_!&;k}k@ zKvmEaN6r^J=*|-FUb7dBB^CGKH5_*B8yjh#VMM_mdCF5R!cF!tKpUG_3lnx#gve?< zCa`W~AjvlfPdIFJ-LeGX=;_eiGP_$A1@>N$ljL>rj%e?CZ2$ITbkSFBpd{2<Hi_h^ z^bZhG-0#Ippys75|4VM!_!WMCLQp1niMG|&{xr_1FWNZ)o!fIF!h=71d!Q&uJbs34 zgv6_|<-zO_Oj^Dp6|fsFQygM^J&<6&mzzedl_cF;M2SFT*o#9{p6Y{6jDvDeC8Yt6 zsx6l81hJWRdt(IKp*1@ZRsY^ij?nY9GKw$Y?BleqONidEjiWSVXkAQ?^bSo&LGJm? zNV__W$f^S~wuEl~8m`KRZ4Oc1xGS?L0>@p<!2>m%CZT^z4$qW0eWGXv?*<|MjseYN zLJ<Q(AR18!Em7VJ%)o+J2oDbN&Ld<|gm1@T$<0L!e5Z`R(8;K5Fm#)&>m^4_Kg*Id zF{>L+ZC=2}8bK<&Z(!!5ROGZsPre#G56h%4{+`3<)y}+hn}T_DA6;_s=H_Ewr>#j4 zF{uE*mJq(j!R{x>;L&vm#R+p{NA|p1oM{0?tCQg0&t;uQR8sxig=d5~hR{k~J(2WV zW1%cQr*;4^7Z&j>4tB<hu7-A=#x_2z&@_!L(Y>80p)HNeTCf%$d1V~yUns{|=mZ2o z1^ev+6U5%NP+oka!RzE`661rudK-;94RjayYmJ9#Qcf#8o7pCdG1>DxM7g6r0;LlT z6gS~x_Fp5YjVW=sF^3D~w%$*YpbL!fDSDR3Y}e#*@5YLC{JWBrDRL3tIkAski3&cB z=f0jUMa3Q`N3LnGwm$`lty{I#l^NkXH-k-5v2x9fmo9tR=$38F@_i<A0;G>`)=h9l z;jhwY#qbL3RnsQU#F6e08*JH|EZ*P>fm4|2a#Yz_Un@Jy1hO-sKlt!J%qfbdE!iVV zkXUDnZBB4lUOYdIKdfkvRzDW9>NYt2zo0Jl@jMUc(Hef}z2&wn4jRs}JU<>3er}9Z zw&fgr3R?!Xh0C;Z&z6Z5@wx5q<p^ZA8+QwW!TJfh@YzxCPnZH}zkk#PG5RtEc#je1 z7Q*sE2l-)=*=k>^un*N(#`H$v79@WL%C8x=a4Lie9oblzBo`y!U5X#wvFFFzQ3gG_ zqhZn8ry5B2Uh#$8@7Wp(07WZFduzahKKj>T>1e>);$av|LI6l!?0s@M**R`!zFjtL z#Mt7>GlIpACuLi}=nEK633jnW0VwwVH?gzUFP7;i*qb<Utc7N=0T=LU^s>4>U*5z* z+TlFGXT(oU=}~V*E24vWB15^;nD6mr35cfCt8WiwZh-&zDoOT)DcaW~Z^t|6uM}de z+T^_WTTfC`hh`YYo15Tq5n1jNs5*F&Zu!<&tIF60Sv9OZc5&Q!uT|I#`I0c=`F3Ut zUV*B>{zHmK#;Qa^$H^bbB3>nftm7B_wF{}_tQAtZ{PBxQaB{fx0}$nT`M?G`Zz*t+ zk!<ZD4;fQ3F<^LQB1lFQiFUBhxJl<KU|$G>?=kFDRUVM8kkW)~59}jG185QRVr!uy z0(W5Cj0Ms^>DVJO`fIWo9*|D-A+ZYZOJa#QP`}P2n(?1vc&m?=MP{9{Z~*2eH*yzk zVHYS9Hu+&JqORw+!K=)KWx3|ZFJ#x{{u<oWy$i`e2<CrtB9qoFc_3i~r}H<Q)(6o= zpgg1ZOxi@?*-=F3rWZ9OeU_+k+*xs!F~*Z8s6=iY{+fgzDr>><Jwn>L?ZDxT`lpMZ z&JPT2Qzz!H{}u#5lqsv`<x?=8x%FdItT#t}{C$@zg9kqMgqP4H`%ucZNx_)1-12|J z+nDQjBw=o@lgL%W*Cun|j1@I|1aNnDAkA|6NT#k}T_C<`Kv9(z-(Z<lVLV*oNWikL z?&tZ?;of5*<rg`Tn{;`#f&QQ*s;-XJOtLzc5cnd2!MSrn(Z_?Fi^5Vmr!4=$aLL`+ zd&Z&#+%$p5e?ABZN1x$B6|iB7BNsK`i)$3mN>1A>=hdiBrp-%BOq4i6-%sfU!9}ST z722;;`e!i#$z&NN^7WEa0XaD@PT@J_{Jt!RE*oJKArc|-G#DbT<eIcO)<bN`5ycC4 zO4paTVQfCe3bZ`Mgw(yWFHe2ptKLT<<v*fA+o*qb07Yl~!ux@rogLiCDD1W=TnXLd zhW-Y=M*@u#YvyUMk|TRSIUsMqY#{E8+(!pLhzmL<1C<~ImWZ>l&$Os>Z3wCmrzqU# z>bIc>TN(>rv__IgCLDU}9w`x29%-s4sZVfPZLUAn$CB6v`>s@d>k=f9SpD+KFqHD` z)UhNCgC7!ck)qzV!*#LeiEm2MRMf2IAKJSRO^|QIa<xcn`qknHM&EU67>YcCw8CN! z5d>myP_~+G2(0`HK)F<xsMeSK!;qgppJFcpo<zzZwuugm9XNMY|G0KDMv7u&rOdnh zm0Vu#B$Ij9syGv|v<+BW8XykW+<RH)57uQaEW-CV5fg<y;%E80-b^<S0?Xiy$mSzf zKe*fs;i$^a)mG0>Ree9E*TGdjQ*()&4LD%kv0qEix*Y1L&z>3-#3Ai2H=Bx@FF8v} zj6tDL*u8_+R97jN`5liylUnPaqhJf2$x3g>E~t;@sAy}abC<+}KLidnFhJ<{{w?pv zV38U0C}@dFr1tAp;L+Ex+p`k_Czm&04Uq^Cu)F_fZf{_TO0WI1FXs@}`rYVV3@y~O z#LThYr<7k+bQeL3mG*uZgw}YtB$;AtP#h1DEO<f_*k2Zi!t^(4Q9DMuFiy$pEM<?i z-Fn&Zw){q6(4g2yjrgZAR3q3qRNu4uv@^+5=H8&IVy&Z2@&^j2NBU~!Y>xG6AG^hf zAb2gSN;%wc9qU%WWfjx{{aAFv4jP9iJmR)LjBJ~_ew}GC4$?MN?XmH2%VArm+MpYM zN{N-=n5A4^6FW-gYEYd!T5{f@d;H>vKnu06&Jpn0yPQ7*;}3S)jQvy@s2CV_>YEQt zC&bSA(K4^K-o^@dgrv&EX3j4-n(7|iMQQNn$&m6rPTmEaEscT^$^1TLN$2On3$hu8 z=$2#n1*xFj&g0oA+}}^v5#4qy;v1c>kFKYK1;{Nh-dE*KT~}O%3rVO{alnVFjD*zQ z?t95SG)G|WS^fZw`iuvK3Q}C0##)3d&_q`}gL3KQrc7-VJM!=Dn0b1_#N6mbxm|IN zuY_6U1^>{3fOZVcZ@E#aS&KlN)}0A9go|alnY)f+9i`f$H!MEu7<V&RVX@*B!3_r_ zV2+>h;a{T=s@zkD;*rN=(bl+b+o7YOh7#5*tZ>(2Tx5;Zp6LbJT?T>9DZ=H|iO*V; z^KXh6ey~-n?;|mQw<;*9tf_6r>n_I>3&3t7O*2B65-K`1V#xUcLYMF){&G63aS3mw zFtycYK?d~01XC_fuh~^YPWesEpt9AGJ-arCH1XU8n|0b)Wcu9AMwcrEoaOe{UD$LA zBX>Zg;_ZNp>@odYJ%-~=V9`e5`758Ryi5(oX|t9EvQgAh7*Tj-L1~~HgR$vHE>8dq zuHviq0%PQWed|&Acf|xq13XsHr(~C6E^-UPEM^fh*dTpmd`{E&GoO|Cp4G3$yW!8( z6_pPiAC7wl1@z41sA9wJ`Zjz20vBq{fivztXytZcQVWZs(8?kl0)Ka4ss*1u(TW0Z zv9qZPhFW7cn}P^0)TQ1h#ly;7`8PO~Y|C*#UAQ3EkHj&T^Tu#6S5Ko2LwmmENP2Ot z4C04*!;v5@+z!29{h_+@d(dl+2;t34cIUp%{TKDOgc@-blcSS+S9@V-v-K;7di*Xd zn}k}8<`?3n#2Q8fS)5jXbf|ur5Nc~kv<lsB2g%V=?N<?=(I1nXMMtaUdJ0)lU!30! z&)gh%`zhjq_M$lLND#LR4*62Mer*Ss^9x7(CM8lTtu-(w&CAlx(<-j5rjxT-$5n&k zp`q(8eK^Eh8bi#zvCruA>fv(Aa900MW#<?r*|Kl@vTfV8ZQHhOySi-KwrzFUw!3Us zSHC{*jeYjHJ>K2#zQ_+N^Fz!TIU;hbk+Ej{{v{h{<=Be(SSj6sgR&mqAXQ5ef4a3Y zExfltc|KGk5}B(Lf&_&s08tM8kXjCeDKg$-eZ3=^;7GS{fp*4oDBBc`Td8tgwl2hd z9dEaZO1f!Te@>CmWoIP>sgdUy8U5Di0E(<`GvPMQyb}P@&?L@%*V^U=Z+ie)zCr>o zW|Ik<dWX7M#IVIcbC`J)B*1-yU+(vYvpLRtebW@`<Sucwe5IZElM}kM!pX`Pz7eT? z@+rhS=g^r`U}!%^oQE&5wPG`GtBt$;%E`YyPtS+cfTFpu6vb7!FxmGKfo+{<^}<0J z-w|&4x`A<q9lY$ZsKNIZDUH3V>VxW1UKI<hV7Vjs$F_4d-_fq%c#*a!%QUIs)wvo= zxZPBzYrO%P@y~BKqGGL?YJKSe0EkZb>HS$2gnA^POQI7(_u@ho#PvXmdG>0Q-^2ai z4~SuVK9Iu?b6L#CKq>+vf~T?~1ZNiLU#VfLX}$Q7O|Y4y>cCF(R2(}URuRa`$Bs%y zg4<-+7_E^;`?b_8*rt?QiBk=enK{t*QPN_><doC!R4-um56*nXSh2MyURIZNS>uYB zM%m=PABZZ}q%qJ6K8+MGacRgC3T?DTLP29a8E>KQSIKW+pIOUnp<+vmGU~Dc`90Yx zzd706a|t<9j9sSWNZibymiKVkLTC>U_>^mzu)|gcMT6#7mWWY`zg#jWlu<)`c$C%! zVK(@n-rG09KOi*XH$%GNyk}&}^#EBSll)$Nj2fqnWmg1MyA}Ws)xK2CfJ=!sP1Zi# zLlEc)-`+o_B({#DP_+~Xx*#AB_9V^T=#muNeDDsMTX-J^HsxOB#wAF*QN9wzP5W@S zSS!xGz=A@~^fJ7y9_q9kQTo8xA;WwO)gX6_5JBr0ZK%ax0J}$;@?G=`lt7+|9Ll<I z`n&+lSjIMr9Y%%cg&}E<tHtqna285vgjq%qTXI>HO55=iB_)Z(oV|L!1ktOJR?Ds; zoWPW?*qn~ty#|iyf`55DoR{RL5%J1liFes*#(v>}_cnvZS?!B_ry+#p3#$S1rjlgp zFyyx5TCv99?AIx-DrEs`Vsjny=1Ptq-sZhSyw}6!@Lcl`b_Q%o{tBd46!UP0(ibyY zj;%4OLcpv-@pm{Pg*4N24Ae*A?57iCuQ}@lTGc@C1$FD?93?g|NacgGG<A}`_2yI+ zpU!dR1{J9u?EMZK7zcJ<#MzFw-~zG|h8Sx2B#t}zz3M_!z~Q*eOBBD1z@J(@0>2a~ z(?Wu5(id}J)KZuAi2KJNylHss*1KE-J}gg8McJG^{Zw!j2UM=_i_i*UozgW>b?G^_ zm{>M(Q53T5ic5IL*C%-g6)$+C3!?H_{MFQX99*BnPpxjtG$+X8J@0qIX9KkW|EEvE zt40Z${GExA`?(SY>CZa-h!rR5K-Z>nb)M4~Skhq}9i``vs)WrMi{znT{c1pjjS+h= z1h~%c%2Oun=jR+R`6=f4UV!X)PddVeNM%S_d#Ck+ra`N<Nx}#SJ}0FyZ1hrldnd$8 z=KB2yb^5d>*i(3qW!4fZx=^0hDDUW`WkljAxv=#_dtfB<)s)Dn#Do;4E$er&b~K!{ zlE<f~yknwj`8#ZCw4(vjC#XwFJ(Pon-UFMY1^GDOZ3)UX0P!z+;P<r!*=iVS={j%h z%^$=pVdu%|`vtM@9+4TC#k$ljmc+(eH_IVyre1Y8b#g;uJ9Wfg8TRpxh;d9ax4e$_ zBJ(1AOrcFxM<e6N3-!+9wJafp(H==o2ycNU;JSK5qoX941+k}O$0mVAco=of@gCm; zZ&oec!X*q?^X13ysxG{^&MvMxy>v02(%s&=3^V38>=ieLB&%MuMoZ5i%fGC3WDZg7 z@I5~3mHTwV)H3pD)tj3W9GUYJCM;I0z$j8$Xu4h^@qV^q@S1;hKiJi3(EuVRJNuV& zQ7pfJH?APPz9IB`nCK4D*D3vw6zn@iyZaS}T=zyp40vaN{}3+5OuEnt4Nlr9;qSh_ zlE<LaHSXZKJcEU6rXCO566IPM31txeMW+jvt0d#zPCbS)VF_d=3)J^{dd5@^{=x3R zte3uftDxtz=>v-Dm}!UprPDT!!9`M=WzBqPoV!@y+QVM$*4Eutt<%=f*Kt82cjvbo z<z7}}$1Tk328KVrR<e~<C{N$9H$_|<v4LsqSZJta_b4vi;sDl{s#K8NIDw<i>?ze( z6P-foDxNV5eOA77?lLiPa?}F`wl-R5&3)on^`&c@?Rb~Wf~`O_%H<Un2)!p;++;YQ zIfdW~{0zz=7q!HiK9pgW!%Uv5rNBvoin0eQPS8dAhJ}|tTGGrVsl{BNvbm9>GF?%3 z-lf{B`sUd0ai}Cn8S(bS1*n;p(M>G}rzu@q{Ak)K0oNMrQ^2^^V~RaP&RkPP`+~zJ zUjYPlTI;j5ZC=oew1xZy8HDD($ZK5|1Qf8Eph%iCjdSRP$ihVd1WDJ9CoOt70WX~& z#LY>5KvS&WF>oS|BGYr6{d3FGK1!eUna})tPvS+5gzD)ASi=U+*7)7wr#J!ephVk& zs&Y6lJNo&MqC`H{tf_SCqWh^f4OJ)vOKbJi`Eq^paN~NTx%q?BD2kb=?x3zGfwDbQ z`4a*<d$PW&?+71IC1mrklfpvn1C@v^q}^K-GU(GS;y3^maG2ucL;7^LT&-e*Ixp@7 zPU-H1Ew7Nbc0VLtsS}08yp^1yh;Ox3S|<pnJeZSttt4mryWDxZY@b^DIur&lJYeJA ziOe@HzKNrmGArU@IQ>yRZgV(G!k>-Mr9bZF3Bo3?kv(Ot&121s>${7nmR4rnrq4sc zBGeQ-ssTP2HCQ!p)pXG>1Yy$x3~hXvh0eFmE1EC*b8oA;49#J0!>%zoop888Qm$8} zS3qoa>^xW8b@Yc6;IeN~Y7V*_J8Y6<j<iM`loTSBvIR8I$a1yPHq~5-t=un!Dxl~( zZBVD3J1hh;E!vqgq5<bb&c#1Uf*dT(+PiJg%$sOA=8c=fpMSWiXN0lj9S&wH#Yvo3 z>=A_$bt*h^X&KMMVx-ggJ(>Fw(g>dCe;(%g%`%L=KQGx1^Y-bSe`n-rkAb_93#N$Z zQC5o8S!D+Z2CtmxM-b-4%U>3sh*FV>+3g8Y$0aX13GDL1t`g6%^Y(2s(H6(R$KxoO zJ?g9}WWoxS*cBX@&8aSo4rDg_%nx*9K;s@ITsB_$9T6dInJTR*xwl6SZ@CDkrN{lw zbY_{pl=X#AIMtG1BlRLE!%vPh4H^>wc)1E(IsJ>8>MBsmUAm}Mygj$IjJz_jav9u? z>*S~I;^;O@yXgBzy3|M62ZnS{VL10-mqebTMVucV3wIaK$#{1pJbh95w&&;GLdp}& z(HP*uxDK^$)@q{bhaJBt=ajP6w#ZMtostbRB|d4p`s6z4)c89qh;R1W)XvoFdIkp+ zs%KhWBB9nf)XECu1<7gOd~11^yp~<D?56T7gqioCskqV}mj%U2;`+qV3B^bOe&K-- zyx1xLPbPMA2c6|S0|s6m#fcRw1-5uUsG!@2%3K5Cs0l-Qu{FRj?@&-yUPd146fjxA z91!Zg@vg$kph$-+QKnfGL%U9rjH-4<o7<u2*6bM22X$4=)kYo+xiEFUNT@w0pcB9X zF)58lO-4~9E%=hq6GOCP;DXel@Mcum%Rclg8ZW9Q-pzS3*W>Hs+JSRVCK%>Vd~Tk` zR5G3tiJgMF?Mz-=J22{=N}nY+DHUY+$;Y3XQ~>uoSLoH-+fMM-jy#|YF5Eyrv{-hS zRc*Rz?O<NIUnRr$=JcOToh`VPCfL49rDQTIA!@mHI8XYj5^fuYsI8R9)G&Wzqbs+_ zi?YUYfrQw1BBOu-s(3q08o0LTM-N`3?41O$R>rI*zZqn|9>kMb8S{}IWn&CJZltCj z4_H-OuG2`Fj91`uXkWBN^BI#g{wWtiqM0-r=Z!aTXuh|o!UcbZ*Sbfz+xXGUpW1fm z=jd{d$#qV+87ALvqdVkGM@#n|qtozvfqm|5LA7S1Pr@g64#{Z1&^JVSv$43m=9qU@ zy;NfX08f#jcJWOfZmp6gi)FUgNtQRvS}V^|J0upupU<aZ#OUdqXt|NtBhV9iG!z@D zP@A_kgCo<C%6N*mg^lmw_eOMA-T5HkN(_+6v`mPIs|u&iT2QdbIMAX;1o-CHM(AO7 z71gnVz!wjwP%t=M91fQQ`Is(z;})=jZyp(${T>G+K$0jo_~C#738#%2_xH%6Qzb5< z5u!)epcdRTiE6qo=4dar*C^bVD%SnyU~f}%4lm@*z^MbWe$Vp?rp-x+?R+q6dUI=d zbcFMPQ`gh#g3GP4BS9G@Y8@WHL}Ye=M3%!;qy1gjR#<BTHG~4fF!c4Q%x_wovpTWC zZ)kn~zrj|g=JaK~O1wL<_I{uHBa{AFM*SanJ$he{KX3AW0rW_X4dCU>`n~R7#?7r# zSavyA@-lpa?6W*6Bvt1K64XWFt9Kn0L~(&}7&%xlj|oC|zf?w4L!qvLU8Kg{;pO06 z`kod^o$kH_clUhwD{#3z|I9{C*X=Efbie!%9296vg{9Rx9%&qXbh|>-+?U<1I~ma9 zW3LEumYq=L)WtD_HYalcb;uQfQ>Sr?3%tnS6ZoMJ)v*S%USe_wqGDe_0Hm2)B7I6R zU#Dl?K`h;*=xK-E`IJ)m^|*wU&%o{~fT_+y?ZDJv7?w9LF7~xa@t8CF?11CmY4h|z z2ixb^M{OOymeUw*V^1Ls6N4Perh^7eG#K58{4>xsDSchMPE~yVG8mZqv<5`&YSn9! z>3of~>b``L=V}4+m$JX|`ls%psy%fpNnGppz_oyGq=T}T(xel<LK@DL9i^H-mO(!j zGUamsmydJ-QVT%^v{p16)%hvP_&po{n`;N7R)<bw@X1CGNF@XKQy#l2bHNl|xQy0H z@V7a7870Jw9CaO(V<h_$K}z`8SG*ohFrMQ)yq8k$P6uh%v=c#B`Gw-JYyIWUm79Jk zL?!h67OtU|<tFQ~s~<IpNrRq7*&qbDM9DtEo15wb`XZ@P@d|gBz&#!SdJ^ddbEHMY z&;<B&gb8SGV9)bq>Od<5J(Wk?*n8z`U9HKDCtbE7*5zn7SpCW@dZXi{<ueB1M;bT0 z5x8IZRjE#sEnkku^<4*56=7pnGr3Hj3bN9qfbSFctEDz|g5n`oX1z*{SdViyk*igM zq=aL+Cvb@!MIE;83O{AnS`{rk5euMZ6tN_Nge7C+g@XzVg6?keVZyHrpIoA0QafJX z7i=OccRC@fz|_I@0#4#y>}%2RA|Un8)&v^7uDMA{Xt4(~Qx;`Dm{3MxV?M~LQdh3F znP{}JrR!uYD$J(H$xR=)*fPwEGo39*kFLvnpyD%XC*TYMqbERuMZik2D8~9*?o?6) zEc8&Jii?YZ=^_B>^?KhGpD0a80u80|>Fp|%NK*%lqM*p%4)+2e##Elcq%#3T@Knd5 z&>%BLN*q<_pztvbd?(=X7i^u!oLbuAxUX@nbp{r`gTyn7sgz62<p`_J5%I1{&ySN1 za6jF5t8WTc4mbQ}_Mn_s2al@XDz!x#u!lDmzrcIJ&si4pp7H)zwxM{1f`+kjTv&?j zQi0w-PgSjbWE7pZ+^#Go*GX`9zwP_4nJ)>{rOmM4dFGYh=OoDfF(&6=Xl!k0Zu&dq zWp9_GCT+jOfY5tW$H3`Q63LNe3u-Egc;L7P1WrO1URZrN-6?x%z-_7?{%hv->d{qz zlO%VH{cx7~@KcjO<<=~J1Ppad%&ig!yP}*X7kipEB@)su`2uU`aF|wAq*2j3Wk;E% z-mWfALW9r=!$PT9bd$KTf5z1!{b^mU+Maq;+pGU*gZj)6MTvUuS0E__gO6WZ-uI~L zblB0E{=EsnC!31_p47JF$JJqyX<20%`)BqwezW_-H=^>ASKIHBnxurWC(v=4KMpN~ z;R|!T&LJIk<&X6^+?esc=O$tw7P$;<inW3_^YGTlHK<9uI0aot*5RWK#ir)w7>&U> z_cwyf8`pQ-zf+px86~SIo6br$3bJvVu-jy}5S8OhOW)#N)HeVdP~a*cQ6^JS_KD{8 z`Mkb99G=>ziN(Eg5O6w%H4@$xM<Imj2+$>F9^@nWz;Wr{Jk1pe#`^|G2TQYsttqg6 z!cRGXlc`1&sGlRD%}J8ps&2&4)Bx;HI5;$PYS7N>T{tSMKE0Fb4Jg}3w_{;DExIf* zHXRkR%CS|(DR$(xJn{<s997A$B1@7bV8D^decVE#aL|SkwF)M~)&?8MgIL2YKEuUT z7RadCV6sxS5`iIhmW@Xj8;r7|i2p&JJi`))CX9sPG5@j{E|n-6w$CCAk>6lD4TiEP zgr^MtP3>Bv*fy~zAw5ai!6koPUK_^ZTA|V>+vpG-cx&#^o=_Y0R06PcQNVL}<{QI( zFsHG3fK=pU?y+37yWyFcqsB1;<HjI-TVckd-dd!uIHwmqg;!6>C#`}@%~a}6`@j;j zP)DPP&-*){4p<xh4++Bn$3Y9W=A8|viu}lQ$9AqUYn@d>@VXXNv*kLO{oVP@$hL`h z(Ds9ejtw;<N!8i*+N~;_j|yk@sb$Ps^>)9(ktCnpR2_|dX`fW4Oj}~fq4Ik;>TWnH zbdm{m=MMR18TIvLthy$g6SIhLuCen=Qp1JWkcb7Z->Dc&oPwL5v4Qh4ryC4LBeLyZ zkY_c@UUG;F#JslcZQN16AYY~$ZHz&<p>)MgJ;m<4I%fBRg_i}>sUqgEz=~|zHy}Ba zX}4LG;m!TSLsmWU9^TxKog#3%f&mj+tlf@JmC0#xa}Ln1=hhP~QZ{0o@`-O!9D42P zE?grso%dih$3k)S@4$ye<^1uY`l9}bZ_?OQUf>}C0LTgazkbTX5`uE#qB8R0bhain z+M7<q;!eJKbwB31Va9;Uu2p;B#H-a-tZ-A0VPig7x>i<FY+%Dj3$crT$loRPP3s>h ztHzK~BqVC6Sr~~J#S5HPbmvZaZTtG!x~n^K>-Bg&t-EbrjjngvUix@?o}V;i)rD1T z;*Z`G<#lxd+B-Es7xC{5Z{rBFU!H3()W@W4e_(XMFWR^d;0>Oz;guS0{d}5!;<+i? z?eTVJomv%lKO4((_uJY&K)#)I>$)o&^LQ~{kD`kSg9Bn8+S0`hLuebKlS`}9>+#$6 zHF!k&#ryX5^6bF6+{f<ioqhnQ?-`tTP=wCjcFg?!`1lx^elhAAmN?ord>z5@j>`Yy z;u?Oe>N;)+-qGvn-1g=9%BL?bi67?U&E0<2ZD`q!XZU(y7B#5?dTgk^>-<@~4Y%~- zdOB=XC{q7pYKR5*@DUCP-6IuV@TubE6BG-$%{?mlit-DJ=BW@pa7|BSMf<S%K8Q<r zdt{_6XEzoZkBgtg`%btqs>zw~*NrpbYclz4Xm%bnf6gR+QBGW#7mZsN?u|i4gLBv& zTw)G4+-5v2)-(6k<(P2mjt@pqpNjmzq@l(l^LiON-Y8KD2rQMPT*e_E)?`Ff1T>D) zEb>iBkH_d%?Umcknr9QXdzND!E=AV%7eW)aE57^TcI~A8X33BTuxZrQF*(Hcw(FK_ z9*+C5Y}9RY!)x%1|H44jA>D`nNN85t!JzEG2sCYW8U3(n0uh6vv<-_?yPjAD=3=%2 zl~Ey+B<v5sAv>4`Z6T0C)kplh1zq>4(kO%DLl#}SUp%_0?C5R8^sN?3+p!j>!QK^{ zsudI*^Gudv7ET<NMuk5pi!vc|h-8~BR7ARtWgOrL^EPpNOAmj|>F(Y*x+wFeqL0Dp z8HY(EQ`{?&qESMkzMBL$<vLUK6svG&t12uYRt0yom#@4RykFVxeaMfRIH4u2e>)@3 zIYK}Lche2;LX_BXE23Vn%6~b?AJr6`MMTP(rx&qLa2lil8Y3sHH^7CAlo&#A(S^GG z^@AP{h@2BX+uhwgO%@<g+HIX5b`Oc??At*c58!Lxub=$e_`PojP5wXA>iRDEel42o z`@fBRM4NI%e^g|}e&8@lGnE#5KWH&{-GSUYcAoX-?Ip1eqJ6LMir^z(tDvfXA$iJN zLnlfs&?iY@paDrJPMTLlZcpfeg6IhWoi>($-*Nv@dT|#{5@-;)YnMRo#@+q?a>y}u z?jzFnL&#+sJz;_59ZVNZ(iFCgOv^aBIaN}~6rtKZ+j@ex%xL;IZZrNxR%T_^xRx)M ze;odeLOVGK(4+*RCTYG@utF3`{Ls~i%}X@mZi$+@<cLcXw<9T+PbAf7sV~7fJ&#NL z?KR06p~dhh14TzFBHI;N4?2f;<}haZc$m<xNEBli{zIt@2tU(EzQd;9Jb^{*M=pW2 zgJ?;9kFl7dsfP$^0r23RvCou!NSq%Q{)6@HdhCv!G1!mI!+m2qubv)2f?ufIDlg%a z7j?_&R=HVYb&*@@hq^pIa2UHedT((*dwYR+G78JVJ%DqgNaBfQAc#?=Gp$#lPk|ci zk=Vc_MQIs!dPmettAk(x_W@#)peHg*q;Xxdoxb^%rcd~dc+c;t$5*av&54*u*K3dj zvxLJ5Nk)L!DLgCVWnb6aSOy$AcKzU-<`l4reW=fA>?NGx)bu0BTj+BO+e!<)Ua@;% zT(8)~wZ}QHEX-r1eb3M$89m}P?-lG5O$0rbu+KSO>NL@G=z;E;qbMp$7V8-EE71Nd z+~^LXrjcvV;@_P+t>#a|CFO_)$6t+)KfK~U4LX_zFNuEcu~YC(FbO2Nu3?kfz#A9{ zLEvN@M$CvNmf=;?ZK<MDUtX@{nxK1*KL2p^-y%Y?W5fKtRhz7E^*pm9-|^5G7TiO> zLY&oYd=_lDX@RH&91=w$rAgaOUcE~6L;)Hdfdz@`2~J9j${(cADomjUaf}&~%nxaZ z!3@4=>kRR@ZX;EEc^_9$m8;c{EL%%nc`;5BR3f{lDp?6U2%QiFYNi;DaO@r2M--Qh zICE@#E5hyJ11hg_D^aT@`3t(%J#t+dwbKMsK{X1z_oUk%F#e_G#8F8EQ`;(+3NtCP zXIai0wP+QOB)}D?U<xw~EAI3Ay9alG4QPBFz(JfBSpTaqSoKlh0;{s0q}0qPJW9jm z&DifJy``#y9H)`ymNf|5cAYm)SifqU$c1GI4Cm<msspOX`j?e{M|LNxE56etio}N) zDTA8L`G<ysO?i!~kdzlhu%9sQRpUBz0?o_-qSFK54D2h_81Ms=+XpovsaKbkyJ}@t ziY8K&MZ0XAzzsW~BMDE$piqWeo4np)$Zf!pYwj1DJ0QJ71MaoMO9<;0m`R`0>h$|7 zi5M&05zD@+a)oQGHmxZw(kFgjvXG}N={eBxAd0^6o#lZ#3^<UfOo6AsXdV=w-6JM{ zmFP2kq?~vxD=}b|Gby?|d|bX|^wW*(yXLY}#6ic<R7NsqjqoOhZJ^cbk#H)_NtSdR zps9C;>b*t*F8?kkWqyBc$?REbHOrOO0g}8Ex2RBtj1jD}87b5T3KeH%u!6Fp0c$-T zkmOJZ7$A!D)Ausi0fbCARIL$R#3QU+OygkS8#8y|m79nfcVXOBIFDpc7{jud<paRM z2?*A$?9lR^!NUcr&<2QM3BFf0x8-42WwBAT<b+ph;^KgKN;4oWeTVE`LGUelp9m05 zgBj%``^SBs|D_#`jH$J52%s+xLhD%aIf79`b}7V+6$rVn5cGu>kwOXz9|b5BAfzHQ zWe6B+YKV{%3mf9dWyUcJQ({|l*pG@&(m0yaf*|iy_v(~e7v4*03~><oA-nR&*R0jO zf!qW9vF+#HqsgC|$6K(LhI3a;5Bsv&B>awvKRS(&k6R=Lclx;lK1~C`!o0XJ8T2Wt zaY6NMm|o3;Ip(fp;i>&oVLmlI9@5xcF`C^l$T|pArNbH|76fog69=6Wd3;omjTx8{ zmb8P|f|FYM%f(jg@=Auv@f$bFJnial)8DnrI==|h=Sw?-Ryu{iu2bwK!=p^%5b2d+ zzHCtoc!>*MD7<^bY)dVq?ip>maoJi2NA*EAL+}R7YwLnp&E}jO-Po|eW9ESfG`Y0n zn#HxCnnV{QmXI(uFdY_ol?|?Y6tf?F4U|ADM~ne9xdU84<9}iSNRw(?HEv(!!QU?9 z%WXw+%feo@0<EFYhU<u-@DxPaV=1DHOMqquB4|SO7^ws>#xE7)b+8oj8GbSbG~)_1 z0!hpQ_@rWK&^q{sluSQYK7?u94{YG&GZu<zZYagmCiVd4EnycS4ws+BEJW6S|0qws zW@dMns!|PQyMm2ACA3K(Z}F$ANj<pq0ec+z@TZ3LGZoWo(o@rFe=eRpm~F1#_W$s0 z7!rqnW>?|*-l6f?(GoVW0+ZMl<d>{Uw~Dy5%86egt#Q2^4=kX!{5>yMzwguUy!ZXt zm))=&KUPC@koZiw@|R@FTQ?DYBN=RL{L^f#fcIIqMFlmwWOQ@5`3gy}OG>u#%yZ>E zUkH=Y#S*`}26<{742K^JenriS%9En(I}MCf+<t<6VRdD365VTY$`BIR0?ZHrRF3r& zF=$zSwbm#k;dR*qoX;f_A<wkxm`-dD_agm;sn)r_#IjV;?4!SQzZQwC(r@HH>8MqN z@lUa!fT34LjS~j({PVN--5BEYPu*+KL&IB6j3GE{g4#0DOt~tzQOSZ}X4=qxqBHMx z@gN|8E?u_3UrsY`d=`&WEJk<z$%|ZTgz(gd`(V3y_&j)Ux5ch1ft?+#))s!WKqa8` z3MtI86U!tq(}*;`|B2B>k;ofdhBTw_Mhgr|jyubG47<ov*~WNmpxjZfSRKsl=6Pel zJf@<TxGYATnd+b;Tz;hH8YH;jbqI+Q7p4I%>P<aG6!40r_5_>B(M#2Y_A5!EiXliX z0sJ)gP6tN;N_nLcAIXZXY|U`+RPdrzbV!)u7Eb0)zLR+mN5#NY%mS+>9_$loexK^P z_uBdRu#9D|!%`OI8z!4vGSg%m$kd#Zog@=YWQ3NJ!d#^`$7t*wc2PpcyvGZUAN{%v z8l^nji8g&A8OCpn<k+-#%)FWWX349x;!^Ay2l)u57OQnK5mh|HchaD0JZAw>XcSAA zpEGBwaL{~)Pt~nd-n`1uGDd;lxWaMpwmyP#It!<c*}sUU`xJ3-j@@Ur%6KC;(_+dE zOVfbi#r|p~R5>1!thpDX!ZxT)0t?70bL(GG-Ijae7@q>^P2kxa6H_vF+vw(T_M0;d zKFEH_=`nfqylCf6BqiUnYW7(+T}lIi;=vAG(b=0WF5HS$YsI9a3XA^H$b-3oWLQN~ z=^&LddI=<)zh(?gZ?v0Q7ES~pJ)g`kmfA`zt!8qD**J@Ft>61G=}ysf%J@rx{qljT zYBKu34?2i_=_&nl*8FDJ8xiq>Pij<+O|yn2!)im@B=M384UX}&#-})5{kTdBwNHGD z7tOze*RBE4e7hd^<YV%Bv-{0ItObF`O1IqY#gyyS&;1u-8X%9_?y2{12jvEE;&R*k zj*byv5ccI;YjKJwk}yT&XJD{!Y2)|&OfgxaclWv)fzYN_&C-mQZxo!|l1^@kBK#xX z@Lg{V--rt(;J7#2A%T0XYEZ7+>K7A}O_i;Qj)gpn%2XO7?&%UCT?zK_7|AN*@27UK z=^x&M1<k-d+`j2KCsodV2Jnc*{ZvZIq@@_cRLL9D#oI-X3-4-FY^rWJrKcgw8dB<k zzklWEZPh1!{5@MB*1aQF3Gr#^Hf`TZv1a+E&syg^UWeuH>%nopJ|TY`wRf}LjQ*+@ zr|w1oyTF6~1}<yf5ltV2yas8{IY}i6Dyn$H8VF5LT|f@~!?=-|#4w5M!pxC3ex-@$ zPW62(SHOP<xfYJ`+lMS~aY@E&GXMwR6ybIn?aM_tvOWXtP3D}cEBn|Lk3r_W1xgws zI&BwrJXJU~!eyzYL9+zbBbJciIvWN`8_*&$L+BdS@PUFI{^8J$=12{$Q=@?2jDz9Z zx#c(Ov_+e13!xWAAW<5G5uv-Wg~C*8T~MBF5WQ`KR4n3)C8ceeL=D_~NM7YU_a_q- zlxFIcb&BUq$N2y*Z?oFz0`ZyxaegS?OB?f>w>jn`n^f`sMJ!{T?$$QoXg8TMhu*Ci z;qrd#V@^MLQ9OYTWc_c!9NV8-!m2d$KSX#^o9zS%ZQ9_+*~piDTryOI*D}RC29Fp! zxnK^HbxSUH_Xsa?I&?s?@orG@E{$WAoq75-TVLcwMp&_NYbRiP&r}?z-ZpuVd}ACP z3>6+t<M1C~iyOiMR-4C%<g$1Mi%jhs@<kWcDGFOL-o=X<QmTczwk|LjzDCVbl1k+L z!Uafs?F0H<GN1D}VwfAnSSm;=rPf#(EIzSRv`8G!C>OfB#*OMg)UlN5pqwU%r317N zFD;?Yn~zRn)hEH8$j8j>+zOJ$Dv1%S&yK2!i`F>6Z6%qxQ@yspp_X254?}$MCq<8c zRi@A+MR3aZJEj3~Vpl_tqTE(0_qvX~CC^<*KjCD4k38nWL&N7`l|_+B8RkoJhKUd| ziWl>a6N`3khN3%?PEvd;JgB&#RBROqxMZcEJ;$VhcC6x8AMrqLYu4E+L}CwDu^^nP zBw_2tCDX=$GkTZT6#)m?Zk|zxHAW#s8%ZrmZ}HA$rf>HSS1HM^DZvnuUt6*IWsbIo zX@4%6svQzYjjxoXttuJ(Q-u=9BSOMq7VhKL0uScYfg@0}BE`B^@v0<2>!Ddons_6P zRP|lD<3xmyrkQ$e#ZaBk6VIu2#_q0Gt-mbj;qk&rh_fJB<l%%heUSVc$%UdBvuI+! z03Z)tWDQ|lccN%$%Tn91u^gloUw}$=7E&}@N?UVkn;O%b&?bKjaurD{l;G2O02NYO z3&X_dGtNL}^$Of%)>M+0_eC4<y|7rL;9<0XhBySZ#G>63kt9+rP!Wqz`Bln<k7z!U z|9)-B1>^C}s>!WvjnaAOSYwk~jU!`2-PccPk+rw@BsMTWjVZg0#LC2sBDyxzhGR^c z8%$y7Smo5Us;4);@sW|LKhaI1iPfU!Z~y?&bN~Rv|F~JKBq}H(EBbqT=}Jr6d9xkW z@3c-J+l|6ghN?Aby(Lq+$+9hLMvo~er?(srnusuhQPcrasdeS>*Uk-20J~<d-A389 z$qEV}PWHq8*1)L|aa1UzlO~3$$4--EayDG5X-3waMYF_&DJwK_57u3?qWk?1A@tJ+ z75#L@<Y+S{z4EzgbYc5@oBM~dykRX=vUyEuT1{G^CK(m1EQa|a8vU3R-pKCm9Dheg zM56`tA($g3t~BUn?S60Hxpgg5($>U^*L?M=VwN_$37gnX=`WwhL0TxdA@uzygCZq} zmJ#VCO~m!Hg5R*;Cdt-_NC|^M9!-dx2!E1e_~lEt2FrIij<DR93#ACvMvYYL0_P3s zH9|#9)Tnha8IJ+qQ)U=m`<(P*6jF!{)&rsGTe0;PjS2f9dYTanijz(RYF&x~x??K& z6ix)DC_w@APA!@Nz<P8^vx&mUaMoa1Jz*BdgyG}+>7Ds1bniiw`K+GI4k5jeRKa?E zfIK9Col<G)43lfwN_4KNrjZ@(S?@2M&uyk7&&9JP8eWPJ2`?$?p#JYIg^sz8BOYs0 z$w1C42Qd^&_Nq$dfxEg#@Zg>W#HKP5i$Y0c30OF=VclwFR3O;ESXgW!+u<+d31{ts zP#8hM9V_;+ad!+!p&E%`p6UlSG-PGq{c3R|cXxsPYZ|XS=TX+uFEIVg(n3%HSte2D z=5a_vZCQEQYtsXvzYqxDw{o&Mt_gyTqiu`(pD{ToNK~BQj=MvMQnPe08I_$E(sZzZ zOGPV2nkUy?w$cVCJgPA8_+iNW7+&Cq_xA$>bo#7&2J6&+r;+Hn#=&}T!-NTkElBjh z1C61vwYRQ`8xr64m}fx}@E|43Br&MDny>At7HiIX*jdaw`FJwyBq?Q5PCF@L(&rL$ zN->QILRs&I<_-oi#6%O*^csnPS}JCtdyrya=Og1+^|UTHoSz4QOV&T4R#%a@eS|6H z<a&Re9KC|Zx8H{#qmA7dPw_w1+N)wT_RaG1!a-;;aAci1LHZN=eXEF%h-V*=zn5qN zViZO-2O0V5&0^TutwS{fC-Aj>yP4?j`;}u_zi+8ot90|!q#^EN6Xe(Xq&Mr*?Fl_m zcg5ML*}blP)-JV-2Mgi2I<Kbb*K4s|kaSfSMvf9921g7aEH2ZGN6+-Ljh3w^_y_Ai z?`yoNNob%4F|~dT*bTpLao_AkO~ffMl=8_mDuh?wj}}A}?6dMk66Il=mY_xU`u9dE zrhDXDC&;tJ0M3&~pm&#AHZ{Q&rWzE{)Stet8CB)Y;`Q{U&D$<puM&WD9kyL-B=pGz z6tZ6sk!Hc=gy;i0VImP4V5A<uT#=eqRY?^!$%ZWwM<huy29@;NeM2?RsYF54QssES zRAN;q7Dbq>Gv=D;_uk0x?Z9&(qbXLTki2M0)jyqRYS&=pKRf)re0gEJ9wlYw+_Nba zl1oBuvS<lq4{I}8eF0Q!3Xs)61%5tN*T28rIkLP(6U7+FDGEeoeEX6B;6c)C$xIkw zDc;<!t1gd)Y%`;Ym!NQjm2D{+-V7u*2CtL<5NJ;UaV=8sYOm=a0?FJa`ywT*ziSKE zvh;dKP%RB9$dpB+h0ZyHB3Cobe$>dWX2Q-quQ%vvd6qrZeNab^!At;*?a@ipMb59J zaAAZQd1)cT*4wyD?oTzz3~HZID)&UARKv*>sZ^zKpTQlb<!)hOE&i?+b}-QxLqjij z5)rwJ9(8eH%Rmu!b&geKN!zk$g~XF~dp!qmcE3{@-@VKeXbL|;+I~6~MIw9VqC{)V zh5I9pw|sxv*Wd7hQ2BhZS#4SC4$v?j1;j2Egfviec{9Esp?Bqd9=xmxvVxSwh(@nL zNnuC0^2e{(u{8QRdH4N;*RvlJXn8el1;Xbg<-kP_bV)lwivtfkH~VO0s%kq<C^akU zEum1kb&<dYgQ6Y;r2}3)xkO4bbu00;^zzjwjZ%}bB-b&{{nZvnu-`+r5Sq^y%o?(| z!cZvy7GE>^N<^u&{i&9CIzW7R$m<E&zO~RGaSB@!f-Q2rjJ~>r9}?RFnQ_)xPn~@8 zbZ;9Epm$?{Kpx)$G-h<7EJa+j*_a3YE@WLzAg(QA-l;Kw`b)0XKx$*V7Zau|CWz3i zB*N7Xj!KD>&#|0`?PlJ@94tsXwuJ@-E_rskWBQs3d-_^O6}&r8NR}#*(@@+9y9KCM zU?4FRN#|g=R2Z&&#(EhLRn66X&IxY0lTGTK14T=0U?UuyCd*EVE@|*QHgUf3DX2A` zB*_(VF2dUkv%cW?<O}PmlJ-1{xfz;#Wx>P?3KAH>vZ9`>WnXZ{5NXDAG%y#uC1yss zV{fED*2=Cz%7C&Y1V74N+TDbIzX9BNPSV{9sQ!?X62%*;4Lj}8V5SMRa{?{@PBk&F zF69+x&s7gG9)ext_W=(nor`U?*yq5^Yb9POwqJGL#oh)X4**<fIqH<y?InjyAy`Bh zoIRb<$+j?O6qQg)1?@&D1jDy!l3bF4$!=i>l(`vXrD@-0Dnan@sUT2uNvmsELRAXV zHkhVmbi3`pPuLLO78Z~gJFQ%RtPrSE!4h?Y)^R2>+@2>Mv-xJ}DK74FYc5IdCA&E| zij8c;o*PGJKLEG=MEI7h$nHa;nXKlBOxEgtY1@Xohz|LtG*>4~SY2c?NrbwQ0<HiI zQ;UYww|)_G+2hNbXkTOeHiuh}+pA|}01Oq1$f7N=O?8w@W2FhuJ8F(mV0$;ESTIg~ zR=&n21h^pJ3ztn5>5I4&S_lRc=PZFHJbNmEX+^s`2!M(0m5i5x-4$71JBHY99c4o$ z@1hwb1AdD+!QXOh7Pqmcn%~PELZA$dClJJ%R-uT|Q%bb8oHk3jP@v-GI}6$w+d*hQ zUyQHJ#iJ&s&3Wfzt`e9dPvhSTsH}x_Nyv>ntw!Ry)gYVc{^I&}L}T?~wor*omHAFs zi8|%_Y|!LrL~$H3W*%3>yICj-aMf7DjcA1qG93gbGAY}uk|A1nr^PJJa}p0KzPrAh zvECKNB3ywxKXKT_?gy*7`;`~8+LPr{5akMKOPhnZ6HqN!&27H{FhVx=M#|bix~{{q ztwf?;%ma~CKgPygO1<gZ;=_*{&v(rGVs=AD(29N0INOD=9}$?<4xOlS;XEAk@NL7b zR!ejeyddaA)x)QV78j2nH%1rb<;V7pECm<h@1v8=)^<Qk1uq=cgWe<;-$mle<b%qD zhs(@=HAhKYp;)K+q9biy_lV}xzSyX$o3klH;cT8L)B6Vi5}xmow8f?fPaw0JX6@zv z-u|(&DLlfW*M=IzX>M<?2+Y|iJka80Rz(J;x*fC~kAex&K5b)Bx|`Tsc5!r-(IL#K zzY21LwDl}otwIN#CYp3lyOIki@6yA;-*`+LwvZS({BY<)3481-Li0#IM&8=M;gv0O zN9H-t#V_>HbnDpiO!Rfw%FKseh$ZfUCKSX}ulxd#6MsC_=<beK4ipeSImQ>TVYl># z12-C6^4>92q(HUD3&_s#$O1*s2AI<08saW29(P02V{qt<bC;xs;+$B%zE5PZyc8^S zMXD_HXmr}ncV9xXDWB(6s~FYcu7U3>;l^=^K|!ApL2K1r^8*MLjpHTgC~f5<DQ3!u zpRv&v5GvDo_9~m)KLeDlOWH<rk**x&Ni|!4gdp+74!B19x~B7{rJoVxHs3J^fomH2 zmW8>Np{)JbK7&_W9c^p!z~kgWx508p^eIKy?|M?&r;4hT@G=IN=?<?sgRWB$i`o@i zB-?ipQT~|a++UJMTim|4m+D#p{fx4Ol)nP!g&eSVc}Ps78EF9KH(avD@f=Ej);px@ z6~0(1V~GIdYx2uKfCo_&^~b~PCi}q#oOnVRlah4KAOb{wSHn<HeiK3erk>*}shF*% zoxqZ=_3i92w>wGsTnq~q0okgB<G?lF=WB!Fje8sjS3HVIVXif1lyL3O*j%8i8jwJv zP%0ZaN})U+z|Q0!3Is({2IedAH={`>;E9o0UVh+mtK3AYQxO!q!UZ{M*G>>Oa~1+s z*uNa&vWhKW`$x--C0^h-IGVCIlChj8zI+{CJ?f*NbYUVDY7V9~#sL!J1oMVaDR&m@ zcO~<dI*VqX)ObV1R$1La9ev8wPcj0t)+2&kk>v_L+83;yLY{*&Tis!DKqVh6aABoP zCjz=S59*ci+v<GP7~g;L{yfrmOMkNp+uhte8zLY0K;g3sk{LJ`#Mq3W9e!?mf`AXy z)R=a|Ehkka)hd76YSr)AzCvLNc{dsSH6rLcozxEdO2s|<D7qqxNa5f90JD|J^#nn( zi~zj|>+4&X0~9ZPAVf>$L@s+02<(|>OH15NDSza|Whj5MJQ5#O=z7!Wjq(D#WR6eo z#UJ+rTe#Q4lKfHK<+Ba@m9))QVe|I9M`*>aVwv8@-+Fz%X5ihQJhG2hAZEw=s9mt? zkafiTBNSt%;)~)^{~6iPVkK_8S^(&~tdDm_C6O&#sS33ZrHkC^?~+y2>%=V)XQM6s z-~&6u3HJs362u9W84zl5^7R|?cMwD`1yvJbPNh{&M`l@wd;_n7s1sx0J`2L#)D`M} z4O<HLaD0u<ldwMz<2p>#T9ehO<SJ49hePu*=fnokkwwZiQ2f0Ic3YGt5rV*;>DbFB z1M?|uGDBml@>2nI_tAGNUrnofIg^Lx3MJ5YAinn%nsKq`P=lTm-s&c3UAV}$y*~0n z<qSpI`B6aCIZO-l3*8|)>8)X0RY-R$JqALmS5=%?7y1uwW8MMx3Q8Jv0P;y|4!a!t z<8}6o4686JA7HroJ!`<jjeLE{RQUMk;Wd|r`ClMHKM-HTGwFbN;Pd<6e*J+M=B$+P z9{tVz+5`ds_|3EWuT_8llUPMBBPlE@rz}e6;^CqiFKA!HfDn4~g<6!`i8NvNQtu8f zQ*UxvZHx6J5wxgb#mFRA_4$D-tZqw6!hGBNl3NC|Nc(;&9rUpX|N8S{UmnmDL-}#c z8p@H(<mR9%&m3P&0<gA;dM`u)u+H$-oae*w6_W_YPmdD(?7%#Ih_mNqK7sk`atvE$ zl_PY0pi3UT-~J6|6~z1$;0Yal`wncj0Y3>FD&5HAAsAbt^AVC3_i^m@B=xrC4kMAj zBfF1GE>Ct<zc`O<Rs5Ftk)A%|(QXI92pddn`B{J!*v_DCnYc~^)O~5s2V6xhUbML> zW<kMG8EQfsSOr2rO4*W=`KaF(IP<DptValBnlHwbvNLjWTj<V>o<q#1KoypD(KMKN z+iBox5lP3HI)f3L1)w5;m&tN~W&KFHjFvcPvBp5*P~;dnotK&u6?A2}x*7ET*RFyh zmF3zlT#o`Us_hw_y2gAQA{=asm|@|lc81*AR_{tBXhAd}%@*c2z@>%D2=AfBQi8B= zhO9Z*%05z)DN|N3Etw}^iB}-IjGB!wm7=yOVut2?0YM7WvT`ap)6H5i^TLhGj+*W} zfUO$$8KaYJE{-*Qb^gL%zaemdK>Wb}eF5m-tKomQE5UzV{wN3i-*^32LFm8Ql_2%+ zxBsQ<e_2!iGz5abM1Ehd1dabu=dW_n|7TQx;j{lN82y)EabUs!K<(e<qyHM@U$TEv zx&M|;!vCi)YxHkM_g{+t>iK8s?SC<x|7ur)ZG``*_-`KbUy6T?@lU4nUy8+nZ~sHZ zzX;END*s7!{aab_cPR3|pX&cJMgO8t|G{|u)8J2p<=+M)zpH-#PYnL=K+8XU{-hrM z?eqS7(f&_-{&Ok+n}PVJ&7Y*ezint~|Nm`%M@s)R_%oLJw*jH@KN<XINcB(6Kl5>a zYhJ4TljeV><^I(Cb4T=VO*zYd(){=S=%0dr-n#x4e0KjQ!T-3CDM*8Y{i_@N?-wvA L0KhNLe|`F2(g{k$ literal 0 HcmV?d00001 diff --git a/.yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip b/.yarn/cache/yn-npm-2.0.0-3ad11617c1-9d49527cb3.zip deleted file mode 100644 index 86fd3519524b31b4ecbca32b2567773157e15d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3226 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 J-{JlC^&d2KPmTZp diff --git a/.yarnrc.yml b/.yarnrc.yml index 148512db4c8..88cc8e05dff 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -21,6 +21,9 @@ npmAuditExcludePackages: - levelup # TODO: Update leveldb - deferred-leveldown # TODO: Update leveldb - abstract-leveldown # TODO: Update leveldb + - level-errors # TODO: Update leveldb + - level-concat-iterator # TODO: Update leveldb + - lodash.get # TODO: Deprecated. Replace to ?. operator. Update sinon packageExtensions: "@dashevo/protobufjs@*": @@ -41,7 +44,7 @@ packageExtensions: eslint-import-resolver-node: ^0.3.6 karma-mocha@*: dependencies: - mocha: ^9.1.2 + mocha: ^11.1.0 ts-node@*: dependencies: typescript: ^3.9.5 diff --git a/CHANGELOG.md b/CHANGELOG.md index f98b8e4c757..2151c906422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,211 @@ +## [1.8.0](https://github.com/dashpay/platform/compare/v1.7.1...v1.8.0) (2025-01-16) + + +### Features + +* **platform:** distribute prefunded specialized balances after vote ([#2422](https://github.com/dashpay/platform/issues/2422)) +* **platform:** using new rust based bls library ([#2424](https://github.com/dashpay/platform/issues/2424)) + + +### Bug Fixes + +* **drive-abci:** document purchase on mutable document from different epoch had issue ([#2420](https://github.com/dashpay/platform/issues/2420)) +* **drive:** more than one key was returned when expecting only one result ([#2421](https://github.com/dashpay/platform/issues/2421)) +* **sdk:** failed to deserialize consensus error ([#2410](https://github.com/dashpay/platform/issues/2410)) +* try DriveDocumentQuery from DocumentQuery start field ([#2407](https://github.com/dashpay/platform/issues/2407)) +* **drive-abci** rebroadcasting should not only take first 2 quorums too ([#2425](https://github.com/dashpay/platform/issues/2425)) +* **dashmate:** local network starting issues ([#2394](https://github.com/dashpay/platform/issues/2394)) +* **dashmate:** some group commands fail with mtime not found ([#2400](https://github.com/dashpay/platform/issues/2400)) +* emergency hard fork to fix masternode voting ([#2397](https://github.com/dashpay/platform/issues/2397)) + + +### Tests + +* unify identity versioned cost coverage ([#2416](https://github.com/dashpay/platform/issues/2416)) +* **sdk:** generate test vectors using testnet ([#2381](https://github.com/dashpay/platform/issues/2381)) + + +### Miscellaneous Chores + +* **drive:** increase withdrawal limits to 2000 Dash per day ([#2287](https://github.com/dashpay/platform/issues/2287)) +* fix test suite configuration script ([#2402](https://github.com/dashpay/platform/issues/2402)) +* resolve NPM audit warnings ([#2417](https://github.com/dashpay/platform/issues/2417)) +* remove deprecated check_network_version.sh ([#2084](https://github.com/dashpay/platform/issues/2084)) +* update bls library ([#2424](https://github.com/dashpay/platform/issues/2424)) + + +### Code Refactoring + +* **platform:** replace bls library ([#2257](https://github.com/dashpay/platform/issues/2257)) +* **dpp:** using deprecated param to init wasm module ([#2399](https://github.com/dashpay/platform/issues/2399)) + + +### Performance Improvements + +* **dpp:** reduce JS binding size by 3x ([#2396](https://github.com/dashpay/platform/issues/2396)) + + +### Continuous Integration + +* fix artifact upload issue on release build ([#2389](https://github.com/dashpay/platform/issues/2389)) + + +### Build System + +* bump wasm-bindgen to 0.2.99 ([#2395](https://github.com/dashpay/platform/issues/2395)) +* update rust to 1.83 ([#2393](https://github.com/dashpay/platform/issues/2393)) + + + +## [1.8.0-rc.1](https://github.com/dashpay/platform/compare/v1.8.0-dev.2...v1.8.0-rc.1) (2025-01-15) + + +### Features + +* **platform:** distribute prefunded specialized balances after vote ([#2422](https://github.com/dashpay/platform/issues/2422)) + + +### Bug Fixes + +* **drive-abci:** document purchase on mutable document from different epoch had issue ([#2420](https://github.com/dashpay/platform/issues/2420)) +* **drive:** more than one key was returned when expecting only one result ([#2421](https://github.com/dashpay/platform/issues/2421)) +* **sdk:** failed to deserialize consensus error ([#2410](https://github.com/dashpay/platform/issues/2410)) +* try DriveDocumentQuery from DocumentQuery start field ([#2407](https://github.com/dashpay/platform/issues/2407)) + + +### Tests + +* unify identity versioned cost coverage ([#2416](https://github.com/dashpay/platform/issues/2416)) + + +### Miscellaneous Chores + +* **drive:** increase withdrawal limits to 2000 Dash per day ([#2287](https://github.com/dashpay/platform/issues/2287)) +* fix test suite configuration script ([#2402](https://github.com/dashpay/platform/issues/2402)) +* resolve NPM audit warnings ([#2417](https://github.com/dashpay/platform/issues/2417)) +* update bls library ([#2424](https://github.com/dashpay/platform/issues/2424)) + + + +## [1.8.0-dev.2](https://github.com/dashpay/platform/compare/v1.8.0-dev.1...v1.8.0-dev.2) (2024-12-19) + +### ⚠ BREAKING CHANGES + +* On epoch 13, masternode vote state transition validation logic will be changed. Nodes which aren't upgraded to this version will halt (#2397) +* Rust 1.83 is required to build the project (#2398) + +### Bug Fixes + +* **dashmate:** local network starting issues ([#2394](https://github.com/dashpay/platform/issues/2394)) +* **dashmate:** some group commands fail with mtime not found ([#2400](https://github.com/dashpay/platform/issues/2400)) +* emergency hard fork to fix masternode voting ([#2397](https://github.com/dashpay/platform/issues/2397)) + + +### Performance Improvements + +* **dpp:** reduce JS binding size by 3x ([#2396](https://github.com/dashpay/platform/issues/2396)) + + +### Build System + +* bump wasm-bindgen to 0.2.99 ([#2395](https://github.com/dashpay/platform/issues/2395)) +* update rust to 1.83 ([#2393](https://github.com/dashpay/platform/issues/2393)) + + +### Code Refactoring + +* **dpp:** using deprecated param to init wasm module ([#2399](https://github.com/dashpay/platform/issues/2399)) + + +### [1.7.1](https://github.com/dashpay/platform/compare/v1.7.0...v1.7.1) (2024-12-19) + +### ⚠ BREAKING CHANGES + +* On epoch 13, masternode vote state transition validation logic will be changed. Nodes which aren't upgraded to this version will halt (#2397) +* Rust 1.83 is required to build the project (#2398) + +### Bug Fixes + +* emergency hard fork to fix masternode voting ([#2397](https://github.com/dashpay/platform/issues/2397)) + + +### Build System + +* update rust to 1.83 - backport [#2393](https://github.com/dashpay/platform/issues/2393) to v1.7 ([#2398](https://github.com/dashpay/platform/issues/2398)) + + +## [1.8.0-dev.1](https://github.com/dashpay/platform/compare/v1.7.0...v1.8.0-dev.1) (2024-12-16) + +### Continuous Integration + +* fix artifact upload issue on release build ([#2389](https://github.com/dashpay/platform/issues/2389)) + + +### Miscellaneous Chores + +* remove deprecated check_network_version.sh ([#2084](https://github.com/dashpay/platform/issues/2084)) + + +### Tests + +* **sdk:** generate test vectors using testnet ([#2381](https://github.com/dashpay/platform/issues/2381)) + + +### Code Refactoring + +* **platform:** replace bls library ([#2257](https://github.com/dashpay/platform/issues/2257)) + + +### [1.7.0](https://github.com/dashpay/platform/compare/v1.6.2...v1.7.0) (2024-12-13) + + +### ⚠ BREAKING CHANGES + +* **sdk:** `AddressList.available` removed +* **sdk:** you need to use `Waitable` to call `wait_for_response()` +* **sdk:** changed multiple args of functions in state transition broadcast logic +* **sdk:** `From<Uri> for Address` replaced with `TryFrom<Uri> for Address` +* **sdk:** `From<&str> for AddressList` replaced with `FromStr for AddressList` +* **sdk:** `FromIterator<Uri> for AddressList` replaced with `FromIterator<Address> for AddressList` +* **sdk:** `LowLevelDashCoreClient` now returns `DashCoreError` instead of `ContextProviderError`. +* **sdk:** Added `ContextProviderError::DashCoreError` variant +* **sdk:** `dash_sdk::Error::CoreClientError` now uses `DashCoreError` instead of `dashcore_rpc::Error`. + +### Features + +* **sdk:** ban addresses failed in sdk ([#2351](https://github.com/dashpay/platform/issues/2351)) + + +### Bug Fixes + +* **drive:** security vulnerability in hashbrown ([#2375](https://github.com/dashpay/platform/issues/2375)) +* **sdk:** create channel error due to empty address ([#2317](https://github.com/dashpay/platform/issues/2317)) + + +### Build System + +* explicitly require tonic v1.12.3 ([#2357](https://github.com/dashpay/platform/issues/2357)) + + +### Continuous Integration + +* remove manage runs workflow ([#2325](https://github.com/dashpay/platform/issues/2325)) +* replace actions/upload-artifact@v3 with actions/upload-artifact@v4 ([#2359](https://github.com/dashpay/platform/issues/2359)) + + +### Miscellaneous Chores + +* make protocol version 7 ([#2376](https://github.com/dashpay/platform/issues/2376)) +* **dashmate:** set tenderdash version to 1 ([#2385](https://github.com/dashpay/platform/issues/2385)) +* **dashmate:** update Core to version 22 ([#2384](https://github.com/dashpay/platform/issues/2384)) +* address vulnerabilty GHSA-mwcw-c2x4-8c55 ([#2382](https://github.com/dashpay/platform/issues/2382)) + + +### Code Refactoring + +* **sdk:** unify state transition processing ([#2338](https://github.com/dashpay/platform/issues/2338)) +* **sdk:** separate dash core client error + ### [1.6.2](https://github.com/dashpay/platform/compare/v1.6.1...v1.6.2) (2024-12-03) diff --git a/Cargo.lock b/Cargo.lock index d9899552c77..4b407637c23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -213,7 +213,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -224,7 +224,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -304,17 +304,16 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] name = "backon" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4fa97bb310c33c811334143cf64c5bb2b7b3c06e453db6b095d7061eff8f113" +checksum = "49fef586913a57ff189f25c9b3d034356a5bf6b3fa9a7f067588fe1698ba1f5d" dependencies = [ "fastrand", - "gloo-timers", "tokio", ] @@ -357,6 +356,15 @@ 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 = "5a8d4d2746f89841e49230dd26917df1876050f95abafafbe34f47cb534b88d7" +dependencies = [ + "byteorder", +] + [[package]] name = "base64ct" version = "1.6.0" @@ -407,7 +415,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.75", + "syn 2.0.96", "which", ] @@ -428,7 +436,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -438,7 +446,7 @@ source = "git+https://github.com/dashpay/rs-bip37-bloom-filter?branch=develop#35 dependencies = [ "bitvec", "murmur3", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -506,7 +514,7 @@ dependencies = [ "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.3.1", + "constant_time_eq", ] [[package]] @@ -528,12 +536,33 @@ dependencies = [ "glob", ] +[[package]] +name = "bls-dash-sys" +version = "1.2.5" +source = "git+https://github.com/dashpay/bls-signatures?rev=0bb5c5b03249c463debb5cef5f7e52ee66f3aaab#0bb5c5b03249c463debb5cef5f7e52ee66f3aaab" +dependencies = [ + "bindgen 0.65.1", + "cc", + "glob", +] + [[package]] name = "bls-signatures" version = "1.2.5" source = "git+https://github.com/dashpay/bls-signatures?tag=1.3.3#4e070243aed142bc458472f8807ab77527dd879a" dependencies = [ - "bls-dash-sys", + "bls-dash-sys 1.2.5 (git+https://github.com/dashpay/bls-signatures?tag=1.3.3)", + "hex", + "rand", + "serde", +] + +[[package]] +name = "bls-signatures" +version = "1.2.5" +source = "git+https://github.com/dashpay/bls-signatures?rev=0bb5c5b03249c463debb5cef5f7e52ee66f3aaab#0bb5c5b03249c463debb5cef5f7e52ee66f3aaab" +dependencies = [ + "bls-dash-sys 1.2.5 (git+https://github.com/dashpay/bls-signatures?rev=0bb5c5b03249c463debb5cef5f7e52ee66f3aaab)", "hex", "rand", "serde", @@ -541,12 +570,11 @@ dependencies = [ [[package]] name = "blsful" -version = "3.0.0-pre6" +version = "3.0.0-pre8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9de4566ea9f21109f6b3f11551b591ff22683ff47c3a30d97e2feb23257427" +checksum = "384e5e9866cb7f830f06a6633ba998697d5a826e99e8c78376deaadd33cda7be" dependencies = [ "anyhow", - "arrayref", "blstrs_plus", "hex", "hkdf", @@ -560,7 +588,7 @@ dependencies = [ "sha2", "sha3", "subtle", - "thiserror", + "thiserror 2.0.11", "uint-zigzag", "vsss-rs", "zeroize", @@ -616,7 +644,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "syn_derive", ] @@ -739,7 +767,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "1.6.2" +version = "1.8.0" dependencies = [ "toml", ] @@ -756,17 +784,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", -] - -[[package]] -name = "ciborium" -version = "0.2.0" -source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" -dependencies = [ - "ciborium-io 0.2.0", - "ciborium-ll 0.2.0", - "serde", + "windows-targets", ] [[package]] @@ -775,39 +793,25 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ - "ciborium-io 0.2.2", - "ciborium-ll 0.2.2", + "ciborium-io", + "ciborium-ll", "serde", ] -[[package]] -name = "ciborium-io" -version = "0.2.0" -source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" - [[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.0" -source = "git+https://github.com/qrayven/ciborium?branch=feat-ser-null-as-undefined#5fbba76d132caf04cd1f271336d9daafdc747f10" -dependencies = [ - "ciborium-io 0.2.0", - "half 1.8.3", -] - [[package]] name = "ciborium-ll" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ - "ciborium-io 0.2.2", - "half 2.4.1", + "ciborium-io", + "half", ] [[package]] @@ -862,7 +866,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -879,12 +883,11 @@ checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "colored" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" dependencies = [ - "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -941,24 +944,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "constant_time_eq" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "core-foundation" version = "0.9.4" @@ -993,6 +984,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -1010,7 +1016,7 @@ checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", "cast", - "ciborium 0.2.2", + "ciborium", "clap", "criterion-plot", "is-terminal", @@ -1125,15 +1131,16 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] name = "dapi-grpc" -version = "1.6.2" +version = "1.8.0" dependencies = [ "dapi-grpc-macros", "futures-core", + "getrandom", "platform-version", "prost", "serde", @@ -1146,12 +1153,12 @@ dependencies = [ [[package]] name = "dapi-grpc-macros" -version = "1.6.2" +version = "1.8.0" dependencies = [ "dapi-grpc", "heck 0.5.0", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -1175,7 +1182,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -1186,20 +1193,21 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] name = "dash-sdk" -version = "1.6.2" +version = "1.8.0" dependencies = [ "arc-swap", + "assert_matches", "async-trait", "backon", "base64 0.22.1", "bip37-bloom-filter", "chrono", - "ciborium 0.2.0", + "ciborium", "clap", "dapi-grpc", "dapi-grpc-macros", @@ -1216,11 +1224,12 @@ dependencies = [ "http", "lru", "rs-dapi-client", + "rustls-pemfile", "sanitize-filename", "serde", "serde_json", "test-case", - "thiserror", + "thiserror 1.0.64", "tokio", "tokio-test", "tokio-util", @@ -1231,12 +1240,15 @@ dependencies = [ [[package]] name = "dashcore" -version = "0.34.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" +version = "0.37.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=v0.37.0#9cb1184f7a4e84b42c800006398520af1d559cf1" dependencies = [ "anyhow", + "base64-compat", "bech32", "bitflags 2.6.0", + "blake3", + "bls-signatures 1.2.5 (git+https://github.com/dashpay/bls-signatures?rev=0bb5c5b03249c463debb5cef5f7e52ee66f3aaab)", "blsful", "dashcore-private", "dashcore_hashes", @@ -1249,21 +1261,20 @@ dependencies = [ "serde", "serde_repr", "strum", + "thiserror 1.0.64", ] [[package]] name = "dashcore-private" -version = "0.1.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" +version = "0.37.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=v0.37.0#9cb1184f7a4e84b42c800006398520af1d559cf1" [[package]] name = "dashcore-rpc" -version = "0.15.13" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.13#88dfef0dc04cbe8f4b0d24e9aabfae8ca126c74a" +version = "0.37.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=v0.37.0#9cb1184f7a4e84b42c800006398520af1d559cf1" dependencies = [ - "dashcore-private", "dashcore-rpc-json", - "env_logger 0.10.2", "hex", "jsonrpc", "log", @@ -1273,8 +1284,8 @@ dependencies = [ [[package]] name = "dashcore-rpc-json" -version = "0.15.13" -source = "git+https://github.com/dashpay/rust-dashcore-rpc?tag=v0.15.13#88dfef0dc04cbe8f4b0d24e9aabfae8ca126c74a" +version = "0.37.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=v0.37.0#9cb1184f7a4e84b42c800006398520af1d559cf1" dependencies = [ "bincode", "dashcore", @@ -1287,8 +1298,8 @@ dependencies = [ [[package]] name = "dashcore_hashes" -version = "0.14.0" -source = "git+https://github.com/dashpay/rust-dashcore?tag=0.34.0#4c61ab617ca9f86f84484607014a7e8e0baba960" +version = "0.37.0" +source = "git+https://github.com/dashpay/rust-dashcore?tag=v0.37.0#9cb1184f7a4e84b42c800006398520af1d559cf1" dependencies = [ "dashcore-private", "secp256k1", @@ -1297,17 +1308,17 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] name = "data-contracts" -version = "1.6.2" +version = "1.8.0" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1316,11 +1327,18 @@ dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", + "token-history-contract", "wallet-utils-contract", "withdrawals-contract", ] +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + [[package]] name = "delegate" version = "0.13.0" @@ -1329,7 +1347,7 @@ checksum = "5060bb0febb73fa907273f8a7ed17ab4bf831d585eac835b28ec24a1e2460956" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -1360,29 +1378,25 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.75", + "derive_more-impl 1.0.0", ] [[package]] name = "derive_more" -version = "1.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl 2.0.1", ] [[package]] @@ -1393,10 +1407,21 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "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.96", +] + [[package]] name = "diff" version = "0.1.13" @@ -1422,7 +1447,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -1439,17 +1464,17 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] name = "dpp" -version = "1.6.2" +version = "1.8.0" dependencies = [ "anyhow", "assert_matches", @@ -1459,12 +1484,12 @@ dependencies = [ "bs58", "byteorder", "chrono", - "ciborium 0.2.0", + "ciborium", "dashcore", "data-contracts", "derive_more 1.0.0", "dpp", - "env_logger 0.11.5", + "env_logger", "getrandom", "hex", "indexmap 2.7.0", @@ -1477,6 +1502,7 @@ dependencies = [ "nohash-hasher", "num_enum 0.7.3", "once_cell", + "ordered-float", "platform-serialization", "platform-serialization-derive", "platform-value", @@ -1493,13 +1519,13 @@ dependencies = [ "sha2", "strum", "test-case", - "thiserror", + "thiserror 1.0.64", "tokio", ] [[package]] name = "drive" -version = "1.6.2" +version = "1.8.0" dependencies = [ "arc-swap", "assert_matches", @@ -1508,7 +1534,7 @@ dependencies = [ "bs58", "byteorder", "chrono", - "ciborium 0.2.0", + "ciborium", "criterion", "derive_more 1.0.0", "dpp", @@ -1534,23 +1560,23 @@ dependencies = [ "serde_json", "sqlparser", "tempfile", - "thiserror", + "thiserror 1.0.64", "tracing", ] [[package]] name = "drive-abci" -version = "1.6.2" +version = "1.8.0" dependencies = [ "arc-swap", "assert_matches", "async-trait", "base64 0.22.1", "bincode", - "bls-signatures", + "bls-signatures 1.2.5 (git+https://github.com/dashpay/bls-signatures?tag=1.3.3)", "bs58", "chrono", - "ciborium 0.2.0", + "ciborium", "clap", "console-subscriber", "dapi-grpc", @@ -1585,7 +1611,7 @@ dependencies = [ "strategy-tests", "tempfile", "tenderdash-abci", - "thiserror", + "thiserror 1.0.64", "tokio", "tokio-util", "tracing", @@ -1595,7 +1621,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "1.6.2" +version = "1.8.0" dependencies = [ "bincode", "dapi-grpc", @@ -1609,7 +1635,7 @@ dependencies = [ "serde", "serde_json", "tenderdash-abci", - "thiserror", + "thiserror 1.0.64", "tracing", ] @@ -1620,7 +1646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9c8d6ea916fadcd87e3d1ff4802b696d717c83519b47e76f267ab77e536dd5a" dependencies = [ "ed-derive", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -1726,7 +1752,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -1739,19 +1765,6 @@ dependencies = [ "regex", ] -[[package]] -name = "env_logger" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.11.5" @@ -1811,28 +1824,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - [[package]] name = "fancy-regex" version = "0.13.0" @@ -1840,8 +1831,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "531e46835a22af56d1e3b66f04844bed63158bc094a628bec1d321d9b4c44bf2" dependencies = [ "bit-set", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -1852,12 +1843,12 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-flags-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -2032,7 +2023,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -2138,15 +2129,12 @@ dependencies = [ [[package]] name = "grovedb" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d91e8f87926c834c7338d0c69a48816c043e0cddf0062a8a567483db2fb1e24" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "axum", "bincode", - "bitvec", "blake3", - "derive_more 0.99.18", "grovedb-costs", "grovedb-merk", "grovedb-path", @@ -2159,12 +2147,11 @@ dependencies = [ "indexmap 2.7.0", "integer-encoding", "intmap", - "itertools 0.12.1", - "nohash-hasher", + "itertools 0.14.0", "reqwest", "sha2", "tempfile", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-util", "tower-http", @@ -2173,40 +2160,36 @@ dependencies = [ [[package]] name = "grovedb-costs" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360f7c8d3b20beafcbf3cde8754bbcfd201ae2a30ec7594a4b9678fd2fa3c7a8" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "integer-encoding", "intmap", - "thiserror", + "thiserror 2.0.11", ] [[package]] name = "grovedb-epoch-based-storage-flags" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acec1b6962d99d7b079c0fd1532cd3a2c83a3d659ffd9fcf02edda4599334bb4" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "grovedb-costs", "hex", "integer-encoding", "intmap", - "thiserror", + "thiserror 2.0.11", ] [[package]] name = "grovedb-merk" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72057865f239fdd24f92eaa8668acc0d618da168f330546577a62eda1701210e" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "bincode", "blake3", "byteorder", "colored", "ed", - "failure", "grovedb-costs", "grovedb-path", "grovedb-storage", @@ -2217,21 +2200,21 @@ dependencies = [ "integer-encoding", "num_cpus", "rand", - "thiserror", - "time", + "thiserror 2.0.11", ] [[package]] name = "grovedb-path" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d96cc6106e5ca88e548d66f130b877b664da78be226dfdba555fc210f8508f4" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" +dependencies = [ + "hex", +] [[package]] name = "grovedb-storage" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1c9b59bc9fa7123b8485f87f88a886dd109e7aff5f34a29a3812cb64eb897ff" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "blake3", "grovedb-costs", @@ -2244,34 +2227,31 @@ dependencies = [ "rocksdb", "strum", "tempfile", - "thiserror", + "thiserror 2.0.11", ] [[package]] name = "grovedb-version" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4be0c1a1ef97068fe93212e7b6f349e0b44a9fc90063c8c28e110cfb8c2fcb2" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ - "thiserror", + "thiserror 2.0.11", "versioned-feature-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "grovedb-visualize" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5865f4335eb99644512a7d80d6b1698ba1099a8268fdfd3ffb1a3a32dcb4af28" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "hex", - "itertools 0.12.1", + "itertools 0.14.0", ] [[package]] name = "grovedbg-types" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921b9a29facf9d3f0de667cd1da083a34695ede9e7bfacd74bb5bd29f8f7c178" +version = "3.0.0" +source = "git+https://github.com/dashpay/grovedb?rev=44c2244bbccd3e6e684729e8cf620644f7ebbf70#44c2244bbccd3e6e684729e8cf620644f7ebbf70" dependencies = [ "serde", "serde_with 3.9.0", @@ -2296,12 +2276,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - [[package]] name = "half" version = "2.4.1" @@ -2448,11 +2422,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2688,9 +2662,9 @@ checksum = "0d762194228a2f1c11063e46e32e5acb96e66e906382b9eb5441f2e0504bbd5a" [[package]] name = "intmap" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee87fd093563344074bacf24faa0bb0227fb6969fb223e922db798516de924d6" +checksum = "615970152acd1ae5f372f98eae7fab7ea63d4ee022cf655cf7079883bde9c3ee" dependencies = [ "serde", ] @@ -2754,6 +2728,15 @@ 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" @@ -2771,10 +2754,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2786,19 +2770,19 @@ checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" dependencies = [ "serde", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] name = "json-schema-compatibility-validator" -version = "1.6.2" +version = "1.8.0" dependencies = [ "assert_matches", "json-patch", "json-schema-compatibility-validator", "once_cell", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -2879,19 +2863,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] name = "librocksdb-sys" -version = "0.16.0+8.10.0" +version = "0.17.1+9.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c" +checksum = "2b7869a512ae9982f4d46ba482c2a304f1efd80c6412a3d4bf57bb79a619679f" dependencies = [ "bindgen 0.69.4", "bzip2-sys", "cc", - "glob", "libc", "libz-sys", "lz4-sys", @@ -2915,12 +2898,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "litemap" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" - [[package]] name = "lock_api" version = "0.4.12" @@ -2962,14 +2939,24 @@ dependencies = [ "libc", ] +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + [[package]] name = "masternode-reward-shares-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -3030,7 +3017,7 @@ dependencies = [ "metrics", "metrics-util", "quanta", - "thiserror", + "thiserror 1.0.64", "tokio", "tracing", ] @@ -3124,7 +3111,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3146,7 +3133,7 @@ dependencies = [ "rustc_version", "smallvec", "tagptr", - "thiserror", + "thiserror 1.0.64", "triomphe", "uuid", ] @@ -3276,7 +3263,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3369,7 +3356,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3416,7 +3403,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3437,6 +3424,17 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", + "rand", + "serde", +] + [[package]] name = "overload" version = "0.1.1" @@ -3478,18 +3476,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", + "windows-targets", ] [[package]] @@ -3500,14 +3487,12 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" -version = "0.11.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest", "hmac", - "password-hash", - "sha2", ] [[package]] @@ -3549,7 +3534,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3582,7 +3567,7 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platform-serialization" -version = "1.6.2" +version = "1.8.0" dependencies = [ "bincode", "platform-version", @@ -3590,61 +3575,59 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "1.6.2" +version = "1.8.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "virtue 0.0.17", ] [[package]] name = "platform-value" -version = "1.6.2" +version = "1.8.0" dependencies = [ "base64 0.22.1", "bincode", "bs58", - "ciborium 0.2.0", + "ciborium", "hex", "indexmap 2.7.0", - "lazy_static", "platform-serialization", "platform-version", "rand", - "regex", "serde", "serde_json", - "thiserror", + "thiserror 1.0.64", "treediff", ] [[package]] name = "platform-value-convertible" -version = "1.6.2" +version = "1.8.0" dependencies = [ "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] name = "platform-version" -version = "1.6.2" +version = "1.8.0" dependencies = [ "bincode", "grovedb-version", "once_cell", - "thiserror", + "thiserror 1.0.64", "versioned-feature-core 1.0.0 (git+https://github.com/dashpay/versioned-feature-core)", ] [[package]] name = "platform-versioning" -version = "1.6.2" +version = "1.8.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3739,7 +3722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3786,9 +3769,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -3820,7 +3803,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.75", + "syn 2.0.96", "tempfile", ] @@ -3834,7 +3817,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -3905,6 +3888,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -3924,6 +3908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", + "serde", ] [[package]] @@ -3975,14 +3960,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -3996,13 +3981,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -4013,9 +3998,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rend" @@ -4125,9 +4110,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7" +checksum = "26ec73b20525cb235bad420f911473b69f9fe27cc856c5461bccd7e4af037f43" dependencies = [ "libc", "librocksdb-sys", @@ -4135,22 +4120,27 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "1.6.2" +version = "1.8.0" dependencies = [ "backon", "chrono", "dapi-grpc", "futures", + "getrandom", + "gloo-timers", "hex", + "http", "http-serde", "lru", "rand", "serde", "serde_json", "sha2", - "thiserror", + "thiserror 1.0.64", "tokio", + "tonic-web-wasm-client", "tracing", + "wasm-bindgen-futures", ] [[package]] @@ -4291,11 +4281,10 @@ dependencies = [ [[package]] name = "sanitize-filename" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed72fbaf78e6f2d41744923916966c4fbe3d7c74e3037a8ee482f1115572603" +checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" dependencies = [ - "lazy_static", "regex", ] @@ -4396,7 +4385,7 @@ dependencies = [ [[package]] name = "serde-wasm-bindgen" version = "0.5.0" -source = "git+https://github.com/QuantumExplorer/serde-wasm-bindgen?branch=feat/not_human_readable#121d1f7fbf62cb97f74b91626a1b23851098cc82" +source = "git+https://github.com/QuantumExplorer/serde-wasm-bindgen?branch=feat%2Fnot_human_readable#121d1f7fbf62cb97f74b91626a1b23851098cc82" dependencies = [ "js-sys", "serde", @@ -4429,7 +4418,7 @@ checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4463,7 +4452,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4530,7 +4519,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4542,7 +4531,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4634,7 +4623,7 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple-signer" -version = "1.6.2" +version = "1.8.0" dependencies = [ "base64 0.22.1", "bincode", @@ -4719,7 +4708,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "1.6.2" +version = "1.8.0" dependencies = [ "bincode", "dpp", @@ -4761,7 +4750,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4792,9 +4781,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.75" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -4810,7 +4799,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4828,18 +4817,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -4888,17 +4865,16 @@ dependencies = [ [[package]] name = "tenderdash-abci" -version = "1.2.1+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" +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", "futures", "hex", "lhash", "semver", - "serde_json", "tenderdash-proto", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-util", "tracing", @@ -4909,12 +4885,12 @@ dependencies = [ [[package]] name = "tenderdash-proto" -version = "1.2.1+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" +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 1.0.0", + "derive_more 2.0.1", "flex-error", "num-derive", "num-traits", @@ -4928,8 +4904,8 @@ dependencies = [ [[package]] name = "tenderdash-proto-compiler" -version = "1.2.1+1.3.0" -source = "git+https://github.com/dashpay/rs-tenderdash-abci?tag=v1.2.1+1.3.0#aad72f4d25816bdf0f584ee4ba3cd383addf8a33" +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", @@ -4938,16 +4914,7 @@ dependencies = [ "tonic-build", "ureq", "walkdir", - "zip 2.2.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", + "zip", ] [[package]] @@ -4974,7 +4941,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -4985,7 +4952,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "test-case-core", ] @@ -4995,38 +4962,38 @@ version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.64", ] [[package]] -name = "thiserror-impl" -version = "1.0.64" +name = "thiserror" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.75", + "thiserror-impl 2.0.11", ] [[package]] -name = "thiserror-impl-no-std" -version = "2.0.2" +name = "thiserror-impl" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] -name = "thiserror-no-std" -version = "2.0.2" +name = "thiserror-impl" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ - "thiserror-impl-no-std", + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] @@ -5104,6 +5071,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "token-history-contract" +version = "1.8.0" +dependencies = [ + "platform-value", + "platform-version", + "serde_json", + "thiserror 1.0.64", +] + [[package]] name = "tokio" version = "1.40.0" @@ -5131,7 +5108,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -5293,13 +5270,38 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.75", + "syn 2.0.96", +] + +[[package]] +name = "tonic-web-wasm-client" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5ca6e7bdd0042c440d36b6df97c1436f1d45871ce18298091f114004b1beb4" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "httparse", + "js-sys", + "pin-project", + "thiserror 1.0.64", + "tonic", + "tower-service", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", ] [[package]] name = "tower" version = "0.4.13" -source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix%2FindexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" dependencies = [ "futures-core", "futures-util", @@ -5343,12 +5345,12 @@ dependencies = [ [[package]] name = "tower-layer" version = "0.3.2" -source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix%2FindexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" [[package]] name = "tower-service" version = "0.3.2" -source = "git+https://github.com/QuantumExplorer/tower?branch=fix/indexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" +source = "git+https://github.com/QuantumExplorer/tower?branch=fix%2FindexMap2OnV0413#5286f8c605d10f48d51254f2434c5ab3fc5d7779" [[package]] name = "tracing" @@ -5370,7 +5372,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] [[package]] @@ -5502,21 +5504,33 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.11.0" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30e6f97efe1fa43535ee241ee76967d3ff6ff3953ebb430d8d55c5393029e7b" +checksum = "217751151c53226090391713e533d9a5e904ba2570dabaaace29032687589c3e" dependencies = [ "base64 0.22.1", + "cc", "flate2", - "litemap", "log", - "once_cell", + "percent-encoding", "rustls", + "rustls-pemfile", "rustls-pki-types", - "url", + "ureq-proto", + "utf-8", "webpki-roots", - "yoke", - "zerofrom", +] + +[[package]] +name = "ureq-proto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c51fe73e1d8c4e06bb2698286f7e7453c6fc90528d6d2e7fc36bb4e87fe09b1" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", ] [[package]] @@ -5530,6 +5544,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5589,9 +5609,9 @@ checksum = "7302ac74a033bf17b6e609ceec0f891ca9200d502d31f02dc7908d3d98767c9d" [[package]] name = "vsss-rs" -version = "5.0.0-rc1" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9860fb75908021ae4cc125917c9763134f7f236a716d181ed644627783230c5d" +checksum = "fec4ebcc5594130c31b49594d55c0583fe80621f252f570b222ca4845cafd3cf" dependencies = [ "crypto-bigint", "elliptic-curve", @@ -5603,7 +5623,6 @@ dependencies = [ "serde", "sha3", "subtle", - "thiserror-no-std", "zeroize", ] @@ -5619,12 +5638,12 @@ dependencies = [ [[package]] name = "wallet-utils-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "platform-value", "platform-version", "serde_json", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -5644,46 +5663,47 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.36" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5691,26 +5711,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-dpp" -version = "1.6.2" +version = "1.8.0" dependencies = [ "anyhow", "async-trait", @@ -5725,7 +5745,7 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", - "thiserror", + "thiserror 1.0.64", "wasm-bindgen", "wasm-bindgen-futures", "wasm-logger", @@ -5743,11 +5763,24 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" -version = "0.3.63" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5811,7 +5844,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5822,7 +5855,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5831,7 +5864,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5841,16 +5874,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -5859,7 +5883,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -5868,22 +5892,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 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", + "windows-targets", ] [[package]] @@ -5892,46 +5901,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5944,48 +5935,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6012,7 +5979,7 @@ dependencies = [ [[package]] name = "withdrawals-contract" -version = "1.6.2" +version = "1.8.0" dependencies = [ "num_enum 0.5.11", "platform-value", @@ -6020,7 +5987,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -6038,17 +6005,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -[[package]] -name = "yoke" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" -dependencies = [ - "serde", - "stable_deref_trait", - "zerofrom", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -6067,15 +6023,9 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", + "syn 2.0.96", ] -[[package]] -name = "zerofrom" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" - [[package]] name = "zeroize" version = "1.8.1" @@ -6094,27 +6044,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.75", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq 0.1.5", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2", - "sha1", - "time", - "zstd", + "syn 2.0.96", ] [[package]] @@ -6123,24 +6053,36 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494" dependencies = [ + "aes", "arbitrary", + "bzip2", + "constant_time_eq", "crc32fast", "crossbeam-utils", + "deflate64", "displaydoc", "flate2", + "hmac", "indexmap 2.7.0", + "lzma-rs", "memchr", - "thiserror", + "pbkdf2", + "rand", + "sha1", + "thiserror 1.0.64", + "time", + "zeroize", "zopfli", + "zstd", ] [[package]] name = "zip-extensions" -version = "0.6.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecf62554c4ff96bce01a7ef123d160c3ffe9180638820f8b4d545c65b221b8c" +checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a" dependencies = [ - "zip 0.6.6", + "zip", ] [[package]] @@ -6159,20 +6101,19 @@ dependencies = [ [[package]] name = "zstd" -version = "0.11.2+zstd.1.5.2" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ - "libc", "zstd-sys", ] diff --git a/Cargo.toml b/Cargo.toml index 3b7b503758f..1dd2d2ecdbf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,14 +28,17 @@ members = [ "packages/simple-signer", "packages/rs-json-schema-compatibility-validator", "packages/check-features", - "packages/wallet-utils-contract" + "packages/wallet-utils-contract", + "packages/token-history-contract" ] + +exclude = ["packages/wasm-sdk"] # This one is experimental and not ready for use + [workspace.package] -rust-version = "1.80" +rust-version = "1.85" [patch.crates-io] tower-service = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } tower-layer = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } tower = { git = "https://github.com/QuantumExplorer/tower", branch = "fix/indexMap2OnV0413" } - diff --git a/Dockerfile b/Dockerfile index 5c8ac67655e..601f48de483 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,7 +44,7 @@ # conflicts in case of parallel compilation. # 3. Configuration variables are shared between runs using /root/env file. -ARG ALPINE_VERSION=3.18 +ARG ALPINE_VERSION=3.21 # deps-${RUSTC_WRAPPER:-base} # If one of SCCACHE_GHA_ENABLED, SCCACHE_BUCKET, SCCACHE_MEMCACHED is set, then deps-sccache is used, otherwise deps-base @@ -72,6 +72,7 @@ RUN apk add --no-cache \ ca-certificates \ clang-static clang-dev \ cmake \ + curl \ git \ libc-dev \ linux-headers \ @@ -114,9 +115,28 @@ RUN TOOLCHAIN_VERSION="$(grep channel rust-toolchain.toml | awk '{print $3}' | t ONBUILD ENV HOME=/root ONBUILD ENV CARGO_HOME=$HOME/.cargo -# Configure Rust toolchain +ONBUILD ARG CARGO_BUILD_PROFILE=dev + +# Configure Rust toolchain and C / C++ compiler +RUN <<EOS # It doesn't sharing PATH between stages, so we need "source $HOME/.cargo/env" everywhere -RUN echo 'source $HOME/.cargo/env' >> /root/env +echo 'source $HOME/.cargo/env' >> /root/env + +# Enable gcc / g++ optimizations +if [[ "$TARGETARCH" == "amd64" ]] ; then + if [[ "${CARGO_BUILD_PROFILE}" == "release" ]] ; then + echo "export CFLAGS=-march=x86-64-v3" >> /root/env + echo "export CXXFLAGS=-march=x86-64-v3" >> /root/env + echo "export PORTABLE=x86-64-v3" >> /root/env + else + echo "export CFLAGS=-march=x86-64" >> /root/env + echo "export CXXFLAGS=-march=x86-64" >> /root/env + echo "export PORTABLE=x86-64" >> /root/env + fi +else + echo "export PORTABLE=1" >> /root/env +fi +EOS # Install protoc - protobuf compiler # The one shipped with Alpine does not work @@ -129,7 +149,13 @@ RUN if [[ "$TARGETARCH" == "arm64" ]] ; then export PROTOC_ARCH=aarch_64; else e ln -s /opt/protoc/bin/protoc /usr/bin/ # Switch to clang -RUN rm /usr/bin/cc && ln -s /usr/bin/clang /usr/bin/cc +# Note that CC / CXX can be updated later on (eg. when configuring sccache) +RUN rm /usr/bin/cc && \ + ln -s /usr/bin/clang /usr/bin/cc +RUN <<EOS +echo "export CXX='clang++'" >> /root/env +echo "export CC='clang'" >> /root/env +EOS ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} @@ -139,7 +165,7 @@ ENV NODE_ENV=${NODE_ENV} # # This stage is used to install sccache and configure it. # Later on, one should source /root/env before building to use sccache. -# +# # Note that, due to security concerns, each stage needs to declare variables containing authentication secrets, like # ACTIONS_RUNTIME_TOKEN, AWS_SECRET_ACCESS_KEY. This is to prevent leaking secrets to the final image. The secrets are # loaded using docker buildx `--secret` flag and need to be explicitly mounted with `--mount=type=secret,id=SECRET_ID`. @@ -186,7 +212,7 @@ RUN --mount=type=secret,id=AWS <<EOS echo "export ACTIONS_CACHE_URL=${ACTIONS_CACHE_URL}" >> /root/env # ACTIONS_RUNTIME_TOKEN is a secret so we quote it here, and it will be loaded when `source /root/env` is run echo 'export ACTIONS_RUNTIME_TOKEN="$(cat /run/secrets/GHA)"' >> /root/env - + ### AWS S3 ### elif [ -n "${SCCACHE_BUCKET}" ]; then echo "export SCCACHE_BUCKET='${SCCACHE_BUCKET}'" >> /root/env @@ -199,11 +225,11 @@ RUN --mount=type=secret,id=AWS <<EOS mkdir --mode=0700 -p "$HOME/.aws" ln -s /run/secrets/AWS "$HOME/.aws/credentials" echo "export AWS_SHARED_CREDENTIALS_FILE=$HOME/.aws/credentials" >> /root/env - + # Check if AWS credentials file is mounted correctly, eg. --mount=type=secret,id=AWS - echo '[ -e "${AWS_SHARED_CREDENTIALS_FILE}" ] || { - echo "$(id -u): Cannot read ${AWS_SHARED_CREDENTIALS_FILE}; did you use RUN --mount=type=secret,id=AWS ?"; - exit 1; + echo '[ -e "${AWS_SHARED_CREDENTIALS_FILE}" ] || { + echo "$(id -u): Cannot read ${AWS_SHARED_CREDENTIALS_FILE}; did you use RUN --mount=type=secret,id=AWS ?"; + exit 1; }' >> /root/env ### memcached ### @@ -214,9 +240,9 @@ RUN --mount=type=secret,id=AWS <<EOS echo "Error: cannot determine sccache cache backend" >&2 exit 1 fi - + echo "export SCCACHE_SERVER_PORT=$((RANDOM+1025))" >> /root/env - + # Configure compilers to use sccache echo "export CXX='sccache clang++'" >> /root/env echo "export CC='sccache clang'" >> /root/env @@ -258,15 +284,17 @@ WORKDIR /tmp/rocksdb # sccache -s # EOS +# Select whether we want dev or release +# This variable will be also visibe in next stages +ONBUILD ARG CARGO_BUILD_PROFILE=dev + RUN --mount=type=secret,id=AWS <<EOS set -ex -o pipefail -git clone https://github.com/facebook/rocksdb.git -b v8.10.2 --depth 1 . +git clone https://github.com/facebook/rocksdb.git -b v9.9.3 --depth 1 . source /root/env -# Support any CPU architecture -export PORTABLE=1 - make -j$(nproc) static_lib + mkdir -p /opt/rocksdb/usr/local/lib cp librocksdb.a /opt/rocksdb/usr/local/lib/ cp -r include /opt/rocksdb/usr/local/ @@ -313,17 +341,13 @@ RUN --mount=type=secret,id=AWS \ RUN --mount=type=secret,id=AWS \ source /root/env; \ - cargo binstall wasm-bindgen-cli@0.2.86 cargo-chef@0.1.67 \ + cargo binstall wasm-bindgen-cli@0.2.99 cargo-chef@0.1.67 \ --locked \ --no-discover-github-token \ --disable-telemetry \ --no-track \ --no-confirm - -# Select whether we want dev or release -ONBUILD ARG CARGO_BUILD_PROFILE=dev - # # Rust build planner to speed up builds # @@ -353,6 +377,7 @@ COPY --parents \ packages/feature-flags-contract \ packages/dpns-contract \ packages/wallet-utils-contract \ + packages/token-history-contract \ packages/data-contracts \ packages/strategy-tests \ packages/simple-signer \ @@ -419,6 +444,7 @@ COPY --parents \ packages/rs-drive-abci \ packages/dashpay-contract \ packages/wallet-utils-contract \ + packages/token-history-contract \ packages/withdrawals-contract \ packages/masternode-reward-shares-contract \ packages/feature-flags-contract \ @@ -465,6 +491,7 @@ RUN --mount=type=cache,sharing=shared,id=cargo_registry_index,target=${CARGO_HOM # Remove /platform to reduce layer size rm -rf /platform + # # STAGE: BUILD JAVASCRIPT INTERMEDIATE IMAGE # @@ -475,11 +502,13 @@ WORKDIR /platform COPY --from=build-planner /platform/recipe.json recipe.json # Build dependencies - this is the caching Docker layer! +# Note we unset CFLAGS and CXXFLAGS as they have `-march` included, which breaks wasm32 build RUN --mount=type=cache,sharing=shared,id=cargo_registry_index,target=${CARGO_HOME}/registry/index \ --mount=type=cache,sharing=shared,id=cargo_registry_cache,target=${CARGO_HOME}/registry/cache \ --mount=type=cache,sharing=shared,id=cargo_git,target=${CARGO_HOME}/git/db \ --mount=type=secret,id=AWS \ source /root/env && \ + unset CFLAGS CXXFLAGS && \ cargo chef cook \ --recipe-path recipe.json \ --profile "$CARGO_BUILD_PROFILE" \ @@ -508,6 +537,7 @@ COPY --parents \ packages/dashpay-contract \ packages/withdrawals-contract \ packages/wallet-utils-contract \ + packages/token-history-contract \ packages/masternode-reward-shares-contract \ packages/feature-flags-contract \ packages/dpns-contract \ @@ -526,12 +556,14 @@ COPY --parents \ packages/dash-spv \ /platform/ +# We unset CFLAGS CXXFLAGS because they hold `march` flags which break wasm32 build RUN --mount=type=cache,sharing=shared,id=cargo_registry_index,target=${CARGO_HOME}/registry/index \ --mount=type=cache,sharing=shared,id=cargo_registry_cache,target=${CARGO_HOME}/registry/cache \ --mount=type=cache,sharing=shared,id=cargo_git,target=${CARGO_HOME}/git/db \ --mount=type=cache,sharing=shared,id=unplugged_${TARGETARCH},target=/tmp/unplugged \ --mount=type=secret,id=AWS \ source /root/env && \ + unset CFLAGS CXXFLAGS && \ cp -R /tmp/unplugged /platform/.yarn/ && \ yarn install --inline-builds && \ cp -R /platform/.yarn/unplugged /tmp/ && \ @@ -628,6 +660,7 @@ COPY --from=build-dashmate-helper /platform/packages/js-grpc-common packages/js- COPY --from=build-dashmate-helper /platform/packages/dapi-grpc packages/dapi-grpc COPY --from=build-dashmate-helper /platform/packages/dash-spv packages/dash-spv COPY --from=build-dashmate-helper /platform/packages/wallet-utils-contract packages/wallet-utils-contract +COPY --from=build-dashmate-helper /platform/packages/token-history-contract packages/token-history-contract COPY --from=build-dashmate-helper /platform/packages/withdrawals-contract packages/withdrawals-contract COPY --from=build-dashmate-helper /platform/packages/masternode-reward-shares-contract packages/masternode-reward-shares-contract COPY --from=build-dashmate-helper /platform/packages/feature-flags-contract packages/feature-flags-contract diff --git a/README.md b/README.md index 8c5254f33c2..5765ccb2e89 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ this repository may be used on the following networks: - Install prerequisites: - [node.js](https://nodejs.org/) v20 - [docker](https://docs.docker.com/get-docker/) v20.10+ - - [rust](https://www.rust-lang.org/tools/install) v1.80+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) + - [rust](https://www.rust-lang.org/tools/install) v1.85+, with wasm32 target (`rustup target add wasm32-unknown-unknown`) - [protoc - protobuf compiler](https://github.com/protocolbuffers/protobuf/releases) v27.3+ - if needed, set PROTOC environment variable to location of `protoc` binary - [wasm-bingen toolchain](https://rustwasm.github.io/wasm-bindgen/): @@ -61,7 +61,7 @@ this repository may be used on the following networks: in terminal run `echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc` or `echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.bash_profile` depending on your default shell. You can find your default shell with `echo $SHELL` - Reload your shell with `source ~/.zshrc` or `source ~/.bash_profile` - - `cargo install wasm-bindgen-cli@0.2.86` + - `cargo install wasm-bindgen-cli@0.2.99` - *double-check that wasm-bindgen-cli version above matches wasm-bindgen version in Cargo.lock file* - *Depending on system, additional packages may need to be installed as a prerequisite for wasm-bindgen-cli. If anything is missing, installation will error and prompt what packages are missing (i.e. clang, llvm, libssl-dev)* - essential build tools - example for Debian/Ubuntu: `apt install -y build-essential libssl-dev pkg-config clang cmake llvm` diff --git a/package.json b/package.json index 16a30ea3df1..a341518dba4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "1.6.2", + "version": "1.8.0", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", @@ -14,6 +14,7 @@ "test:dashpay-contract": "ultra -r --filter \"packages/@(dashpay-contract|js-dash-sdk|js-drive|js-dapi-client|wasm-dpp|wallet-lib|dapi|platform-test-suite)\" test", "test:dpns-contract": "ultra -r --filter \"packages/@(dpns-contract|js-dash-sdk|js-drive|js-dapi-client|wasm-dpp|wallet-lib|dapi|platform-test-suite)\" test", "test:feature-flags-contract": "ultra -r --filter \"packages/@(feature-flags-contract|js-dash-sdk|js-drive|js-dapi-client|wasm-dpp|wallet-lib|dapi|platform-test-suite)\" test", + "test:token-history-contract": "ultra -r --filter \"packages/@(token-history-contract|js-dash-sdk|js-drive|js-dapi-client|wasm-dpp|wallet-lib|dapi|platform-test-suite)\" test", "test:dapi-client": "ultra -r --filter \"packages/@(js-dapi-client|wallet-lib|js-dash-sdk|platform-test-suite)\" test", "test:sdk": "ultra -r --filter \"packages/@(js-dash-sdk|platform-test-suite)\" test", "test:spv": "ultra -r --filter \"packages/@(dash-spv|js-dapi-client)\" test", @@ -65,7 +66,8 @@ "packages/masternode-reward-shares-contract", "packages/dash-spv", "packages/wasm-dpp", - "packages/withdrawals-contract" + "packages/withdrawals-contract", + "packages/token-history-contract" ], "resolutions": { "elliptic": "6.5.7", @@ -94,7 +96,8 @@ "body-parser": "^1.20.3", "path-to-regexp": "^1.9.0", "cookie": "^0.7.0", - "cross-spawn": "^7.0.5" + "cross-spawn": "^7.0.5", + "nanoid": "^3.3.8" }, "dependencies": { "node-gyp": "^10.0.1" diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 6383452e504..51d44e76198 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "1.6.2", + "version": "1.8.0", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", @@ -17,7 +17,7 @@ "dotenv-safe": "^8.2.0", "lodash": "^4.17.21", "mathjs": "^10.4.3", - "mocha": "^10.2.0" + "mocha": "^11.1.0" }, "devDependencies": { "babel-eslint": "^10.1.0", diff --git a/packages/check-features/Cargo.toml b/packages/check-features/Cargo.toml index 93a2823a7a9..c4dd095d520 100644 --- a/packages/check-features/Cargo.toml +++ b/packages/check-features/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "check-features" -version = "1.6.2" +version = "1.8.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/dapi-grpc/.eslintrc b/packages/dapi-grpc/.eslintrc index d8877872a6f..4d651184c49 100644 --- a/packages/dapi-grpc/.eslintrc +++ b/packages/dapi-grpc/.eslintrc @@ -1,5 +1,8 @@ { "extends": "airbnb-base", + "env": { + "es2020": true + }, "rules": { "import/no-extraneous-dependencies": ["error", { "packageDir": "." }], "no-plusplus": 0, diff --git a/packages/dapi-grpc/Cargo.toml b/packages/dapi-grpc/Cargo.toml index 3dd57a7b4da..62c544d3b37 100644 --- a/packages/dapi-grpc/Cargo.toml +++ b/packages/dapi-grpc/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc" description = "GRPC client for Dash Platform" -version = "1.6.2" +version = "1.8.0" authors = [ "Samuel Westrich <sam@dash.org>", "Igor Markin <igor.markin@dash.org>", @@ -20,19 +20,19 @@ platform = [] # Re-export Dash Platform protobuf types as `dapi_grpc::platform::proto` # Note: client needs tls and tls-roots to connect to testnet which uses TLS. tenderdash-proto = [] -client = [ - "tonic/channel", - "tonic/transport", - "tonic/tls", - "tonic/tls-roots", - "tonic/tls-webpki-roots", - "platform", -] -server = ["tonic/channel", "tonic/transport", "platform"] -serde = ["dep:serde", "dep:serde_bytes"] + +# Client support. +client = ["platform"] + +# Build tonic server code. Includes all client features and adds server-specific dependencies. +server = ["platform", "tenderdash-proto/server", "client"] + +serde = ["dep:serde", "dep:serde_bytes", "tenderdash-proto/serde"] mocks = ["serde", "dep:serde_json"] [dependencies] +tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.3.0", tag = "v1.3.0+1.3.0", default-features = false } + prost = { version = "0.13" } futures-core = "0.3.30" tonic = { version = "0.12.3", features = [ @@ -42,12 +42,23 @@ tonic = { version = "0.12.3", features = [ serde = { version = "1.0.197", optional = true, features = ["derive"] } serde_bytes = { version = "0.11.12", optional = true } serde_json = { version = "1.0", optional = true } -tenderdash-proto = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", default-features = false, features = [ - "grpc", -] } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } platform-version = { path = "../rs-platform-version" } +[target.'cfg(target_arch = "wasm32")'.dependencies] +getrandom = { version = "0.2", features = ["js"] } + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +tonic = { version = "0.12.3", features = [ + "codegen", + "prost", + "channel", + "transport", + "tls", + "tls-roots", + "tls-webpki-roots", +], default-features = false } + [build-dependencies] tonic-build = { version = "0.12.3" } diff --git a/packages/dapi-grpc/build.rs b/packages/dapi-grpc/build.rs index 642b614ab90..4c8f1d1aa35 100644 --- a/packages/dapi-grpc/build.rs +++ b/packages/dapi-grpc/build.rs @@ -2,7 +2,6 @@ use std::{ collections::HashSet, fs::{create_dir_all, remove_dir_all}, path::PathBuf, - process::exit, }; use tonic_build::Builder; @@ -14,9 +13,24 @@ const SERDE_WITH_STRING: &str = r#"#[cfg_attr(feature = "serde", serde(with = "crate::deserialization::from_to_string"))]"#; fn main() { + #[cfg(feature = "server")] + generate_code(ImplType::Server); + #[cfg(feature = "client")] + generate_code(ImplType::Client); + + if std::env::var("CARGO_CFG_TARGET_ARCH") + .unwrap_or_default() + .eq("wasm32") + { + generate_code(ImplType::Wasm); + } +} + +fn generate_code(typ: ImplType) { let core = MappingConfig::new( PathBuf::from("protos/core/v0/core.proto"), PathBuf::from("src/core"), + &typ, ); configure_core(core) @@ -26,6 +40,7 @@ fn main() { let platform = MappingConfig::new( PathBuf::from("protos/platform/v0/platform.proto"), PathBuf::from("src/platform"), + &typ, ); configure_platform(platform) @@ -34,6 +49,7 @@ fn main() { println!("cargo:rerun-if-changed=./protos"); println!("cargo:rerun-if-env-changed=CARGO_FEATURE_SERDE"); + println!("cargo:rerun-if-env-changed=CARGO_CFG_TARGET_ARCH"); } struct MappingConfig { @@ -47,7 +63,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // Derive features for versioned messages // // "GetConsensusParamsRequest" is excluded as this message does not support proofs - const VERSIONED_REQUESTS: [&str; 30] = [ + const VERSIONED_REQUESTS: [&str; 34] = [ "GetDataContractHistoryRequest", "GetDataContractRequest", "GetDataContractsRequest", @@ -78,6 +94,10 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetEvonodesProposedEpochBlocksByIdsRequest", "GetEvonodesProposedEpochBlocksByRangeRequest", "GetStatusRequest", + "GetIdentityTokenBalancesRequest", + "GetIdentitiesTokenBalancesRequest", + "GetIdentityTokenInfosRequest", + "GetIdentitiesTokenInfosRequest", ]; // The following responses are excluded as they don't support proofs: @@ -85,7 +105,7 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { // - "GetStatusResponse" // // "GetEvonodesProposedEpochBlocksResponse" is used for 2 Requests - const VERSIONED_RESPONSES: [&str; 29] = [ + const VERSIONED_RESPONSES: [&str; 33] = [ "GetDataContractHistoryResponse", "GetDataContractResponse", "GetDataContractsResponse", @@ -115,6 +135,10 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig { "GetVotePollsByEndDateResponse", "GetTotalCreditsInPlatformResponse", "GetEvonodesProposedEpochBlocksResponse", + "GetIdentityTokenBalancesResponse", + "GetIdentitiesTokenBalancesResponse", + "GetIdentityTokenInfosResponse", + "GetIdentitiesTokenInfosResponse", ]; check_unique(&VERSIONED_REQUESTS).expect("VERSIONED_REQUESTS"); @@ -210,6 +234,43 @@ fn configure_core(core: MappingConfig) -> MappingConfig { core } +#[allow(unused)] +enum ImplType { + Server, + Client, + Wasm, +} + +impl ImplType { + // Configure the builder based on the implementation type. + pub fn configure(&self, builder: Builder) -> Builder { + match self { + Self::Server => builder + .build_client(true) + .build_server(true) + .build_transport(true), + Self::Client => builder + .build_client(true) + .build_server(false) + .build_transport(true), + Self::Wasm => builder + .build_client(true) + .build_server(false) + .build_transport(false), + } + } + + /// Get the directory name for the implementation type. + fn dirname(&self) -> String { + match self { + Self::Server => "server", + Self::Client => "client", + Self::Wasm => "wasm", + } + .to_string() + } +} + impl MappingConfig { /// Create a new MappingConfig instance. /// @@ -220,31 +281,18 @@ impl MappingConfig { /// /// Depending on the features, either `client`, `server` or `client_server` subdirectory /// will be created inside `out_dir`. - fn new(protobuf_file: PathBuf, out_dir: PathBuf) -> Self { + fn new(protobuf_file: PathBuf, out_dir: PathBuf, typ: &ImplType) -> Self { let protobuf_file = abs_path(&protobuf_file); - let build_server = cfg!(feature = "server"); - let build_client = cfg!(feature = "client"); - // Depending on the features, we need to build the server, client or both. // We save these artifacts in separate directories to avoid overwriting the generated files // when another crate requires different features. - let out_dir_suffix = match (build_server, build_client) { - (true, true) => "client_server", - (true, false) => "server", - (false, true) => "client", - (false, false) => { - println!("WARNING: At least one of the features 'server' or 'client' must be enabled; dapi-grpc will not generate any files."); - exit(0) - } - }; + let out_dir_suffix = typ.dirname(); let out_dir = abs_path(&out_dir.join(out_dir_suffix)); - let builder = tonic_build::configure() - .build_server(build_server) - .build_client(build_client) - .build_transport(build_server || build_client) + let builder = typ + .configure(tonic_build::configure()) .out_dir(out_dir.clone()) .protoc_arg("--experimental_allow_proto3_optional"); diff --git a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java index 26cf1818f91..f0d139c5183 100644 --- a/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java +++ b/packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java @@ -1007,6 +1007,347 @@ org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse> getG return getGetCurrentQuorumsInfoMethod; } + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> getGetIdentityTokenBalancesMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentityTokenBalances", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> getGetIdentityTokenBalancesMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> getGetIdentityTokenBalancesMethod; + if ((getGetIdentityTokenBalancesMethod = PlatformGrpc.getGetIdentityTokenBalancesMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentityTokenBalancesMethod = PlatformGrpc.getGetIdentityTokenBalancesMethod) == null) { + PlatformGrpc.getGetIdentityTokenBalancesMethod = getGetIdentityTokenBalancesMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentityTokenBalances")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentityTokenBalances")) + .build(); + } + } + } + return getGetIdentityTokenBalancesMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> getGetIdentitiesTokenBalancesMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentitiesTokenBalances", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> getGetIdentitiesTokenBalancesMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> getGetIdentitiesTokenBalancesMethod; + if ((getGetIdentitiesTokenBalancesMethod = PlatformGrpc.getGetIdentitiesTokenBalancesMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentitiesTokenBalancesMethod = PlatformGrpc.getGetIdentitiesTokenBalancesMethod) == null) { + PlatformGrpc.getGetIdentitiesTokenBalancesMethod = getGetIdentitiesTokenBalancesMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentitiesTokenBalances")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentitiesTokenBalances")) + .build(); + } + } + } + return getGetIdentitiesTokenBalancesMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> getGetIdentityTokenInfosMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentityTokenInfos", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> getGetIdentityTokenInfosMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> getGetIdentityTokenInfosMethod; + if ((getGetIdentityTokenInfosMethod = PlatformGrpc.getGetIdentityTokenInfosMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentityTokenInfosMethod = PlatformGrpc.getGetIdentityTokenInfosMethod) == null) { + PlatformGrpc.getGetIdentityTokenInfosMethod = getGetIdentityTokenInfosMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentityTokenInfos")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentityTokenInfos")) + .build(); + } + } + } + return getGetIdentityTokenInfosMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> getGetIdentitiesTokenInfosMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getIdentitiesTokenInfos", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> getGetIdentitiesTokenInfosMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> getGetIdentitiesTokenInfosMethod; + if ((getGetIdentitiesTokenInfosMethod = PlatformGrpc.getGetIdentitiesTokenInfosMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetIdentitiesTokenInfosMethod = PlatformGrpc.getGetIdentitiesTokenInfosMethod) == null) { + PlatformGrpc.getGetIdentitiesTokenInfosMethod = getGetIdentitiesTokenInfosMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getIdentitiesTokenInfos")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getIdentitiesTokenInfos")) + .build(); + } + } + } + return getGetIdentitiesTokenInfosMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> getGetTokenStatusesMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getTokenStatuses", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> getGetTokenStatusesMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> getGetTokenStatusesMethod; + if ((getGetTokenStatusesMethod = PlatformGrpc.getGetTokenStatusesMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetTokenStatusesMethod = PlatformGrpc.getGetTokenStatusesMethod) == null) { + PlatformGrpc.getGetTokenStatusesMethod = getGetTokenStatusesMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getTokenStatuses")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getTokenStatuses")) + .build(); + } + } + } + return getGetTokenStatusesMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> getGetTokenPreProgrammedDistributionsMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getTokenPreProgrammedDistributions", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> getGetTokenPreProgrammedDistributionsMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> getGetTokenPreProgrammedDistributionsMethod; + if ((getGetTokenPreProgrammedDistributionsMethod = PlatformGrpc.getGetTokenPreProgrammedDistributionsMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetTokenPreProgrammedDistributionsMethod = PlatformGrpc.getGetTokenPreProgrammedDistributionsMethod) == null) { + PlatformGrpc.getGetTokenPreProgrammedDistributionsMethod = getGetTokenPreProgrammedDistributionsMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getTokenPreProgrammedDistributions")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getTokenPreProgrammedDistributions")) + .build(); + } + } + } + return getGetTokenPreProgrammedDistributionsMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> getGetTokenTotalSupplyMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getTokenTotalSupply", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> getGetTokenTotalSupplyMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> getGetTokenTotalSupplyMethod; + if ((getGetTokenTotalSupplyMethod = PlatformGrpc.getGetTokenTotalSupplyMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetTokenTotalSupplyMethod = PlatformGrpc.getGetTokenTotalSupplyMethod) == null) { + PlatformGrpc.getGetTokenTotalSupplyMethod = getGetTokenTotalSupplyMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getTokenTotalSupply")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getTokenTotalSupply")) + .build(); + } + } + } + return getGetTokenTotalSupplyMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> getGetGroupInfoMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getGroupInfo", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> getGetGroupInfoMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> getGetGroupInfoMethod; + if ((getGetGroupInfoMethod = PlatformGrpc.getGetGroupInfoMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetGroupInfoMethod = PlatformGrpc.getGetGroupInfoMethod) == null) { + PlatformGrpc.getGetGroupInfoMethod = getGetGroupInfoMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getGroupInfo")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getGroupInfo")) + .build(); + } + } + } + return getGetGroupInfoMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> getGetGroupInfosMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getGroupInfos", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> getGetGroupInfosMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> getGetGroupInfosMethod; + if ((getGetGroupInfosMethod = PlatformGrpc.getGetGroupInfosMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetGroupInfosMethod = PlatformGrpc.getGetGroupInfosMethod) == null) { + PlatformGrpc.getGetGroupInfosMethod = getGetGroupInfosMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getGroupInfos")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getGroupInfos")) + .build(); + } + } + } + return getGetGroupInfosMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> getGetGroupActionsMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getGroupActions", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> getGetGroupActionsMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> getGetGroupActionsMethod; + if ((getGetGroupActionsMethod = PlatformGrpc.getGetGroupActionsMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetGroupActionsMethod = PlatformGrpc.getGetGroupActionsMethod) == null) { + PlatformGrpc.getGetGroupActionsMethod = getGetGroupActionsMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getGroupActions")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getGroupActions")) + .build(); + } + } + } + return getGetGroupActionsMethod; + } + + private static volatile io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> getGetGroupActionSignersMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "getGroupActionSigners", + requestType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest.class, + responseType = org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> getGetGroupActionSignersMethod() { + io.grpc.MethodDescriptor<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> getGetGroupActionSignersMethod; + if ((getGetGroupActionSignersMethod = PlatformGrpc.getGetGroupActionSignersMethod) == null) { + synchronized (PlatformGrpc.class) { + if ((getGetGroupActionSignersMethod = PlatformGrpc.getGetGroupActionSignersMethod) == null) { + PlatformGrpc.getGetGroupActionSignersMethod = getGetGroupActionSignersMethod = + io.grpc.MethodDescriptor.<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse>newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "getGroupActionSigners")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse.getDefaultInstance())) + .setSchemaDescriptor(new PlatformMethodDescriptorSupplier("getGroupActionSigners")) + .build(); + } + } + } + return getGetGroupActionSignersMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -1294,6 +1635,83 @@ public void getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.G io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetCurrentQuorumsInfoMethod(), responseObserver); } + /** + */ + public void getIdentityTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityTokenBalancesMethod(), responseObserver); + } + + /** + */ + public void getIdentitiesTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentitiesTokenBalancesMethod(), responseObserver); + } + + /** + */ + public void getIdentityTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentityTokenInfosMethod(), responseObserver); + } + + /** + */ + public void getIdentitiesTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetIdentitiesTokenInfosMethod(), responseObserver); + } + + /** + */ + public void getTokenStatuses(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTokenStatusesMethod(), responseObserver); + } + + /** + */ + public void getTokenPreProgrammedDistributions(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTokenPreProgrammedDistributionsMethod(), responseObserver); + } + + /** + */ + public void getTokenTotalSupply(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTokenTotalSupplyMethod(), responseObserver); + } + + /** + */ + public void getGroupInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetGroupInfoMethod(), responseObserver); + } + + /** + */ + public void getGroupInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetGroupInfosMethod(), responseObserver); + } + + /** + */ + public void getGroupActions(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetGroupActionsMethod(), responseObserver); + } + + /** + */ + public void getGroupActionSigners(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetGroupActionSignersMethod(), responseObserver); + } + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( @@ -1520,6 +1938,83 @@ public void getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.G org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest, org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse>( this, METHODID_GET_CURRENT_QUORUMS_INFO))) + .addMethod( + getGetIdentityTokenBalancesMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse>( + this, METHODID_GET_IDENTITY_TOKEN_BALANCES))) + .addMethod( + getGetIdentitiesTokenBalancesMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse>( + this, METHODID_GET_IDENTITIES_TOKEN_BALANCES))) + .addMethod( + getGetIdentityTokenInfosMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse>( + this, METHODID_GET_IDENTITY_TOKEN_INFOS))) + .addMethod( + getGetIdentitiesTokenInfosMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse>( + this, METHODID_GET_IDENTITIES_TOKEN_INFOS))) + .addMethod( + getGetTokenStatusesMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse>( + this, METHODID_GET_TOKEN_STATUSES))) + .addMethod( + getGetTokenPreProgrammedDistributionsMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse>( + this, METHODID_GET_TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS))) + .addMethod( + getGetTokenTotalSupplyMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse>( + this, METHODID_GET_TOKEN_TOTAL_SUPPLY))) + .addMethod( + getGetGroupInfoMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse>( + this, METHODID_GET_GROUP_INFO))) + .addMethod( + getGetGroupInfosMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse>( + this, METHODID_GET_GROUP_INFOS))) + .addMethod( + getGetGroupActionsMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse>( + this, METHODID_GET_GROUP_ACTIONS))) + .addMethod( + getGetGroupActionSignersMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest, + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse>( + this, METHODID_GET_GROUP_ACTION_SIGNERS))) .build(); } } @@ -1808,6 +2303,94 @@ public void getCurrentQuorumsInfo(org.dash.platform.dapi.v0.PlatformOuterClass.G io.grpc.stub.ClientCalls.asyncUnaryCall( getChannel().newCall(getGetCurrentQuorumsInfoMethod(), getCallOptions()), request, responseObserver); } + + /** + */ + public void getIdentityTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentityTokenBalancesMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getIdentitiesTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentitiesTokenBalancesMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getIdentityTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentityTokenInfosMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getIdentitiesTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetIdentitiesTokenInfosMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getTokenStatuses(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetTokenStatusesMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getTokenPreProgrammedDistributions(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetTokenPreProgrammedDistributionsMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getTokenTotalSupply(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetTokenTotalSupplyMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getGroupInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetGroupInfoMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getGroupInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetGroupInfosMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getGroupActions(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetGroupActionsMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getGroupActionSigners(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest request, + io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetGroupActionSignersMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -2062,6 +2645,83 @@ public org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRespons return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetCurrentQuorumsInfoMethod(), getCallOptions(), request); } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse getIdentityTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentityTokenBalancesMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse getIdentitiesTokenBalances(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentitiesTokenBalancesMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse getIdentityTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentityTokenInfosMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse getIdentitiesTokenInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetIdentitiesTokenInfosMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse getTokenStatuses(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetTokenStatusesMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse getTokenPreProgrammedDistributions(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetTokenPreProgrammedDistributionsMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse getTokenTotalSupply(org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetTokenTotalSupplyMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse getGroupInfo(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetGroupInfoMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse getGroupInfos(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetGroupInfosMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse getGroupActions(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetGroupActionsMethod(), getCallOptions(), request); + } + + /** + */ + public org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse getGroupActionSigners(org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetGroupActionSignersMethod(), getCallOptions(), request); + } } /** @@ -2348,6 +3008,94 @@ public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi return io.grpc.stub.ClientCalls.futureUnaryCall( getChannel().newCall(getGetCurrentQuorumsInfoMethod(), getCallOptions()), request); } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse> getIdentityTokenBalances( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentityTokenBalancesMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse> getIdentitiesTokenBalances( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentitiesTokenBalancesMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse> getIdentityTokenInfos( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentityTokenInfosMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse> getIdentitiesTokenInfos( + org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetIdentitiesTokenInfosMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse> getTokenStatuses( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetTokenStatusesMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse> getTokenPreProgrammedDistributions( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetTokenPreProgrammedDistributionsMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse> getTokenTotalSupply( + org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetTokenTotalSupplyMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse> getGroupInfo( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetGroupInfoMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse> getGroupInfos( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetGroupInfosMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse> getGroupActions( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetGroupActionsMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse> getGroupActionSigners( + org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetGroupActionSignersMethod(), getCallOptions()), request); + } } private static final int METHODID_BROADCAST_STATE_TRANSITION = 0; @@ -2382,6 +3130,17 @@ public com.google.common.util.concurrent.ListenableFuture<org.dash.platform.dapi private static final int METHODID_GET_PATH_ELEMENTS = 29; private static final int METHODID_GET_STATUS = 30; private static final int METHODID_GET_CURRENT_QUORUMS_INFO = 31; + private static final int METHODID_GET_IDENTITY_TOKEN_BALANCES = 32; + private static final int METHODID_GET_IDENTITIES_TOKEN_BALANCES = 33; + private static final int METHODID_GET_IDENTITY_TOKEN_INFOS = 34; + private static final int METHODID_GET_IDENTITIES_TOKEN_INFOS = 35; + private static final int METHODID_GET_TOKEN_STATUSES = 36; + private static final int METHODID_GET_TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS = 37; + private static final int METHODID_GET_TOKEN_TOTAL_SUPPLY = 38; + private static final int METHODID_GET_GROUP_INFO = 39; + private static final int METHODID_GET_GROUP_INFOS = 40; + private static final int METHODID_GET_GROUP_ACTIONS = 41; + private static final int METHODID_GET_GROUP_ACTION_SIGNERS = 42; private static final class MethodHandlers<Req, Resp> implements io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>, @@ -2528,6 +3287,50 @@ public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserv serviceImpl.getCurrentQuorumsInfo((org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoRequest) request, (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetCurrentQuorumsInfoResponse>) responseObserver); break; + case METHODID_GET_IDENTITY_TOKEN_BALANCES: + serviceImpl.getIdentityTokenBalances((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenBalancesResponse>) responseObserver); + break; + case METHODID_GET_IDENTITIES_TOKEN_BALANCES: + serviceImpl.getIdentitiesTokenBalances((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenBalancesResponse>) responseObserver); + break; + case METHODID_GET_IDENTITY_TOKEN_INFOS: + serviceImpl.getIdentityTokenInfos((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentityTokenInfosResponse>) responseObserver); + break; + case METHODID_GET_IDENTITIES_TOKEN_INFOS: + serviceImpl.getIdentitiesTokenInfos((org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetIdentitiesTokenInfosResponse>) responseObserver); + break; + case METHODID_GET_TOKEN_STATUSES: + serviceImpl.getTokenStatuses((org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenStatusesResponse>) responseObserver); + break; + case METHODID_GET_TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS: + serviceImpl.getTokenPreProgrammedDistributions((org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenPreProgrammedDistributionsResponse>) responseObserver); + break; + case METHODID_GET_TOKEN_TOTAL_SUPPLY: + serviceImpl.getTokenTotalSupply((org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetTokenTotalSupplyResponse>) responseObserver); + break; + case METHODID_GET_GROUP_INFO: + serviceImpl.getGroupInfo((org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfoResponse>) responseObserver); + break; + case METHODID_GET_GROUP_INFOS: + serviceImpl.getGroupInfos((org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupInfosResponse>) responseObserver); + break; + case METHODID_GET_GROUP_ACTIONS: + serviceImpl.getGroupActions((org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionsResponse>) responseObserver); + break; + case METHODID_GET_GROUP_ACTION_SIGNERS: + serviceImpl.getGroupActionSigners((org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersRequest) request, + (io.grpc.stub.StreamObserver<org.dash.platform.dapi.v0.PlatformOuterClass.GetGroupActionSignersResponse>) responseObserver); + break; default: throw new AssertionError(); } @@ -2621,6 +3424,17 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getGetPathElementsMethod()) .addMethod(getGetStatusMethod()) .addMethod(getGetCurrentQuorumsInfoMethod()) + .addMethod(getGetIdentityTokenBalancesMethod()) + .addMethod(getGetIdentitiesTokenBalancesMethod()) + .addMethod(getGetIdentityTokenInfosMethod()) + .addMethod(getGetIdentitiesTokenInfosMethod()) + .addMethod(getGetTokenStatusesMethod()) + .addMethod(getGetTokenPreProgrammedDistributionsMethod()) + .addMethod(getGetTokenTotalSupplyMethod()) + .addMethod(getGetGroupInfoMethod()) + .addMethod(getGetGroupInfosMethod()) + .addMethod(getGetGroupActionsMethod()) + .addMethod(getGetGroupActionSignersMethod()) .build(); } } diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js index 1818a68889a..3e3651d0586 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.js @@ -1142,6 +1142,369 @@ $root.org = (function() { * @variation 2 */ + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityTokenBalances}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentityTokenBalancesCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} [response] GetIdentityTokenBalancesResponse + */ + + /** + * Calls getIdentityTokenBalances. + * @function getIdentityTokenBalances + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest} request GetIdentityTokenBalancesRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentityTokenBalancesCallback} callback Node-style callback called with the error, if any, and GetIdentityTokenBalancesResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentityTokenBalances = function getIdentityTokenBalances(request, callback) { + return this.rpcCall(getIdentityTokenBalances, $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest, $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse, request, callback); + }, "name", { value: "getIdentityTokenBalances" }); + + /** + * Calls getIdentityTokenBalances. + * @function getIdentityTokenBalances + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest} request GetIdentityTokenBalancesRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentitiesTokenBalances}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentitiesTokenBalancesCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} [response] GetIdentitiesTokenBalancesResponse + */ + + /** + * Calls getIdentitiesTokenBalances. + * @function getIdentitiesTokenBalances + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest} request GetIdentitiesTokenBalancesRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentitiesTokenBalancesCallback} callback Node-style callback called with the error, if any, and GetIdentitiesTokenBalancesResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentitiesTokenBalances = function getIdentitiesTokenBalances(request, callback) { + return this.rpcCall(getIdentitiesTokenBalances, $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest, $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse, request, callback); + }, "name", { value: "getIdentitiesTokenBalances" }); + + /** + * Calls getIdentitiesTokenBalances. + * @function getIdentitiesTokenBalances + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest} request GetIdentitiesTokenBalancesRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentityTokenInfos}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentityTokenInfosCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} [response] GetIdentityTokenInfosResponse + */ + + /** + * Calls getIdentityTokenInfos. + * @function getIdentityTokenInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest} request GetIdentityTokenInfosRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentityTokenInfosCallback} callback Node-style callback called with the error, if any, and GetIdentityTokenInfosResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentityTokenInfos = function getIdentityTokenInfos(request, callback) { + return this.rpcCall(getIdentityTokenInfos, $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest, $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse, request, callback); + }, "name", { value: "getIdentityTokenInfos" }); + + /** + * Calls getIdentityTokenInfos. + * @function getIdentityTokenInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest} request GetIdentityTokenInfosRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getIdentitiesTokenInfos}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getIdentitiesTokenInfosCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} [response] GetIdentitiesTokenInfosResponse + */ + + /** + * Calls getIdentitiesTokenInfos. + * @function getIdentitiesTokenInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest} request GetIdentitiesTokenInfosRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getIdentitiesTokenInfosCallback} callback Node-style callback called with the error, if any, and GetIdentitiesTokenInfosResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getIdentitiesTokenInfos = function getIdentitiesTokenInfos(request, callback) { + return this.rpcCall(getIdentitiesTokenInfos, $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest, $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse, request, callback); + }, "name", { value: "getIdentitiesTokenInfos" }); + + /** + * Calls getIdentitiesTokenInfos. + * @function getIdentitiesTokenInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest} request GetIdentitiesTokenInfosRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getTokenStatuses}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getTokenStatusesCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse} [response] GetTokenStatusesResponse + */ + + /** + * Calls getTokenStatuses. + * @function getTokenStatuses + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest} request GetTokenStatusesRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getTokenStatusesCallback} callback Node-style callback called with the error, if any, and GetTokenStatusesResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getTokenStatuses = function getTokenStatuses(request, callback) { + return this.rpcCall(getTokenStatuses, $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest, $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse, request, callback); + }, "name", { value: "getTokenStatuses" }); + + /** + * Calls getTokenStatuses. + * @function getTokenStatuses + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest} request GetTokenStatusesRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetTokenStatusesResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getTokenPreProgrammedDistributions}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getTokenPreProgrammedDistributionsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} [response] GetTokenPreProgrammedDistributionsResponse + */ + + /** + * Calls getTokenPreProgrammedDistributions. + * @function getTokenPreProgrammedDistributions + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest} request GetTokenPreProgrammedDistributionsRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getTokenPreProgrammedDistributionsCallback} callback Node-style callback called with the error, if any, and GetTokenPreProgrammedDistributionsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getTokenPreProgrammedDistributions = function getTokenPreProgrammedDistributions(request, callback) { + return this.rpcCall(getTokenPreProgrammedDistributions, $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest, $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse, request, callback); + }, "name", { value: "getTokenPreProgrammedDistributions" }); + + /** + * Calls getTokenPreProgrammedDistributions. + * @function getTokenPreProgrammedDistributions + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest} request GetTokenPreProgrammedDistributionsRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getTokenTotalSupply}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getTokenTotalSupplyCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} [response] GetTokenTotalSupplyResponse + */ + + /** + * Calls getTokenTotalSupply. + * @function getTokenTotalSupply + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest} request GetTokenTotalSupplyRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getTokenTotalSupplyCallback} callback Node-style callback called with the error, if any, and GetTokenTotalSupplyResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getTokenTotalSupply = function getTokenTotalSupply(request, callback) { + return this.rpcCall(getTokenTotalSupply, $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest, $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse, request, callback); + }, "name", { value: "getTokenTotalSupply" }); + + /** + * Calls getTokenTotalSupply. + * @function getTokenTotalSupply + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest} request GetTokenTotalSupplyRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getGroupInfo}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getGroupInfoCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse} [response] GetGroupInfoResponse + */ + + /** + * Calls getGroupInfo. + * @function getGroupInfo + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest} request GetGroupInfoRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getGroupInfoCallback} callback Node-style callback called with the error, if any, and GetGroupInfoResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getGroupInfo = function getGroupInfo(request, callback) { + return this.rpcCall(getGroupInfo, $root.org.dash.platform.dapi.v0.GetGroupInfoRequest, $root.org.dash.platform.dapi.v0.GetGroupInfoResponse, request, callback); + }, "name", { value: "getGroupInfo" }); + + /** + * Calls getGroupInfo. + * @function getGroupInfo + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest} request GetGroupInfoRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetGroupInfoResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getGroupInfos}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getGroupInfosCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse} [response] GetGroupInfosResponse + */ + + /** + * Calls getGroupInfos. + * @function getGroupInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest} request GetGroupInfosRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getGroupInfosCallback} callback Node-style callback called with the error, if any, and GetGroupInfosResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getGroupInfos = function getGroupInfos(request, callback) { + return this.rpcCall(getGroupInfos, $root.org.dash.platform.dapi.v0.GetGroupInfosRequest, $root.org.dash.platform.dapi.v0.GetGroupInfosResponse, request, callback); + }, "name", { value: "getGroupInfos" }); + + /** + * Calls getGroupInfos. + * @function getGroupInfos + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest} request GetGroupInfosRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetGroupInfosResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getGroupActions}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getGroupActionsCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse} [response] GetGroupActionsResponse + */ + + /** + * Calls getGroupActions. + * @function getGroupActions + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest} request GetGroupActionsRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getGroupActionsCallback} callback Node-style callback called with the error, if any, and GetGroupActionsResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getGroupActions = function getGroupActions(request, callback) { + return this.rpcCall(getGroupActions, $root.org.dash.platform.dapi.v0.GetGroupActionsRequest, $root.org.dash.platform.dapi.v0.GetGroupActionsResponse, request, callback); + }, "name", { value: "getGroupActions" }); + + /** + * Calls getGroupActions. + * @function getGroupActions + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest} request GetGroupActionsRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetGroupActionsResponse>} Promise + * @variation 2 + */ + + /** + * Callback as used by {@link org.dash.platform.dapi.v0.Platform#getGroupActionSigners}. + * @memberof org.dash.platform.dapi.v0.Platform + * @typedef getGroupActionSignersCallback + * @type {function} + * @param {Error|null} error Error, if any + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} [response] GetGroupActionSignersResponse + */ + + /** + * Calls getGroupActionSigners. + * @function getGroupActionSigners + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest} request GetGroupActionSignersRequest message or plain object + * @param {org.dash.platform.dapi.v0.Platform.getGroupActionSignersCallback} callback Node-style callback called with the error, if any, and GetGroupActionSignersResponse + * @returns {undefined} + * @variation 1 + */ + Object.defineProperty(Platform.prototype.getGroupActionSigners = function getGroupActionSigners(request, callback) { + return this.rpcCall(getGroupActionSigners, $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest, $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse, request, callback); + }, "name", { value: "getGroupActionSigners" }); + + /** + * Calls getGroupActionSigners. + * @function getGroupActionSigners + * @memberof org.dash.platform.dapi.v0.Platform + * @instance + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest} request GetGroupActionSignersRequest message or plain object + * @returns {Promise<org.dash.platform.dapi.v0.GetGroupActionSignersResponse>} Promise + * @variation 2 + */ + return Platform; })(); @@ -14856,6 +15219,9 @@ $root.org = (function() { * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IContractRequest>|null} [contracts] GetProofsRequestV0 contracts * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IDocumentRequest>|null} [documents] GetProofsRequestV0 documents * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IVoteStatusRequest>|null} [votes] GetProofsRequestV0 votes + * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest>|null} [identityTokenBalances] GetProofsRequestV0 identityTokenBalances + * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest>|null} [identityTokenInfos] GetProofsRequestV0 identityTokenInfos + * @property {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest>|null} [tokenStatuses] GetProofsRequestV0 tokenStatuses */ /** @@ -14871,6 +15237,9 @@ $root.org = (function() { this.contracts = []; this.documents = []; this.votes = []; + this.identityTokenBalances = []; + this.identityTokenInfos = []; + this.tokenStatuses = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -14909,6 +15278,30 @@ $root.org = (function() { */ GetProofsRequestV0.prototype.votes = $util.emptyArray; + /** + * GetProofsRequestV0 identityTokenBalances. + * @member {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest>} identityTokenBalances + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @instance + */ + GetProofsRequestV0.prototype.identityTokenBalances = $util.emptyArray; + + /** + * GetProofsRequestV0 identityTokenInfos. + * @member {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest>} identityTokenInfos + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @instance + */ + GetProofsRequestV0.prototype.identityTokenInfos = $util.emptyArray; + + /** + * GetProofsRequestV0 tokenStatuses. + * @member {Array.<org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest>} tokenStatuses + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @instance + */ + GetProofsRequestV0.prototype.tokenStatuses = $util.emptyArray; + /** * Creates a new GetProofsRequestV0 instance using the specified properties. * @function create @@ -14945,6 +15338,15 @@ $root.org = (function() { if (message.votes != null && message.votes.length) for (var i = 0; i < message.votes.length; ++i) $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.encode(message.votes[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.identityTokenBalances != null && message.identityTokenBalances.length) + for (var i = 0; i < message.identityTokenBalances.length; ++i) + $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.encode(message.identityTokenBalances[i], writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.identityTokenInfos != null && message.identityTokenInfos.length) + for (var i = 0; i < message.identityTokenInfos.length; ++i) + $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.encode(message.identityTokenInfos[i], writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.tokenStatuses != null && message.tokenStatuses.length) + for (var i = 0; i < message.tokenStatuses.length; ++i) + $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.encode(message.tokenStatuses[i], writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); return writer; }; @@ -14999,6 +15401,21 @@ $root.org = (function() { message.votes = []; message.votes.push($root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.decode(reader, reader.uint32())); break; + case 5: + if (!(message.identityTokenBalances && message.identityTokenBalances.length)) + message.identityTokenBalances = []; + message.identityTokenBalances.push($root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.decode(reader, reader.uint32())); + break; + case 6: + if (!(message.identityTokenInfos && message.identityTokenInfos.length)) + message.identityTokenInfos = []; + message.identityTokenInfos.push($root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.decode(reader, reader.uint32())); + break; + case 7: + if (!(message.tokenStatuses && message.tokenStatuses.length)) + message.tokenStatuses = []; + message.tokenStatuses.push($root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -15070,6 +15487,33 @@ $root.org = (function() { return "votes." + error; } } + if (message.identityTokenBalances != null && message.hasOwnProperty("identityTokenBalances")) { + if (!Array.isArray(message.identityTokenBalances)) + return "identityTokenBalances: array expected"; + for (var i = 0; i < message.identityTokenBalances.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.verify(message.identityTokenBalances[i]); + if (error) + return "identityTokenBalances." + error; + } + } + if (message.identityTokenInfos != null && message.hasOwnProperty("identityTokenInfos")) { + if (!Array.isArray(message.identityTokenInfos)) + return "identityTokenInfos: array expected"; + for (var i = 0; i < message.identityTokenInfos.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.verify(message.identityTokenInfos[i]); + if (error) + return "identityTokenInfos." + error; + } + } + if (message.tokenStatuses != null && message.hasOwnProperty("tokenStatuses")) { + if (!Array.isArray(message.tokenStatuses)) + return "tokenStatuses: array expected"; + for (var i = 0; i < message.tokenStatuses.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.verify(message.tokenStatuses[i]); + if (error) + return "tokenStatuses." + error; + } + } return null; }; @@ -15125,6 +15569,36 @@ $root.org = (function() { message.votes[i] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.fromObject(object.votes[i]); } } + if (object.identityTokenBalances) { + if (!Array.isArray(object.identityTokenBalances)) + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identityTokenBalances: array expected"); + message.identityTokenBalances = []; + for (var i = 0; i < object.identityTokenBalances.length; ++i) { + if (typeof object.identityTokenBalances[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identityTokenBalances: object expected"); + message.identityTokenBalances[i] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.fromObject(object.identityTokenBalances[i]); + } + } + if (object.identityTokenInfos) { + if (!Array.isArray(object.identityTokenInfos)) + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identityTokenInfos: array expected"); + message.identityTokenInfos = []; + for (var i = 0; i < object.identityTokenInfos.length; ++i) { + if (typeof object.identityTokenInfos[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identityTokenInfos: object expected"); + message.identityTokenInfos[i] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.fromObject(object.identityTokenInfos[i]); + } + } + if (object.tokenStatuses) { + if (!Array.isArray(object.tokenStatuses)) + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.tokenStatuses: array expected"); + message.tokenStatuses = []; + for (var i = 0; i < object.tokenStatuses.length; ++i) { + if (typeof object.tokenStatuses[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.tokenStatuses: object expected"); + message.tokenStatuses[i] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.fromObject(object.tokenStatuses[i]); + } + } return message; }; @@ -15146,6 +15620,9 @@ $root.org = (function() { object.contracts = []; object.documents = []; object.votes = []; + object.identityTokenBalances = []; + object.identityTokenInfos = []; + object.tokenStatuses = []; } if (message.identities && message.identities.length) { object.identities = []; @@ -15167,6 +15644,21 @@ $root.org = (function() { for (var j = 0; j < message.votes.length; ++j) object.votes[j] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject(message.votes[j], options); } + if (message.identityTokenBalances && message.identityTokenBalances.length) { + object.identityTokenBalances = []; + for (var j = 0; j < message.identityTokenBalances.length; ++j) + object.identityTokenBalances[j] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject(message.identityTokenBalances[j], options); + } + if (message.identityTokenInfos && message.identityTokenInfos.length) { + object.identityTokenInfos = []; + for (var j = 0; j < message.identityTokenInfos.length; ++j) + object.identityTokenInfos[j] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject(message.identityTokenInfos[j], options); + } + if (message.tokenStatuses && message.tokenStatuses.length) { + object.tokenStatuses = []; + for (var j = 0; j < message.tokenStatuses.length; ++j) + object.tokenStatuses[j] = $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject(message.tokenStatuses[j], options); + } return object; }; @@ -16490,151 +16982,803 @@ $root.org = (function() { return VoteStatusRequest; })(); - return GetProofsRequestV0; - })(); + GetProofsRequestV0.IdentityTokenBalanceRequest = (function() { - return GetProofsRequest; - })(); + /** + * Properties of an IdentityTokenBalanceRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @interface IIdentityTokenBalanceRequest + * @property {Uint8Array|null} [tokenId] IdentityTokenBalanceRequest tokenId + * @property {Uint8Array|null} [identityId] IdentityTokenBalanceRequest identityId + */ - v0.GetProofsResponse = (function() { + /** + * Constructs a new IdentityTokenBalanceRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @classdesc Represents an IdentityTokenBalanceRequest. + * @implements IIdentityTokenBalanceRequest + * @constructor + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest=} [properties] Properties to set + */ + function IdentityTokenBalanceRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } - /** - * Properties of a GetProofsResponse. - * @memberof org.dash.platform.dapi.v0 - * @interface IGetProofsResponse - * @property {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null} [v0] GetProofsResponse v0 - */ + /** + * IdentityTokenBalanceRequest tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @instance + */ + IdentityTokenBalanceRequest.prototype.tokenId = $util.newBuffer([]); - /** - * Constructs a new GetProofsResponse. - * @memberof org.dash.platform.dapi.v0 - * @classdesc Represents a GetProofsResponse. - * @implements IGetProofsResponse - * @constructor - * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set - */ - function GetProofsResponse(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } + /** + * IdentityTokenBalanceRequest identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @instance + */ + IdentityTokenBalanceRequest.prototype.identityId = $util.newBuffer([]); - /** - * GetProofsResponse v0. - * @member {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null|undefined} v0 - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @instance - */ - GetProofsResponse.prototype.v0 = null; + /** + * Creates a new IdentityTokenBalanceRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} IdentityTokenBalanceRequest instance + */ + IdentityTokenBalanceRequest.create = function create(properties) { + return new IdentityTokenBalanceRequest(properties); + }; - // OneOf field names bound to virtual getters and setters - var $oneOfFields; + /** + * Encodes the specified IdentityTokenBalanceRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest} message IdentityTokenBalanceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalanceRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.identityId); + return writer; + }; - /** - * GetProofsResponse version. - * @member {"v0"|undefined} version - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @instance - */ - Object.defineProperty(GetProofsResponse.prototype, "version", { - get: $util.oneOfGetter($oneOfFields = ["v0"]), - set: $util.oneOfSetter($oneOfFields) - }); + /** + * Encodes the specified IdentityTokenBalanceRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenBalanceRequest} message IdentityTokenBalanceRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalanceRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; - /** - * Creates a new GetProofsResponse instance using the specified properties. - * @function create - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse instance - */ - GetProofsResponse.create = function create(properties) { - return new GetProofsResponse(properties); - }; + /** + * Decodes an IdentityTokenBalanceRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} IdentityTokenBalanceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalanceRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.identityId = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; - /** - * Encodes the specified GetProofsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. - * @function encode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponse.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) - $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); - return writer; - }; + /** + * Decodes an IdentityTokenBalanceRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} IdentityTokenBalanceRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalanceRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; - /** - * Encodes the specified GetProofsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. - * @function encodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - GetProofsResponse.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; + /** + * Verifies an IdentityTokenBalanceRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityTokenBalanceRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + return null; + }; - /** - * Decodes a GetProofsResponse message from the specified reader or buffer. - * @function decode - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponse.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; + /** + * Creates an IdentityTokenBalanceRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} IdentityTokenBalanceRequest + */ + IdentityTokenBalanceRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + return message; + }; - /** - * Decodes a GetProofsResponse message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - GetProofsResponse.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; + /** + * Creates a plain object from an IdentityTokenBalanceRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} message IdentityTokenBalanceRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + IdentityTokenBalanceRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + return object; + }; - /** - * Verifies a GetProofsResponse message. - * @function verify - * @memberof org.dash.platform.dapi.v0.GetProofsResponse - * @static - * @param {Object.<string,*>} message Plain object to verify + /** + * Converts this IdentityTokenBalanceRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + IdentityTokenBalanceRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityTokenBalanceRequest; + })(); + + GetProofsRequestV0.IdentityTokenInfoRequest = (function() { + + /** + * Properties of an IdentityTokenInfoRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @interface IIdentityTokenInfoRequest + * @property {Uint8Array|null} [tokenId] IdentityTokenInfoRequest tokenId + * @property {Uint8Array|null} [identityId] IdentityTokenInfoRequest identityId + */ + + /** + * Constructs a new IdentityTokenInfoRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @classdesc Represents an IdentityTokenInfoRequest. + * @implements IIdentityTokenInfoRequest + * @constructor + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest=} [properties] Properties to set + */ + function IdentityTokenInfoRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityTokenInfoRequest tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @instance + */ + IdentityTokenInfoRequest.prototype.tokenId = $util.newBuffer([]); + + /** + * IdentityTokenInfoRequest identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @instance + */ + IdentityTokenInfoRequest.prototype.identityId = $util.newBuffer([]); + + /** + * Creates a new IdentityTokenInfoRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} IdentityTokenInfoRequest instance + */ + IdentityTokenInfoRequest.create = function create(properties) { + return new IdentityTokenInfoRequest(properties); + }; + + /** + * Encodes the specified IdentityTokenInfoRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest} message IdentityTokenInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenInfoRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.identityId); + return writer; + }; + + /** + * Encodes the specified IdentityTokenInfoRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IIdentityTokenInfoRequest} message IdentityTokenInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenInfoRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityTokenInfoRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} IdentityTokenInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenInfoRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.identityId = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityTokenInfoRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} IdentityTokenInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenInfoRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityTokenInfoRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityTokenInfoRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + return null; + }; + + /** + * Creates an IdentityTokenInfoRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} IdentityTokenInfoRequest + */ + IdentityTokenInfoRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + return message; + }; + + /** + * Creates a plain object from an IdentityTokenInfoRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} message IdentityTokenInfoRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + IdentityTokenInfoRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + return object; + }; + + /** + * Converts this IdentityTokenInfoRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + IdentityTokenInfoRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityTokenInfoRequest; + })(); + + GetProofsRequestV0.TokenStatusRequest = (function() { + + /** + * Properties of a TokenStatusRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @interface ITokenStatusRequest + * @property {Uint8Array|null} [tokenId] TokenStatusRequest tokenId + */ + + /** + * Constructs a new TokenStatusRequest. + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0 + * @classdesc Represents a TokenStatusRequest. + * @implements ITokenStatusRequest + * @constructor + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest=} [properties] Properties to set + */ + function TokenStatusRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenStatusRequest tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @instance + */ + TokenStatusRequest.prototype.tokenId = $util.newBuffer([]); + + /** + * Creates a new TokenStatusRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} TokenStatusRequest instance + */ + TokenStatusRequest.create = function create(properties) { + return new TokenStatusRequest(properties); + }; + + /** + * Encodes the specified TokenStatusRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest} message TokenStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatusRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + return writer; + }; + + /** + * Encodes the specified TokenStatusRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ITokenStatusRequest} message TokenStatusRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatusRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenStatusRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} TokenStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatusRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenStatusRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} TokenStatusRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatusRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenStatusRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenStatusRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + return null; + }; + + /** + * Creates a TokenStatusRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} TokenStatusRequest + */ + TokenStatusRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + return message; + }; + + /** + * Creates a plain object from a TokenStatusRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @static + * @param {org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} message TokenStatusRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenStatusRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + return object; + }; + + /** + * Converts this TokenStatusRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenStatusRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenStatusRequest; + })(); + + return GetProofsRequestV0; + })(); + + return GetProofsRequest; + })(); + + v0.GetProofsResponse = (function() { + + /** + * Properties of a GetProofsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetProofsResponse + * @property {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null} [v0] GetProofsResponse v0 + */ + + /** + * Constructs a new GetProofsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetProofsResponse. + * @implements IGetProofsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set + */ + function GetProofsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetProofsResponse v0. + * @member {org.dash.platform.dapi.v0.GetProofsResponse.IGetProofsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @instance + */ + GetProofsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetProofsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @instance + */ + Object.defineProperty(GetProofsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetProofsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetProofsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse instance + */ + GetProofsResponse.create = function create(properties) { + return new GetProofsResponse(properties); + }; + + /** + * Encodes the specified GetProofsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetProofsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetProofsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetProofsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetProofsResponse} message GetProofsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetProofsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetProofsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetProofsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetProofsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetProofsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetProofsResponse} GetProofsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetProofsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetProofsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetProofsResponse + * @static + * @param {Object.<string,*>} message Plain object to verify * @returns {string|null} `null` if valid, otherwise the reason why it is not */ GetProofsResponse.verify = function verify(message) { @@ -46592,6 +47736,20909 @@ $root.org = (function() { return GetCurrentQuorumsInfoResponse; })(); + v0.GetIdentityTokenBalancesRequest = (function() { + + /** + * Properties of a GetIdentityTokenBalancesRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityTokenBalancesRequest + * @property {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0|null} [v0] GetIdentityTokenBalancesRequest v0 + */ + + /** + * Constructs a new GetIdentityTokenBalancesRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityTokenBalancesRequest. + * @implements IGetIdentityTokenBalancesRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest=} [properties] Properties to set + */ + function GetIdentityTokenBalancesRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenBalancesRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @instance + */ + GetIdentityTokenBalancesRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenBalancesRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @instance + */ + Object.defineProperty(GetIdentityTokenBalancesRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenBalancesRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} GetIdentityTokenBalancesRequest instance + */ + GetIdentityTokenBalancesRequest.create = function create(properties) { + return new GetIdentityTokenBalancesRequest(properties); + }; + + /** + * Encodes the specified GetIdentityTokenBalancesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest} message GetIdentityTokenBalancesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenBalancesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesRequest} message GetIdentityTokenBalancesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenBalancesRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} GetIdentityTokenBalancesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenBalancesRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} GetIdentityTokenBalancesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenBalancesRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenBalancesRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityTokenBalancesRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} GetIdentityTokenBalancesRequest + */ + GetIdentityTokenBalancesRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenBalancesRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} message GetIdentityTokenBalancesRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenBalancesRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityTokenBalancesRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenBalancesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 = (function() { + + /** + * Properties of a GetIdentityTokenBalancesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @interface IGetIdentityTokenBalancesRequestV0 + * @property {Uint8Array|null} [identityId] GetIdentityTokenBalancesRequestV0 identityId + * @property {Array.<Uint8Array>|null} [tokenIds] GetIdentityTokenBalancesRequestV0 tokenIds + * @property {boolean|null} [prove] GetIdentityTokenBalancesRequestV0 prove + */ + + /** + * Constructs a new GetIdentityTokenBalancesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest + * @classdesc Represents a GetIdentityTokenBalancesRequestV0. + * @implements IGetIdentityTokenBalancesRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0=} [properties] Properties to set + */ + function GetIdentityTokenBalancesRequestV0(properties) { + this.tokenIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenBalancesRequestV0 identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @instance + */ + GetIdentityTokenBalancesRequestV0.prototype.identityId = $util.newBuffer([]); + + /** + * GetIdentityTokenBalancesRequestV0 tokenIds. + * @member {Array.<Uint8Array>} tokenIds + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @instance + */ + GetIdentityTokenBalancesRequestV0.prototype.tokenIds = $util.emptyArray; + + /** + * GetIdentityTokenBalancesRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @instance + */ + GetIdentityTokenBalancesRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentityTokenBalancesRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} GetIdentityTokenBalancesRequestV0 instance + */ + GetIdentityTokenBalancesRequestV0.create = function create(properties) { + return new GetIdentityTokenBalancesRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentityTokenBalancesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0} message GetIdentityTokenBalancesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.tokenIds != null && message.tokenIds.length) + for (var i = 0; i < message.tokenIds.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.tokenIds[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenBalancesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.IGetIdentityTokenBalancesRequestV0} message GetIdentityTokenBalancesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenBalancesRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} GetIdentityTokenBalancesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); + break; + case 2: + if (!(message.tokenIds && message.tokenIds.length)) + message.tokenIds = []; + message.tokenIds.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenBalancesRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} GetIdentityTokenBalancesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenBalancesRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenBalancesRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.tokenIds != null && message.hasOwnProperty("tokenIds")) { + if (!Array.isArray(message.tokenIds)) + return "tokenIds: array expected"; + for (var i = 0; i < message.tokenIds.length; ++i) + if (!(message.tokenIds[i] && typeof message.tokenIds[i].length === "number" || $util.isString(message.tokenIds[i]))) + return "tokenIds: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentityTokenBalancesRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} GetIdentityTokenBalancesRequestV0 + */ + GetIdentityTokenBalancesRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.tokenIds) { + if (!Array.isArray(object.tokenIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.tokenIds: array expected"); + message.tokenIds = []; + for (var i = 0; i < object.tokenIds.length; ++i) + if (typeof object.tokenIds[i] === "string") + $util.base64.decode(object.tokenIds[i], message.tokenIds[i] = $util.newBuffer($util.base64.length(object.tokenIds[i])), 0); + else if (object.tokenIds[i].length >= 0) + message.tokenIds[i] = object.tokenIds[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenBalancesRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} message GetIdentityTokenBalancesRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenBalancesRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenIds = []; + if (options.defaults) { + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + object.prove = false; + } + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.tokenIds && message.tokenIds.length) { + object.tokenIds = []; + for (var j = 0; j < message.tokenIds.length; ++j) + object.tokenIds[j] = options.bytes === String ? $util.base64.encode(message.tokenIds[j], 0, message.tokenIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenIds[j]) : message.tokenIds[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentityTokenBalancesRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenBalancesRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentityTokenBalancesRequestV0; + })(); + + return GetIdentityTokenBalancesRequest; + })(); + + v0.GetIdentityTokenBalancesResponse = (function() { + + /** + * Properties of a GetIdentityTokenBalancesResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityTokenBalancesResponse + * @property {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0|null} [v0] GetIdentityTokenBalancesResponse v0 + */ + + /** + * Constructs a new GetIdentityTokenBalancesResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityTokenBalancesResponse. + * @implements IGetIdentityTokenBalancesResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesResponse=} [properties] Properties to set + */ + function GetIdentityTokenBalancesResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenBalancesResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @instance + */ + GetIdentityTokenBalancesResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenBalancesResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @instance + */ + Object.defineProperty(GetIdentityTokenBalancesResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenBalancesResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} GetIdentityTokenBalancesResponse instance + */ + GetIdentityTokenBalancesResponse.create = function create(properties) { + return new GetIdentityTokenBalancesResponse(properties); + }; + + /** + * Encodes the specified GetIdentityTokenBalancesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesResponse} message GetIdentityTokenBalancesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenBalancesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenBalancesResponse} message GetIdentityTokenBalancesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenBalancesResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} GetIdentityTokenBalancesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenBalancesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} GetIdentityTokenBalancesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenBalancesResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenBalancesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityTokenBalancesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} GetIdentityTokenBalancesResponse + */ + GetIdentityTokenBalancesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenBalancesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} message GetIdentityTokenBalancesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenBalancesResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityTokenBalancesResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenBalancesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 = (function() { + + /** + * Properties of a GetIdentityTokenBalancesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @interface IGetIdentityTokenBalancesResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances|null} [tokenBalances] GetIdentityTokenBalancesResponseV0 tokenBalances + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityTokenBalancesResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityTokenBalancesResponseV0 metadata + */ + + /** + * Constructs a new GetIdentityTokenBalancesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse + * @classdesc Represents a GetIdentityTokenBalancesResponseV0. + * @implements IGetIdentityTokenBalancesResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0=} [properties] Properties to set + */ + function GetIdentityTokenBalancesResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenBalancesResponseV0 tokenBalances. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances|null|undefined} tokenBalances + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @instance + */ + GetIdentityTokenBalancesResponseV0.prototype.tokenBalances = null; + + /** + * GetIdentityTokenBalancesResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @instance + */ + GetIdentityTokenBalancesResponseV0.prototype.proof = null; + + /** + * GetIdentityTokenBalancesResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @instance + */ + GetIdentityTokenBalancesResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenBalancesResponseV0 result. + * @member {"tokenBalances"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @instance + */ + Object.defineProperty(GetIdentityTokenBalancesResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["tokenBalances", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenBalancesResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} GetIdentityTokenBalancesResponseV0 instance + */ + GetIdentityTokenBalancesResponseV0.create = function create(properties) { + return new GetIdentityTokenBalancesResponseV0(properties); + }; + + /** + * Encodes the specified GetIdentityTokenBalancesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0} message GetIdentityTokenBalancesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenBalances != null && Object.hasOwnProperty.call(message, "tokenBalances")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.encode(message.tokenBalances, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenBalancesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.IGetIdentityTokenBalancesResponseV0} message GetIdentityTokenBalancesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenBalancesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenBalancesResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} GetIdentityTokenBalancesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenBalances = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenBalancesResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} GetIdentityTokenBalancesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenBalancesResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenBalancesResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenBalancesResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenBalances != null && message.hasOwnProperty("tokenBalances")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.verify(message.tokenBalances); + if (error) + return "tokenBalances." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetIdentityTokenBalancesResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} GetIdentityTokenBalancesResponseV0 + */ + GetIdentityTokenBalancesResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0(); + if (object.tokenBalances != null) { + if (typeof object.tokenBalances !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.tokenBalances: object expected"); + message.tokenBalances = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.fromObject(object.tokenBalances); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenBalancesResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} message GetIdentityTokenBalancesResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenBalancesResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.tokenBalances != null && message.hasOwnProperty("tokenBalances")) { + object.tokenBalances = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject(message.tokenBalances, options); + if (options.oneofs) + object.result = "tokenBalances"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentityTokenBalancesResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenBalancesResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenBalancesResponseV0.TokenBalanceEntry = (function() { + + /** + * Properties of a TokenBalanceEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @interface ITokenBalanceEntry + * @property {Uint8Array|null} [tokenId] TokenBalanceEntry tokenId + * @property {number|Long|null} [balance] TokenBalanceEntry balance + */ + + /** + * Constructs a new TokenBalanceEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @classdesc Represents a TokenBalanceEntry. + * @implements ITokenBalanceEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry=} [properties] Properties to set + */ + function TokenBalanceEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenBalanceEntry tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @instance + */ + TokenBalanceEntry.prototype.tokenId = $util.newBuffer([]); + + /** + * TokenBalanceEntry balance. + * @member {number|Long} balance + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @instance + */ + TokenBalanceEntry.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new TokenBalanceEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} TokenBalanceEntry instance + */ + TokenBalanceEntry.create = function create(properties) { + return new TokenBalanceEntry(properties); + }; + + /** + * Encodes the specified TokenBalanceEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry} message TokenBalanceEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenBalanceEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.balance); + return writer; + }; + + /** + * Encodes the specified TokenBalanceEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry} message TokenBalanceEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenBalanceEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenBalanceEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} TokenBalanceEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenBalanceEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.balance = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenBalanceEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} TokenBalanceEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenBalanceEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenBalanceEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenBalanceEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.balance != null && message.hasOwnProperty("balance")) + if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) + return "balance: integer|Long expected"; + return null; + }; + + /** + * Creates a TokenBalanceEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} TokenBalanceEntry + */ + TokenBalanceEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.balance != null) + if ($util.Long) + (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; + else if (typeof object.balance === "string") + message.balance = parseInt(object.balance, 10); + else if (typeof object.balance === "number") + message.balance = object.balance; + else if (typeof object.balance === "object") + message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a TokenBalanceEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} message TokenBalanceEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenBalanceEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.balance = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.balance = options.longs === String ? "0" : 0; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.balance != null && message.hasOwnProperty("balance")) + if (typeof message.balance === "number") + object.balance = options.longs === String ? String(message.balance) : message.balance; + else + object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; + return object; + }; + + /** + * Converts this TokenBalanceEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenBalanceEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenBalanceEntry; + })(); + + GetIdentityTokenBalancesResponseV0.TokenBalances = (function() { + + /** + * Properties of a TokenBalances. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @interface ITokenBalances + * @property {Array.<org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry>|null} [tokenBalances] TokenBalances tokenBalances + */ + + /** + * Constructs a new TokenBalances. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 + * @classdesc Represents a TokenBalances. + * @implements ITokenBalances + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances=} [properties] Properties to set + */ + function TokenBalances(properties) { + this.tokenBalances = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenBalances tokenBalances. + * @member {Array.<org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalanceEntry>} tokenBalances + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @instance + */ + TokenBalances.prototype.tokenBalances = $util.emptyArray; + + /** + * Creates a new TokenBalances instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} TokenBalances instance + */ + TokenBalances.create = function create(properties) { + return new TokenBalances(properties); + }; + + /** + * Encodes the specified TokenBalances message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances} message TokenBalances message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenBalances.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenBalances != null && message.tokenBalances.length) + for (var i = 0; i < message.tokenBalances.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.encode(message.tokenBalances[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenBalances message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ITokenBalances} message TokenBalances message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenBalances.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenBalances message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} TokenBalances + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenBalances.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenBalances && message.tokenBalances.length)) + message.tokenBalances = []; + message.tokenBalances.push($root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenBalances message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} TokenBalances + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenBalances.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenBalances message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenBalances.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenBalances != null && message.hasOwnProperty("tokenBalances")) { + if (!Array.isArray(message.tokenBalances)) + return "tokenBalances: array expected"; + for (var i = 0; i < message.tokenBalances.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.verify(message.tokenBalances[i]); + if (error) + return "tokenBalances." + error; + } + } + return null; + }; + + /** + * Creates a TokenBalances message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} TokenBalances + */ + TokenBalances.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances(); + if (object.tokenBalances) { + if (!Array.isArray(object.tokenBalances)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.tokenBalances: array expected"); + message.tokenBalances = []; + for (var i = 0; i < object.tokenBalances.length; ++i) { + if (typeof object.tokenBalances[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.tokenBalances: object expected"); + message.tokenBalances[i] = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.fromObject(object.tokenBalances[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TokenBalances message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} message TokenBalances + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenBalances.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenBalances = []; + if (message.tokenBalances && message.tokenBalances.length) { + object.tokenBalances = []; + for (var j = 0; j < message.tokenBalances.length; ++j) + object.tokenBalances[j] = $root.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject(message.tokenBalances[j], options); + } + return object; + }; + + /** + * Converts this TokenBalances to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenBalances.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenBalances; + })(); + + return GetIdentityTokenBalancesResponseV0; + })(); + + return GetIdentityTokenBalancesResponse; + })(); + + v0.GetIdentitiesTokenBalancesRequest = (function() { + + /** + * Properties of a GetIdentitiesTokenBalancesRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesTokenBalancesRequest + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0|null} [v0] GetIdentitiesTokenBalancesRequest v0 + */ + + /** + * Constructs a new GetIdentitiesTokenBalancesRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesTokenBalancesRequest. + * @implements IGetIdentitiesTokenBalancesRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest=} [properties] Properties to set + */ + function GetIdentitiesTokenBalancesRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenBalancesRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @instance + */ + GetIdentitiesTokenBalancesRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenBalancesRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @instance + */ + Object.defineProperty(GetIdentitiesTokenBalancesRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenBalancesRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} GetIdentitiesTokenBalancesRequest instance + */ + GetIdentitiesTokenBalancesRequest.create = function create(properties) { + return new GetIdentitiesTokenBalancesRequest(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest} message GetIdentitiesTokenBalancesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesRequest} message GetIdentitiesTokenBalancesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenBalancesRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} GetIdentitiesTokenBalancesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenBalancesRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} GetIdentitiesTokenBalancesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenBalancesRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenBalancesRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenBalancesRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} GetIdentitiesTokenBalancesRequest + */ + GetIdentitiesTokenBalancesRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenBalancesRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} message GetIdentitiesTokenBalancesRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenBalancesRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesTokenBalancesRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenBalancesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 = (function() { + + /** + * Properties of a GetIdentitiesTokenBalancesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @interface IGetIdentitiesTokenBalancesRequestV0 + * @property {Uint8Array|null} [tokenId] GetIdentitiesTokenBalancesRequestV0 tokenId + * @property {Array.<Uint8Array>|null} [identityIds] GetIdentitiesTokenBalancesRequestV0 identityIds + * @property {boolean|null} [prove] GetIdentitiesTokenBalancesRequestV0 prove + */ + + /** + * Constructs a new GetIdentitiesTokenBalancesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest + * @classdesc Represents a GetIdentitiesTokenBalancesRequestV0. + * @implements IGetIdentitiesTokenBalancesRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0=} [properties] Properties to set + */ + function GetIdentitiesTokenBalancesRequestV0(properties) { + this.identityIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenBalancesRequestV0 tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @instance + */ + GetIdentitiesTokenBalancesRequestV0.prototype.tokenId = $util.newBuffer([]); + + /** + * GetIdentitiesTokenBalancesRequestV0 identityIds. + * @member {Array.<Uint8Array>} identityIds + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @instance + */ + GetIdentitiesTokenBalancesRequestV0.prototype.identityIds = $util.emptyArray; + + /** + * GetIdentitiesTokenBalancesRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @instance + */ + GetIdentitiesTokenBalancesRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentitiesTokenBalancesRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} GetIdentitiesTokenBalancesRequestV0 instance + */ + GetIdentitiesTokenBalancesRequestV0.create = function create(properties) { + return new GetIdentitiesTokenBalancesRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0} message GetIdentitiesTokenBalancesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.identityIds != null && message.identityIds.length) + for (var i = 0; i < message.identityIds.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.identityIds[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.IGetIdentitiesTokenBalancesRequestV0} message GetIdentitiesTokenBalancesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenBalancesRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} GetIdentitiesTokenBalancesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + if (!(message.identityIds && message.identityIds.length)) + message.identityIds = []; + message.identityIds.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenBalancesRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} GetIdentitiesTokenBalancesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenBalancesRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenBalancesRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.identityIds != null && message.hasOwnProperty("identityIds")) { + if (!Array.isArray(message.identityIds)) + return "identityIds: array expected"; + for (var i = 0; i < message.identityIds.length; ++i) + if (!(message.identityIds[i] && typeof message.identityIds[i].length === "number" || $util.isString(message.identityIds[i]))) + return "identityIds: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentitiesTokenBalancesRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} GetIdentitiesTokenBalancesRequestV0 + */ + GetIdentitiesTokenBalancesRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.identityIds) { + if (!Array.isArray(object.identityIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.identityIds: array expected"); + message.identityIds = []; + for (var i = 0; i < object.identityIds.length; ++i) + if (typeof object.identityIds[i] === "string") + $util.base64.decode(object.identityIds[i], message.identityIds[i] = $util.newBuffer($util.base64.length(object.identityIds[i])), 0); + else if (object.identityIds[i].length >= 0) + message.identityIds[i] = object.identityIds[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenBalancesRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} message GetIdentitiesTokenBalancesRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenBalancesRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.identityIds = []; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.prove = false; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.identityIds && message.identityIds.length) { + object.identityIds = []; + for (var j = 0; j < message.identityIds.length; ++j) + object.identityIds[j] = options.bytes === String ? $util.base64.encode(message.identityIds[j], 0, message.identityIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.identityIds[j]) : message.identityIds[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentitiesTokenBalancesRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenBalancesRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentitiesTokenBalancesRequestV0; + })(); + + return GetIdentitiesTokenBalancesRequest; + })(); + + v0.GetIdentitiesTokenBalancesResponse = (function() { + + /** + * Properties of a GetIdentitiesTokenBalancesResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesTokenBalancesResponse + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0|null} [v0] GetIdentitiesTokenBalancesResponse v0 + */ + + /** + * Constructs a new GetIdentitiesTokenBalancesResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesTokenBalancesResponse. + * @implements IGetIdentitiesTokenBalancesResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesResponse=} [properties] Properties to set + */ + function GetIdentitiesTokenBalancesResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenBalancesResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @instance + */ + GetIdentitiesTokenBalancesResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenBalancesResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @instance + */ + Object.defineProperty(GetIdentitiesTokenBalancesResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenBalancesResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} GetIdentitiesTokenBalancesResponse instance + */ + GetIdentitiesTokenBalancesResponse.create = function create(properties) { + return new GetIdentitiesTokenBalancesResponse(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesResponse} message GetIdentitiesTokenBalancesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenBalancesResponse} message GetIdentitiesTokenBalancesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenBalancesResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} GetIdentitiesTokenBalancesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenBalancesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} GetIdentitiesTokenBalancesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenBalancesResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenBalancesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenBalancesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} GetIdentitiesTokenBalancesResponse + */ + GetIdentitiesTokenBalancesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenBalancesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} message GetIdentitiesTokenBalancesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenBalancesResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesTokenBalancesResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenBalancesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 = (function() { + + /** + * Properties of a GetIdentitiesTokenBalancesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @interface IGetIdentitiesTokenBalancesResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances|null} [identityTokenBalances] GetIdentitiesTokenBalancesResponseV0 identityTokenBalances + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesTokenBalancesResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesTokenBalancesResponseV0 metadata + */ + + /** + * Constructs a new GetIdentitiesTokenBalancesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse + * @classdesc Represents a GetIdentitiesTokenBalancesResponseV0. + * @implements IGetIdentitiesTokenBalancesResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0=} [properties] Properties to set + */ + function GetIdentitiesTokenBalancesResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenBalancesResponseV0 identityTokenBalances. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances|null|undefined} identityTokenBalances + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @instance + */ + GetIdentitiesTokenBalancesResponseV0.prototype.identityTokenBalances = null; + + /** + * GetIdentitiesTokenBalancesResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @instance + */ + GetIdentitiesTokenBalancesResponseV0.prototype.proof = null; + + /** + * GetIdentitiesTokenBalancesResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @instance + */ + GetIdentitiesTokenBalancesResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenBalancesResponseV0 result. + * @member {"identityTokenBalances"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @instance + */ + Object.defineProperty(GetIdentitiesTokenBalancesResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityTokenBalances", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenBalancesResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} GetIdentitiesTokenBalancesResponseV0 instance + */ + GetIdentitiesTokenBalancesResponseV0.create = function create(properties) { + return new GetIdentitiesTokenBalancesResponseV0(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0} message GetIdentitiesTokenBalancesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityTokenBalances != null && Object.hasOwnProperty.call(message, "identityTokenBalances")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.encode(message.identityTokenBalances, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenBalancesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.IGetIdentitiesTokenBalancesResponseV0} message GetIdentitiesTokenBalancesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenBalancesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenBalancesResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} GetIdentitiesTokenBalancesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityTokenBalances = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenBalancesResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} GetIdentitiesTokenBalancesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenBalancesResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenBalancesResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenBalancesResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.identityTokenBalances != null && message.hasOwnProperty("identityTokenBalances")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.verify(message.identityTokenBalances); + if (error) + return "identityTokenBalances." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenBalancesResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} GetIdentitiesTokenBalancesResponseV0 + */ + GetIdentitiesTokenBalancesResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0(); + if (object.identityTokenBalances != null) { + if (typeof object.identityTokenBalances !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.identityTokenBalances: object expected"); + message.identityTokenBalances = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.fromObject(object.identityTokenBalances); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenBalancesResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} message GetIdentitiesTokenBalancesResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenBalancesResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.identityTokenBalances != null && message.hasOwnProperty("identityTokenBalances")) { + object.identityTokenBalances = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject(message.identityTokenBalances, options); + if (options.oneofs) + object.result = "identityTokenBalances"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentitiesTokenBalancesResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenBalancesResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry = (function() { + + /** + * Properties of an IdentityTokenBalanceEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @interface IIdentityTokenBalanceEntry + * @property {Uint8Array|null} [identityId] IdentityTokenBalanceEntry identityId + * @property {number|Long|null} [balance] IdentityTokenBalanceEntry balance + */ + + /** + * Constructs a new IdentityTokenBalanceEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @classdesc Represents an IdentityTokenBalanceEntry. + * @implements IIdentityTokenBalanceEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry=} [properties] Properties to set + */ + function IdentityTokenBalanceEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityTokenBalanceEntry identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @instance + */ + IdentityTokenBalanceEntry.prototype.identityId = $util.newBuffer([]); + + /** + * IdentityTokenBalanceEntry balance. + * @member {number|Long} balance + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @instance + */ + IdentityTokenBalanceEntry.prototype.balance = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new IdentityTokenBalanceEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} IdentityTokenBalanceEntry instance + */ + IdentityTokenBalanceEntry.create = function create(properties) { + return new IdentityTokenBalanceEntry(properties); + }; + + /** + * Encodes the specified IdentityTokenBalanceEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry} message IdentityTokenBalanceEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalanceEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.balance != null && Object.hasOwnProperty.call(message, "balance")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.balance); + return writer; + }; + + /** + * Encodes the specified IdentityTokenBalanceEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry} message IdentityTokenBalanceEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalanceEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityTokenBalanceEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} IdentityTokenBalanceEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalanceEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); + break; + case 2: + message.balance = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityTokenBalanceEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} IdentityTokenBalanceEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalanceEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityTokenBalanceEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityTokenBalanceEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.balance != null && message.hasOwnProperty("balance")) + if (!$util.isInteger(message.balance) && !(message.balance && $util.isInteger(message.balance.low) && $util.isInteger(message.balance.high))) + return "balance: integer|Long expected"; + return null; + }; + + /** + * Creates an IdentityTokenBalanceEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} IdentityTokenBalanceEntry + */ + IdentityTokenBalanceEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.balance != null) + if ($util.Long) + (message.balance = $util.Long.fromValue(object.balance)).unsigned = true; + else if (typeof object.balance === "string") + message.balance = parseInt(object.balance, 10); + else if (typeof object.balance === "number") + message.balance = object.balance; + else if (typeof object.balance === "object") + message.balance = new $util.LongBits(object.balance.low >>> 0, object.balance.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from an IdentityTokenBalanceEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} message IdentityTokenBalanceEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + IdentityTokenBalanceEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.balance = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.balance = options.longs === String ? "0" : 0; + } + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.balance != null && message.hasOwnProperty("balance")) + if (typeof message.balance === "number") + object.balance = options.longs === String ? String(message.balance) : message.balance; + else + object.balance = options.longs === String ? $util.Long.prototype.toString.call(message.balance) : options.longs === Number ? new $util.LongBits(message.balance.low >>> 0, message.balance.high >>> 0).toNumber(true) : message.balance; + return object; + }; + + /** + * Converts this IdentityTokenBalanceEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + IdentityTokenBalanceEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityTokenBalanceEntry; + })(); + + GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances = (function() { + + /** + * Properties of an IdentityTokenBalances. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @interface IIdentityTokenBalances + * @property {Array.<org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry>|null} [identityTokenBalances] IdentityTokenBalances identityTokenBalances + */ + + /** + * Constructs a new IdentityTokenBalances. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 + * @classdesc Represents an IdentityTokenBalances. + * @implements IIdentityTokenBalances + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances=} [properties] Properties to set + */ + function IdentityTokenBalances(properties) { + this.identityTokenBalances = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityTokenBalances identityTokenBalances. + * @member {Array.<org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalanceEntry>} identityTokenBalances + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @instance + */ + IdentityTokenBalances.prototype.identityTokenBalances = $util.emptyArray; + + /** + * Creates a new IdentityTokenBalances instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} IdentityTokenBalances instance + */ + IdentityTokenBalances.create = function create(properties) { + return new IdentityTokenBalances(properties); + }; + + /** + * Encodes the specified IdentityTokenBalances message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances} message IdentityTokenBalances message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalances.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityTokenBalances != null && message.identityTokenBalances.length) + for (var i = 0; i < message.identityTokenBalances.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.encode(message.identityTokenBalances[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified IdentityTokenBalances message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IIdentityTokenBalances} message IdentityTokenBalances message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenBalances.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityTokenBalances message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} IdentityTokenBalances + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalances.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.identityTokenBalances && message.identityTokenBalances.length)) + message.identityTokenBalances = []; + message.identityTokenBalances.push($root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityTokenBalances message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} IdentityTokenBalances + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenBalances.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityTokenBalances message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityTokenBalances.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityTokenBalances != null && message.hasOwnProperty("identityTokenBalances")) { + if (!Array.isArray(message.identityTokenBalances)) + return "identityTokenBalances: array expected"; + for (var i = 0; i < message.identityTokenBalances.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.verify(message.identityTokenBalances[i]); + if (error) + return "identityTokenBalances." + error; + } + } + return null; + }; + + /** + * Creates an IdentityTokenBalances message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} IdentityTokenBalances + */ + IdentityTokenBalances.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances(); + if (object.identityTokenBalances) { + if (!Array.isArray(object.identityTokenBalances)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.identityTokenBalances: array expected"); + message.identityTokenBalances = []; + for (var i = 0; i < object.identityTokenBalances.length; ++i) { + if (typeof object.identityTokenBalances[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.identityTokenBalances: object expected"); + message.identityTokenBalances[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.fromObject(object.identityTokenBalances[i]); + } + } + return message; + }; + + /** + * Creates a plain object from an IdentityTokenBalances message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} message IdentityTokenBalances + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + IdentityTokenBalances.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.identityTokenBalances = []; + if (message.identityTokenBalances && message.identityTokenBalances.length) { + object.identityTokenBalances = []; + for (var j = 0; j < message.identityTokenBalances.length; ++j) + object.identityTokenBalances[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject(message.identityTokenBalances[j], options); + } + return object; + }; + + /** + * Converts this IdentityTokenBalances to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances + * @instance + * @returns {Object.<string,*>} JSON object + */ + IdentityTokenBalances.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityTokenBalances; + })(); + + return GetIdentitiesTokenBalancesResponseV0; + })(); + + return GetIdentitiesTokenBalancesResponse; + })(); + + v0.GetIdentityTokenInfosRequest = (function() { + + /** + * Properties of a GetIdentityTokenInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityTokenInfosRequest + * @property {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0|null} [v0] GetIdentityTokenInfosRequest v0 + */ + + /** + * Constructs a new GetIdentityTokenInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityTokenInfosRequest. + * @implements IGetIdentityTokenInfosRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest=} [properties] Properties to set + */ + function GetIdentityTokenInfosRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenInfosRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @instance + */ + GetIdentityTokenInfosRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenInfosRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @instance + */ + Object.defineProperty(GetIdentityTokenInfosRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenInfosRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} GetIdentityTokenInfosRequest instance + */ + GetIdentityTokenInfosRequest.create = function create(properties) { + return new GetIdentityTokenInfosRequest(properties); + }; + + /** + * Encodes the specified GetIdentityTokenInfosRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest} message GetIdentityTokenInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenInfosRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosRequest} message GetIdentityTokenInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenInfosRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} GetIdentityTokenInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenInfosRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} GetIdentityTokenInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenInfosRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenInfosRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityTokenInfosRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} GetIdentityTokenInfosRequest + */ + GetIdentityTokenInfosRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenInfosRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} message GetIdentityTokenInfosRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenInfosRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityTokenInfosRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenInfosRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 = (function() { + + /** + * Properties of a GetIdentityTokenInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @interface IGetIdentityTokenInfosRequestV0 + * @property {Uint8Array|null} [identityId] GetIdentityTokenInfosRequestV0 identityId + * @property {Array.<Uint8Array>|null} [tokenIds] GetIdentityTokenInfosRequestV0 tokenIds + * @property {boolean|null} [prove] GetIdentityTokenInfosRequestV0 prove + */ + + /** + * Constructs a new GetIdentityTokenInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest + * @classdesc Represents a GetIdentityTokenInfosRequestV0. + * @implements IGetIdentityTokenInfosRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0=} [properties] Properties to set + */ + function GetIdentityTokenInfosRequestV0(properties) { + this.tokenIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenInfosRequestV0 identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @instance + */ + GetIdentityTokenInfosRequestV0.prototype.identityId = $util.newBuffer([]); + + /** + * GetIdentityTokenInfosRequestV0 tokenIds. + * @member {Array.<Uint8Array>} tokenIds + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @instance + */ + GetIdentityTokenInfosRequestV0.prototype.tokenIds = $util.emptyArray; + + /** + * GetIdentityTokenInfosRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @instance + */ + GetIdentityTokenInfosRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentityTokenInfosRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} GetIdentityTokenInfosRequestV0 instance + */ + GetIdentityTokenInfosRequestV0.create = function create(properties) { + return new GetIdentityTokenInfosRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentityTokenInfosRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0} message GetIdentityTokenInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.tokenIds != null && message.tokenIds.length) + for (var i = 0; i < message.tokenIds.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.tokenIds[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenInfosRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.IGetIdentityTokenInfosRequestV0} message GetIdentityTokenInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenInfosRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} GetIdentityTokenInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); + break; + case 2: + if (!(message.tokenIds && message.tokenIds.length)) + message.tokenIds = []; + message.tokenIds.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenInfosRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} GetIdentityTokenInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenInfosRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenInfosRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.tokenIds != null && message.hasOwnProperty("tokenIds")) { + if (!Array.isArray(message.tokenIds)) + return "tokenIds: array expected"; + for (var i = 0; i < message.tokenIds.length; ++i) + if (!(message.tokenIds[i] && typeof message.tokenIds[i].length === "number" || $util.isString(message.tokenIds[i]))) + return "tokenIds: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentityTokenInfosRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} GetIdentityTokenInfosRequestV0 + */ + GetIdentityTokenInfosRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.tokenIds) { + if (!Array.isArray(object.tokenIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.tokenIds: array expected"); + message.tokenIds = []; + for (var i = 0; i < object.tokenIds.length; ++i) + if (typeof object.tokenIds[i] === "string") + $util.base64.decode(object.tokenIds[i], message.tokenIds[i] = $util.newBuffer($util.base64.length(object.tokenIds[i])), 0); + else if (object.tokenIds[i].length >= 0) + message.tokenIds[i] = object.tokenIds[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenInfosRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} message GetIdentityTokenInfosRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenInfosRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenIds = []; + if (options.defaults) { + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + object.prove = false; + } + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.tokenIds && message.tokenIds.length) { + object.tokenIds = []; + for (var j = 0; j < message.tokenIds.length; ++j) + object.tokenIds[j] = options.bytes === String ? $util.base64.encode(message.tokenIds[j], 0, message.tokenIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenIds[j]) : message.tokenIds[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentityTokenInfosRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenInfosRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentityTokenInfosRequestV0; + })(); + + return GetIdentityTokenInfosRequest; + })(); + + v0.GetIdentityTokenInfosResponse = (function() { + + /** + * Properties of a GetIdentityTokenInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentityTokenInfosResponse + * @property {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0|null} [v0] GetIdentityTokenInfosResponse v0 + */ + + /** + * Constructs a new GetIdentityTokenInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentityTokenInfosResponse. + * @implements IGetIdentityTokenInfosResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosResponse=} [properties] Properties to set + */ + function GetIdentityTokenInfosResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenInfosResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @instance + */ + GetIdentityTokenInfosResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenInfosResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @instance + */ + Object.defineProperty(GetIdentityTokenInfosResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenInfosResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} GetIdentityTokenInfosResponse instance + */ + GetIdentityTokenInfosResponse.create = function create(properties) { + return new GetIdentityTokenInfosResponse(properties); + }; + + /** + * Encodes the specified GetIdentityTokenInfosResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosResponse} message GetIdentityTokenInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenInfosResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentityTokenInfosResponse} message GetIdentityTokenInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenInfosResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} GetIdentityTokenInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenInfosResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} GetIdentityTokenInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenInfosResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenInfosResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentityTokenInfosResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} GetIdentityTokenInfosResponse + */ + GetIdentityTokenInfosResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenInfosResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} message GetIdentityTokenInfosResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenInfosResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentityTokenInfosResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenInfosResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 = (function() { + + /** + * Properties of a GetIdentityTokenInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @interface IGetIdentityTokenInfosResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos|null} [tokenInfos] GetIdentityTokenInfosResponseV0 tokenInfos + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentityTokenInfosResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentityTokenInfosResponseV0 metadata + */ + + /** + * Constructs a new GetIdentityTokenInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse + * @classdesc Represents a GetIdentityTokenInfosResponseV0. + * @implements IGetIdentityTokenInfosResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0=} [properties] Properties to set + */ + function GetIdentityTokenInfosResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentityTokenInfosResponseV0 tokenInfos. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos|null|undefined} tokenInfos + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @instance + */ + GetIdentityTokenInfosResponseV0.prototype.tokenInfos = null; + + /** + * GetIdentityTokenInfosResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @instance + */ + GetIdentityTokenInfosResponseV0.prototype.proof = null; + + /** + * GetIdentityTokenInfosResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @instance + */ + GetIdentityTokenInfosResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentityTokenInfosResponseV0 result. + * @member {"tokenInfos"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @instance + */ + Object.defineProperty(GetIdentityTokenInfosResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["tokenInfos", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentityTokenInfosResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} GetIdentityTokenInfosResponseV0 instance + */ + GetIdentityTokenInfosResponseV0.create = function create(properties) { + return new GetIdentityTokenInfosResponseV0(properties); + }; + + /** + * Encodes the specified GetIdentityTokenInfosResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0} message GetIdentityTokenInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenInfos != null && Object.hasOwnProperty.call(message, "tokenInfos")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.encode(message.tokenInfos, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentityTokenInfosResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.IGetIdentityTokenInfosResponseV0} message GetIdentityTokenInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentityTokenInfosResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentityTokenInfosResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} GetIdentityTokenInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenInfos = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentityTokenInfosResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} GetIdentityTokenInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentityTokenInfosResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentityTokenInfosResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentityTokenInfosResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenInfos != null && message.hasOwnProperty("tokenInfos")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.verify(message.tokenInfos); + if (error) + return "tokenInfos." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetIdentityTokenInfosResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} GetIdentityTokenInfosResponseV0 + */ + GetIdentityTokenInfosResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0(); + if (object.tokenInfos != null) { + if (typeof object.tokenInfos !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.tokenInfos: object expected"); + message.tokenInfos = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.fromObject(object.tokenInfos); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentityTokenInfosResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} message GetIdentityTokenInfosResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentityTokenInfosResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.tokenInfos != null && message.hasOwnProperty("tokenInfos")) { + object.tokenInfos = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject(message.tokenInfos, options); + if (options.oneofs) + object.result = "tokenInfos"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentityTokenInfosResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentityTokenInfosResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry = (function() { + + /** + * Properties of a TokenIdentityInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @interface ITokenIdentityInfoEntry + * @property {boolean|null} [frozen] TokenIdentityInfoEntry frozen + */ + + /** + * Constructs a new TokenIdentityInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @classdesc Represents a TokenIdentityInfoEntry. + * @implements ITokenIdentityInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry=} [properties] Properties to set + */ + function TokenIdentityInfoEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenIdentityInfoEntry frozen. + * @member {boolean} frozen + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @instance + */ + TokenIdentityInfoEntry.prototype.frozen = false; + + /** + * Creates a new TokenIdentityInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry instance + */ + TokenIdentityInfoEntry.create = function create(properties) { + return new TokenIdentityInfoEntry(properties); + }; + + /** + * Encodes the specified TokenIdentityInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry} message TokenIdentityInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenIdentityInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.frozen != null && Object.hasOwnProperty.call(message, "frozen")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.frozen); + return writer; + }; + + /** + * Encodes the specified TokenIdentityInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry} message TokenIdentityInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenIdentityInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenIdentityInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenIdentityInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.frozen = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenIdentityInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenIdentityInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenIdentityInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenIdentityInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.frozen != null && message.hasOwnProperty("frozen")) + if (typeof message.frozen !== "boolean") + return "frozen: boolean expected"; + return null; + }; + + /** + * Creates a TokenIdentityInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + */ + TokenIdentityInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry(); + if (object.frozen != null) + message.frozen = Boolean(object.frozen); + return message; + }; + + /** + * Creates a plain object from a TokenIdentityInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} message TokenIdentityInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenIdentityInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.frozen = false; + if (message.frozen != null && message.hasOwnProperty("frozen")) + object.frozen = message.frozen; + return object; + }; + + /** + * Converts this TokenIdentityInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenIdentityInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenIdentityInfoEntry; + })(); + + GetIdentityTokenInfosResponseV0.TokenInfoEntry = (function() { + + /** + * Properties of a TokenInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @interface ITokenInfoEntry + * @property {Uint8Array|null} [tokenId] TokenInfoEntry tokenId + * @property {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry|null} [info] TokenInfoEntry info + */ + + /** + * Constructs a new TokenInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @classdesc Represents a TokenInfoEntry. + * @implements ITokenInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry=} [properties] Properties to set + */ + function TokenInfoEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenInfoEntry tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @instance + */ + TokenInfoEntry.prototype.tokenId = $util.newBuffer([]); + + /** + * TokenInfoEntry info. + * @member {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenIdentityInfoEntry|null|undefined} info + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @instance + */ + TokenInfoEntry.prototype.info = null; + + /** + * Creates a new TokenInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry instance + */ + TokenInfoEntry.create = function create(properties) { + return new TokenInfoEntry(properties); + }; + + /** + * Encodes the specified TokenInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry} message TokenInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.info != null && Object.hasOwnProperty.call(message, "info")) + $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.encode(message.info, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry} message TokenInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.info = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.info != null && message.hasOwnProperty("info")) { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.verify(message.info); + if (error) + return "info." + error; + } + return null; + }; + + /** + * Creates a TokenInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + */ + TokenInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.info != null) { + if (typeof object.info !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.info: object expected"); + message.info = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.fromObject(object.info); + } + return message; + }; + + /** + * Creates a plain object from a TokenInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} message TokenInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.info = null; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.info != null && message.hasOwnProperty("info")) + object.info = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(message.info, options); + return object; + }; + + /** + * Converts this TokenInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenInfoEntry; + })(); + + GetIdentityTokenInfosResponseV0.TokenInfos = (function() { + + /** + * Properties of a TokenInfos. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @interface ITokenInfos + * @property {Array.<org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry>|null} [tokenInfos] TokenInfos tokenInfos + */ + + /** + * Constructs a new TokenInfos. + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 + * @classdesc Represents a TokenInfos. + * @implements ITokenInfos + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos=} [properties] Properties to set + */ + function TokenInfos(properties) { + this.tokenInfos = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenInfos tokenInfos. + * @member {Array.<org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfoEntry>} tokenInfos + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @instance + */ + TokenInfos.prototype.tokenInfos = $util.emptyArray; + + /** + * Creates a new TokenInfos instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} TokenInfos instance + */ + TokenInfos.create = function create(properties) { + return new TokenInfos(properties); + }; + + /** + * Encodes the specified TokenInfos message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos} message TokenInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfos.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenInfos != null && message.tokenInfos.length) + for (var i = 0; i < message.tokenInfos.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.encode(message.tokenInfos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenInfos message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ITokenInfos} message TokenInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfos.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenInfos message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} TokenInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfos.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenInfos && message.tokenInfos.length)) + message.tokenInfos = []; + message.tokenInfos.push($root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenInfos message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} TokenInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfos.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenInfos message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenInfos.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenInfos != null && message.hasOwnProperty("tokenInfos")) { + if (!Array.isArray(message.tokenInfos)) + return "tokenInfos: array expected"; + for (var i = 0; i < message.tokenInfos.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.verify(message.tokenInfos[i]); + if (error) + return "tokenInfos." + error; + } + } + return null; + }; + + /** + * Creates a TokenInfos message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} TokenInfos + */ + TokenInfos.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos(); + if (object.tokenInfos) { + if (!Array.isArray(object.tokenInfos)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.tokenInfos: array expected"); + message.tokenInfos = []; + for (var i = 0; i < object.tokenInfos.length; ++i) { + if (typeof object.tokenInfos[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.tokenInfos: object expected"); + message.tokenInfos[i] = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.fromObject(object.tokenInfos[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TokenInfos message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} message TokenInfos + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenInfos.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenInfos = []; + if (message.tokenInfos && message.tokenInfos.length) { + object.tokenInfos = []; + for (var j = 0; j < message.tokenInfos.length; ++j) + object.tokenInfos[j] = $root.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject(message.tokenInfos[j], options); + } + return object; + }; + + /** + * Converts this TokenInfos to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenInfos.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenInfos; + })(); + + return GetIdentityTokenInfosResponseV0; + })(); + + return GetIdentityTokenInfosResponse; + })(); + + v0.GetIdentitiesTokenInfosRequest = (function() { + + /** + * Properties of a GetIdentitiesTokenInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesTokenInfosRequest + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0|null} [v0] GetIdentitiesTokenInfosRequest v0 + */ + + /** + * Constructs a new GetIdentitiesTokenInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesTokenInfosRequest. + * @implements IGetIdentitiesTokenInfosRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest=} [properties] Properties to set + */ + function GetIdentitiesTokenInfosRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenInfosRequest v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @instance + */ + GetIdentitiesTokenInfosRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenInfosRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @instance + */ + Object.defineProperty(GetIdentitiesTokenInfosRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenInfosRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} GetIdentitiesTokenInfosRequest instance + */ + GetIdentitiesTokenInfosRequest.create = function create(properties) { + return new GetIdentitiesTokenInfosRequest(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest} message GetIdentitiesTokenInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosRequest} message GetIdentitiesTokenInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenInfosRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} GetIdentitiesTokenInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenInfosRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} GetIdentitiesTokenInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenInfosRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenInfosRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenInfosRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} GetIdentitiesTokenInfosRequest + */ + GetIdentitiesTokenInfosRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenInfosRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} message GetIdentitiesTokenInfosRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenInfosRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesTokenInfosRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenInfosRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 = (function() { + + /** + * Properties of a GetIdentitiesTokenInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @interface IGetIdentitiesTokenInfosRequestV0 + * @property {Uint8Array|null} [tokenId] GetIdentitiesTokenInfosRequestV0 tokenId + * @property {Array.<Uint8Array>|null} [identityIds] GetIdentitiesTokenInfosRequestV0 identityIds + * @property {boolean|null} [prove] GetIdentitiesTokenInfosRequestV0 prove + */ + + /** + * Constructs a new GetIdentitiesTokenInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest + * @classdesc Represents a GetIdentitiesTokenInfosRequestV0. + * @implements IGetIdentitiesTokenInfosRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0=} [properties] Properties to set + */ + function GetIdentitiesTokenInfosRequestV0(properties) { + this.identityIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenInfosRequestV0 tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @instance + */ + GetIdentitiesTokenInfosRequestV0.prototype.tokenId = $util.newBuffer([]); + + /** + * GetIdentitiesTokenInfosRequestV0 identityIds. + * @member {Array.<Uint8Array>} identityIds + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @instance + */ + GetIdentitiesTokenInfosRequestV0.prototype.identityIds = $util.emptyArray; + + /** + * GetIdentitiesTokenInfosRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @instance + */ + GetIdentitiesTokenInfosRequestV0.prototype.prove = false; + + /** + * Creates a new GetIdentitiesTokenInfosRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} GetIdentitiesTokenInfosRequestV0 instance + */ + GetIdentitiesTokenInfosRequestV0.create = function create(properties) { + return new GetIdentitiesTokenInfosRequestV0(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0} message GetIdentitiesTokenInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.identityIds != null && message.identityIds.length) + for (var i = 0; i < message.identityIds.length; ++i) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.identityIds[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.IGetIdentitiesTokenInfosRequestV0} message GetIdentitiesTokenInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenInfosRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} GetIdentitiesTokenInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + if (!(message.identityIds && message.identityIds.length)) + message.identityIds = []; + message.identityIds.push(reader.bytes()); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenInfosRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} GetIdentitiesTokenInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenInfosRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenInfosRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.identityIds != null && message.hasOwnProperty("identityIds")) { + if (!Array.isArray(message.identityIds)) + return "identityIds: array expected"; + for (var i = 0; i < message.identityIds.length; ++i) + if (!(message.identityIds[i] && typeof message.identityIds[i].length === "number" || $util.isString(message.identityIds[i]))) + return "identityIds: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetIdentitiesTokenInfosRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} GetIdentitiesTokenInfosRequestV0 + */ + GetIdentitiesTokenInfosRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.identityIds) { + if (!Array.isArray(object.identityIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.identityIds: array expected"); + message.identityIds = []; + for (var i = 0; i < object.identityIds.length; ++i) + if (typeof object.identityIds[i] === "string") + $util.base64.decode(object.identityIds[i], message.identityIds[i] = $util.newBuffer($util.base64.length(object.identityIds[i])), 0); + else if (object.identityIds[i].length >= 0) + message.identityIds[i] = object.identityIds[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenInfosRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} message GetIdentitiesTokenInfosRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenInfosRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.identityIds = []; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.prove = false; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.identityIds && message.identityIds.length) { + object.identityIds = []; + for (var j = 0; j < message.identityIds.length; ++j) + object.identityIds[j] = options.bytes === String ? $util.base64.encode(message.identityIds[j], 0, message.identityIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.identityIds[j]) : message.identityIds[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetIdentitiesTokenInfosRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenInfosRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetIdentitiesTokenInfosRequestV0; + })(); + + return GetIdentitiesTokenInfosRequest; + })(); + + v0.GetIdentitiesTokenInfosResponse = (function() { + + /** + * Properties of a GetIdentitiesTokenInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetIdentitiesTokenInfosResponse + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0|null} [v0] GetIdentitiesTokenInfosResponse v0 + */ + + /** + * Constructs a new GetIdentitiesTokenInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetIdentitiesTokenInfosResponse. + * @implements IGetIdentitiesTokenInfosResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosResponse=} [properties] Properties to set + */ + function GetIdentitiesTokenInfosResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenInfosResponse v0. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @instance + */ + GetIdentitiesTokenInfosResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenInfosResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @instance + */ + Object.defineProperty(GetIdentitiesTokenInfosResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenInfosResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} GetIdentitiesTokenInfosResponse instance + */ + GetIdentitiesTokenInfosResponse.create = function create(properties) { + return new GetIdentitiesTokenInfosResponse(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosResponse} message GetIdentitiesTokenInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetIdentitiesTokenInfosResponse} message GetIdentitiesTokenInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenInfosResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} GetIdentitiesTokenInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenInfosResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} GetIdentitiesTokenInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenInfosResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenInfosResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenInfosResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} GetIdentitiesTokenInfosResponse + */ + GetIdentitiesTokenInfosResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenInfosResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} message GetIdentitiesTokenInfosResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenInfosResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetIdentitiesTokenInfosResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenInfosResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 = (function() { + + /** + * Properties of a GetIdentitiesTokenInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @interface IGetIdentitiesTokenInfosResponseV0 + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos|null} [identityTokenInfos] GetIdentitiesTokenInfosResponseV0 identityTokenInfos + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetIdentitiesTokenInfosResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetIdentitiesTokenInfosResponseV0 metadata + */ + + /** + * Constructs a new GetIdentitiesTokenInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse + * @classdesc Represents a GetIdentitiesTokenInfosResponseV0. + * @implements IGetIdentitiesTokenInfosResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0=} [properties] Properties to set + */ + function GetIdentitiesTokenInfosResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetIdentitiesTokenInfosResponseV0 identityTokenInfos. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos|null|undefined} identityTokenInfos + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @instance + */ + GetIdentitiesTokenInfosResponseV0.prototype.identityTokenInfos = null; + + /** + * GetIdentitiesTokenInfosResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @instance + */ + GetIdentitiesTokenInfosResponseV0.prototype.proof = null; + + /** + * GetIdentitiesTokenInfosResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @instance + */ + GetIdentitiesTokenInfosResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetIdentitiesTokenInfosResponseV0 result. + * @member {"identityTokenInfos"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @instance + */ + Object.defineProperty(GetIdentitiesTokenInfosResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["identityTokenInfos", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetIdentitiesTokenInfosResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} GetIdentitiesTokenInfosResponseV0 instance + */ + GetIdentitiesTokenInfosResponseV0.create = function create(properties) { + return new GetIdentitiesTokenInfosResponseV0(properties); + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0} message GetIdentitiesTokenInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityTokenInfos != null && Object.hasOwnProperty.call(message, "identityTokenInfos")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.encode(message.identityTokenInfos, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetIdentitiesTokenInfosResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.IGetIdentitiesTokenInfosResponseV0} message GetIdentitiesTokenInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetIdentitiesTokenInfosResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetIdentitiesTokenInfosResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} GetIdentitiesTokenInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityTokenInfos = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetIdentitiesTokenInfosResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} GetIdentitiesTokenInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetIdentitiesTokenInfosResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetIdentitiesTokenInfosResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetIdentitiesTokenInfosResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.identityTokenInfos != null && message.hasOwnProperty("identityTokenInfos")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.verify(message.identityTokenInfos); + if (error) + return "identityTokenInfos." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetIdentitiesTokenInfosResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} GetIdentitiesTokenInfosResponseV0 + */ + GetIdentitiesTokenInfosResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0(); + if (object.identityTokenInfos != null) { + if (typeof object.identityTokenInfos !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.identityTokenInfos: object expected"); + message.identityTokenInfos = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.fromObject(object.identityTokenInfos); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetIdentitiesTokenInfosResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} message GetIdentitiesTokenInfosResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetIdentitiesTokenInfosResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.identityTokenInfos != null && message.hasOwnProperty("identityTokenInfos")) { + object.identityTokenInfos = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject(message.identityTokenInfos, options); + if (options.oneofs) + object.result = "identityTokenInfos"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetIdentitiesTokenInfosResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetIdentitiesTokenInfosResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry = (function() { + + /** + * Properties of a TokenIdentityInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @interface ITokenIdentityInfoEntry + * @property {boolean|null} [frozen] TokenIdentityInfoEntry frozen + */ + + /** + * Constructs a new TokenIdentityInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @classdesc Represents a TokenIdentityInfoEntry. + * @implements ITokenIdentityInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry=} [properties] Properties to set + */ + function TokenIdentityInfoEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenIdentityInfoEntry frozen. + * @member {boolean} frozen + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @instance + */ + TokenIdentityInfoEntry.prototype.frozen = false; + + /** + * Creates a new TokenIdentityInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry instance + */ + TokenIdentityInfoEntry.create = function create(properties) { + return new TokenIdentityInfoEntry(properties); + }; + + /** + * Encodes the specified TokenIdentityInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry} message TokenIdentityInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenIdentityInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.frozen != null && Object.hasOwnProperty.call(message, "frozen")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.frozen); + return writer; + }; + + /** + * Encodes the specified TokenIdentityInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry} message TokenIdentityInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenIdentityInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenIdentityInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenIdentityInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.frozen = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenIdentityInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenIdentityInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenIdentityInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenIdentityInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.frozen != null && message.hasOwnProperty("frozen")) + if (typeof message.frozen !== "boolean") + return "frozen: boolean expected"; + return null; + }; + + /** + * Creates a TokenIdentityInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} TokenIdentityInfoEntry + */ + TokenIdentityInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry(); + if (object.frozen != null) + message.frozen = Boolean(object.frozen); + return message; + }; + + /** + * Creates a plain object from a TokenIdentityInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} message TokenIdentityInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenIdentityInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.frozen = false; + if (message.frozen != null && message.hasOwnProperty("frozen")) + object.frozen = message.frozen; + return object; + }; + + /** + * Converts this TokenIdentityInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenIdentityInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenIdentityInfoEntry; + })(); + + GetIdentitiesTokenInfosResponseV0.TokenInfoEntry = (function() { + + /** + * Properties of a TokenInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @interface ITokenInfoEntry + * @property {Uint8Array|null} [identityId] TokenInfoEntry identityId + * @property {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry|null} [info] TokenInfoEntry info + */ + + /** + * Constructs a new TokenInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @classdesc Represents a TokenInfoEntry. + * @implements ITokenInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry=} [properties] Properties to set + */ + function TokenInfoEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenInfoEntry identityId. + * @member {Uint8Array} identityId + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @instance + */ + TokenInfoEntry.prototype.identityId = $util.newBuffer([]); + + /** + * TokenInfoEntry info. + * @member {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenIdentityInfoEntry|null|undefined} info + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @instance + */ + TokenInfoEntry.prototype.info = null; + + /** + * Creates a new TokenInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry instance + */ + TokenInfoEntry.create = function create(properties) { + return new TokenInfoEntry(properties); + }; + + /** + * Encodes the specified TokenInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry} message TokenInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.identityId != null && Object.hasOwnProperty.call(message, "identityId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.identityId); + if (message.info != null && Object.hasOwnProperty.call(message, "info")) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.encode(message.info, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry} message TokenInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.identityId = reader.bytes(); + break; + case 2: + message.info = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.identityId != null && message.hasOwnProperty("identityId")) + if (!(message.identityId && typeof message.identityId.length === "number" || $util.isString(message.identityId))) + return "identityId: buffer expected"; + if (message.info != null && message.hasOwnProperty("info")) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.verify(message.info); + if (error) + return "info." + error; + } + return null; + }; + + /** + * Creates a TokenInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} TokenInfoEntry + */ + TokenInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry(); + if (object.identityId != null) + if (typeof object.identityId === "string") + $util.base64.decode(object.identityId, message.identityId = $util.newBuffer($util.base64.length(object.identityId)), 0); + else if (object.identityId.length >= 0) + message.identityId = object.identityId; + if (object.info != null) { + if (typeof object.info !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.info: object expected"); + message.info = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.fromObject(object.info); + } + return message; + }; + + /** + * Creates a plain object from a TokenInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} message TokenInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.identityId = ""; + else { + object.identityId = []; + if (options.bytes !== Array) + object.identityId = $util.newBuffer(object.identityId); + } + object.info = null; + } + if (message.identityId != null && message.hasOwnProperty("identityId")) + object.identityId = options.bytes === String ? $util.base64.encode(message.identityId, 0, message.identityId.length) : options.bytes === Array ? Array.prototype.slice.call(message.identityId) : message.identityId; + if (message.info != null && message.hasOwnProperty("info")) + object.info = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(message.info, options); + return object; + }; + + /** + * Converts this TokenInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenInfoEntry; + })(); + + GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos = (function() { + + /** + * Properties of an IdentityTokenInfos. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @interface IIdentityTokenInfos + * @property {Array.<org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry>|null} [tokenInfos] IdentityTokenInfos tokenInfos + */ + + /** + * Constructs a new IdentityTokenInfos. + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 + * @classdesc Represents an IdentityTokenInfos. + * @implements IIdentityTokenInfos + * @constructor + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos=} [properties] Properties to set + */ + function IdentityTokenInfos(properties) { + this.tokenInfos = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * IdentityTokenInfos tokenInfos. + * @member {Array.<org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ITokenInfoEntry>} tokenInfos + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @instance + */ + IdentityTokenInfos.prototype.tokenInfos = $util.emptyArray; + + /** + * Creates a new IdentityTokenInfos instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} IdentityTokenInfos instance + */ + IdentityTokenInfos.create = function create(properties) { + return new IdentityTokenInfos(properties); + }; + + /** + * Encodes the specified IdentityTokenInfos message. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos} message IdentityTokenInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenInfos.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenInfos != null && message.tokenInfos.length) + for (var i = 0; i < message.tokenInfos.length; ++i) + $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.encode(message.tokenInfos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified IdentityTokenInfos message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IIdentityTokenInfos} message IdentityTokenInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + IdentityTokenInfos.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an IdentityTokenInfos message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} IdentityTokenInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenInfos.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenInfos && message.tokenInfos.length)) + message.tokenInfos = []; + message.tokenInfos.push($root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an IdentityTokenInfos message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} IdentityTokenInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + IdentityTokenInfos.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an IdentityTokenInfos message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + IdentityTokenInfos.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenInfos != null && message.hasOwnProperty("tokenInfos")) { + if (!Array.isArray(message.tokenInfos)) + return "tokenInfos: array expected"; + for (var i = 0; i < message.tokenInfos.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.verify(message.tokenInfos[i]); + if (error) + return "tokenInfos." + error; + } + } + return null; + }; + + /** + * Creates an IdentityTokenInfos message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} IdentityTokenInfos + */ + IdentityTokenInfos.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos(); + if (object.tokenInfos) { + if (!Array.isArray(object.tokenInfos)) + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.tokenInfos: array expected"); + message.tokenInfos = []; + for (var i = 0; i < object.tokenInfos.length; ++i) { + if (typeof object.tokenInfos[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.tokenInfos: object expected"); + message.tokenInfos[i] = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.fromObject(object.tokenInfos[i]); + } + } + return message; + }; + + /** + * Creates a plain object from an IdentityTokenInfos message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @static + * @param {org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} message IdentityTokenInfos + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + IdentityTokenInfos.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenInfos = []; + if (message.tokenInfos && message.tokenInfos.length) { + object.tokenInfos = []; + for (var j = 0; j < message.tokenInfos.length; ++j) + object.tokenInfos[j] = $root.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject(message.tokenInfos[j], options); + } + return object; + }; + + /** + * Converts this IdentityTokenInfos to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos + * @instance + * @returns {Object.<string,*>} JSON object + */ + IdentityTokenInfos.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return IdentityTokenInfos; + })(); + + return GetIdentitiesTokenInfosResponseV0; + })(); + + return GetIdentitiesTokenInfosResponse; + })(); + + v0.GetTokenStatusesRequest = (function() { + + /** + * Properties of a GetTokenStatusesRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenStatusesRequest + * @property {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0|null} [v0] GetTokenStatusesRequest v0 + */ + + /** + * Constructs a new GetTokenStatusesRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenStatusesRequest. + * @implements IGetTokenStatusesRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest=} [properties] Properties to set + */ + function GetTokenStatusesRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenStatusesRequest v0. + * @member {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @instance + */ + GetTokenStatusesRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenStatusesRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @instance + */ + Object.defineProperty(GetTokenStatusesRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenStatusesRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest} GetTokenStatusesRequest instance + */ + GetTokenStatusesRequest.create = function create(properties) { + return new GetTokenStatusesRequest(properties); + }; + + /** + * Encodes the specified GetTokenStatusesRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest} message GetTokenStatusesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenStatusesRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesRequest} message GetTokenStatusesRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenStatusesRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest} GetTokenStatusesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenStatusesRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest} GetTokenStatusesRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenStatusesRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenStatusesRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenStatusesRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest} GetTokenStatusesRequest + */ + GetTokenStatusesRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenStatusesRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest} message GetTokenStatusesRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenStatusesRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenStatusesRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenStatusesRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenStatusesRequest.GetTokenStatusesRequestV0 = (function() { + + /** + * Properties of a GetTokenStatusesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @interface IGetTokenStatusesRequestV0 + * @property {Array.<Uint8Array>|null} [tokenIds] GetTokenStatusesRequestV0 tokenIds + * @property {boolean|null} [prove] GetTokenStatusesRequestV0 prove + */ + + /** + * Constructs a new GetTokenStatusesRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest + * @classdesc Represents a GetTokenStatusesRequestV0. + * @implements IGetTokenStatusesRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0=} [properties] Properties to set + */ + function GetTokenStatusesRequestV0(properties) { + this.tokenIds = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenStatusesRequestV0 tokenIds. + * @member {Array.<Uint8Array>} tokenIds + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @instance + */ + GetTokenStatusesRequestV0.prototype.tokenIds = $util.emptyArray; + + /** + * GetTokenStatusesRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @instance + */ + GetTokenStatusesRequestV0.prototype.prove = false; + + /** + * Creates a new GetTokenStatusesRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} GetTokenStatusesRequestV0 instance + */ + GetTokenStatusesRequestV0.create = function create(properties) { + return new GetTokenStatusesRequestV0(properties); + }; + + /** + * Encodes the specified GetTokenStatusesRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0} message GetTokenStatusesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenIds != null && message.tokenIds.length) + for (var i = 0; i < message.tokenIds.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenIds[i]); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetTokenStatusesRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest.IGetTokenStatusesRequestV0} message GetTokenStatusesRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenStatusesRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} GetTokenStatusesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenIds && message.tokenIds.length)) + message.tokenIds = []; + message.tokenIds.push(reader.bytes()); + break; + case 2: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenStatusesRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} GetTokenStatusesRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenStatusesRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenStatusesRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenIds != null && message.hasOwnProperty("tokenIds")) { + if (!Array.isArray(message.tokenIds)) + return "tokenIds: array expected"; + for (var i = 0; i < message.tokenIds.length; ++i) + if (!(message.tokenIds[i] && typeof message.tokenIds[i].length === "number" || $util.isString(message.tokenIds[i]))) + return "tokenIds: buffer[] expected"; + } + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetTokenStatusesRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} GetTokenStatusesRequestV0 + */ + GetTokenStatusesRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0(); + if (object.tokenIds) { + if (!Array.isArray(object.tokenIds)) + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.tokenIds: array expected"); + message.tokenIds = []; + for (var i = 0; i < object.tokenIds.length; ++i) + if (typeof object.tokenIds[i] === "string") + $util.base64.decode(object.tokenIds[i], message.tokenIds[i] = $util.newBuffer($util.base64.length(object.tokenIds[i])), 0); + else if (object.tokenIds[i].length >= 0) + message.tokenIds[i] = object.tokenIds[i]; + } + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetTokenStatusesRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} message GetTokenStatusesRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenStatusesRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenIds = []; + if (options.defaults) + object.prove = false; + if (message.tokenIds && message.tokenIds.length) { + object.tokenIds = []; + for (var j = 0; j < message.tokenIds.length; ++j) + object.tokenIds[j] = options.bytes === String ? $util.base64.encode(message.tokenIds[j], 0, message.tokenIds[j].length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenIds[j]) : message.tokenIds[j]; + } + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetTokenStatusesRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenStatusesRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetTokenStatusesRequestV0; + })(); + + return GetTokenStatusesRequest; + })(); + + v0.GetTokenStatusesResponse = (function() { + + /** + * Properties of a GetTokenStatusesResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenStatusesResponse + * @property {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0|null} [v0] GetTokenStatusesResponse v0 + */ + + /** + * Constructs a new GetTokenStatusesResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenStatusesResponse. + * @implements IGetTokenStatusesResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesResponse=} [properties] Properties to set + */ + function GetTokenStatusesResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenStatusesResponse v0. + * @member {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @instance + */ + GetTokenStatusesResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenStatusesResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @instance + */ + Object.defineProperty(GetTokenStatusesResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenStatusesResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse} GetTokenStatusesResponse instance + */ + GetTokenStatusesResponse.create = function create(properties) { + return new GetTokenStatusesResponse(properties); + }; + + /** + * Encodes the specified GetTokenStatusesResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesResponse} message GetTokenStatusesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenStatusesResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenStatusesResponse} message GetTokenStatusesResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenStatusesResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse} GetTokenStatusesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenStatusesResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse} GetTokenStatusesResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenStatusesResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenStatusesResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenStatusesResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse} GetTokenStatusesResponse + */ + GetTokenStatusesResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenStatusesResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse} message GetTokenStatusesResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenStatusesResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenStatusesResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenStatusesResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenStatusesResponse.GetTokenStatusesResponseV0 = (function() { + + /** + * Properties of a GetTokenStatusesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @interface IGetTokenStatusesResponseV0 + * @property {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses|null} [tokenStatuses] GetTokenStatusesResponseV0 tokenStatuses + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetTokenStatusesResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetTokenStatusesResponseV0 metadata + */ + + /** + * Constructs a new GetTokenStatusesResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse + * @classdesc Represents a GetTokenStatusesResponseV0. + * @implements IGetTokenStatusesResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0=} [properties] Properties to set + */ + function GetTokenStatusesResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenStatusesResponseV0 tokenStatuses. + * @member {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses|null|undefined} tokenStatuses + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @instance + */ + GetTokenStatusesResponseV0.prototype.tokenStatuses = null; + + /** + * GetTokenStatusesResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @instance + */ + GetTokenStatusesResponseV0.prototype.proof = null; + + /** + * GetTokenStatusesResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @instance + */ + GetTokenStatusesResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenStatusesResponseV0 result. + * @member {"tokenStatuses"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @instance + */ + Object.defineProperty(GetTokenStatusesResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["tokenStatuses", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenStatusesResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} GetTokenStatusesResponseV0 instance + */ + GetTokenStatusesResponseV0.create = function create(properties) { + return new GetTokenStatusesResponseV0(properties); + }; + + /** + * Encodes the specified GetTokenStatusesResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0} message GetTokenStatusesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenStatuses != null && Object.hasOwnProperty.call(message, "tokenStatuses")) + $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.encode(message.tokenStatuses, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenStatusesResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.IGetTokenStatusesResponseV0} message GetTokenStatusesResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenStatusesResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenStatusesResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} GetTokenStatusesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenStatuses = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenStatusesResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} GetTokenStatusesResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenStatusesResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenStatusesResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenStatusesResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenStatuses != null && message.hasOwnProperty("tokenStatuses")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.verify(message.tokenStatuses); + if (error) + return "tokenStatuses." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetTokenStatusesResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} GetTokenStatusesResponseV0 + */ + GetTokenStatusesResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0(); + if (object.tokenStatuses != null) { + if (typeof object.tokenStatuses !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.tokenStatuses: object expected"); + message.tokenStatuses = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.fromObject(object.tokenStatuses); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenStatusesResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} message GetTokenStatusesResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenStatusesResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.tokenStatuses != null && message.hasOwnProperty("tokenStatuses")) { + object.tokenStatuses = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject(message.tokenStatuses, options); + if (options.oneofs) + object.result = "tokenStatuses"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetTokenStatusesResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenStatusesResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenStatusesResponseV0.TokenStatusEntry = (function() { + + /** + * Properties of a TokenStatusEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @interface ITokenStatusEntry + * @property {Uint8Array|null} [tokenId] TokenStatusEntry tokenId + * @property {boolean|null} [paused] TokenStatusEntry paused + */ + + /** + * Constructs a new TokenStatusEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @classdesc Represents a TokenStatusEntry. + * @implements ITokenStatusEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry=} [properties] Properties to set + */ + function TokenStatusEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenStatusEntry tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @instance + */ + TokenStatusEntry.prototype.tokenId = $util.newBuffer([]); + + /** + * TokenStatusEntry paused. + * @member {boolean} paused + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @instance + */ + TokenStatusEntry.prototype.paused = false; + + /** + * Creates a new TokenStatusEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} TokenStatusEntry instance + */ + TokenStatusEntry.create = function create(properties) { + return new TokenStatusEntry(properties); + }; + + /** + * Encodes the specified TokenStatusEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry} message TokenStatusEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatusEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.paused != null && Object.hasOwnProperty.call(message, "paused")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.paused); + return writer; + }; + + /** + * Encodes the specified TokenStatusEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry} message TokenStatusEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatusEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenStatusEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} TokenStatusEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatusEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.paused = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenStatusEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} TokenStatusEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatusEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenStatusEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenStatusEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.paused != null && message.hasOwnProperty("paused")) + if (typeof message.paused !== "boolean") + return "paused: boolean expected"; + return null; + }; + + /** + * Creates a TokenStatusEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} TokenStatusEntry + */ + TokenStatusEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.paused != null) + message.paused = Boolean(object.paused); + return message; + }; + + /** + * Creates a plain object from a TokenStatusEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} message TokenStatusEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenStatusEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.paused = false; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.paused != null && message.hasOwnProperty("paused")) + object.paused = message.paused; + return object; + }; + + /** + * Converts this TokenStatusEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenStatusEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenStatusEntry; + })(); + + GetTokenStatusesResponseV0.TokenStatuses = (function() { + + /** + * Properties of a TokenStatuses. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @interface ITokenStatuses + * @property {Array.<org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry>|null} [tokenStatuses] TokenStatuses tokenStatuses + */ + + /** + * Constructs a new TokenStatuses. + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 + * @classdesc Represents a TokenStatuses. + * @implements ITokenStatuses + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses=} [properties] Properties to set + */ + function TokenStatuses(properties) { + this.tokenStatuses = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenStatuses tokenStatuses. + * @member {Array.<org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatusEntry>} tokenStatuses + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @instance + */ + TokenStatuses.prototype.tokenStatuses = $util.emptyArray; + + /** + * Creates a new TokenStatuses instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} TokenStatuses instance + */ + TokenStatuses.create = function create(properties) { + return new TokenStatuses(properties); + }; + + /** + * Encodes the specified TokenStatuses message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses} message TokenStatuses message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatuses.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenStatuses != null && message.tokenStatuses.length) + for (var i = 0; i < message.tokenStatuses.length; ++i) + $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.encode(message.tokenStatuses[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenStatuses message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ITokenStatuses} message TokenStatuses message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenStatuses.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenStatuses message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} TokenStatuses + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatuses.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenStatuses && message.tokenStatuses.length)) + message.tokenStatuses = []; + message.tokenStatuses.push($root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenStatuses message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} TokenStatuses + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenStatuses.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenStatuses message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenStatuses.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenStatuses != null && message.hasOwnProperty("tokenStatuses")) { + if (!Array.isArray(message.tokenStatuses)) + return "tokenStatuses: array expected"; + for (var i = 0; i < message.tokenStatuses.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.verify(message.tokenStatuses[i]); + if (error) + return "tokenStatuses." + error; + } + } + return null; + }; + + /** + * Creates a TokenStatuses message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} TokenStatuses + */ + TokenStatuses.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses(); + if (object.tokenStatuses) { + if (!Array.isArray(object.tokenStatuses)) + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.tokenStatuses: array expected"); + message.tokenStatuses = []; + for (var i = 0; i < object.tokenStatuses.length; ++i) { + if (typeof object.tokenStatuses[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.tokenStatuses: object expected"); + message.tokenStatuses[i] = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.fromObject(object.tokenStatuses[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TokenStatuses message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @static + * @param {org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} message TokenStatuses + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenStatuses.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenStatuses = []; + if (message.tokenStatuses && message.tokenStatuses.length) { + object.tokenStatuses = []; + for (var j = 0; j < message.tokenStatuses.length; ++j) + object.tokenStatuses[j] = $root.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject(message.tokenStatuses[j], options); + } + return object; + }; + + /** + * Converts this TokenStatuses to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenStatuses.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenStatuses; + })(); + + return GetTokenStatusesResponseV0; + })(); + + return GetTokenStatusesResponse; + })(); + + v0.GetTokenPreProgrammedDistributionsRequest = (function() { + + /** + * Properties of a GetTokenPreProgrammedDistributionsRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenPreProgrammedDistributionsRequest + * @property {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0|null} [v0] GetTokenPreProgrammedDistributionsRequest v0 + */ + + /** + * Constructs a new GetTokenPreProgrammedDistributionsRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenPreProgrammedDistributionsRequest. + * @implements IGetTokenPreProgrammedDistributionsRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest=} [properties] Properties to set + */ + function GetTokenPreProgrammedDistributionsRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenPreProgrammedDistributionsRequest v0. + * @member {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @instance + */ + GetTokenPreProgrammedDistributionsRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenPreProgrammedDistributionsRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @instance + */ + Object.defineProperty(GetTokenPreProgrammedDistributionsRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenPreProgrammedDistributionsRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} GetTokenPreProgrammedDistributionsRequest instance + */ + GetTokenPreProgrammedDistributionsRequest.create = function create(properties) { + return new GetTokenPreProgrammedDistributionsRequest(properties); + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest} message GetTokenPreProgrammedDistributionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsRequest} message GetTokenPreProgrammedDistributionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} GetTokenPreProgrammedDistributionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} GetTokenPreProgrammedDistributionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenPreProgrammedDistributionsRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenPreProgrammedDistributionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenPreProgrammedDistributionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} GetTokenPreProgrammedDistributionsRequest + */ + GetTokenPreProgrammedDistributionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenPreProgrammedDistributionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} message GetTokenPreProgrammedDistributionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenPreProgrammedDistributionsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenPreProgrammedDistributionsRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenPreProgrammedDistributionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 = (function() { + + /** + * Properties of a GetTokenPreProgrammedDistributionsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @interface IGetTokenPreProgrammedDistributionsRequestV0 + * @property {Uint8Array|null} [tokenId] GetTokenPreProgrammedDistributionsRequestV0 tokenId + * @property {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo|null} [startAtInfo] GetTokenPreProgrammedDistributionsRequestV0 startAtInfo + * @property {number|null} [limit] GetTokenPreProgrammedDistributionsRequestV0 limit + * @property {boolean|null} [prove] GetTokenPreProgrammedDistributionsRequestV0 prove + */ + + /** + * Constructs a new GetTokenPreProgrammedDistributionsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest + * @classdesc Represents a GetTokenPreProgrammedDistributionsRequestV0. + * @implements IGetTokenPreProgrammedDistributionsRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0=} [properties] Properties to set + */ + function GetTokenPreProgrammedDistributionsRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenPreProgrammedDistributionsRequestV0 tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @instance + */ + GetTokenPreProgrammedDistributionsRequestV0.prototype.tokenId = $util.newBuffer([]); + + /** + * GetTokenPreProgrammedDistributionsRequestV0 startAtInfo. + * @member {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo|null|undefined} startAtInfo + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @instance + */ + GetTokenPreProgrammedDistributionsRequestV0.prototype.startAtInfo = null; + + /** + * GetTokenPreProgrammedDistributionsRequestV0 limit. + * @member {number} limit + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @instance + */ + GetTokenPreProgrammedDistributionsRequestV0.prototype.limit = 0; + + /** + * GetTokenPreProgrammedDistributionsRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @instance + */ + GetTokenPreProgrammedDistributionsRequestV0.prototype.prove = false; + + /** + * Creates a new GetTokenPreProgrammedDistributionsRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} GetTokenPreProgrammedDistributionsRequestV0 instance + */ + GetTokenPreProgrammedDistributionsRequestV0.create = function create(properties) { + return new GetTokenPreProgrammedDistributionsRequestV0(properties); + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0} message GetTokenPreProgrammedDistributionsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.startAtInfo != null && Object.hasOwnProperty.call(message, "startAtInfo")) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.encode(message.startAtInfo, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.limit != null && Object.hasOwnProperty.call(message, "limit")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.limit); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.IGetTokenPreProgrammedDistributionsRequestV0} message GetTokenPreProgrammedDistributionsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} GetTokenPreProgrammedDistributionsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.startAtInfo = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.decode(reader, reader.uint32()); + break; + case 3: + message.limit = reader.uint32(); + break; + case 4: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} GetTokenPreProgrammedDistributionsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenPreProgrammedDistributionsRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenPreProgrammedDistributionsRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.startAtInfo != null && message.hasOwnProperty("startAtInfo")) { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.verify(message.startAtInfo); + if (error) + return "startAtInfo." + error; + } + if (message.limit != null && message.hasOwnProperty("limit")) + if (!$util.isInteger(message.limit)) + return "limit: integer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetTokenPreProgrammedDistributionsRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} GetTokenPreProgrammedDistributionsRequestV0 + */ + GetTokenPreProgrammedDistributionsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.startAtInfo != null) { + if (typeof object.startAtInfo !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.startAtInfo: object expected"); + message.startAtInfo = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.fromObject(object.startAtInfo); + } + if (object.limit != null) + message.limit = object.limit >>> 0; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetTokenPreProgrammedDistributionsRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} message GetTokenPreProgrammedDistributionsRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenPreProgrammedDistributionsRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.startAtInfo = null; + object.limit = 0; + object.prove = false; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.startAtInfo != null && message.hasOwnProperty("startAtInfo")) + object.startAtInfo = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject(message.startAtInfo, options); + if (message.limit != null && message.hasOwnProperty("limit")) + object.limit = message.limit; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetTokenPreProgrammedDistributionsRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenPreProgrammedDistributionsRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo = (function() { + + /** + * Properties of a StartAtInfo. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @interface IStartAtInfo + * @property {number|Long|null} [startTimeMs] StartAtInfo startTimeMs + * @property {Uint8Array|null} [startRecipient] StartAtInfo startRecipient + * @property {boolean|null} [startRecipientIncluded] StartAtInfo startRecipientIncluded + */ + + /** + * Constructs a new StartAtInfo. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 + * @classdesc Represents a StartAtInfo. + * @implements IStartAtInfo + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo=} [properties] Properties to set + */ + function StartAtInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartAtInfo startTimeMs. + * @member {number|Long} startTimeMs + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @instance + */ + StartAtInfo.prototype.startTimeMs = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * StartAtInfo startRecipient. + * @member {Uint8Array} startRecipient + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @instance + */ + StartAtInfo.prototype.startRecipient = $util.newBuffer([]); + + /** + * StartAtInfo startRecipientIncluded. + * @member {boolean} startRecipientIncluded + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @instance + */ + StartAtInfo.prototype.startRecipientIncluded = false; + + /** + * Creates a new StartAtInfo instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} StartAtInfo instance + */ + StartAtInfo.create = function create(properties) { + return new StartAtInfo(properties); + }; + + /** + * Encodes the specified StartAtInfo message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo} message StartAtInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.startTimeMs != null && Object.hasOwnProperty.call(message, "startTimeMs")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.startTimeMs); + if (message.startRecipient != null && Object.hasOwnProperty.call(message, "startRecipient")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.startRecipient); + if (message.startRecipientIncluded != null && Object.hasOwnProperty.call(message, "startRecipientIncluded")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.startRecipientIncluded); + return writer; + }; + + /** + * Encodes the specified StartAtInfo message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.IStartAtInfo} message StartAtInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartAtInfo message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} StartAtInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.startTimeMs = reader.uint64(); + break; + case 2: + message.startRecipient = reader.bytes(); + break; + case 3: + message.startRecipientIncluded = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartAtInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} StartAtInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartAtInfo message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartAtInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.startTimeMs != null && message.hasOwnProperty("startTimeMs")) + if (!$util.isInteger(message.startTimeMs) && !(message.startTimeMs && $util.isInteger(message.startTimeMs.low) && $util.isInteger(message.startTimeMs.high))) + return "startTimeMs: integer|Long expected"; + if (message.startRecipient != null && message.hasOwnProperty("startRecipient")) + if (!(message.startRecipient && typeof message.startRecipient.length === "number" || $util.isString(message.startRecipient))) + return "startRecipient: buffer expected"; + if (message.startRecipientIncluded != null && message.hasOwnProperty("startRecipientIncluded")) + if (typeof message.startRecipientIncluded !== "boolean") + return "startRecipientIncluded: boolean expected"; + return null; + }; + + /** + * Creates a StartAtInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} StartAtInfo + */ + StartAtInfo.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo(); + if (object.startTimeMs != null) + if ($util.Long) + (message.startTimeMs = $util.Long.fromValue(object.startTimeMs)).unsigned = true; + else if (typeof object.startTimeMs === "string") + message.startTimeMs = parseInt(object.startTimeMs, 10); + else if (typeof object.startTimeMs === "number") + message.startTimeMs = object.startTimeMs; + else if (typeof object.startTimeMs === "object") + message.startTimeMs = new $util.LongBits(object.startTimeMs.low >>> 0, object.startTimeMs.high >>> 0).toNumber(true); + if (object.startRecipient != null) + if (typeof object.startRecipient === "string") + $util.base64.decode(object.startRecipient, message.startRecipient = $util.newBuffer($util.base64.length(object.startRecipient)), 0); + else if (object.startRecipient.length >= 0) + message.startRecipient = object.startRecipient; + if (object.startRecipientIncluded != null) + message.startRecipientIncluded = Boolean(object.startRecipientIncluded); + return message; + }; + + /** + * Creates a plain object from a StartAtInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} message StartAtInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + StartAtInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.startTimeMs = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.startTimeMs = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.startRecipient = ""; + else { + object.startRecipient = []; + if (options.bytes !== Array) + object.startRecipient = $util.newBuffer(object.startRecipient); + } + object.startRecipientIncluded = false; + } + if (message.startTimeMs != null && message.hasOwnProperty("startTimeMs")) + if (typeof message.startTimeMs === "number") + object.startTimeMs = options.longs === String ? String(message.startTimeMs) : message.startTimeMs; + else + object.startTimeMs = options.longs === String ? $util.Long.prototype.toString.call(message.startTimeMs) : options.longs === Number ? new $util.LongBits(message.startTimeMs.low >>> 0, message.startTimeMs.high >>> 0).toNumber(true) : message.startTimeMs; + if (message.startRecipient != null && message.hasOwnProperty("startRecipient")) + object.startRecipient = options.bytes === String ? $util.base64.encode(message.startRecipient, 0, message.startRecipient.length) : options.bytes === Array ? Array.prototype.slice.call(message.startRecipient) : message.startRecipient; + if (message.startRecipientIncluded != null && message.hasOwnProperty("startRecipientIncluded")) + object.startRecipientIncluded = message.startRecipientIncluded; + return object; + }; + + /** + * Converts this StartAtInfo to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo + * @instance + * @returns {Object.<string,*>} JSON object + */ + StartAtInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StartAtInfo; + })(); + + return GetTokenPreProgrammedDistributionsRequestV0; + })(); + + return GetTokenPreProgrammedDistributionsRequest; + })(); + + v0.GetTokenPreProgrammedDistributionsResponse = (function() { + + /** + * Properties of a GetTokenPreProgrammedDistributionsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenPreProgrammedDistributionsResponse + * @property {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0|null} [v0] GetTokenPreProgrammedDistributionsResponse v0 + */ + + /** + * Constructs a new GetTokenPreProgrammedDistributionsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenPreProgrammedDistributionsResponse. + * @implements IGetTokenPreProgrammedDistributionsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsResponse=} [properties] Properties to set + */ + function GetTokenPreProgrammedDistributionsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenPreProgrammedDistributionsResponse v0. + * @member {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @instance + */ + GetTokenPreProgrammedDistributionsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenPreProgrammedDistributionsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @instance + */ + Object.defineProperty(GetTokenPreProgrammedDistributionsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenPreProgrammedDistributionsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} GetTokenPreProgrammedDistributionsResponse instance + */ + GetTokenPreProgrammedDistributionsResponse.create = function create(properties) { + return new GetTokenPreProgrammedDistributionsResponse(properties); + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsResponse} message GetTokenPreProgrammedDistributionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenPreProgrammedDistributionsResponse} message GetTokenPreProgrammedDistributionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} GetTokenPreProgrammedDistributionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} GetTokenPreProgrammedDistributionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenPreProgrammedDistributionsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenPreProgrammedDistributionsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenPreProgrammedDistributionsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} GetTokenPreProgrammedDistributionsResponse + */ + GetTokenPreProgrammedDistributionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenPreProgrammedDistributionsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} message GetTokenPreProgrammedDistributionsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenPreProgrammedDistributionsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenPreProgrammedDistributionsResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenPreProgrammedDistributionsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 = (function() { + + /** + * Properties of a GetTokenPreProgrammedDistributionsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @interface IGetTokenPreProgrammedDistributionsResponseV0 + * @property {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions|null} [tokenDistributions] GetTokenPreProgrammedDistributionsResponseV0 tokenDistributions + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetTokenPreProgrammedDistributionsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetTokenPreProgrammedDistributionsResponseV0 metadata + */ + + /** + * Constructs a new GetTokenPreProgrammedDistributionsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse + * @classdesc Represents a GetTokenPreProgrammedDistributionsResponseV0. + * @implements IGetTokenPreProgrammedDistributionsResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0=} [properties] Properties to set + */ + function GetTokenPreProgrammedDistributionsResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenPreProgrammedDistributionsResponseV0 tokenDistributions. + * @member {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions|null|undefined} tokenDistributions + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @instance + */ + GetTokenPreProgrammedDistributionsResponseV0.prototype.tokenDistributions = null; + + /** + * GetTokenPreProgrammedDistributionsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @instance + */ + GetTokenPreProgrammedDistributionsResponseV0.prototype.proof = null; + + /** + * GetTokenPreProgrammedDistributionsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @instance + */ + GetTokenPreProgrammedDistributionsResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenPreProgrammedDistributionsResponseV0 result. + * @member {"tokenDistributions"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @instance + */ + Object.defineProperty(GetTokenPreProgrammedDistributionsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["tokenDistributions", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenPreProgrammedDistributionsResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} GetTokenPreProgrammedDistributionsResponseV0 instance + */ + GetTokenPreProgrammedDistributionsResponseV0.create = function create(properties) { + return new GetTokenPreProgrammedDistributionsResponseV0(properties); + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0} message GetTokenPreProgrammedDistributionsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenDistributions != null && Object.hasOwnProperty.call(message, "tokenDistributions")) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.encode(message.tokenDistributions, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenPreProgrammedDistributionsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.IGetTokenPreProgrammedDistributionsResponseV0} message GetTokenPreProgrammedDistributionsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenPreProgrammedDistributionsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} GetTokenPreProgrammedDistributionsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenDistributions = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenPreProgrammedDistributionsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} GetTokenPreProgrammedDistributionsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenPreProgrammedDistributionsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenPreProgrammedDistributionsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenPreProgrammedDistributionsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenDistributions != null && message.hasOwnProperty("tokenDistributions")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.verify(message.tokenDistributions); + if (error) + return "tokenDistributions." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetTokenPreProgrammedDistributionsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} GetTokenPreProgrammedDistributionsResponseV0 + */ + GetTokenPreProgrammedDistributionsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0(); + if (object.tokenDistributions != null) { + if (typeof object.tokenDistributions !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.tokenDistributions: object expected"); + message.tokenDistributions = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.fromObject(object.tokenDistributions); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenPreProgrammedDistributionsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} message GetTokenPreProgrammedDistributionsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenPreProgrammedDistributionsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.tokenDistributions != null && message.hasOwnProperty("tokenDistributions")) { + object.tokenDistributions = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject(message.tokenDistributions, options); + if (options.oneofs) + object.result = "tokenDistributions"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetTokenPreProgrammedDistributionsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenPreProgrammedDistributionsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry = (function() { + + /** + * Properties of a TokenDistributionEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @interface ITokenDistributionEntry + * @property {Uint8Array|null} [recipientId] TokenDistributionEntry recipientId + * @property {number|Long|null} [amount] TokenDistributionEntry amount + */ + + /** + * Constructs a new TokenDistributionEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @classdesc Represents a TokenDistributionEntry. + * @implements ITokenDistributionEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry=} [properties] Properties to set + */ + function TokenDistributionEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenDistributionEntry recipientId. + * @member {Uint8Array} recipientId + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @instance + */ + TokenDistributionEntry.prototype.recipientId = $util.newBuffer([]); + + /** + * TokenDistributionEntry amount. + * @member {number|Long} amount + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @instance + */ + TokenDistributionEntry.prototype.amount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new TokenDistributionEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} TokenDistributionEntry instance + */ + TokenDistributionEntry.create = function create(properties) { + return new TokenDistributionEntry(properties); + }; + + /** + * Encodes the specified TokenDistributionEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry} message TokenDistributionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenDistributionEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.recipientId); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.amount); + return writer; + }; + + /** + * Encodes the specified TokenDistributionEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry} message TokenDistributionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenDistributionEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenDistributionEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} TokenDistributionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenDistributionEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.recipientId = reader.bytes(); + break; + case 2: + message.amount = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenDistributionEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} TokenDistributionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenDistributionEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenDistributionEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenDistributionEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + if (!(message.recipientId && typeof message.recipientId.length === "number" || $util.isString(message.recipientId))) + return "recipientId: buffer expected"; + if (message.amount != null && message.hasOwnProperty("amount")) + if (!$util.isInteger(message.amount) && !(message.amount && $util.isInteger(message.amount.low) && $util.isInteger(message.amount.high))) + return "amount: integer|Long expected"; + return null; + }; + + /** + * Creates a TokenDistributionEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} TokenDistributionEntry + */ + TokenDistributionEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry(); + if (object.recipientId != null) + if (typeof object.recipientId === "string") + $util.base64.decode(object.recipientId, message.recipientId = $util.newBuffer($util.base64.length(object.recipientId)), 0); + else if (object.recipientId.length >= 0) + message.recipientId = object.recipientId; + if (object.amount != null) + if ($util.Long) + (message.amount = $util.Long.fromValue(object.amount)).unsigned = true; + else if (typeof object.amount === "string") + message.amount = parseInt(object.amount, 10); + else if (typeof object.amount === "number") + message.amount = object.amount; + else if (typeof object.amount === "object") + message.amount = new $util.LongBits(object.amount.low >>> 0, object.amount.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a TokenDistributionEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} message TokenDistributionEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenDistributionEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.recipientId = ""; + else { + object.recipientId = []; + if (options.bytes !== Array) + object.recipientId = $util.newBuffer(object.recipientId); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount = options.longs === String ? "0" : 0; + } + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + object.recipientId = options.bytes === String ? $util.base64.encode(message.recipientId, 0, message.recipientId.length) : options.bytes === Array ? Array.prototype.slice.call(message.recipientId) : message.recipientId; + if (message.amount != null && message.hasOwnProperty("amount")) + if (typeof message.amount === "number") + object.amount = options.longs === String ? String(message.amount) : message.amount; + else + object.amount = options.longs === String ? $util.Long.prototype.toString.call(message.amount) : options.longs === Number ? new $util.LongBits(message.amount.low >>> 0, message.amount.high >>> 0).toNumber(true) : message.amount; + return object; + }; + + /** + * Converts this TokenDistributionEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenDistributionEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenDistributionEntry; + })(); + + GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry = (function() { + + /** + * Properties of a TokenTimedDistributionEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @interface ITokenTimedDistributionEntry + * @property {number|Long|null} [timestamp] TokenTimedDistributionEntry timestamp + * @property {Array.<org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry>|null} [distributions] TokenTimedDistributionEntry distributions + */ + + /** + * Constructs a new TokenTimedDistributionEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @classdesc Represents a TokenTimedDistributionEntry. + * @implements ITokenTimedDistributionEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry=} [properties] Properties to set + */ + function TokenTimedDistributionEntry(properties) { + this.distributions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenTimedDistributionEntry timestamp. + * @member {number|Long} timestamp + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @instance + */ + TokenTimedDistributionEntry.prototype.timestamp = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * TokenTimedDistributionEntry distributions. + * @member {Array.<org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributionEntry>} distributions + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @instance + */ + TokenTimedDistributionEntry.prototype.distributions = $util.emptyArray; + + /** + * Creates a new TokenTimedDistributionEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} TokenTimedDistributionEntry instance + */ + TokenTimedDistributionEntry.create = function create(properties) { + return new TokenTimedDistributionEntry(properties); + }; + + /** + * Encodes the specified TokenTimedDistributionEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry} message TokenTimedDistributionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenTimedDistributionEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.timestamp); + if (message.distributions != null && message.distributions.length) + for (var i = 0; i < message.distributions.length; ++i) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.encode(message.distributions[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenTimedDistributionEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry} message TokenTimedDistributionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenTimedDistributionEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenTimedDistributionEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} TokenTimedDistributionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenTimedDistributionEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.timestamp = reader.uint64(); + break; + case 2: + if (!(message.distributions && message.distributions.length)) + message.distributions = []; + message.distributions.push($root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenTimedDistributionEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} TokenTimedDistributionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenTimedDistributionEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenTimedDistributionEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenTimedDistributionEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high))) + return "timestamp: integer|Long expected"; + if (message.distributions != null && message.hasOwnProperty("distributions")) { + if (!Array.isArray(message.distributions)) + return "distributions: array expected"; + for (var i = 0; i < message.distributions.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.verify(message.distributions[i]); + if (error) + return "distributions." + error; + } + } + return null; + }; + + /** + * Creates a TokenTimedDistributionEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} TokenTimedDistributionEntry + */ + TokenTimedDistributionEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry(); + if (object.timestamp != null) + if ($util.Long) + (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = true; + else if (typeof object.timestamp === "string") + message.timestamp = parseInt(object.timestamp, 10); + else if (typeof object.timestamp === "number") + message.timestamp = object.timestamp; + else if (typeof object.timestamp === "object") + message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber(true); + if (object.distributions) { + if (!Array.isArray(object.distributions)) + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.distributions: array expected"); + message.distributions = []; + for (var i = 0; i < object.distributions.length; ++i) { + if (typeof object.distributions[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.distributions: object expected"); + message.distributions[i] = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.fromObject(object.distributions[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TokenTimedDistributionEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} message TokenTimedDistributionEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenTimedDistributionEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.distributions = []; + if (options.defaults) + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.timestamp = options.longs === String ? "0" : 0; + if (message.timestamp != null && message.hasOwnProperty("timestamp")) + if (typeof message.timestamp === "number") + object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp; + else + object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber(true) : message.timestamp; + if (message.distributions && message.distributions.length) { + object.distributions = []; + for (var j = 0; j < message.distributions.length; ++j) + object.distributions[j] = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject(message.distributions[j], options); + } + return object; + }; + + /** + * Converts this TokenTimedDistributionEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenTimedDistributionEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenTimedDistributionEntry; + })(); + + GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions = (function() { + + /** + * Properties of a TokenDistributions. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @interface ITokenDistributions + * @property {Array.<org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry>|null} [tokenDistributions] TokenDistributions tokenDistributions + */ + + /** + * Constructs a new TokenDistributions. + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 + * @classdesc Represents a TokenDistributions. + * @implements ITokenDistributions + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions=} [properties] Properties to set + */ + function TokenDistributions(properties) { + this.tokenDistributions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenDistributions tokenDistributions. + * @member {Array.<org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenTimedDistributionEntry>} tokenDistributions + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @instance + */ + TokenDistributions.prototype.tokenDistributions = $util.emptyArray; + + /** + * Creates a new TokenDistributions instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} TokenDistributions instance + */ + TokenDistributions.create = function create(properties) { + return new TokenDistributions(properties); + }; + + /** + * Encodes the specified TokenDistributions message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions} message TokenDistributions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenDistributions.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenDistributions != null && message.tokenDistributions.length) + for (var i = 0; i < message.tokenDistributions.length; ++i) + $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.encode(message.tokenDistributions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenDistributions message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ITokenDistributions} message TokenDistributions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenDistributions.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenDistributions message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} TokenDistributions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenDistributions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.tokenDistributions && message.tokenDistributions.length)) + message.tokenDistributions = []; + message.tokenDistributions.push($root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenDistributions message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} TokenDistributions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenDistributions.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenDistributions message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenDistributions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenDistributions != null && message.hasOwnProperty("tokenDistributions")) { + if (!Array.isArray(message.tokenDistributions)) + return "tokenDistributions: array expected"; + for (var i = 0; i < message.tokenDistributions.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.verify(message.tokenDistributions[i]); + if (error) + return "tokenDistributions." + error; + } + } + return null; + }; + + /** + * Creates a TokenDistributions message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} TokenDistributions + */ + TokenDistributions.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions(); + if (object.tokenDistributions) { + if (!Array.isArray(object.tokenDistributions)) + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.tokenDistributions: array expected"); + message.tokenDistributions = []; + for (var i = 0; i < object.tokenDistributions.length; ++i) { + if (typeof object.tokenDistributions[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.tokenDistributions: object expected"); + message.tokenDistributions[i] = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.fromObject(object.tokenDistributions[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a TokenDistributions message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @static + * @param {org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} message TokenDistributions + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenDistributions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.tokenDistributions = []; + if (message.tokenDistributions && message.tokenDistributions.length) { + object.tokenDistributions = []; + for (var j = 0; j < message.tokenDistributions.length; ++j) + object.tokenDistributions[j] = $root.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject(message.tokenDistributions[j], options); + } + return object; + }; + + /** + * Converts this TokenDistributions to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenDistributions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenDistributions; + })(); + + return GetTokenPreProgrammedDistributionsResponseV0; + })(); + + return GetTokenPreProgrammedDistributionsResponse; + })(); + + v0.GetTokenTotalSupplyRequest = (function() { + + /** + * Properties of a GetTokenTotalSupplyRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenTotalSupplyRequest + * @property {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0|null} [v0] GetTokenTotalSupplyRequest v0 + */ + + /** + * Constructs a new GetTokenTotalSupplyRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenTotalSupplyRequest. + * @implements IGetTokenTotalSupplyRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest=} [properties] Properties to set + */ + function GetTokenTotalSupplyRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenTotalSupplyRequest v0. + * @member {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @instance + */ + GetTokenTotalSupplyRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenTotalSupplyRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @instance + */ + Object.defineProperty(GetTokenTotalSupplyRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenTotalSupplyRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} GetTokenTotalSupplyRequest instance + */ + GetTokenTotalSupplyRequest.create = function create(properties) { + return new GetTokenTotalSupplyRequest(properties); + }; + + /** + * Encodes the specified GetTokenTotalSupplyRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest} message GetTokenTotalSupplyRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenTotalSupplyRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyRequest} message GetTokenTotalSupplyRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenTotalSupplyRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} GetTokenTotalSupplyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenTotalSupplyRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} GetTokenTotalSupplyRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenTotalSupplyRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenTotalSupplyRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenTotalSupplyRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} GetTokenTotalSupplyRequest + */ + GetTokenTotalSupplyRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenTotalSupplyRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} message GetTokenTotalSupplyRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenTotalSupplyRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenTotalSupplyRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenTotalSupplyRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 = (function() { + + /** + * Properties of a GetTokenTotalSupplyRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @interface IGetTokenTotalSupplyRequestV0 + * @property {Uint8Array|null} [tokenId] GetTokenTotalSupplyRequestV0 tokenId + * @property {boolean|null} [prove] GetTokenTotalSupplyRequestV0 prove + */ + + /** + * Constructs a new GetTokenTotalSupplyRequestV0. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest + * @classdesc Represents a GetTokenTotalSupplyRequestV0. + * @implements IGetTokenTotalSupplyRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0=} [properties] Properties to set + */ + function GetTokenTotalSupplyRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenTotalSupplyRequestV0 tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @instance + */ + GetTokenTotalSupplyRequestV0.prototype.tokenId = $util.newBuffer([]); + + /** + * GetTokenTotalSupplyRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @instance + */ + GetTokenTotalSupplyRequestV0.prototype.prove = false; + + /** + * Creates a new GetTokenTotalSupplyRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} GetTokenTotalSupplyRequestV0 instance + */ + GetTokenTotalSupplyRequestV0.create = function create(properties) { + return new GetTokenTotalSupplyRequestV0(properties); + }; + + /** + * Encodes the specified GetTokenTotalSupplyRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0} message GetTokenTotalSupplyRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetTokenTotalSupplyRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.IGetTokenTotalSupplyRequestV0} message GetTokenTotalSupplyRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenTotalSupplyRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} GetTokenTotalSupplyRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenTotalSupplyRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} GetTokenTotalSupplyRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenTotalSupplyRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenTotalSupplyRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetTokenTotalSupplyRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} GetTokenTotalSupplyRequestV0 + */ + GetTokenTotalSupplyRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetTokenTotalSupplyRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} message GetTokenTotalSupplyRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenTotalSupplyRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + object.prove = false; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetTokenTotalSupplyRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenTotalSupplyRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetTokenTotalSupplyRequestV0; + })(); + + return GetTokenTotalSupplyRequest; + })(); + + v0.GetTokenTotalSupplyResponse = (function() { + + /** + * Properties of a GetTokenTotalSupplyResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetTokenTotalSupplyResponse + * @property {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0|null} [v0] GetTokenTotalSupplyResponse v0 + */ + + /** + * Constructs a new GetTokenTotalSupplyResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetTokenTotalSupplyResponse. + * @implements IGetTokenTotalSupplyResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyResponse=} [properties] Properties to set + */ + function GetTokenTotalSupplyResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenTotalSupplyResponse v0. + * @member {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @instance + */ + GetTokenTotalSupplyResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenTotalSupplyResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @instance + */ + Object.defineProperty(GetTokenTotalSupplyResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenTotalSupplyResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} GetTokenTotalSupplyResponse instance + */ + GetTokenTotalSupplyResponse.create = function create(properties) { + return new GetTokenTotalSupplyResponse(properties); + }; + + /** + * Encodes the specified GetTokenTotalSupplyResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyResponse} message GetTokenTotalSupplyResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenTotalSupplyResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetTokenTotalSupplyResponse} message GetTokenTotalSupplyResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenTotalSupplyResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} GetTokenTotalSupplyResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenTotalSupplyResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} GetTokenTotalSupplyResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenTotalSupplyResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenTotalSupplyResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetTokenTotalSupplyResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} GetTokenTotalSupplyResponse + */ + GetTokenTotalSupplyResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenTotalSupplyResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} message GetTokenTotalSupplyResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenTotalSupplyResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetTokenTotalSupplyResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenTotalSupplyResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 = (function() { + + /** + * Properties of a GetTokenTotalSupplyResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @interface IGetTokenTotalSupplyResponseV0 + * @property {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry|null} [tokenTotalSupply] GetTokenTotalSupplyResponseV0 tokenTotalSupply + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetTokenTotalSupplyResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetTokenTotalSupplyResponseV0 metadata + */ + + /** + * Constructs a new GetTokenTotalSupplyResponseV0. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse + * @classdesc Represents a GetTokenTotalSupplyResponseV0. + * @implements IGetTokenTotalSupplyResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0=} [properties] Properties to set + */ + function GetTokenTotalSupplyResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetTokenTotalSupplyResponseV0 tokenTotalSupply. + * @member {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry|null|undefined} tokenTotalSupply + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @instance + */ + GetTokenTotalSupplyResponseV0.prototype.tokenTotalSupply = null; + + /** + * GetTokenTotalSupplyResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @instance + */ + GetTokenTotalSupplyResponseV0.prototype.proof = null; + + /** + * GetTokenTotalSupplyResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @instance + */ + GetTokenTotalSupplyResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetTokenTotalSupplyResponseV0 result. + * @member {"tokenTotalSupply"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @instance + */ + Object.defineProperty(GetTokenTotalSupplyResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["tokenTotalSupply", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetTokenTotalSupplyResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} GetTokenTotalSupplyResponseV0 instance + */ + GetTokenTotalSupplyResponseV0.create = function create(properties) { + return new GetTokenTotalSupplyResponseV0(properties); + }; + + /** + * Encodes the specified GetTokenTotalSupplyResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0} message GetTokenTotalSupplyResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenTotalSupply != null && Object.hasOwnProperty.call(message, "tokenTotalSupply")) + $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.encode(message.tokenTotalSupply, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetTokenTotalSupplyResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.IGetTokenTotalSupplyResponseV0} message GetTokenTotalSupplyResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetTokenTotalSupplyResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetTokenTotalSupplyResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} GetTokenTotalSupplyResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenTotalSupply = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetTokenTotalSupplyResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} GetTokenTotalSupplyResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetTokenTotalSupplyResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetTokenTotalSupplyResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetTokenTotalSupplyResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenTotalSupply != null && message.hasOwnProperty("tokenTotalSupply")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.verify(message.tokenTotalSupply); + if (error) + return "tokenTotalSupply." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetTokenTotalSupplyResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} GetTokenTotalSupplyResponseV0 + */ + GetTokenTotalSupplyResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0(); + if (object.tokenTotalSupply != null) { + if (typeof object.tokenTotalSupply !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.tokenTotalSupply: object expected"); + message.tokenTotalSupply = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.fromObject(object.tokenTotalSupply); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetTokenTotalSupplyResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} message GetTokenTotalSupplyResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetTokenTotalSupplyResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.tokenTotalSupply != null && message.hasOwnProperty("tokenTotalSupply")) { + object.tokenTotalSupply = $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject(message.tokenTotalSupply, options); + if (options.oneofs) + object.result = "tokenTotalSupply"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetTokenTotalSupplyResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetTokenTotalSupplyResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry = (function() { + + /** + * Properties of a TokenTotalSupplyEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @interface ITokenTotalSupplyEntry + * @property {Uint8Array|null} [tokenId] TokenTotalSupplyEntry tokenId + * @property {number|Long|null} [totalAggregatedAmountInUserAccounts] TokenTotalSupplyEntry totalAggregatedAmountInUserAccounts + * @property {number|Long|null} [totalSystemAmount] TokenTotalSupplyEntry totalSystemAmount + */ + + /** + * Constructs a new TokenTotalSupplyEntry. + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 + * @classdesc Represents a TokenTotalSupplyEntry. + * @implements ITokenTotalSupplyEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry=} [properties] Properties to set + */ + function TokenTotalSupplyEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenTotalSupplyEntry tokenId. + * @member {Uint8Array} tokenId + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @instance + */ + TokenTotalSupplyEntry.prototype.tokenId = $util.newBuffer([]); + + /** + * TokenTotalSupplyEntry totalAggregatedAmountInUserAccounts. + * @member {number|Long} totalAggregatedAmountInUserAccounts + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @instance + */ + TokenTotalSupplyEntry.prototype.totalAggregatedAmountInUserAccounts = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * TokenTotalSupplyEntry totalSystemAmount. + * @member {number|Long} totalSystemAmount + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @instance + */ + TokenTotalSupplyEntry.prototype.totalSystemAmount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new TokenTotalSupplyEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} TokenTotalSupplyEntry instance + */ + TokenTotalSupplyEntry.create = function create(properties) { + return new TokenTotalSupplyEntry(properties); + }; + + /** + * Encodes the specified TokenTotalSupplyEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry} message TokenTotalSupplyEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenTotalSupplyEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenId != null && Object.hasOwnProperty.call(message, "tokenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenId); + if (message.totalAggregatedAmountInUserAccounts != null && Object.hasOwnProperty.call(message, "totalAggregatedAmountInUserAccounts")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.totalAggregatedAmountInUserAccounts); + if (message.totalSystemAmount != null && Object.hasOwnProperty.call(message, "totalSystemAmount")) + writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.totalSystemAmount); + return writer; + }; + + /** + * Encodes the specified TokenTotalSupplyEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ITokenTotalSupplyEntry} message TokenTotalSupplyEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenTotalSupplyEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenTotalSupplyEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} TokenTotalSupplyEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenTotalSupplyEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenId = reader.bytes(); + break; + case 2: + message.totalAggregatedAmountInUserAccounts = reader.uint64(); + break; + case 3: + message.totalSystemAmount = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenTotalSupplyEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} TokenTotalSupplyEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenTotalSupplyEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenTotalSupplyEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenTotalSupplyEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + if (!(message.tokenId && typeof message.tokenId.length === "number" || $util.isString(message.tokenId))) + return "tokenId: buffer expected"; + if (message.totalAggregatedAmountInUserAccounts != null && message.hasOwnProperty("totalAggregatedAmountInUserAccounts")) + if (!$util.isInteger(message.totalAggregatedAmountInUserAccounts) && !(message.totalAggregatedAmountInUserAccounts && $util.isInteger(message.totalAggregatedAmountInUserAccounts.low) && $util.isInteger(message.totalAggregatedAmountInUserAccounts.high))) + return "totalAggregatedAmountInUserAccounts: integer|Long expected"; + if (message.totalSystemAmount != null && message.hasOwnProperty("totalSystemAmount")) + if (!$util.isInteger(message.totalSystemAmount) && !(message.totalSystemAmount && $util.isInteger(message.totalSystemAmount.low) && $util.isInteger(message.totalSystemAmount.high))) + return "totalSystemAmount: integer|Long expected"; + return null; + }; + + /** + * Creates a TokenTotalSupplyEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} TokenTotalSupplyEntry + */ + TokenTotalSupplyEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry(); + if (object.tokenId != null) + if (typeof object.tokenId === "string") + $util.base64.decode(object.tokenId, message.tokenId = $util.newBuffer($util.base64.length(object.tokenId)), 0); + else if (object.tokenId.length >= 0) + message.tokenId = object.tokenId; + if (object.totalAggregatedAmountInUserAccounts != null) + if ($util.Long) + (message.totalAggregatedAmountInUserAccounts = $util.Long.fromValue(object.totalAggregatedAmountInUserAccounts)).unsigned = true; + else if (typeof object.totalAggregatedAmountInUserAccounts === "string") + message.totalAggregatedAmountInUserAccounts = parseInt(object.totalAggregatedAmountInUserAccounts, 10); + else if (typeof object.totalAggregatedAmountInUserAccounts === "number") + message.totalAggregatedAmountInUserAccounts = object.totalAggregatedAmountInUserAccounts; + else if (typeof object.totalAggregatedAmountInUserAccounts === "object") + message.totalAggregatedAmountInUserAccounts = new $util.LongBits(object.totalAggregatedAmountInUserAccounts.low >>> 0, object.totalAggregatedAmountInUserAccounts.high >>> 0).toNumber(true); + if (object.totalSystemAmount != null) + if ($util.Long) + (message.totalSystemAmount = $util.Long.fromValue(object.totalSystemAmount)).unsigned = true; + else if (typeof object.totalSystemAmount === "string") + message.totalSystemAmount = parseInt(object.totalSystemAmount, 10); + else if (typeof object.totalSystemAmount === "number") + message.totalSystemAmount = object.totalSystemAmount; + else if (typeof object.totalSystemAmount === "object") + message.totalSystemAmount = new $util.LongBits(object.totalSystemAmount.low >>> 0, object.totalSystemAmount.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a TokenTotalSupplyEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @static + * @param {org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} message TokenTotalSupplyEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenTotalSupplyEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenId = ""; + else { + object.tokenId = []; + if (options.bytes !== Array) + object.tokenId = $util.newBuffer(object.tokenId); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.totalAggregatedAmountInUserAccounts = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.totalAggregatedAmountInUserAccounts = options.longs === String ? "0" : 0; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.totalSystemAmount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.totalSystemAmount = options.longs === String ? "0" : 0; + } + if (message.tokenId != null && message.hasOwnProperty("tokenId")) + object.tokenId = options.bytes === String ? $util.base64.encode(message.tokenId, 0, message.tokenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenId) : message.tokenId; + if (message.totalAggregatedAmountInUserAccounts != null && message.hasOwnProperty("totalAggregatedAmountInUserAccounts")) + if (typeof message.totalAggregatedAmountInUserAccounts === "number") + object.totalAggregatedAmountInUserAccounts = options.longs === String ? String(message.totalAggregatedAmountInUserAccounts) : message.totalAggregatedAmountInUserAccounts; + else + object.totalAggregatedAmountInUserAccounts = options.longs === String ? $util.Long.prototype.toString.call(message.totalAggregatedAmountInUserAccounts) : options.longs === Number ? new $util.LongBits(message.totalAggregatedAmountInUserAccounts.low >>> 0, message.totalAggregatedAmountInUserAccounts.high >>> 0).toNumber(true) : message.totalAggregatedAmountInUserAccounts; + if (message.totalSystemAmount != null && message.hasOwnProperty("totalSystemAmount")) + if (typeof message.totalSystemAmount === "number") + object.totalSystemAmount = options.longs === String ? String(message.totalSystemAmount) : message.totalSystemAmount; + else + object.totalSystemAmount = options.longs === String ? $util.Long.prototype.toString.call(message.totalSystemAmount) : options.longs === Number ? new $util.LongBits(message.totalSystemAmount.low >>> 0, message.totalSystemAmount.high >>> 0).toNumber(true) : message.totalSystemAmount; + return object; + }; + + /** + * Converts this TokenTotalSupplyEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenTotalSupplyEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenTotalSupplyEntry; + })(); + + return GetTokenTotalSupplyResponseV0; + })(); + + return GetTokenTotalSupplyResponse; + })(); + + v0.GetGroupInfoRequest = (function() { + + /** + * Properties of a GetGroupInfoRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupInfoRequest + * @property {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0|null} [v0] GetGroupInfoRequest v0 + */ + + /** + * Constructs a new GetGroupInfoRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupInfoRequest. + * @implements IGetGroupInfoRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest=} [properties] Properties to set + */ + function GetGroupInfoRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfoRequest v0. + * @member {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @instance + */ + GetGroupInfoRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfoRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @instance + */ + Object.defineProperty(GetGroupInfoRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfoRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest} GetGroupInfoRequest instance + */ + GetGroupInfoRequest.create = function create(properties) { + return new GetGroupInfoRequest(properties); + }; + + /** + * Encodes the specified GetGroupInfoRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest} message GetGroupInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfoRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoRequest} message GetGroupInfoRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfoRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest} GetGroupInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfoRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest} GetGroupInfoRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfoRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfoRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupInfoRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest} GetGroupInfoRequest + */ + GetGroupInfoRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfoRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest} message GetGroupInfoRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfoRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupInfoRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfoRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfoRequest.GetGroupInfoRequestV0 = (function() { + + /** + * Properties of a GetGroupInfoRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @interface IGetGroupInfoRequestV0 + * @property {Uint8Array|null} [contractId] GetGroupInfoRequestV0 contractId + * @property {number|null} [groupContractPosition] GetGroupInfoRequestV0 groupContractPosition + * @property {boolean|null} [prove] GetGroupInfoRequestV0 prove + */ + + /** + * Constructs a new GetGroupInfoRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest + * @classdesc Represents a GetGroupInfoRequestV0. + * @implements IGetGroupInfoRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0=} [properties] Properties to set + */ + function GetGroupInfoRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfoRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @instance + */ + GetGroupInfoRequestV0.prototype.contractId = $util.newBuffer([]); + + /** + * GetGroupInfoRequestV0 groupContractPosition. + * @member {number} groupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @instance + */ + GetGroupInfoRequestV0.prototype.groupContractPosition = 0; + + /** + * GetGroupInfoRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @instance + */ + GetGroupInfoRequestV0.prototype.prove = false; + + /** + * Creates a new GetGroupInfoRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} GetGroupInfoRequestV0 instance + */ + GetGroupInfoRequestV0.create = function create(properties) { + return new GetGroupInfoRequestV0(properties); + }; + + /** + * Encodes the specified GetGroupInfoRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0} message GetGroupInfoRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.contractId); + if (message.groupContractPosition != null && Object.hasOwnProperty.call(message, "groupContractPosition")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.groupContractPosition); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 3, wireType 0 =*/24).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetGroupInfoRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest.IGetGroupInfoRequestV0} message GetGroupInfoRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfoRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} GetGroupInfoRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.contractId = reader.bytes(); + break; + case 2: + message.groupContractPosition = reader.uint32(); + break; + case 3: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfoRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} GetGroupInfoRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfoRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfoRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + if (!$util.isInteger(message.groupContractPosition)) + return "groupContractPosition: integer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetGroupInfoRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} GetGroupInfoRequestV0 + */ + GetGroupInfoRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0(); + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; + if (object.groupContractPosition != null) + message.groupContractPosition = object.groupContractPosition >>> 0; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetGroupInfoRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} message GetGroupInfoRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfoRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); + } + object.groupContractPosition = 0; + object.prove = false; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + object.groupContractPosition = message.groupContractPosition; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetGroupInfoRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfoRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetGroupInfoRequestV0; + })(); + + return GetGroupInfoRequest; + })(); + + v0.GetGroupInfoResponse = (function() { + + /** + * Properties of a GetGroupInfoResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupInfoResponse + * @property {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0|null} [v0] GetGroupInfoResponse v0 + */ + + /** + * Constructs a new GetGroupInfoResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupInfoResponse. + * @implements IGetGroupInfoResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupInfoResponse=} [properties] Properties to set + */ + function GetGroupInfoResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfoResponse v0. + * @member {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @instance + */ + GetGroupInfoResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfoResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @instance + */ + Object.defineProperty(GetGroupInfoResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfoResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse} GetGroupInfoResponse instance + */ + GetGroupInfoResponse.create = function create(properties) { + return new GetGroupInfoResponse(properties); + }; + + /** + * Encodes the specified GetGroupInfoResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoResponse} message GetGroupInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfoResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfoResponse} message GetGroupInfoResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfoResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse} GetGroupInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfoResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse} GetGroupInfoResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfoResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfoResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupInfoResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse} GetGroupInfoResponse + */ + GetGroupInfoResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfoResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse} message GetGroupInfoResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfoResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupInfoResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfoResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfoResponse.GetGroupInfoResponseV0 = (function() { + + /** + * Properties of a GetGroupInfoResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @interface IGetGroupInfoResponseV0 + * @property {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo|null} [groupInfo] GetGroupInfoResponseV0 groupInfo + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetGroupInfoResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetGroupInfoResponseV0 metadata + */ + + /** + * Constructs a new GetGroupInfoResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse + * @classdesc Represents a GetGroupInfoResponseV0. + * @implements IGetGroupInfoResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0=} [properties] Properties to set + */ + function GetGroupInfoResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfoResponseV0 groupInfo. + * @member {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo|null|undefined} groupInfo + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @instance + */ + GetGroupInfoResponseV0.prototype.groupInfo = null; + + /** + * GetGroupInfoResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @instance + */ + GetGroupInfoResponseV0.prototype.proof = null; + + /** + * GetGroupInfoResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @instance + */ + GetGroupInfoResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfoResponseV0 result. + * @member {"groupInfo"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @instance + */ + Object.defineProperty(GetGroupInfoResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["groupInfo", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfoResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} GetGroupInfoResponseV0 instance + */ + GetGroupInfoResponseV0.create = function create(properties) { + return new GetGroupInfoResponseV0(properties); + }; + + /** + * Encodes the specified GetGroupInfoResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0} message GetGroupInfoResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupInfo != null && Object.hasOwnProperty.call(message, "groupInfo")) + $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.encode(message.groupInfo, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfoResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.IGetGroupInfoResponseV0} message GetGroupInfoResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfoResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfoResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} GetGroupInfoResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 4: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfoResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} GetGroupInfoResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfoResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfoResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfoResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.groupInfo != null && message.hasOwnProperty("groupInfo")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.verify(message.groupInfo); + if (error) + return "groupInfo." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetGroupInfoResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} GetGroupInfoResponseV0 + */ + GetGroupInfoResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0(); + if (object.groupInfo != null) { + if (typeof object.groupInfo !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.groupInfo: object expected"); + message.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.fromObject(object.groupInfo); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfoResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} message GetGroupInfoResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfoResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.groupInfo != null && message.hasOwnProperty("groupInfo")) { + object.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject(message.groupInfo, options); + if (options.oneofs) + object.result = "groupInfo"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetGroupInfoResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfoResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfoResponseV0.GroupMemberEntry = (function() { + + /** + * Properties of a GroupMemberEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @interface IGroupMemberEntry + * @property {Uint8Array|null} [memberId] GroupMemberEntry memberId + * @property {number|null} [power] GroupMemberEntry power + */ + + /** + * Constructs a new GroupMemberEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @classdesc Represents a GroupMemberEntry. + * @implements IGroupMemberEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry=} [properties] Properties to set + */ + function GroupMemberEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupMemberEntry memberId. + * @member {Uint8Array} memberId + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @instance + */ + GroupMemberEntry.prototype.memberId = $util.newBuffer([]); + + /** + * GroupMemberEntry power. + * @member {number} power + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @instance + */ + GroupMemberEntry.prototype.power = 0; + + /** + * Creates a new GroupMemberEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} GroupMemberEntry instance + */ + GroupMemberEntry.create = function create(properties) { + return new GroupMemberEntry(properties); + }; + + /** + * Encodes the specified GroupMemberEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry} message GroupMemberEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupMemberEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.memberId != null && Object.hasOwnProperty.call(message, "memberId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.memberId); + if (message.power != null && Object.hasOwnProperty.call(message, "power")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.power); + return writer; + }; + + /** + * Encodes the specified GroupMemberEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry} message GroupMemberEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupMemberEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupMemberEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} GroupMemberEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.memberId = reader.bytes(); + break; + case 2: + message.power = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupMemberEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} GroupMemberEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupMemberEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupMemberEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.memberId != null && message.hasOwnProperty("memberId")) + if (!(message.memberId && typeof message.memberId.length === "number" || $util.isString(message.memberId))) + return "memberId: buffer expected"; + if (message.power != null && message.hasOwnProperty("power")) + if (!$util.isInteger(message.power)) + return "power: integer expected"; + return null; + }; + + /** + * Creates a GroupMemberEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} GroupMemberEntry + */ + GroupMemberEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry(); + if (object.memberId != null) + if (typeof object.memberId === "string") + $util.base64.decode(object.memberId, message.memberId = $util.newBuffer($util.base64.length(object.memberId)), 0); + else if (object.memberId.length >= 0) + message.memberId = object.memberId; + if (object.power != null) + message.power = object.power >>> 0; + return message; + }; + + /** + * Creates a plain object from a GroupMemberEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} message GroupMemberEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupMemberEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.memberId = ""; + else { + object.memberId = []; + if (options.bytes !== Array) + object.memberId = $util.newBuffer(object.memberId); + } + object.power = 0; + } + if (message.memberId != null && message.hasOwnProperty("memberId")) + object.memberId = options.bytes === String ? $util.base64.encode(message.memberId, 0, message.memberId.length) : options.bytes === Array ? Array.prototype.slice.call(message.memberId) : message.memberId; + if (message.power != null && message.hasOwnProperty("power")) + object.power = message.power; + return object; + }; + + /** + * Converts this GroupMemberEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupMemberEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupMemberEntry; + })(); + + GetGroupInfoResponseV0.GroupInfoEntry = (function() { + + /** + * Properties of a GroupInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @interface IGroupInfoEntry + * @property {Array.<org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry>|null} [members] GroupInfoEntry members + * @property {number|null} [groupRequiredPower] GroupInfoEntry groupRequiredPower + */ + + /** + * Constructs a new GroupInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @classdesc Represents a GroupInfoEntry. + * @implements IGroupInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry=} [properties] Properties to set + */ + function GroupInfoEntry(properties) { + this.members = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupInfoEntry members. + * @member {Array.<org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupMemberEntry>} members + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @instance + */ + GroupInfoEntry.prototype.members = $util.emptyArray; + + /** + * GroupInfoEntry groupRequiredPower. + * @member {number} groupRequiredPower + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @instance + */ + GroupInfoEntry.prototype.groupRequiredPower = 0; + + /** + * Creates a new GroupInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} GroupInfoEntry instance + */ + GroupInfoEntry.create = function create(properties) { + return new GroupInfoEntry(properties); + }; + + /** + * Encodes the specified GroupInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry} message GroupInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.members != null && message.members.length) + for (var i = 0; i < message.members.length; ++i) + $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.encode(message.members[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.groupRequiredPower != null && Object.hasOwnProperty.call(message, "groupRequiredPower")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.groupRequiredPower); + return writer; + }; + + /** + * Encodes the specified GroupInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry} message GroupInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} GroupInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.members && message.members.length)) + message.members = []; + message.members.push($root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.decode(reader, reader.uint32())); + break; + case 2: + message.groupRequiredPower = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} GroupInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.members != null && message.hasOwnProperty("members")) { + if (!Array.isArray(message.members)) + return "members: array expected"; + for (var i = 0; i < message.members.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.verify(message.members[i]); + if (error) + return "members." + error; + } + } + if (message.groupRequiredPower != null && message.hasOwnProperty("groupRequiredPower")) + if (!$util.isInteger(message.groupRequiredPower)) + return "groupRequiredPower: integer expected"; + return null; + }; + + /** + * Creates a GroupInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} GroupInfoEntry + */ + GroupInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry(); + if (object.members) { + if (!Array.isArray(object.members)) + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.members: array expected"); + message.members = []; + for (var i = 0; i < object.members.length; ++i) { + if (typeof object.members[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.members: object expected"); + message.members[i] = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.fromObject(object.members[i]); + } + } + if (object.groupRequiredPower != null) + message.groupRequiredPower = object.groupRequiredPower >>> 0; + return message; + }; + + /** + * Creates a plain object from a GroupInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} message GroupInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.members = []; + if (options.defaults) + object.groupRequiredPower = 0; + if (message.members && message.members.length) { + object.members = []; + for (var j = 0; j < message.members.length; ++j) + object.members[j] = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject(message.members[j], options); + } + if (message.groupRequiredPower != null && message.hasOwnProperty("groupRequiredPower")) + object.groupRequiredPower = message.groupRequiredPower; + return object; + }; + + /** + * Converts this GroupInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupInfoEntry; + })(); + + GetGroupInfoResponseV0.GroupInfo = (function() { + + /** + * Properties of a GroupInfo. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @interface IGroupInfo + * @property {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry|null} [groupInfo] GroupInfo groupInfo + */ + + /** + * Constructs a new GroupInfo. + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 + * @classdesc Represents a GroupInfo. + * @implements IGroupInfo + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo=} [properties] Properties to set + */ + function GroupInfo(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupInfo groupInfo. + * @member {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfoEntry|null|undefined} groupInfo + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @instance + */ + GroupInfo.prototype.groupInfo = null; + + /** + * Creates a new GroupInfo instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} GroupInfo instance + */ + GroupInfo.create = function create(properties) { + return new GroupInfo(properties); + }; + + /** + * Encodes the specified GroupInfo message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo} message GroupInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupInfo != null && Object.hasOwnProperty.call(message, "groupInfo")) + $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.encode(message.groupInfo, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupInfo message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.IGroupInfo} message GroupInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupInfo message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} GroupInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} GroupInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupInfo message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupInfo != null && message.hasOwnProperty("groupInfo")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.verify(message.groupInfo); + if (error) + return "groupInfo." + error; + } + return null; + }; + + /** + * Creates a GroupInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} GroupInfo + */ + GroupInfo.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo(); + if (object.groupInfo != null) { + if (typeof object.groupInfo !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.groupInfo: object expected"); + message.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.fromObject(object.groupInfo); + } + return message; + }; + + /** + * Creates a plain object from a GroupInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} message GroupInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.groupInfo = null; + if (message.groupInfo != null && message.hasOwnProperty("groupInfo")) + object.groupInfo = $root.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject(message.groupInfo, options); + return object; + }; + + /** + * Converts this GroupInfo to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupInfo; + })(); + + return GetGroupInfoResponseV0; + })(); + + return GetGroupInfoResponse; + })(); + + v0.GetGroupInfosRequest = (function() { + + /** + * Properties of a GetGroupInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupInfosRequest + * @property {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0|null} [v0] GetGroupInfosRequest v0 + */ + + /** + * Constructs a new GetGroupInfosRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupInfosRequest. + * @implements IGetGroupInfosRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest=} [properties] Properties to set + */ + function GetGroupInfosRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfosRequest v0. + * @member {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @instance + */ + GetGroupInfosRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfosRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @instance + */ + Object.defineProperty(GetGroupInfosRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfosRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest} GetGroupInfosRequest instance + */ + GetGroupInfosRequest.create = function create(properties) { + return new GetGroupInfosRequest(properties); + }; + + /** + * Encodes the specified GetGroupInfosRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest} message GetGroupInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfosRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosRequest} message GetGroupInfosRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfosRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest} GetGroupInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfosRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest} GetGroupInfosRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfosRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfosRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupInfosRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest} GetGroupInfosRequest + */ + GetGroupInfosRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfosRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest} message GetGroupInfosRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfosRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupInfosRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfosRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfosRequest.StartAtGroupContractPosition = (function() { + + /** + * Properties of a StartAtGroupContractPosition. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @interface IStartAtGroupContractPosition + * @property {number|null} [startGroupContractPosition] StartAtGroupContractPosition startGroupContractPosition + * @property {boolean|null} [startGroupContractPositionIncluded] StartAtGroupContractPosition startGroupContractPositionIncluded + */ + + /** + * Constructs a new StartAtGroupContractPosition. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @classdesc Represents a StartAtGroupContractPosition. + * @implements IStartAtGroupContractPosition + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition=} [properties] Properties to set + */ + function StartAtGroupContractPosition(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartAtGroupContractPosition startGroupContractPosition. + * @member {number} startGroupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @instance + */ + StartAtGroupContractPosition.prototype.startGroupContractPosition = 0; + + /** + * StartAtGroupContractPosition startGroupContractPositionIncluded. + * @member {boolean} startGroupContractPositionIncluded + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @instance + */ + StartAtGroupContractPosition.prototype.startGroupContractPositionIncluded = false; + + /** + * Creates a new StartAtGroupContractPosition instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} StartAtGroupContractPosition instance + */ + StartAtGroupContractPosition.create = function create(properties) { + return new StartAtGroupContractPosition(properties); + }; + + /** + * Encodes the specified StartAtGroupContractPosition message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition} message StartAtGroupContractPosition message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtGroupContractPosition.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.startGroupContractPosition != null && Object.hasOwnProperty.call(message, "startGroupContractPosition")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.startGroupContractPosition); + if (message.startGroupContractPositionIncluded != null && Object.hasOwnProperty.call(message, "startGroupContractPositionIncluded")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.startGroupContractPositionIncluded); + return writer; + }; + + /** + * Encodes the specified StartAtGroupContractPosition message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition} message StartAtGroupContractPosition message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtGroupContractPosition.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartAtGroupContractPosition message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} StartAtGroupContractPosition + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtGroupContractPosition.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.startGroupContractPosition = reader.uint32(); + break; + case 2: + message.startGroupContractPositionIncluded = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartAtGroupContractPosition message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} StartAtGroupContractPosition + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtGroupContractPosition.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartAtGroupContractPosition message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartAtGroupContractPosition.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.startGroupContractPosition != null && message.hasOwnProperty("startGroupContractPosition")) + if (!$util.isInteger(message.startGroupContractPosition)) + return "startGroupContractPosition: integer expected"; + if (message.startGroupContractPositionIncluded != null && message.hasOwnProperty("startGroupContractPositionIncluded")) + if (typeof message.startGroupContractPositionIncluded !== "boolean") + return "startGroupContractPositionIncluded: boolean expected"; + return null; + }; + + /** + * Creates a StartAtGroupContractPosition message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} StartAtGroupContractPosition + */ + StartAtGroupContractPosition.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition(); + if (object.startGroupContractPosition != null) + message.startGroupContractPosition = object.startGroupContractPosition >>> 0; + if (object.startGroupContractPositionIncluded != null) + message.startGroupContractPositionIncluded = Boolean(object.startGroupContractPositionIncluded); + return message; + }; + + /** + * Creates a plain object from a StartAtGroupContractPosition message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} message StartAtGroupContractPosition + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + StartAtGroupContractPosition.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.startGroupContractPosition = 0; + object.startGroupContractPositionIncluded = false; + } + if (message.startGroupContractPosition != null && message.hasOwnProperty("startGroupContractPosition")) + object.startGroupContractPosition = message.startGroupContractPosition; + if (message.startGroupContractPositionIncluded != null && message.hasOwnProperty("startGroupContractPositionIncluded")) + object.startGroupContractPositionIncluded = message.startGroupContractPositionIncluded; + return object; + }; + + /** + * Converts this StartAtGroupContractPosition to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition + * @instance + * @returns {Object.<string,*>} JSON object + */ + StartAtGroupContractPosition.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StartAtGroupContractPosition; + })(); + + GetGroupInfosRequest.GetGroupInfosRequestV0 = (function() { + + /** + * Properties of a GetGroupInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @interface IGetGroupInfosRequestV0 + * @property {Uint8Array|null} [contractId] GetGroupInfosRequestV0 contractId + * @property {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition|null} [startAtGroupContractPosition] GetGroupInfosRequestV0 startAtGroupContractPosition + * @property {number|null} [count] GetGroupInfosRequestV0 count + * @property {boolean|null} [prove] GetGroupInfosRequestV0 prove + */ + + /** + * Constructs a new GetGroupInfosRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest + * @classdesc Represents a GetGroupInfosRequestV0. + * @implements IGetGroupInfosRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0=} [properties] Properties to set + */ + function GetGroupInfosRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfosRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @instance + */ + GetGroupInfosRequestV0.prototype.contractId = $util.newBuffer([]); + + /** + * GetGroupInfosRequestV0 startAtGroupContractPosition. + * @member {org.dash.platform.dapi.v0.GetGroupInfosRequest.IStartAtGroupContractPosition|null|undefined} startAtGroupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @instance + */ + GetGroupInfosRequestV0.prototype.startAtGroupContractPosition = null; + + /** + * GetGroupInfosRequestV0 count. + * @member {number} count + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @instance + */ + GetGroupInfosRequestV0.prototype.count = 0; + + /** + * GetGroupInfosRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @instance + */ + GetGroupInfosRequestV0.prototype.prove = false; + + /** + * Creates a new GetGroupInfosRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} GetGroupInfosRequestV0 instance + */ + GetGroupInfosRequestV0.create = function create(properties) { + return new GetGroupInfosRequestV0(properties); + }; + + /** + * Encodes the specified GetGroupInfosRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0} message GetGroupInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.contractId); + if (message.startAtGroupContractPosition != null && Object.hasOwnProperty.call(message, "startAtGroupContractPosition")) + $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.encode(message.startAtGroupContractPosition, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.count != null && Object.hasOwnProperty.call(message, "count")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.count); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetGroupInfosRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.IGetGroupInfosRequestV0} message GetGroupInfosRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfosRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} GetGroupInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.contractId = reader.bytes(); + break; + case 2: + message.startAtGroupContractPosition = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.decode(reader, reader.uint32()); + break; + case 3: + message.count = reader.uint32(); + break; + case 4: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfosRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} GetGroupInfosRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfosRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfosRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; + if (message.startAtGroupContractPosition != null && message.hasOwnProperty("startAtGroupContractPosition")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.verify(message.startAtGroupContractPosition); + if (error) + return "startAtGroupContractPosition." + error; + } + if (message.count != null && message.hasOwnProperty("count")) + if (!$util.isInteger(message.count)) + return "count: integer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetGroupInfosRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} GetGroupInfosRequestV0 + */ + GetGroupInfosRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0(); + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; + if (object.startAtGroupContractPosition != null) { + if (typeof object.startAtGroupContractPosition !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.startAtGroupContractPosition: object expected"); + message.startAtGroupContractPosition = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.fromObject(object.startAtGroupContractPosition); + } + if (object.count != null) + message.count = object.count >>> 0; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetGroupInfosRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} message GetGroupInfosRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfosRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); + } + object.startAtGroupContractPosition = null; + object.count = 0; + object.prove = false; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; + if (message.startAtGroupContractPosition != null && message.hasOwnProperty("startAtGroupContractPosition")) + object.startAtGroupContractPosition = $root.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject(message.startAtGroupContractPosition, options); + if (message.count != null && message.hasOwnProperty("count")) + object.count = message.count; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetGroupInfosRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfosRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetGroupInfosRequestV0; + })(); + + return GetGroupInfosRequest; + })(); + + v0.GetGroupInfosResponse = (function() { + + /** + * Properties of a GetGroupInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupInfosResponse + * @property {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0|null} [v0] GetGroupInfosResponse v0 + */ + + /** + * Constructs a new GetGroupInfosResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupInfosResponse. + * @implements IGetGroupInfosResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupInfosResponse=} [properties] Properties to set + */ + function GetGroupInfosResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfosResponse v0. + * @member {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @instance + */ + GetGroupInfosResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfosResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @instance + */ + Object.defineProperty(GetGroupInfosResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfosResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse} GetGroupInfosResponse instance + */ + GetGroupInfosResponse.create = function create(properties) { + return new GetGroupInfosResponse(properties); + }; + + /** + * Encodes the specified GetGroupInfosResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosResponse} message GetGroupInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfosResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupInfosResponse} message GetGroupInfosResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfosResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse} GetGroupInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfosResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse} GetGroupInfosResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfosResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfosResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupInfosResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse} GetGroupInfosResponse + */ + GetGroupInfosResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfosResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse} message GetGroupInfosResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfosResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupInfosResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfosResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfosResponse.GetGroupInfosResponseV0 = (function() { + + /** + * Properties of a GetGroupInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @interface IGetGroupInfosResponseV0 + * @property {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos|null} [groupInfos] GetGroupInfosResponseV0 groupInfos + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetGroupInfosResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetGroupInfosResponseV0 metadata + */ + + /** + * Constructs a new GetGroupInfosResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse + * @classdesc Represents a GetGroupInfosResponseV0. + * @implements IGetGroupInfosResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0=} [properties] Properties to set + */ + function GetGroupInfosResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupInfosResponseV0 groupInfos. + * @member {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos|null|undefined} groupInfos + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @instance + */ + GetGroupInfosResponseV0.prototype.groupInfos = null; + + /** + * GetGroupInfosResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @instance + */ + GetGroupInfosResponseV0.prototype.proof = null; + + /** + * GetGroupInfosResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @instance + */ + GetGroupInfosResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupInfosResponseV0 result. + * @member {"groupInfos"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @instance + */ + Object.defineProperty(GetGroupInfosResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["groupInfos", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupInfosResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} GetGroupInfosResponseV0 instance + */ + GetGroupInfosResponseV0.create = function create(properties) { + return new GetGroupInfosResponseV0(properties); + }; + + /** + * Encodes the specified GetGroupInfosResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0} message GetGroupInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupInfos != null && Object.hasOwnProperty.call(message, "groupInfos")) + $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.encode(message.groupInfos, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupInfosResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.IGetGroupInfosResponseV0} message GetGroupInfosResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupInfosResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupInfosResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} GetGroupInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupInfos = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 4: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupInfosResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} GetGroupInfosResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupInfosResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupInfosResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupInfosResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.groupInfos != null && message.hasOwnProperty("groupInfos")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.verify(message.groupInfos); + if (error) + return "groupInfos." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetGroupInfosResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} GetGroupInfosResponseV0 + */ + GetGroupInfosResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0(); + if (object.groupInfos != null) { + if (typeof object.groupInfos !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.groupInfos: object expected"); + message.groupInfos = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.fromObject(object.groupInfos); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupInfosResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} message GetGroupInfosResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupInfosResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.groupInfos != null && message.hasOwnProperty("groupInfos")) { + object.groupInfos = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject(message.groupInfos, options); + if (options.oneofs) + object.result = "groupInfos"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetGroupInfosResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupInfosResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupInfosResponseV0.GroupMemberEntry = (function() { + + /** + * Properties of a GroupMemberEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @interface IGroupMemberEntry + * @property {Uint8Array|null} [memberId] GroupMemberEntry memberId + * @property {number|null} [power] GroupMemberEntry power + */ + + /** + * Constructs a new GroupMemberEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @classdesc Represents a GroupMemberEntry. + * @implements IGroupMemberEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry=} [properties] Properties to set + */ + function GroupMemberEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupMemberEntry memberId. + * @member {Uint8Array} memberId + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @instance + */ + GroupMemberEntry.prototype.memberId = $util.newBuffer([]); + + /** + * GroupMemberEntry power. + * @member {number} power + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @instance + */ + GroupMemberEntry.prototype.power = 0; + + /** + * Creates a new GroupMemberEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} GroupMemberEntry instance + */ + GroupMemberEntry.create = function create(properties) { + return new GroupMemberEntry(properties); + }; + + /** + * Encodes the specified GroupMemberEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry} message GroupMemberEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupMemberEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.memberId != null && Object.hasOwnProperty.call(message, "memberId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.memberId); + if (message.power != null && Object.hasOwnProperty.call(message, "power")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.power); + return writer; + }; + + /** + * Encodes the specified GroupMemberEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry} message GroupMemberEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupMemberEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupMemberEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} GroupMemberEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.memberId = reader.bytes(); + break; + case 2: + message.power = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupMemberEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} GroupMemberEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupMemberEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupMemberEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupMemberEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.memberId != null && message.hasOwnProperty("memberId")) + if (!(message.memberId && typeof message.memberId.length === "number" || $util.isString(message.memberId))) + return "memberId: buffer expected"; + if (message.power != null && message.hasOwnProperty("power")) + if (!$util.isInteger(message.power)) + return "power: integer expected"; + return null; + }; + + /** + * Creates a GroupMemberEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} GroupMemberEntry + */ + GroupMemberEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry(); + if (object.memberId != null) + if (typeof object.memberId === "string") + $util.base64.decode(object.memberId, message.memberId = $util.newBuffer($util.base64.length(object.memberId)), 0); + else if (object.memberId.length >= 0) + message.memberId = object.memberId; + if (object.power != null) + message.power = object.power >>> 0; + return message; + }; + + /** + * Creates a plain object from a GroupMemberEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} message GroupMemberEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupMemberEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.memberId = ""; + else { + object.memberId = []; + if (options.bytes !== Array) + object.memberId = $util.newBuffer(object.memberId); + } + object.power = 0; + } + if (message.memberId != null && message.hasOwnProperty("memberId")) + object.memberId = options.bytes === String ? $util.base64.encode(message.memberId, 0, message.memberId.length) : options.bytes === Array ? Array.prototype.slice.call(message.memberId) : message.memberId; + if (message.power != null && message.hasOwnProperty("power")) + object.power = message.power; + return object; + }; + + /** + * Converts this GroupMemberEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupMemberEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupMemberEntry; + })(); + + GetGroupInfosResponseV0.GroupPositionInfoEntry = (function() { + + /** + * Properties of a GroupPositionInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @interface IGroupPositionInfoEntry + * @property {number|null} [groupContractPosition] GroupPositionInfoEntry groupContractPosition + * @property {Array.<org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry>|null} [members] GroupPositionInfoEntry members + * @property {number|null} [groupRequiredPower] GroupPositionInfoEntry groupRequiredPower + */ + + /** + * Constructs a new GroupPositionInfoEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @classdesc Represents a GroupPositionInfoEntry. + * @implements IGroupPositionInfoEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry=} [properties] Properties to set + */ + function GroupPositionInfoEntry(properties) { + this.members = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupPositionInfoEntry groupContractPosition. + * @member {number} groupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @instance + */ + GroupPositionInfoEntry.prototype.groupContractPosition = 0; + + /** + * GroupPositionInfoEntry members. + * @member {Array.<org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupMemberEntry>} members + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @instance + */ + GroupPositionInfoEntry.prototype.members = $util.emptyArray; + + /** + * GroupPositionInfoEntry groupRequiredPower. + * @member {number} groupRequiredPower + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @instance + */ + GroupPositionInfoEntry.prototype.groupRequiredPower = 0; + + /** + * Creates a new GroupPositionInfoEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} GroupPositionInfoEntry instance + */ + GroupPositionInfoEntry.create = function create(properties) { + return new GroupPositionInfoEntry(properties); + }; + + /** + * Encodes the specified GroupPositionInfoEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry} message GroupPositionInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupPositionInfoEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupContractPosition != null && Object.hasOwnProperty.call(message, "groupContractPosition")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.groupContractPosition); + if (message.members != null && message.members.length) + for (var i = 0; i < message.members.length; ++i) + $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.encode(message.members[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.groupRequiredPower != null && Object.hasOwnProperty.call(message, "groupRequiredPower")) + writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.groupRequiredPower); + return writer; + }; + + /** + * Encodes the specified GroupPositionInfoEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry} message GroupPositionInfoEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupPositionInfoEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupPositionInfoEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} GroupPositionInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupPositionInfoEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupContractPosition = reader.uint32(); + break; + case 2: + if (!(message.members && message.members.length)) + message.members = []; + message.members.push($root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.decode(reader, reader.uint32())); + break; + case 3: + message.groupRequiredPower = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupPositionInfoEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} GroupPositionInfoEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupPositionInfoEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupPositionInfoEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupPositionInfoEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + if (!$util.isInteger(message.groupContractPosition)) + return "groupContractPosition: integer expected"; + if (message.members != null && message.hasOwnProperty("members")) { + if (!Array.isArray(message.members)) + return "members: array expected"; + for (var i = 0; i < message.members.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.verify(message.members[i]); + if (error) + return "members." + error; + } + } + if (message.groupRequiredPower != null && message.hasOwnProperty("groupRequiredPower")) + if (!$util.isInteger(message.groupRequiredPower)) + return "groupRequiredPower: integer expected"; + return null; + }; + + /** + * Creates a GroupPositionInfoEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} GroupPositionInfoEntry + */ + GroupPositionInfoEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry(); + if (object.groupContractPosition != null) + message.groupContractPosition = object.groupContractPosition >>> 0; + if (object.members) { + if (!Array.isArray(object.members)) + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.members: array expected"); + message.members = []; + for (var i = 0; i < object.members.length; ++i) { + if (typeof object.members[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.members: object expected"); + message.members[i] = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.fromObject(object.members[i]); + } + } + if (object.groupRequiredPower != null) + message.groupRequiredPower = object.groupRequiredPower >>> 0; + return message; + }; + + /** + * Creates a plain object from a GroupPositionInfoEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} message GroupPositionInfoEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupPositionInfoEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.members = []; + if (options.defaults) { + object.groupContractPosition = 0; + object.groupRequiredPower = 0; + } + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + object.groupContractPosition = message.groupContractPosition; + if (message.members && message.members.length) { + object.members = []; + for (var j = 0; j < message.members.length; ++j) + object.members[j] = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject(message.members[j], options); + } + if (message.groupRequiredPower != null && message.hasOwnProperty("groupRequiredPower")) + object.groupRequiredPower = message.groupRequiredPower; + return object; + }; + + /** + * Converts this GroupPositionInfoEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupPositionInfoEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupPositionInfoEntry; + })(); + + GetGroupInfosResponseV0.GroupInfos = (function() { + + /** + * Properties of a GroupInfos. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @interface IGroupInfos + * @property {Array.<org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry>|null} [groupInfos] GroupInfos groupInfos + */ + + /** + * Constructs a new GroupInfos. + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 + * @classdesc Represents a GroupInfos. + * @implements IGroupInfos + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos=} [properties] Properties to set + */ + function GroupInfos(properties) { + this.groupInfos = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupInfos groupInfos. + * @member {Array.<org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupPositionInfoEntry>} groupInfos + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @instance + */ + GroupInfos.prototype.groupInfos = $util.emptyArray; + + /** + * Creates a new GroupInfos instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} GroupInfos instance + */ + GroupInfos.create = function create(properties) { + return new GroupInfos(properties); + }; + + /** + * Encodes the specified GroupInfos message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos} message GroupInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfos.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupInfos != null && message.groupInfos.length) + for (var i = 0; i < message.groupInfos.length; ++i) + $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.encode(message.groupInfos[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupInfos message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.IGroupInfos} message GroupInfos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupInfos.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupInfos message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} GroupInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfos.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.groupInfos && message.groupInfos.length)) + message.groupInfos = []; + message.groupInfos.push($root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupInfos message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} GroupInfos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupInfos.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupInfos message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupInfos.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupInfos != null && message.hasOwnProperty("groupInfos")) { + if (!Array.isArray(message.groupInfos)) + return "groupInfos: array expected"; + for (var i = 0; i < message.groupInfos.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.verify(message.groupInfos[i]); + if (error) + return "groupInfos." + error; + } + } + return null; + }; + + /** + * Creates a GroupInfos message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} GroupInfos + */ + GroupInfos.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos(); + if (object.groupInfos) { + if (!Array.isArray(object.groupInfos)) + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.groupInfos: array expected"); + message.groupInfos = []; + for (var i = 0; i < object.groupInfos.length; ++i) { + if (typeof object.groupInfos[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.groupInfos: object expected"); + message.groupInfos[i] = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.fromObject(object.groupInfos[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a GroupInfos message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @static + * @param {org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} message GroupInfos + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupInfos.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.groupInfos = []; + if (message.groupInfos && message.groupInfos.length) { + object.groupInfos = []; + for (var j = 0; j < message.groupInfos.length; ++j) + object.groupInfos[j] = $root.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject(message.groupInfos[j], options); + } + return object; + }; + + /** + * Converts this GroupInfos to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupInfos.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupInfos; + })(); + + return GetGroupInfosResponseV0; + })(); + + return GetGroupInfosResponse; + })(); + + v0.GetGroupActionsRequest = (function() { + + /** + * Properties of a GetGroupActionsRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupActionsRequest + * @property {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0|null} [v0] GetGroupActionsRequest v0 + */ + + /** + * Constructs a new GetGroupActionsRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupActionsRequest. + * @implements IGetGroupActionsRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest=} [properties] Properties to set + */ + function GetGroupActionsRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionsRequest v0. + * @member {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @instance + */ + GetGroupActionsRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionsRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @instance + */ + Object.defineProperty(GetGroupActionsRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionsRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest} GetGroupActionsRequest instance + */ + GetGroupActionsRequest.create = function create(properties) { + return new GetGroupActionsRequest(properties); + }; + + /** + * Encodes the specified GetGroupActionsRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest} message GetGroupActionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionsRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsRequest} message GetGroupActionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionsRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest} GetGroupActionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest} GetGroupActionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionsRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupActionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest} GetGroupActionsRequest + */ + GetGroupActionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest} message GetGroupActionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupActionsRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ActionStatus enum. + * @name org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus + * @enum {number} + * @property {number} ACTIVE=0 ACTIVE value + * @property {number} CLOSED=1 CLOSED value + */ + GetGroupActionsRequest.ActionStatus = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ACTIVE"] = 0; + values[valuesById[1] = "CLOSED"] = 1; + return values; + })(); + + GetGroupActionsRequest.StartAtActionId = (function() { + + /** + * Properties of a StartAtActionId. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @interface IStartAtActionId + * @property {Uint8Array|null} [startActionId] StartAtActionId startActionId + * @property {boolean|null} [startActionIdIncluded] StartAtActionId startActionIdIncluded + */ + + /** + * Constructs a new StartAtActionId. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @classdesc Represents a StartAtActionId. + * @implements IStartAtActionId + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId=} [properties] Properties to set + */ + function StartAtActionId(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartAtActionId startActionId. + * @member {Uint8Array} startActionId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @instance + */ + StartAtActionId.prototype.startActionId = $util.newBuffer([]); + + /** + * StartAtActionId startActionIdIncluded. + * @member {boolean} startActionIdIncluded + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @instance + */ + StartAtActionId.prototype.startActionIdIncluded = false; + + /** + * Creates a new StartAtActionId instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} StartAtActionId instance + */ + StartAtActionId.create = function create(properties) { + return new StartAtActionId(properties); + }; + + /** + * Encodes the specified StartAtActionId message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId} message StartAtActionId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtActionId.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.startActionId != null && Object.hasOwnProperty.call(message, "startActionId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.startActionId); + if (message.startActionIdIncluded != null && Object.hasOwnProperty.call(message, "startActionIdIncluded")) + writer.uint32(/* id 2, wireType 0 =*/16).bool(message.startActionIdIncluded); + return writer; + }; + + /** + * Encodes the specified StartAtActionId message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId} message StartAtActionId message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartAtActionId.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartAtActionId message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} StartAtActionId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtActionId.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.startActionId = reader.bytes(); + break; + case 2: + message.startActionIdIncluded = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartAtActionId message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} StartAtActionId + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartAtActionId.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartAtActionId message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartAtActionId.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.startActionId != null && message.hasOwnProperty("startActionId")) + if (!(message.startActionId && typeof message.startActionId.length === "number" || $util.isString(message.startActionId))) + return "startActionId: buffer expected"; + if (message.startActionIdIncluded != null && message.hasOwnProperty("startActionIdIncluded")) + if (typeof message.startActionIdIncluded !== "boolean") + return "startActionIdIncluded: boolean expected"; + return null; + }; + + /** + * Creates a StartAtActionId message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} StartAtActionId + */ + StartAtActionId.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId(); + if (object.startActionId != null) + if (typeof object.startActionId === "string") + $util.base64.decode(object.startActionId, message.startActionId = $util.newBuffer($util.base64.length(object.startActionId)), 0); + else if (object.startActionId.length >= 0) + message.startActionId = object.startActionId; + if (object.startActionIdIncluded != null) + message.startActionIdIncluded = Boolean(object.startActionIdIncluded); + return message; + }; + + /** + * Creates a plain object from a StartAtActionId message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} message StartAtActionId + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + StartAtActionId.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.startActionId = ""; + else { + object.startActionId = []; + if (options.bytes !== Array) + object.startActionId = $util.newBuffer(object.startActionId); + } + object.startActionIdIncluded = false; + } + if (message.startActionId != null && message.hasOwnProperty("startActionId")) + object.startActionId = options.bytes === String ? $util.base64.encode(message.startActionId, 0, message.startActionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.startActionId) : message.startActionId; + if (message.startActionIdIncluded != null && message.hasOwnProperty("startActionIdIncluded")) + object.startActionIdIncluded = message.startActionIdIncluded; + return object; + }; + + /** + * Converts this StartAtActionId to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId + * @instance + * @returns {Object.<string,*>} JSON object + */ + StartAtActionId.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StartAtActionId; + })(); + + GetGroupActionsRequest.GetGroupActionsRequestV0 = (function() { + + /** + * Properties of a GetGroupActionsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @interface IGetGroupActionsRequestV0 + * @property {Uint8Array|null} [contractId] GetGroupActionsRequestV0 contractId + * @property {number|null} [groupContractPosition] GetGroupActionsRequestV0 groupContractPosition + * @property {org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus|null} [status] GetGroupActionsRequestV0 status + * @property {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId|null} [startAtActionId] GetGroupActionsRequestV0 startAtActionId + * @property {number|null} [count] GetGroupActionsRequestV0 count + * @property {boolean|null} [prove] GetGroupActionsRequestV0 prove + */ + + /** + * Constructs a new GetGroupActionsRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest + * @classdesc Represents a GetGroupActionsRequestV0. + * @implements IGetGroupActionsRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0=} [properties] Properties to set + */ + function GetGroupActionsRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionsRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.contractId = $util.newBuffer([]); + + /** + * GetGroupActionsRequestV0 groupContractPosition. + * @member {number} groupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.groupContractPosition = 0; + + /** + * GetGroupActionsRequestV0 status. + * @member {org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} status + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.status = 0; + + /** + * GetGroupActionsRequestV0 startAtActionId. + * @member {org.dash.platform.dapi.v0.GetGroupActionsRequest.IStartAtActionId|null|undefined} startAtActionId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.startAtActionId = null; + + /** + * GetGroupActionsRequestV0 count. + * @member {number} count + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.count = 0; + + /** + * GetGroupActionsRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + */ + GetGroupActionsRequestV0.prototype.prove = false; + + /** + * Creates a new GetGroupActionsRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} GetGroupActionsRequestV0 instance + */ + GetGroupActionsRequestV0.create = function create(properties) { + return new GetGroupActionsRequestV0(properties); + }; + + /** + * Encodes the specified GetGroupActionsRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0} message GetGroupActionsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.contractId); + if (message.groupContractPosition != null && Object.hasOwnProperty.call(message, "groupContractPosition")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.groupContractPosition); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.status); + if (message.startAtActionId != null && Object.hasOwnProperty.call(message, "startAtActionId")) + $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.encode(message.startAtActionId, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.count != null && Object.hasOwnProperty.call(message, "count")) + writer.uint32(/* id 5, wireType 0 =*/40).uint32(message.count); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 6, wireType 0 =*/48).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetGroupActionsRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.IGetGroupActionsRequestV0} message GetGroupActionsRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionsRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} GetGroupActionsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.contractId = reader.bytes(); + break; + case 2: + message.groupContractPosition = reader.uint32(); + break; + case 3: + message.status = reader.int32(); + break; + case 4: + message.startAtActionId = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.decode(reader, reader.uint32()); + break; + case 5: + message.count = reader.uint32(); + break; + case 6: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionsRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} GetGroupActionsRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionsRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionsRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + if (!$util.isInteger(message.groupContractPosition)) + return "groupContractPosition: integer expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 0: + case 1: + break; + } + if (message.startAtActionId != null && message.hasOwnProperty("startAtActionId")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.verify(message.startAtActionId); + if (error) + return "startAtActionId." + error; + } + if (message.count != null && message.hasOwnProperty("count")) + if (!$util.isInteger(message.count)) + return "count: integer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetGroupActionsRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} GetGroupActionsRequestV0 + */ + GetGroupActionsRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0(); + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; + if (object.groupContractPosition != null) + message.groupContractPosition = object.groupContractPosition >>> 0; + switch (object.status) { + case "ACTIVE": + case 0: + message.status = 0; + break; + case "CLOSED": + case 1: + message.status = 1; + break; + } + if (object.startAtActionId != null) { + if (typeof object.startAtActionId !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.startAtActionId: object expected"); + message.startAtActionId = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.fromObject(object.startAtActionId); + } + if (object.count != null) + message.count = object.count >>> 0; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetGroupActionsRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} message GetGroupActionsRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionsRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); + } + object.groupContractPosition = 0; + object.status = options.enums === String ? "ACTIVE" : 0; + object.startAtActionId = null; + object.count = 0; + object.prove = false; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + object.groupContractPosition = message.groupContractPosition; + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus[message.status] : message.status; + if (message.startAtActionId != null && message.hasOwnProperty("startAtActionId")) + object.startAtActionId = $root.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject(message.startAtActionId, options); + if (message.count != null && message.hasOwnProperty("count")) + object.count = message.count; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetGroupActionsRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionsRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetGroupActionsRequestV0; + })(); + + return GetGroupActionsRequest; + })(); + + v0.GetGroupActionsResponse = (function() { + + /** + * Properties of a GetGroupActionsResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupActionsResponse + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0|null} [v0] GetGroupActionsResponse v0 + */ + + /** + * Constructs a new GetGroupActionsResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupActionsResponse. + * @implements IGetGroupActionsResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupActionsResponse=} [properties] Properties to set + */ + function GetGroupActionsResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionsResponse v0. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @instance + */ + GetGroupActionsResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionsResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @instance + */ + Object.defineProperty(GetGroupActionsResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionsResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse} GetGroupActionsResponse instance + */ + GetGroupActionsResponse.create = function create(properties) { + return new GetGroupActionsResponse(properties); + }; + + /** + * Encodes the specified GetGroupActionsResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsResponse} message GetGroupActionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionsResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionsResponse} message GetGroupActionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionsResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse} GetGroupActionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse} GetGroupActionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionsResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupActionsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse} GetGroupActionsResponse + */ + GetGroupActionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse} message GetGroupActionsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupActionsResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupActionsResponse.GetGroupActionsResponseV0 = (function() { + + /** + * Properties of a GetGroupActionsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @interface IGetGroupActionsResponseV0 + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions|null} [groupActions] GetGroupActionsResponseV0 groupActions + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetGroupActionsResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetGroupActionsResponseV0 metadata + */ + + /** + * Constructs a new GetGroupActionsResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse + * @classdesc Represents a GetGroupActionsResponseV0. + * @implements IGetGroupActionsResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0=} [properties] Properties to set + */ + function GetGroupActionsResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionsResponseV0 groupActions. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions|null|undefined} groupActions + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @instance + */ + GetGroupActionsResponseV0.prototype.groupActions = null; + + /** + * GetGroupActionsResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @instance + */ + GetGroupActionsResponseV0.prototype.proof = null; + + /** + * GetGroupActionsResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @instance + */ + GetGroupActionsResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionsResponseV0 result. + * @member {"groupActions"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @instance + */ + Object.defineProperty(GetGroupActionsResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["groupActions", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionsResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} GetGroupActionsResponseV0 instance + */ + GetGroupActionsResponseV0.create = function create(properties) { + return new GetGroupActionsResponseV0(properties); + }; + + /** + * Encodes the specified GetGroupActionsResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0} message GetGroupActionsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupActions != null && Object.hasOwnProperty.call(message, "groupActions")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.encode(message.groupActions, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionsResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.IGetGroupActionsResponseV0} message GetGroupActionsResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionsResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionsResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} GetGroupActionsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupActions = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionsResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} GetGroupActionsResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionsResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionsResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionsResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.groupActions != null && message.hasOwnProperty("groupActions")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.verify(message.groupActions); + if (error) + return "groupActions." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetGroupActionsResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} GetGroupActionsResponseV0 + */ + GetGroupActionsResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0(); + if (object.groupActions != null) { + if (typeof object.groupActions !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.groupActions: object expected"); + message.groupActions = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.fromObject(object.groupActions); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionsResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} message GetGroupActionsResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionsResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.groupActions != null && message.hasOwnProperty("groupActions")) { + object.groupActions = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject(message.groupActions, options); + if (options.oneofs) + object.result = "groupActions"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetGroupActionsResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionsResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupActionsResponseV0.MintEvent = (function() { + + /** + * Properties of a MintEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IMintEvent + * @property {number|Long|null} [amount] MintEvent amount + * @property {Uint8Array|null} [recipientId] MintEvent recipientId + * @property {string|null} [publicNote] MintEvent publicNote + */ + + /** + * Constructs a new MintEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a MintEvent. + * @implements IMintEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent=} [properties] Properties to set + */ + function MintEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * MintEvent amount. + * @member {number|Long} amount + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @instance + */ + MintEvent.prototype.amount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * MintEvent recipientId. + * @member {Uint8Array} recipientId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @instance + */ + MintEvent.prototype.recipientId = $util.newBuffer([]); + + /** + * MintEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @instance + */ + MintEvent.prototype.publicNote = ""; + + /** + * Creates a new MintEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} MintEvent instance + */ + MintEvent.create = function create(properties) { + return new MintEvent(properties); + }; + + /** + * Encodes the specified MintEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent} message MintEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MintEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.amount); + if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) + writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.recipientId); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified MintEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent} message MintEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + MintEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a MintEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} MintEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MintEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.amount = reader.uint64(); + break; + case 2: + message.recipientId = reader.bytes(); + break; + case 3: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a MintEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} MintEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + MintEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a MintEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + MintEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.amount != null && message.hasOwnProperty("amount")) + if (!$util.isInteger(message.amount) && !(message.amount && $util.isInteger(message.amount.low) && $util.isInteger(message.amount.high))) + return "amount: integer|Long expected"; + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + if (!(message.recipientId && typeof message.recipientId.length === "number" || $util.isString(message.recipientId))) + return "recipientId: buffer expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates a MintEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} MintEvent + */ + MintEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent(); + if (object.amount != null) + if ($util.Long) + (message.amount = $util.Long.fromValue(object.amount)).unsigned = true; + else if (typeof object.amount === "string") + message.amount = parseInt(object.amount, 10); + else if (typeof object.amount === "number") + message.amount = object.amount; + else if (typeof object.amount === "object") + message.amount = new $util.LongBits(object.amount.low >>> 0, object.amount.high >>> 0).toNumber(true); + if (object.recipientId != null) + if (typeof object.recipientId === "string") + $util.base64.decode(object.recipientId, message.recipientId = $util.newBuffer($util.base64.length(object.recipientId)), 0); + else if (object.recipientId.length >= 0) + message.recipientId = object.recipientId; + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from a MintEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} message MintEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + MintEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount = options.longs === String ? "0" : 0; + if (options.bytes === String) + object.recipientId = ""; + else { + object.recipientId = []; + if (options.bytes !== Array) + object.recipientId = $util.newBuffer(object.recipientId); + } + object.publicNote = ""; + } + if (message.amount != null && message.hasOwnProperty("amount")) + if (typeof message.amount === "number") + object.amount = options.longs === String ? String(message.amount) : message.amount; + else + object.amount = options.longs === String ? $util.Long.prototype.toString.call(message.amount) : options.longs === Number ? new $util.LongBits(message.amount.low >>> 0, message.amount.high >>> 0).toNumber(true) : message.amount; + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + object.recipientId = options.bytes === String ? $util.base64.encode(message.recipientId, 0, message.recipientId.length) : options.bytes === Array ? Array.prototype.slice.call(message.recipientId) : message.recipientId; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this MintEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + MintEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return MintEvent; + })(); + + GetGroupActionsResponseV0.BurnEvent = (function() { + + /** + * Properties of a BurnEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IBurnEvent + * @property {number|Long|null} [amount] BurnEvent amount + * @property {string|null} [publicNote] BurnEvent publicNote + */ + + /** + * Constructs a new BurnEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a BurnEvent. + * @implements IBurnEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent=} [properties] Properties to set + */ + function BurnEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BurnEvent amount. + * @member {number|Long} amount + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @instance + */ + BurnEvent.prototype.amount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * BurnEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @instance + */ + BurnEvent.prototype.publicNote = ""; + + /** + * Creates a new BurnEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} BurnEvent instance + */ + BurnEvent.create = function create(properties) { + return new BurnEvent(properties); + }; + + /** + * Encodes the specified BurnEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent} message BurnEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BurnEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.amount); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified BurnEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent} message BurnEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BurnEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BurnEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} BurnEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BurnEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.amount = reader.uint64(); + break; + case 2: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BurnEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} BurnEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BurnEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BurnEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BurnEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.amount != null && message.hasOwnProperty("amount")) + if (!$util.isInteger(message.amount) && !(message.amount && $util.isInteger(message.amount.low) && $util.isInteger(message.amount.high))) + return "amount: integer|Long expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates a BurnEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} BurnEvent + */ + BurnEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent(); + if (object.amount != null) + if ($util.Long) + (message.amount = $util.Long.fromValue(object.amount)).unsigned = true; + else if (typeof object.amount === "string") + message.amount = parseInt(object.amount, 10); + else if (typeof object.amount === "number") + message.amount = object.amount; + else if (typeof object.amount === "object") + message.amount = new $util.LongBits(object.amount.low >>> 0, object.amount.high >>> 0).toNumber(true); + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from a BurnEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} message BurnEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + BurnEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount = options.longs === String ? "0" : 0; + object.publicNote = ""; + } + if (message.amount != null && message.hasOwnProperty("amount")) + if (typeof message.amount === "number") + object.amount = options.longs === String ? String(message.amount) : message.amount; + else + object.amount = options.longs === String ? $util.Long.prototype.toString.call(message.amount) : options.longs === Number ? new $util.LongBits(message.amount.low >>> 0, message.amount.high >>> 0).toNumber(true) : message.amount; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this BurnEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + BurnEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return BurnEvent; + })(); + + GetGroupActionsResponseV0.FreezeEvent = (function() { + + /** + * Properties of a FreezeEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IFreezeEvent + * @property {Uint8Array|null} [frozenId] FreezeEvent frozenId + * @property {string|null} [publicNote] FreezeEvent publicNote + */ + + /** + * Constructs a new FreezeEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a FreezeEvent. + * @implements IFreezeEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent=} [properties] Properties to set + */ + function FreezeEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * FreezeEvent frozenId. + * @member {Uint8Array} frozenId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @instance + */ + FreezeEvent.prototype.frozenId = $util.newBuffer([]); + + /** + * FreezeEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @instance + */ + FreezeEvent.prototype.publicNote = ""; + + /** + * Creates a new FreezeEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} FreezeEvent instance + */ + FreezeEvent.create = function create(properties) { + return new FreezeEvent(properties); + }; + + /** + * Encodes the specified FreezeEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent} message FreezeEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FreezeEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.frozenId != null && Object.hasOwnProperty.call(message, "frozenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.frozenId); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified FreezeEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent} message FreezeEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + FreezeEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a FreezeEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} FreezeEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FreezeEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.frozenId = reader.bytes(); + break; + case 2: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a FreezeEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} FreezeEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + FreezeEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a FreezeEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + FreezeEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + if (!(message.frozenId && typeof message.frozenId.length === "number" || $util.isString(message.frozenId))) + return "frozenId: buffer expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates a FreezeEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} FreezeEvent + */ + FreezeEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent(); + if (object.frozenId != null) + if (typeof object.frozenId === "string") + $util.base64.decode(object.frozenId, message.frozenId = $util.newBuffer($util.base64.length(object.frozenId)), 0); + else if (object.frozenId.length >= 0) + message.frozenId = object.frozenId; + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from a FreezeEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} message FreezeEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + FreezeEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.frozenId = ""; + else { + object.frozenId = []; + if (options.bytes !== Array) + object.frozenId = $util.newBuffer(object.frozenId); + } + object.publicNote = ""; + } + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + object.frozenId = options.bytes === String ? $util.base64.encode(message.frozenId, 0, message.frozenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.frozenId) : message.frozenId; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this FreezeEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + FreezeEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return FreezeEvent; + })(); + + GetGroupActionsResponseV0.UnfreezeEvent = (function() { + + /** + * Properties of an UnfreezeEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IUnfreezeEvent + * @property {Uint8Array|null} [frozenId] UnfreezeEvent frozenId + * @property {string|null} [publicNote] UnfreezeEvent publicNote + */ + + /** + * Constructs a new UnfreezeEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents an UnfreezeEvent. + * @implements IUnfreezeEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent=} [properties] Properties to set + */ + function UnfreezeEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UnfreezeEvent frozenId. + * @member {Uint8Array} frozenId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @instance + */ + UnfreezeEvent.prototype.frozenId = $util.newBuffer([]); + + /** + * UnfreezeEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @instance + */ + UnfreezeEvent.prototype.publicNote = ""; + + /** + * Creates a new UnfreezeEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} UnfreezeEvent instance + */ + UnfreezeEvent.create = function create(properties) { + return new UnfreezeEvent(properties); + }; + + /** + * Encodes the specified UnfreezeEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent} message UnfreezeEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnfreezeEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.frozenId != null && Object.hasOwnProperty.call(message, "frozenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.frozenId); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified UnfreezeEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent} message UnfreezeEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UnfreezeEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an UnfreezeEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} UnfreezeEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnfreezeEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.frozenId = reader.bytes(); + break; + case 2: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an UnfreezeEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} UnfreezeEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UnfreezeEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an UnfreezeEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UnfreezeEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + if (!(message.frozenId && typeof message.frozenId.length === "number" || $util.isString(message.frozenId))) + return "frozenId: buffer expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates an UnfreezeEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} UnfreezeEvent + */ + UnfreezeEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent(); + if (object.frozenId != null) + if (typeof object.frozenId === "string") + $util.base64.decode(object.frozenId, message.frozenId = $util.newBuffer($util.base64.length(object.frozenId)), 0); + else if (object.frozenId.length >= 0) + message.frozenId = object.frozenId; + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from an UnfreezeEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} message UnfreezeEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + UnfreezeEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.frozenId = ""; + else { + object.frozenId = []; + if (options.bytes !== Array) + object.frozenId = $util.newBuffer(object.frozenId); + } + object.publicNote = ""; + } + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + object.frozenId = options.bytes === String ? $util.base64.encode(message.frozenId, 0, message.frozenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.frozenId) : message.frozenId; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this UnfreezeEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + UnfreezeEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return UnfreezeEvent; + })(); + + GetGroupActionsResponseV0.DestroyFrozenFundsEvent = (function() { + + /** + * Properties of a DestroyFrozenFundsEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IDestroyFrozenFundsEvent + * @property {Uint8Array|null} [frozenId] DestroyFrozenFundsEvent frozenId + * @property {number|Long|null} [amount] DestroyFrozenFundsEvent amount + * @property {string|null} [publicNote] DestroyFrozenFundsEvent publicNote + */ + + /** + * Constructs a new DestroyFrozenFundsEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a DestroyFrozenFundsEvent. + * @implements IDestroyFrozenFundsEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent=} [properties] Properties to set + */ + function DestroyFrozenFundsEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DestroyFrozenFundsEvent frozenId. + * @member {Uint8Array} frozenId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @instance + */ + DestroyFrozenFundsEvent.prototype.frozenId = $util.newBuffer([]); + + /** + * DestroyFrozenFundsEvent amount. + * @member {number|Long} amount + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @instance + */ + DestroyFrozenFundsEvent.prototype.amount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * DestroyFrozenFundsEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @instance + */ + DestroyFrozenFundsEvent.prototype.publicNote = ""; + + /** + * Creates a new DestroyFrozenFundsEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} DestroyFrozenFundsEvent instance + */ + DestroyFrozenFundsEvent.create = function create(properties) { + return new DestroyFrozenFundsEvent(properties); + }; + + /** + * Encodes the specified DestroyFrozenFundsEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent} message DestroyFrozenFundsEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DestroyFrozenFundsEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.frozenId != null && Object.hasOwnProperty.call(message, "frozenId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.frozenId); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.amount); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified DestroyFrozenFundsEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent} message DestroyFrozenFundsEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DestroyFrozenFundsEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DestroyFrozenFundsEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} DestroyFrozenFundsEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DestroyFrozenFundsEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.frozenId = reader.bytes(); + break; + case 2: + message.amount = reader.uint64(); + break; + case 3: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DestroyFrozenFundsEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} DestroyFrozenFundsEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DestroyFrozenFundsEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DestroyFrozenFundsEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DestroyFrozenFundsEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + if (!(message.frozenId && typeof message.frozenId.length === "number" || $util.isString(message.frozenId))) + return "frozenId: buffer expected"; + if (message.amount != null && message.hasOwnProperty("amount")) + if (!$util.isInteger(message.amount) && !(message.amount && $util.isInteger(message.amount.low) && $util.isInteger(message.amount.high))) + return "amount: integer|Long expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates a DestroyFrozenFundsEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} DestroyFrozenFundsEvent + */ + DestroyFrozenFundsEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent(); + if (object.frozenId != null) + if (typeof object.frozenId === "string") + $util.base64.decode(object.frozenId, message.frozenId = $util.newBuffer($util.base64.length(object.frozenId)), 0); + else if (object.frozenId.length >= 0) + message.frozenId = object.frozenId; + if (object.amount != null) + if ($util.Long) + (message.amount = $util.Long.fromValue(object.amount)).unsigned = true; + else if (typeof object.amount === "string") + message.amount = parseInt(object.amount, 10); + else if (typeof object.amount === "number") + message.amount = object.amount; + else if (typeof object.amount === "object") + message.amount = new $util.LongBits(object.amount.low >>> 0, object.amount.high >>> 0).toNumber(true); + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from a DestroyFrozenFundsEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} message DestroyFrozenFundsEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + DestroyFrozenFundsEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.frozenId = ""; + else { + object.frozenId = []; + if (options.bytes !== Array) + object.frozenId = $util.newBuffer(object.frozenId); + } + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount = options.longs === String ? "0" : 0; + object.publicNote = ""; + } + if (message.frozenId != null && message.hasOwnProperty("frozenId")) + object.frozenId = options.bytes === String ? $util.base64.encode(message.frozenId, 0, message.frozenId.length) : options.bytes === Array ? Array.prototype.slice.call(message.frozenId) : message.frozenId; + if (message.amount != null && message.hasOwnProperty("amount")) + if (typeof message.amount === "number") + object.amount = options.longs === String ? String(message.amount) : message.amount; + else + object.amount = options.longs === String ? $util.Long.prototype.toString.call(message.amount) : options.longs === Number ? new $util.LongBits(message.amount.low >>> 0, message.amount.high >>> 0).toNumber(true) : message.amount; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this DestroyFrozenFundsEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + DestroyFrozenFundsEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DestroyFrozenFundsEvent; + })(); + + GetGroupActionsResponseV0.SharedEncryptedNote = (function() { + + /** + * Properties of a SharedEncryptedNote. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface ISharedEncryptedNote + * @property {number|null} [senderKeyIndex] SharedEncryptedNote senderKeyIndex + * @property {number|null} [recipientKeyIndex] SharedEncryptedNote recipientKeyIndex + * @property {Uint8Array|null} [encryptedData] SharedEncryptedNote encryptedData + */ + + /** + * Constructs a new SharedEncryptedNote. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a SharedEncryptedNote. + * @implements ISharedEncryptedNote + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote=} [properties] Properties to set + */ + function SharedEncryptedNote(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * SharedEncryptedNote senderKeyIndex. + * @member {number} senderKeyIndex + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @instance + */ + SharedEncryptedNote.prototype.senderKeyIndex = 0; + + /** + * SharedEncryptedNote recipientKeyIndex. + * @member {number} recipientKeyIndex + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @instance + */ + SharedEncryptedNote.prototype.recipientKeyIndex = 0; + + /** + * SharedEncryptedNote encryptedData. + * @member {Uint8Array} encryptedData + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @instance + */ + SharedEncryptedNote.prototype.encryptedData = $util.newBuffer([]); + + /** + * Creates a new SharedEncryptedNote instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} SharedEncryptedNote instance + */ + SharedEncryptedNote.create = function create(properties) { + return new SharedEncryptedNote(properties); + }; + + /** + * Encodes the specified SharedEncryptedNote message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote} message SharedEncryptedNote message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SharedEncryptedNote.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.senderKeyIndex != null && Object.hasOwnProperty.call(message, "senderKeyIndex")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.senderKeyIndex); + if (message.recipientKeyIndex != null && Object.hasOwnProperty.call(message, "recipientKeyIndex")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.recipientKeyIndex); + if (message.encryptedData != null && Object.hasOwnProperty.call(message, "encryptedData")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.encryptedData); + return writer; + }; + + /** + * Encodes the specified SharedEncryptedNote message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote} message SharedEncryptedNote message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + SharedEncryptedNote.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a SharedEncryptedNote message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} SharedEncryptedNote + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SharedEncryptedNote.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.senderKeyIndex = reader.uint32(); + break; + case 2: + message.recipientKeyIndex = reader.uint32(); + break; + case 3: + message.encryptedData = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a SharedEncryptedNote message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} SharedEncryptedNote + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + SharedEncryptedNote.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a SharedEncryptedNote message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + SharedEncryptedNote.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.senderKeyIndex != null && message.hasOwnProperty("senderKeyIndex")) + if (!$util.isInteger(message.senderKeyIndex)) + return "senderKeyIndex: integer expected"; + if (message.recipientKeyIndex != null && message.hasOwnProperty("recipientKeyIndex")) + if (!$util.isInteger(message.recipientKeyIndex)) + return "recipientKeyIndex: integer expected"; + if (message.encryptedData != null && message.hasOwnProperty("encryptedData")) + if (!(message.encryptedData && typeof message.encryptedData.length === "number" || $util.isString(message.encryptedData))) + return "encryptedData: buffer expected"; + return null; + }; + + /** + * Creates a SharedEncryptedNote message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} SharedEncryptedNote + */ + SharedEncryptedNote.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote(); + if (object.senderKeyIndex != null) + message.senderKeyIndex = object.senderKeyIndex >>> 0; + if (object.recipientKeyIndex != null) + message.recipientKeyIndex = object.recipientKeyIndex >>> 0; + if (object.encryptedData != null) + if (typeof object.encryptedData === "string") + $util.base64.decode(object.encryptedData, message.encryptedData = $util.newBuffer($util.base64.length(object.encryptedData)), 0); + else if (object.encryptedData.length >= 0) + message.encryptedData = object.encryptedData; + return message; + }; + + /** + * Creates a plain object from a SharedEncryptedNote message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} message SharedEncryptedNote + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + SharedEncryptedNote.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.senderKeyIndex = 0; + object.recipientKeyIndex = 0; + if (options.bytes === String) + object.encryptedData = ""; + else { + object.encryptedData = []; + if (options.bytes !== Array) + object.encryptedData = $util.newBuffer(object.encryptedData); + } + } + if (message.senderKeyIndex != null && message.hasOwnProperty("senderKeyIndex")) + object.senderKeyIndex = message.senderKeyIndex; + if (message.recipientKeyIndex != null && message.hasOwnProperty("recipientKeyIndex")) + object.recipientKeyIndex = message.recipientKeyIndex; + if (message.encryptedData != null && message.hasOwnProperty("encryptedData")) + object.encryptedData = options.bytes === String ? $util.base64.encode(message.encryptedData, 0, message.encryptedData.length) : options.bytes === Array ? Array.prototype.slice.call(message.encryptedData) : message.encryptedData; + return object; + }; + + /** + * Converts this SharedEncryptedNote to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote + * @instance + * @returns {Object.<string,*>} JSON object + */ + SharedEncryptedNote.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return SharedEncryptedNote; + })(); + + GetGroupActionsResponseV0.PersonalEncryptedNote = (function() { + + /** + * Properties of a PersonalEncryptedNote. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IPersonalEncryptedNote + * @property {number|null} [rootEncryptionKeyIndex] PersonalEncryptedNote rootEncryptionKeyIndex + * @property {number|null} [derivationEncryptionKeyIndex] PersonalEncryptedNote derivationEncryptionKeyIndex + * @property {Uint8Array|null} [encryptedData] PersonalEncryptedNote encryptedData + */ + + /** + * Constructs a new PersonalEncryptedNote. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a PersonalEncryptedNote. + * @implements IPersonalEncryptedNote + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote=} [properties] Properties to set + */ + function PersonalEncryptedNote(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * PersonalEncryptedNote rootEncryptionKeyIndex. + * @member {number} rootEncryptionKeyIndex + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @instance + */ + PersonalEncryptedNote.prototype.rootEncryptionKeyIndex = 0; + + /** + * PersonalEncryptedNote derivationEncryptionKeyIndex. + * @member {number} derivationEncryptionKeyIndex + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @instance + */ + PersonalEncryptedNote.prototype.derivationEncryptionKeyIndex = 0; + + /** + * PersonalEncryptedNote encryptedData. + * @member {Uint8Array} encryptedData + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @instance + */ + PersonalEncryptedNote.prototype.encryptedData = $util.newBuffer([]); + + /** + * Creates a new PersonalEncryptedNote instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} PersonalEncryptedNote instance + */ + PersonalEncryptedNote.create = function create(properties) { + return new PersonalEncryptedNote(properties); + }; + + /** + * Encodes the specified PersonalEncryptedNote message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote} message PersonalEncryptedNote message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PersonalEncryptedNote.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.rootEncryptionKeyIndex != null && Object.hasOwnProperty.call(message, "rootEncryptionKeyIndex")) + writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.rootEncryptionKeyIndex); + if (message.derivationEncryptionKeyIndex != null && Object.hasOwnProperty.call(message, "derivationEncryptionKeyIndex")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.derivationEncryptionKeyIndex); + if (message.encryptedData != null && Object.hasOwnProperty.call(message, "encryptedData")) + writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.encryptedData); + return writer; + }; + + /** + * Encodes the specified PersonalEncryptedNote message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote} message PersonalEncryptedNote message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + PersonalEncryptedNote.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a PersonalEncryptedNote message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} PersonalEncryptedNote + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PersonalEncryptedNote.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.rootEncryptionKeyIndex = reader.uint32(); + break; + case 2: + message.derivationEncryptionKeyIndex = reader.uint32(); + break; + case 3: + message.encryptedData = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a PersonalEncryptedNote message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} PersonalEncryptedNote + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + PersonalEncryptedNote.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a PersonalEncryptedNote message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + PersonalEncryptedNote.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.rootEncryptionKeyIndex != null && message.hasOwnProperty("rootEncryptionKeyIndex")) + if (!$util.isInteger(message.rootEncryptionKeyIndex)) + return "rootEncryptionKeyIndex: integer expected"; + if (message.derivationEncryptionKeyIndex != null && message.hasOwnProperty("derivationEncryptionKeyIndex")) + if (!$util.isInteger(message.derivationEncryptionKeyIndex)) + return "derivationEncryptionKeyIndex: integer expected"; + if (message.encryptedData != null && message.hasOwnProperty("encryptedData")) + if (!(message.encryptedData && typeof message.encryptedData.length === "number" || $util.isString(message.encryptedData))) + return "encryptedData: buffer expected"; + return null; + }; + + /** + * Creates a PersonalEncryptedNote message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} PersonalEncryptedNote + */ + PersonalEncryptedNote.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote(); + if (object.rootEncryptionKeyIndex != null) + message.rootEncryptionKeyIndex = object.rootEncryptionKeyIndex >>> 0; + if (object.derivationEncryptionKeyIndex != null) + message.derivationEncryptionKeyIndex = object.derivationEncryptionKeyIndex >>> 0; + if (object.encryptedData != null) + if (typeof object.encryptedData === "string") + $util.base64.decode(object.encryptedData, message.encryptedData = $util.newBuffer($util.base64.length(object.encryptedData)), 0); + else if (object.encryptedData.length >= 0) + message.encryptedData = object.encryptedData; + return message; + }; + + /** + * Creates a plain object from a PersonalEncryptedNote message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} message PersonalEncryptedNote + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + PersonalEncryptedNote.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.rootEncryptionKeyIndex = 0; + object.derivationEncryptionKeyIndex = 0; + if (options.bytes === String) + object.encryptedData = ""; + else { + object.encryptedData = []; + if (options.bytes !== Array) + object.encryptedData = $util.newBuffer(object.encryptedData); + } + } + if (message.rootEncryptionKeyIndex != null && message.hasOwnProperty("rootEncryptionKeyIndex")) + object.rootEncryptionKeyIndex = message.rootEncryptionKeyIndex; + if (message.derivationEncryptionKeyIndex != null && message.hasOwnProperty("derivationEncryptionKeyIndex")) + object.derivationEncryptionKeyIndex = message.derivationEncryptionKeyIndex; + if (message.encryptedData != null && message.hasOwnProperty("encryptedData")) + object.encryptedData = options.bytes === String ? $util.base64.encode(message.encryptedData, 0, message.encryptedData.length) : options.bytes === Array ? Array.prototype.slice.call(message.encryptedData) : message.encryptedData; + return object; + }; + + /** + * Converts this PersonalEncryptedNote to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote + * @instance + * @returns {Object.<string,*>} JSON object + */ + PersonalEncryptedNote.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return PersonalEncryptedNote; + })(); + + GetGroupActionsResponseV0.TransferEvent = (function() { + + /** + * Properties of a TransferEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface ITransferEvent + * @property {Uint8Array|null} [recipientId] TransferEvent recipientId + * @property {string|null} [publicNote] TransferEvent publicNote + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote|null} [sharedEncryptedNote] TransferEvent sharedEncryptedNote + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote|null} [personalEncryptedNote] TransferEvent personalEncryptedNote + * @property {number|Long|null} [amount] TransferEvent amount + */ + + /** + * Constructs a new TransferEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a TransferEvent. + * @implements ITransferEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent=} [properties] Properties to set + */ + function TransferEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TransferEvent recipientId. + * @member {Uint8Array} recipientId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + */ + TransferEvent.prototype.recipientId = $util.newBuffer([]); + + /** + * TransferEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + */ + TransferEvent.prototype.publicNote = ""; + + /** + * TransferEvent sharedEncryptedNote. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ISharedEncryptedNote|null|undefined} sharedEncryptedNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + */ + TransferEvent.prototype.sharedEncryptedNote = null; + + /** + * TransferEvent personalEncryptedNote. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IPersonalEncryptedNote|null|undefined} personalEncryptedNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + */ + TransferEvent.prototype.personalEncryptedNote = null; + + /** + * TransferEvent amount. + * @member {number|Long} amount + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + */ + TransferEvent.prototype.amount = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Creates a new TransferEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} TransferEvent instance + */ + TransferEvent.create = function create(properties) { + return new TransferEvent(properties); + }; + + /** + * Encodes the specified TransferEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent} message TransferEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TransferEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.recipientId != null && Object.hasOwnProperty.call(message, "recipientId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.recipientId); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + if (message.sharedEncryptedNote != null && Object.hasOwnProperty.call(message, "sharedEncryptedNote")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.encode(message.sharedEncryptedNote, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.personalEncryptedNote != null && Object.hasOwnProperty.call(message, "personalEncryptedNote")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.encode(message.personalEncryptedNote, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.amount != null && Object.hasOwnProperty.call(message, "amount")) + writer.uint32(/* id 5, wireType 0 =*/40).uint64(message.amount); + return writer; + }; + + /** + * Encodes the specified TransferEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent} message TransferEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TransferEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TransferEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} TransferEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TransferEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.recipientId = reader.bytes(); + break; + case 2: + message.publicNote = reader.string(); + break; + case 3: + message.sharedEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.decode(reader, reader.uint32()); + break; + case 4: + message.personalEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.decode(reader, reader.uint32()); + break; + case 5: + message.amount = reader.uint64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TransferEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} TransferEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TransferEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TransferEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TransferEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + if (!(message.recipientId && typeof message.recipientId.length === "number" || $util.isString(message.recipientId))) + return "recipientId: buffer expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + if (message.sharedEncryptedNote != null && message.hasOwnProperty("sharedEncryptedNote")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.verify(message.sharedEncryptedNote); + if (error) + return "sharedEncryptedNote." + error; + } + if (message.personalEncryptedNote != null && message.hasOwnProperty("personalEncryptedNote")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.verify(message.personalEncryptedNote); + if (error) + return "personalEncryptedNote." + error; + } + if (message.amount != null && message.hasOwnProperty("amount")) + if (!$util.isInteger(message.amount) && !(message.amount && $util.isInteger(message.amount.low) && $util.isInteger(message.amount.high))) + return "amount: integer|Long expected"; + return null; + }; + + /** + * Creates a TransferEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} TransferEvent + */ + TransferEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent(); + if (object.recipientId != null) + if (typeof object.recipientId === "string") + $util.base64.decode(object.recipientId, message.recipientId = $util.newBuffer($util.base64.length(object.recipientId)), 0); + else if (object.recipientId.length >= 0) + message.recipientId = object.recipientId; + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + if (object.sharedEncryptedNote != null) { + if (typeof object.sharedEncryptedNote !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.sharedEncryptedNote: object expected"); + message.sharedEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.fromObject(object.sharedEncryptedNote); + } + if (object.personalEncryptedNote != null) { + if (typeof object.personalEncryptedNote !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.personalEncryptedNote: object expected"); + message.personalEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.fromObject(object.personalEncryptedNote); + } + if (object.amount != null) + if ($util.Long) + (message.amount = $util.Long.fromValue(object.amount)).unsigned = true; + else if (typeof object.amount === "string") + message.amount = parseInt(object.amount, 10); + else if (typeof object.amount === "number") + message.amount = object.amount; + else if (typeof object.amount === "object") + message.amount = new $util.LongBits(object.amount.low >>> 0, object.amount.high >>> 0).toNumber(true); + return message; + }; + + /** + * Creates a plain object from a TransferEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} message TransferEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TransferEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.recipientId = ""; + else { + object.recipientId = []; + if (options.bytes !== Array) + object.recipientId = $util.newBuffer(object.recipientId); + } + object.publicNote = ""; + object.sharedEncryptedNote = null; + object.personalEncryptedNote = null; + if ($util.Long) { + var long = new $util.Long(0, 0, true); + object.amount = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.amount = options.longs === String ? "0" : 0; + } + if (message.recipientId != null && message.hasOwnProperty("recipientId")) + object.recipientId = options.bytes === String ? $util.base64.encode(message.recipientId, 0, message.recipientId.length) : options.bytes === Array ? Array.prototype.slice.call(message.recipientId) : message.recipientId; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + if (message.sharedEncryptedNote != null && message.hasOwnProperty("sharedEncryptedNote")) + object.sharedEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject(message.sharedEncryptedNote, options); + if (message.personalEncryptedNote != null && message.hasOwnProperty("personalEncryptedNote")) + object.personalEncryptedNote = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject(message.personalEncryptedNote, options); + if (message.amount != null && message.hasOwnProperty("amount")) + if (typeof message.amount === "number") + object.amount = options.longs === String ? String(message.amount) : message.amount; + else + object.amount = options.longs === String ? $util.Long.prototype.toString.call(message.amount) : options.longs === Number ? new $util.LongBits(message.amount.low >>> 0, message.amount.high >>> 0).toNumber(true) : message.amount; + return object; + }; + + /** + * Converts this TransferEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + TransferEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TransferEvent; + })(); + + GetGroupActionsResponseV0.EmergencyActionEvent = (function() { + + /** + * Properties of an EmergencyActionEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IEmergencyActionEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType|null} [actionType] EmergencyActionEvent actionType + * @property {string|null} [publicNote] EmergencyActionEvent publicNote + */ + + /** + * Constructs a new EmergencyActionEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents an EmergencyActionEvent. + * @implements IEmergencyActionEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent=} [properties] Properties to set + */ + function EmergencyActionEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * EmergencyActionEvent actionType. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} actionType + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @instance + */ + EmergencyActionEvent.prototype.actionType = 0; + + /** + * EmergencyActionEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @instance + */ + EmergencyActionEvent.prototype.publicNote = ""; + + /** + * Creates a new EmergencyActionEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} EmergencyActionEvent instance + */ + EmergencyActionEvent.create = function create(properties) { + return new EmergencyActionEvent(properties); + }; + + /** + * Encodes the specified EmergencyActionEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent} message EmergencyActionEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EmergencyActionEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.actionType != null && Object.hasOwnProperty.call(message, "actionType")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.actionType); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified EmergencyActionEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent} message EmergencyActionEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + EmergencyActionEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an EmergencyActionEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} EmergencyActionEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EmergencyActionEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.actionType = reader.int32(); + break; + case 2: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an EmergencyActionEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} EmergencyActionEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + EmergencyActionEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an EmergencyActionEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + EmergencyActionEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.actionType != null && message.hasOwnProperty("actionType")) + switch (message.actionType) { + default: + return "actionType: enum value expected"; + case 0: + case 1: + break; + } + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates an EmergencyActionEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} EmergencyActionEvent + */ + EmergencyActionEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent(); + switch (object.actionType) { + case "PAUSE": + case 0: + message.actionType = 0; + break; + case "RESUME": + case 1: + message.actionType = 1; + break; + } + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from an EmergencyActionEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} message EmergencyActionEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + EmergencyActionEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.actionType = options.enums === String ? "PAUSE" : 0; + object.publicNote = ""; + } + if (message.actionType != null && message.hasOwnProperty("actionType")) + object.actionType = options.enums === String ? $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType[message.actionType] : message.actionType; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this EmergencyActionEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + EmergencyActionEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ActionType enum. + * @name org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType + * @enum {number} + * @property {number} PAUSE=0 PAUSE value + * @property {number} RESUME=1 RESUME value + */ + EmergencyActionEvent.ActionType = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "PAUSE"] = 0; + values[valuesById[1] = "RESUME"] = 1; + return values; + })(); + + return EmergencyActionEvent; + })(); + + GetGroupActionsResponseV0.TokenConfigUpdateEvent = (function() { + + /** + * Properties of a TokenConfigUpdateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface ITokenConfigUpdateEvent + * @property {Uint8Array|null} [tokenConfigUpdateItem] TokenConfigUpdateEvent tokenConfigUpdateItem + * @property {string|null} [publicNote] TokenConfigUpdateEvent publicNote + */ + + /** + * Constructs a new TokenConfigUpdateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a TokenConfigUpdateEvent. + * @implements ITokenConfigUpdateEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent=} [properties] Properties to set + */ + function TokenConfigUpdateEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenConfigUpdateEvent tokenConfigUpdateItem. + * @member {Uint8Array} tokenConfigUpdateItem + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @instance + */ + TokenConfigUpdateEvent.prototype.tokenConfigUpdateItem = $util.newBuffer([]); + + /** + * TokenConfigUpdateEvent publicNote. + * @member {string} publicNote + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @instance + */ + TokenConfigUpdateEvent.prototype.publicNote = ""; + + /** + * Creates a new TokenConfigUpdateEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} TokenConfigUpdateEvent instance + */ + TokenConfigUpdateEvent.create = function create(properties) { + return new TokenConfigUpdateEvent(properties); + }; + + /** + * Encodes the specified TokenConfigUpdateEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent} message TokenConfigUpdateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenConfigUpdateEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenConfigUpdateItem != null && Object.hasOwnProperty.call(message, "tokenConfigUpdateItem")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.tokenConfigUpdateItem); + if (message.publicNote != null && Object.hasOwnProperty.call(message, "publicNote")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.publicNote); + return writer; + }; + + /** + * Encodes the specified TokenConfigUpdateEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent} message TokenConfigUpdateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenConfigUpdateEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenConfigUpdateEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} TokenConfigUpdateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenConfigUpdateEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenConfigUpdateItem = reader.bytes(); + break; + case 2: + message.publicNote = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenConfigUpdateEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} TokenConfigUpdateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenConfigUpdateEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenConfigUpdateEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenConfigUpdateEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.tokenConfigUpdateItem != null && message.hasOwnProperty("tokenConfigUpdateItem")) + if (!(message.tokenConfigUpdateItem && typeof message.tokenConfigUpdateItem.length === "number" || $util.isString(message.tokenConfigUpdateItem))) + return "tokenConfigUpdateItem: buffer expected"; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + if (!$util.isString(message.publicNote)) + return "publicNote: string expected"; + return null; + }; + + /** + * Creates a TokenConfigUpdateEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} TokenConfigUpdateEvent + */ + TokenConfigUpdateEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent(); + if (object.tokenConfigUpdateItem != null) + if (typeof object.tokenConfigUpdateItem === "string") + $util.base64.decode(object.tokenConfigUpdateItem, message.tokenConfigUpdateItem = $util.newBuffer($util.base64.length(object.tokenConfigUpdateItem)), 0); + else if (object.tokenConfigUpdateItem.length >= 0) + message.tokenConfigUpdateItem = object.tokenConfigUpdateItem; + if (object.publicNote != null) + message.publicNote = String(object.publicNote); + return message; + }; + + /** + * Creates a plain object from a TokenConfigUpdateEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} message TokenConfigUpdateEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenConfigUpdateEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.tokenConfigUpdateItem = ""; + else { + object.tokenConfigUpdateItem = []; + if (options.bytes !== Array) + object.tokenConfigUpdateItem = $util.newBuffer(object.tokenConfigUpdateItem); + } + object.publicNote = ""; + } + if (message.tokenConfigUpdateItem != null && message.hasOwnProperty("tokenConfigUpdateItem")) + object.tokenConfigUpdateItem = options.bytes === String ? $util.base64.encode(message.tokenConfigUpdateItem, 0, message.tokenConfigUpdateItem.length) : options.bytes === Array ? Array.prototype.slice.call(message.tokenConfigUpdateItem) : message.tokenConfigUpdateItem; + if (message.publicNote != null && message.hasOwnProperty("publicNote")) + object.publicNote = message.publicNote; + return object; + }; + + /** + * Converts this TokenConfigUpdateEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenConfigUpdateEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenConfigUpdateEvent; + })(); + + GetGroupActionsResponseV0.GroupActionEvent = (function() { + + /** + * Properties of a GroupActionEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IGroupActionEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent|null} [tokenEvent] GroupActionEvent tokenEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent|null} [documentEvent] GroupActionEvent documentEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent|null} [contractEvent] GroupActionEvent contractEvent + */ + + /** + * Constructs a new GroupActionEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a GroupActionEvent. + * @implements IGroupActionEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent=} [properties] Properties to set + */ + function GroupActionEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupActionEvent tokenEvent. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent|null|undefined} tokenEvent + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @instance + */ + GroupActionEvent.prototype.tokenEvent = null; + + /** + * GroupActionEvent documentEvent. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent|null|undefined} documentEvent + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @instance + */ + GroupActionEvent.prototype.documentEvent = null; + + /** + * GroupActionEvent contractEvent. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent|null|undefined} contractEvent + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @instance + */ + GroupActionEvent.prototype.contractEvent = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GroupActionEvent eventType. + * @member {"tokenEvent"|"documentEvent"|"contractEvent"|undefined} eventType + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @instance + */ + Object.defineProperty(GroupActionEvent.prototype, "eventType", { + get: $util.oneOfGetter($oneOfFields = ["tokenEvent", "documentEvent", "contractEvent"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GroupActionEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} GroupActionEvent instance + */ + GroupActionEvent.create = function create(properties) { + return new GroupActionEvent(properties); + }; + + /** + * Encodes the specified GroupActionEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent} message GroupActionEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.tokenEvent != null && Object.hasOwnProperty.call(message, "tokenEvent")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.encode(message.tokenEvent, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.documentEvent != null && Object.hasOwnProperty.call(message, "documentEvent")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.encode(message.documentEvent, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.contractEvent != null && Object.hasOwnProperty.call(message, "contractEvent")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.encode(message.contractEvent, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupActionEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent} message GroupActionEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupActionEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} GroupActionEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.tokenEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.decode(reader, reader.uint32()); + break; + case 2: + message.documentEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.decode(reader, reader.uint32()); + break; + case 3: + message.contractEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupActionEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} GroupActionEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupActionEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupActionEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.tokenEvent != null && message.hasOwnProperty("tokenEvent")) { + properties.eventType = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.verify(message.tokenEvent); + if (error) + return "tokenEvent." + error; + } + } + if (message.documentEvent != null && message.hasOwnProperty("documentEvent")) { + if (properties.eventType === 1) + return "eventType: multiple values"; + properties.eventType = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.verify(message.documentEvent); + if (error) + return "documentEvent." + error; + } + } + if (message.contractEvent != null && message.hasOwnProperty("contractEvent")) { + if (properties.eventType === 1) + return "eventType: multiple values"; + properties.eventType = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.verify(message.contractEvent); + if (error) + return "contractEvent." + error; + } + } + return null; + }; + + /** + * Creates a GroupActionEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} GroupActionEvent + */ + GroupActionEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent(); + if (object.tokenEvent != null) { + if (typeof object.tokenEvent !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.tokenEvent: object expected"); + message.tokenEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.fromObject(object.tokenEvent); + } + if (object.documentEvent != null) { + if (typeof object.documentEvent !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.documentEvent: object expected"); + message.documentEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.fromObject(object.documentEvent); + } + if (object.contractEvent != null) { + if (typeof object.contractEvent !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.contractEvent: object expected"); + message.contractEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.fromObject(object.contractEvent); + } + return message; + }; + + /** + * Creates a plain object from a GroupActionEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} message GroupActionEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupActionEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.tokenEvent != null && message.hasOwnProperty("tokenEvent")) { + object.tokenEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject(message.tokenEvent, options); + if (options.oneofs) + object.eventType = "tokenEvent"; + } + if (message.documentEvent != null && message.hasOwnProperty("documentEvent")) { + object.documentEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject(message.documentEvent, options); + if (options.oneofs) + object.eventType = "documentEvent"; + } + if (message.contractEvent != null && message.hasOwnProperty("contractEvent")) { + object.contractEvent = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject(message.contractEvent, options); + if (options.oneofs) + object.eventType = "contractEvent"; + } + return object; + }; + + /** + * Converts this GroupActionEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupActionEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupActionEvent; + })(); + + GetGroupActionsResponseV0.DocumentEvent = (function() { + + /** + * Properties of a DocumentEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IDocumentEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent|null} [create] DocumentEvent create + */ + + /** + * Constructs a new DocumentEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a DocumentEvent. + * @implements IDocumentEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent=} [properties] Properties to set + */ + function DocumentEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DocumentEvent create. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent|null|undefined} create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @instance + */ + DocumentEvent.prototype.create = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * DocumentEvent type. + * @member {"create"|undefined} type + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @instance + */ + Object.defineProperty(DocumentEvent.prototype, "type", { + get: $util.oneOfGetter($oneOfFields = ["create"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new DocumentEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} DocumentEvent instance + */ + DocumentEvent.create = function create(properties) { + return new DocumentEvent(properties); + }; + + /** + * Encodes the specified DocumentEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent} message DocumentEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.create != null && Object.hasOwnProperty.call(message, "create")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.encode(message.create, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified DocumentEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentEvent} message DocumentEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DocumentEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} DocumentEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.create = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DocumentEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} DocumentEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DocumentEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DocumentEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.create != null && message.hasOwnProperty("create")) { + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.verify(message.create); + if (error) + return "create." + error; + } + } + return null; + }; + + /** + * Creates a DocumentEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} DocumentEvent + */ + DocumentEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent(); + if (object.create != null) { + if (typeof object.create !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.create: object expected"); + message.create = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.fromObject(object.create); + } + return message; + }; + + /** + * Creates a plain object from a DocumentEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} message DocumentEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + DocumentEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.create != null && message.hasOwnProperty("create")) { + object.create = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject(message.create, options); + if (options.oneofs) + object.type = "create"; + } + return object; + }; + + /** + * Converts this DocumentEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + DocumentEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DocumentEvent; + })(); + + GetGroupActionsResponseV0.DocumentCreateEvent = (function() { + + /** + * Properties of a DocumentCreateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IDocumentCreateEvent + * @property {Uint8Array|null} [createdDocument] DocumentCreateEvent createdDocument + */ + + /** + * Constructs a new DocumentCreateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a DocumentCreateEvent. + * @implements IDocumentCreateEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent=} [properties] Properties to set + */ + function DocumentCreateEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DocumentCreateEvent createdDocument. + * @member {Uint8Array} createdDocument + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @instance + */ + DocumentCreateEvent.prototype.createdDocument = $util.newBuffer([]); + + /** + * Creates a new DocumentCreateEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} DocumentCreateEvent instance + */ + DocumentCreateEvent.create = function create(properties) { + return new DocumentCreateEvent(properties); + }; + + /** + * Encodes the specified DocumentCreateEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent} message DocumentCreateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentCreateEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.createdDocument != null && Object.hasOwnProperty.call(message, "createdDocument")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.createdDocument); + return writer; + }; + + /** + * Encodes the specified DocumentCreateEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDocumentCreateEvent} message DocumentCreateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DocumentCreateEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DocumentCreateEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} DocumentCreateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentCreateEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.createdDocument = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DocumentCreateEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} DocumentCreateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DocumentCreateEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DocumentCreateEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DocumentCreateEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.createdDocument != null && message.hasOwnProperty("createdDocument")) + if (!(message.createdDocument && typeof message.createdDocument.length === "number" || $util.isString(message.createdDocument))) + return "createdDocument: buffer expected"; + return null; + }; + + /** + * Creates a DocumentCreateEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} DocumentCreateEvent + */ + DocumentCreateEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent(); + if (object.createdDocument != null) + if (typeof object.createdDocument === "string") + $util.base64.decode(object.createdDocument, message.createdDocument = $util.newBuffer($util.base64.length(object.createdDocument)), 0); + else if (object.createdDocument.length >= 0) + message.createdDocument = object.createdDocument; + return message; + }; + + /** + * Creates a plain object from a DocumentCreateEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} message DocumentCreateEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + DocumentCreateEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.createdDocument = ""; + else { + object.createdDocument = []; + if (options.bytes !== Array) + object.createdDocument = $util.newBuffer(object.createdDocument); + } + if (message.createdDocument != null && message.hasOwnProperty("createdDocument")) + object.createdDocument = options.bytes === String ? $util.base64.encode(message.createdDocument, 0, message.createdDocument.length) : options.bytes === Array ? Array.prototype.slice.call(message.createdDocument) : message.createdDocument; + return object; + }; + + /** + * Converts this DocumentCreateEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + DocumentCreateEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DocumentCreateEvent; + })(); + + GetGroupActionsResponseV0.ContractUpdateEvent = (function() { + + /** + * Properties of a ContractUpdateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IContractUpdateEvent + * @property {Uint8Array|null} [updatedContract] ContractUpdateEvent updatedContract + */ + + /** + * Constructs a new ContractUpdateEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a ContractUpdateEvent. + * @implements IContractUpdateEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent=} [properties] Properties to set + */ + function ContractUpdateEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContractUpdateEvent updatedContract. + * @member {Uint8Array} updatedContract + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @instance + */ + ContractUpdateEvent.prototype.updatedContract = $util.newBuffer([]); + + /** + * Creates a new ContractUpdateEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} ContractUpdateEvent instance + */ + ContractUpdateEvent.create = function create(properties) { + return new ContractUpdateEvent(properties); + }; + + /** + * Encodes the specified ContractUpdateEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent} message ContractUpdateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractUpdateEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.updatedContract != null && Object.hasOwnProperty.call(message, "updatedContract")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.updatedContract); + return writer; + }; + + /** + * Encodes the specified ContractUpdateEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent} message ContractUpdateEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractUpdateEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContractUpdateEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} ContractUpdateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractUpdateEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.updatedContract = reader.bytes(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContractUpdateEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} ContractUpdateEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractUpdateEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContractUpdateEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContractUpdateEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.updatedContract != null && message.hasOwnProperty("updatedContract")) + if (!(message.updatedContract && typeof message.updatedContract.length === "number" || $util.isString(message.updatedContract))) + return "updatedContract: buffer expected"; + return null; + }; + + /** + * Creates a ContractUpdateEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} ContractUpdateEvent + */ + ContractUpdateEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent(); + if (object.updatedContract != null) + if (typeof object.updatedContract === "string") + $util.base64.decode(object.updatedContract, message.updatedContract = $util.newBuffer($util.base64.length(object.updatedContract)), 0); + else if (object.updatedContract.length >= 0) + message.updatedContract = object.updatedContract; + return message; + }; + + /** + * Creates a plain object from a ContractUpdateEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} message ContractUpdateEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + ContractUpdateEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + if (options.bytes === String) + object.updatedContract = ""; + else { + object.updatedContract = []; + if (options.bytes !== Array) + object.updatedContract = $util.newBuffer(object.updatedContract); + } + if (message.updatedContract != null && message.hasOwnProperty("updatedContract")) + object.updatedContract = options.bytes === String ? $util.base64.encode(message.updatedContract, 0, message.updatedContract.length) : options.bytes === Array ? Array.prototype.slice.call(message.updatedContract) : message.updatedContract; + return object; + }; + + /** + * Converts this ContractUpdateEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + ContractUpdateEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContractUpdateEvent; + })(); + + GetGroupActionsResponseV0.ContractEvent = (function() { + + /** + * Properties of a ContractEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IContractEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent|null} [update] ContractEvent update + */ + + /** + * Constructs a new ContractEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a ContractEvent. + * @implements IContractEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent=} [properties] Properties to set + */ + function ContractEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ContractEvent update. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractUpdateEvent|null|undefined} update + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @instance + */ + ContractEvent.prototype.update = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * ContractEvent type. + * @member {"update"|undefined} type + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @instance + */ + Object.defineProperty(ContractEvent.prototype, "type", { + get: $util.oneOfGetter($oneOfFields = ["update"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new ContractEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} ContractEvent instance + */ + ContractEvent.create = function create(properties) { + return new ContractEvent(properties); + }; + + /** + * Encodes the specified ContractEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent} message ContractEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.update != null && Object.hasOwnProperty.call(message, "update")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.encode(message.update, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified ContractEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IContractEvent} message ContractEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ContractEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ContractEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} ContractEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.update = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ContractEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} ContractEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ContractEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ContractEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ContractEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.update != null && message.hasOwnProperty("update")) { + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.verify(message.update); + if (error) + return "update." + error; + } + } + return null; + }; + + /** + * Creates a ContractEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} ContractEvent + */ + ContractEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent(); + if (object.update != null) { + if (typeof object.update !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.update: object expected"); + message.update = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.fromObject(object.update); + } + return message; + }; + + /** + * Creates a plain object from a ContractEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} message ContractEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + ContractEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.update != null && message.hasOwnProperty("update")) { + object.update = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject(message.update, options); + if (options.oneofs) + object.type = "update"; + } + return object; + }; + + /** + * Converts this ContractEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + ContractEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ContractEvent; + })(); + + GetGroupActionsResponseV0.TokenEvent = (function() { + + /** + * Properties of a TokenEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface ITokenEvent + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent|null} [mint] TokenEvent mint + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent|null} [burn] TokenEvent burn + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent|null} [freeze] TokenEvent freeze + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent|null} [unfreeze] TokenEvent unfreeze + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent|null} [destroyFrozenFunds] TokenEvent destroyFrozenFunds + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent|null} [transfer] TokenEvent transfer + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent|null} [emergencyAction] TokenEvent emergencyAction + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent|null} [tokenConfigUpdate] TokenEvent tokenConfigUpdate + */ + + /** + * Constructs a new TokenEvent. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a TokenEvent. + * @implements ITokenEvent + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent=} [properties] Properties to set + */ + function TokenEvent(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TokenEvent mint. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IMintEvent|null|undefined} mint + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.mint = null; + + /** + * TokenEvent burn. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IBurnEvent|null|undefined} burn + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.burn = null; + + /** + * TokenEvent freeze. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IFreezeEvent|null|undefined} freeze + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.freeze = null; + + /** + * TokenEvent unfreeze. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IUnfreezeEvent|null|undefined} unfreeze + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.unfreeze = null; + + /** + * TokenEvent destroyFrozenFunds. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IDestroyFrozenFundsEvent|null|undefined} destroyFrozenFunds + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.destroyFrozenFunds = null; + + /** + * TokenEvent transfer. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITransferEvent|null|undefined} transfer + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.transfer = null; + + /** + * TokenEvent emergencyAction. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IEmergencyActionEvent|null|undefined} emergencyAction + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.emergencyAction = null; + + /** + * TokenEvent tokenConfigUpdate. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenConfigUpdateEvent|null|undefined} tokenConfigUpdate + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + TokenEvent.prototype.tokenConfigUpdate = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * TokenEvent type. + * @member {"mint"|"burn"|"freeze"|"unfreeze"|"destroyFrozenFunds"|"transfer"|"emergencyAction"|"tokenConfigUpdate"|undefined} type + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + */ + Object.defineProperty(TokenEvent.prototype, "type", { + get: $util.oneOfGetter($oneOfFields = ["mint", "burn", "freeze", "unfreeze", "destroyFrozenFunds", "transfer", "emergencyAction", "tokenConfigUpdate"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new TokenEvent instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} TokenEvent instance + */ + TokenEvent.create = function create(properties) { + return new TokenEvent(properties); + }; + + /** + * Encodes the specified TokenEvent message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent} message TokenEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenEvent.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mint != null && Object.hasOwnProperty.call(message, "mint")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.encode(message.mint, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.burn != null && Object.hasOwnProperty.call(message, "burn")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.encode(message.burn, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.freeze != null && Object.hasOwnProperty.call(message, "freeze")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.encode(message.freeze, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + if (message.unfreeze != null && Object.hasOwnProperty.call(message, "unfreeze")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.encode(message.unfreeze, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + if (message.destroyFrozenFunds != null && Object.hasOwnProperty.call(message, "destroyFrozenFunds")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.encode(message.destroyFrozenFunds, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim(); + if (message.transfer != null && Object.hasOwnProperty.call(message, "transfer")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.encode(message.transfer, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim(); + if (message.emergencyAction != null && Object.hasOwnProperty.call(message, "emergencyAction")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.encode(message.emergencyAction, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim(); + if (message.tokenConfigUpdate != null && Object.hasOwnProperty.call(message, "tokenConfigUpdate")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.encode(message.tokenConfigUpdate, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified TokenEvent message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ITokenEvent} message TokenEvent message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TokenEvent.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TokenEvent message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} TokenEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenEvent.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.mint = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.decode(reader, reader.uint32()); + break; + case 2: + message.burn = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.decode(reader, reader.uint32()); + break; + case 3: + message.freeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.decode(reader, reader.uint32()); + break; + case 4: + message.unfreeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.decode(reader, reader.uint32()); + break; + case 5: + message.destroyFrozenFunds = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.decode(reader, reader.uint32()); + break; + case 6: + message.transfer = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.decode(reader, reader.uint32()); + break; + case 7: + message.emergencyAction = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.decode(reader, reader.uint32()); + break; + case 8: + message.tokenConfigUpdate = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TokenEvent message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} TokenEvent + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TokenEvent.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TokenEvent message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TokenEvent.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.mint != null && message.hasOwnProperty("mint")) { + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.verify(message.mint); + if (error) + return "mint." + error; + } + } + if (message.burn != null && message.hasOwnProperty("burn")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.verify(message.burn); + if (error) + return "burn." + error; + } + } + if (message.freeze != null && message.hasOwnProperty("freeze")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.verify(message.freeze); + if (error) + return "freeze." + error; + } + } + if (message.unfreeze != null && message.hasOwnProperty("unfreeze")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.verify(message.unfreeze); + if (error) + return "unfreeze." + error; + } + } + if (message.destroyFrozenFunds != null && message.hasOwnProperty("destroyFrozenFunds")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.verify(message.destroyFrozenFunds); + if (error) + return "destroyFrozenFunds." + error; + } + } + if (message.transfer != null && message.hasOwnProperty("transfer")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.verify(message.transfer); + if (error) + return "transfer." + error; + } + } + if (message.emergencyAction != null && message.hasOwnProperty("emergencyAction")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.verify(message.emergencyAction); + if (error) + return "emergencyAction." + error; + } + } + if (message.tokenConfigUpdate != null && message.hasOwnProperty("tokenConfigUpdate")) { + if (properties.type === 1) + return "type: multiple values"; + properties.type = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.verify(message.tokenConfigUpdate); + if (error) + return "tokenConfigUpdate." + error; + } + } + return null; + }; + + /** + * Creates a TokenEvent message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} TokenEvent + */ + TokenEvent.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent(); + if (object.mint != null) { + if (typeof object.mint !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.mint: object expected"); + message.mint = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.fromObject(object.mint); + } + if (object.burn != null) { + if (typeof object.burn !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.burn: object expected"); + message.burn = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.fromObject(object.burn); + } + if (object.freeze != null) { + if (typeof object.freeze !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.freeze: object expected"); + message.freeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.fromObject(object.freeze); + } + if (object.unfreeze != null) { + if (typeof object.unfreeze !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.unfreeze: object expected"); + message.unfreeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.fromObject(object.unfreeze); + } + if (object.destroyFrozenFunds != null) { + if (typeof object.destroyFrozenFunds !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.destroyFrozenFunds: object expected"); + message.destroyFrozenFunds = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.fromObject(object.destroyFrozenFunds); + } + if (object.transfer != null) { + if (typeof object.transfer !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.transfer: object expected"); + message.transfer = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.fromObject(object.transfer); + } + if (object.emergencyAction != null) { + if (typeof object.emergencyAction !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.emergencyAction: object expected"); + message.emergencyAction = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.fromObject(object.emergencyAction); + } + if (object.tokenConfigUpdate != null) { + if (typeof object.tokenConfigUpdate !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.tokenConfigUpdate: object expected"); + message.tokenConfigUpdate = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.fromObject(object.tokenConfigUpdate); + } + return message; + }; + + /** + * Creates a plain object from a TokenEvent message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} message TokenEvent + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + TokenEvent.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.mint != null && message.hasOwnProperty("mint")) { + object.mint = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject(message.mint, options); + if (options.oneofs) + object.type = "mint"; + } + if (message.burn != null && message.hasOwnProperty("burn")) { + object.burn = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject(message.burn, options); + if (options.oneofs) + object.type = "burn"; + } + if (message.freeze != null && message.hasOwnProperty("freeze")) { + object.freeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject(message.freeze, options); + if (options.oneofs) + object.type = "freeze"; + } + if (message.unfreeze != null && message.hasOwnProperty("unfreeze")) { + object.unfreeze = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject(message.unfreeze, options); + if (options.oneofs) + object.type = "unfreeze"; + } + if (message.destroyFrozenFunds != null && message.hasOwnProperty("destroyFrozenFunds")) { + object.destroyFrozenFunds = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject(message.destroyFrozenFunds, options); + if (options.oneofs) + object.type = "destroyFrozenFunds"; + } + if (message.transfer != null && message.hasOwnProperty("transfer")) { + object.transfer = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject(message.transfer, options); + if (options.oneofs) + object.type = "transfer"; + } + if (message.emergencyAction != null && message.hasOwnProperty("emergencyAction")) { + object.emergencyAction = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject(message.emergencyAction, options); + if (options.oneofs) + object.type = "emergencyAction"; + } + if (message.tokenConfigUpdate != null && message.hasOwnProperty("tokenConfigUpdate")) { + object.tokenConfigUpdate = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject(message.tokenConfigUpdate, options); + if (options.oneofs) + object.type = "tokenConfigUpdate"; + } + return object; + }; + + /** + * Converts this TokenEvent to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent + * @instance + * @returns {Object.<string,*>} JSON object + */ + TokenEvent.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TokenEvent; + })(); + + GetGroupActionsResponseV0.GroupActionEntry = (function() { + + /** + * Properties of a GroupActionEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IGroupActionEntry + * @property {Uint8Array|null} [actionId] GroupActionEntry actionId + * @property {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent|null} [event] GroupActionEntry event + */ + + /** + * Constructs a new GroupActionEntry. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a GroupActionEntry. + * @implements IGroupActionEntry + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry=} [properties] Properties to set + */ + function GroupActionEntry(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupActionEntry actionId. + * @member {Uint8Array} actionId + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @instance + */ + GroupActionEntry.prototype.actionId = $util.newBuffer([]); + + /** + * GroupActionEntry event. + * @member {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEvent|null|undefined} event + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @instance + */ + GroupActionEntry.prototype.event = null; + + /** + * Creates a new GroupActionEntry instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} GroupActionEntry instance + */ + GroupActionEntry.create = function create(properties) { + return new GroupActionEntry(properties); + }; + + /** + * Encodes the specified GroupActionEntry message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry} message GroupActionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionEntry.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.actionId != null && Object.hasOwnProperty.call(message, "actionId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.actionId); + if (message.event != null && Object.hasOwnProperty.call(message, "event")) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.encode(message.event, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupActionEntry message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry} message GroupActionEntry message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionEntry.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupActionEntry message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} GroupActionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionEntry.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.actionId = reader.bytes(); + break; + case 2: + message.event = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupActionEntry message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} GroupActionEntry + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionEntry.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupActionEntry message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupActionEntry.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.actionId != null && message.hasOwnProperty("actionId")) + if (!(message.actionId && typeof message.actionId.length === "number" || $util.isString(message.actionId))) + return "actionId: buffer expected"; + if (message.event != null && message.hasOwnProperty("event")) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.verify(message.event); + if (error) + return "event." + error; + } + return null; + }; + + /** + * Creates a GroupActionEntry message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} GroupActionEntry + */ + GroupActionEntry.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry(); + if (object.actionId != null) + if (typeof object.actionId === "string") + $util.base64.decode(object.actionId, message.actionId = $util.newBuffer($util.base64.length(object.actionId)), 0); + else if (object.actionId.length >= 0) + message.actionId = object.actionId; + if (object.event != null) { + if (typeof object.event !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.event: object expected"); + message.event = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.fromObject(object.event); + } + return message; + }; + + /** + * Creates a plain object from a GroupActionEntry message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} message GroupActionEntry + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupActionEntry.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.actionId = ""; + else { + object.actionId = []; + if (options.bytes !== Array) + object.actionId = $util.newBuffer(object.actionId); + } + object.event = null; + } + if (message.actionId != null && message.hasOwnProperty("actionId")) + object.actionId = options.bytes === String ? $util.base64.encode(message.actionId, 0, message.actionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.actionId) : message.actionId; + if (message.event != null && message.hasOwnProperty("event")) + object.event = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject(message.event, options); + return object; + }; + + /** + * Converts this GroupActionEntry to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupActionEntry.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupActionEntry; + })(); + + GetGroupActionsResponseV0.GroupActions = (function() { + + /** + * Properties of a GroupActions. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @interface IGroupActions + * @property {Array.<org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry>|null} [groupActions] GroupActions groupActions + */ + + /** + * Constructs a new GroupActions. + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 + * @classdesc Represents a GroupActions. + * @implements IGroupActions + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions=} [properties] Properties to set + */ + function GroupActions(properties) { + this.groupActions = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupActions groupActions. + * @member {Array.<org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActionEntry>} groupActions + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @instance + */ + GroupActions.prototype.groupActions = $util.emptyArray; + + /** + * Creates a new GroupActions instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} GroupActions instance + */ + GroupActions.create = function create(properties) { + return new GroupActions(properties); + }; + + /** + * Encodes the specified GroupActions message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions} message GroupActions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActions.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupActions != null && message.groupActions.length) + for (var i = 0; i < message.groupActions.length; ++i) + $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.encode(message.groupActions[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupActions message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.IGroupActions} message GroupActions message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActions.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupActions message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} GroupActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActions.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.groupActions && message.groupActions.length)) + message.groupActions = []; + message.groupActions.push($root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupActions message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} GroupActions + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActions.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupActions message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupActions.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.groupActions != null && message.hasOwnProperty("groupActions")) { + if (!Array.isArray(message.groupActions)) + return "groupActions: array expected"; + for (var i = 0; i < message.groupActions.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.verify(message.groupActions[i]); + if (error) + return "groupActions." + error; + } + } + return null; + }; + + /** + * Creates a GroupActions message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} GroupActions + */ + GroupActions.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions(); + if (object.groupActions) { + if (!Array.isArray(object.groupActions)) + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.groupActions: array expected"); + message.groupActions = []; + for (var i = 0; i < object.groupActions.length; ++i) { + if (typeof object.groupActions[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.groupActions: object expected"); + message.groupActions[i] = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.fromObject(object.groupActions[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a GroupActions message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} message GroupActions + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupActions.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.groupActions = []; + if (message.groupActions && message.groupActions.length) { + object.groupActions = []; + for (var j = 0; j < message.groupActions.length; ++j) + object.groupActions[j] = $root.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject(message.groupActions[j], options); + } + return object; + }; + + /** + * Converts this GroupActions to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupActions.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupActions; + })(); + + return GetGroupActionsResponseV0; + })(); + + return GetGroupActionsResponse; + })(); + + v0.GetGroupActionSignersRequest = (function() { + + /** + * Properties of a GetGroupActionSignersRequest. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupActionSignersRequest + * @property {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0|null} [v0] GetGroupActionSignersRequest v0 + */ + + /** + * Constructs a new GetGroupActionSignersRequest. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupActionSignersRequest. + * @implements IGetGroupActionSignersRequest + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest=} [properties] Properties to set + */ + function GetGroupActionSignersRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionSignersRequest v0. + * @member {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @instance + */ + GetGroupActionSignersRequest.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionSignersRequest version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @instance + */ + Object.defineProperty(GetGroupActionSignersRequest.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionSignersRequest instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest} GetGroupActionSignersRequest instance + */ + GetGroupActionSignersRequest.create = function create(properties) { + return new GetGroupActionSignersRequest(properties); + }; + + /** + * Encodes the specified GetGroupActionSignersRequest message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersRequest.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest} message GetGroupActionSignersRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionSignersRequest message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersRequest} message GetGroupActionSignersRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionSignersRequest message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest} GetGroupActionSignersRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionSignersRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest} GetGroupActionSignersRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionSignersRequest message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionSignersRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupActionSignersRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest} GetGroupActionSignersRequest + */ + GetGroupActionSignersRequest.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersRequest.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionSignersRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest} message GetGroupActionSignersRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionSignersRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupActionSignersRequest to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionSignersRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * ActionStatus enum. + * @name org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus + * @enum {number} + * @property {number} ACTIVE=0 ACTIVE value + * @property {number} CLOSED=1 CLOSED value + */ + GetGroupActionSignersRequest.ActionStatus = (function() { + var valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "ACTIVE"] = 0; + values[valuesById[1] = "CLOSED"] = 1; + return values; + })(); + + GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 = (function() { + + /** + * Properties of a GetGroupActionSignersRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @interface IGetGroupActionSignersRequestV0 + * @property {Uint8Array|null} [contractId] GetGroupActionSignersRequestV0 contractId + * @property {number|null} [groupContractPosition] GetGroupActionSignersRequestV0 groupContractPosition + * @property {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus|null} [status] GetGroupActionSignersRequestV0 status + * @property {Uint8Array|null} [actionId] GetGroupActionSignersRequestV0 actionId + * @property {boolean|null} [prove] GetGroupActionSignersRequestV0 prove + */ + + /** + * Constructs a new GetGroupActionSignersRequestV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest + * @classdesc Represents a GetGroupActionSignersRequestV0. + * @implements IGetGroupActionSignersRequestV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0=} [properties] Properties to set + */ + function GetGroupActionSignersRequestV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionSignersRequestV0 contractId. + * @member {Uint8Array} contractId + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + */ + GetGroupActionSignersRequestV0.prototype.contractId = $util.newBuffer([]); + + /** + * GetGroupActionSignersRequestV0 groupContractPosition. + * @member {number} groupContractPosition + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + */ + GetGroupActionSignersRequestV0.prototype.groupContractPosition = 0; + + /** + * GetGroupActionSignersRequestV0 status. + * @member {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} status + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + */ + GetGroupActionSignersRequestV0.prototype.status = 0; + + /** + * GetGroupActionSignersRequestV0 actionId. + * @member {Uint8Array} actionId + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + */ + GetGroupActionSignersRequestV0.prototype.actionId = $util.newBuffer([]); + + /** + * GetGroupActionSignersRequestV0 prove. + * @member {boolean} prove + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + */ + GetGroupActionSignersRequestV0.prototype.prove = false; + + /** + * Creates a new GetGroupActionSignersRequestV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} GetGroupActionSignersRequestV0 instance + */ + GetGroupActionSignersRequestV0.create = function create(properties) { + return new GetGroupActionSignersRequestV0(properties); + }; + + /** + * Encodes the specified GetGroupActionSignersRequestV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0} message GetGroupActionSignersRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersRequestV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.contractId != null && Object.hasOwnProperty.call(message, "contractId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.contractId); + if (message.groupContractPosition != null && Object.hasOwnProperty.call(message, "groupContractPosition")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.groupContractPosition); + if (message.status != null && Object.hasOwnProperty.call(message, "status")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.status); + if (message.actionId != null && Object.hasOwnProperty.call(message, "actionId")) + writer.uint32(/* id 4, wireType 2 =*/34).bytes(message.actionId); + if (message.prove != null && Object.hasOwnProperty.call(message, "prove")) + writer.uint32(/* id 5, wireType 0 =*/40).bool(message.prove); + return writer; + }; + + /** + * Encodes the specified GetGroupActionSignersRequestV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.IGetGroupActionSignersRequestV0} message GetGroupActionSignersRequestV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersRequestV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionSignersRequestV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} GetGroupActionSignersRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersRequestV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.contractId = reader.bytes(); + break; + case 2: + message.groupContractPosition = reader.uint32(); + break; + case 3: + message.status = reader.int32(); + break; + case 4: + message.actionId = reader.bytes(); + break; + case 5: + message.prove = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionSignersRequestV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} GetGroupActionSignersRequestV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersRequestV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionSignersRequestV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionSignersRequestV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.contractId != null && message.hasOwnProperty("contractId")) + if (!(message.contractId && typeof message.contractId.length === "number" || $util.isString(message.contractId))) + return "contractId: buffer expected"; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + if (!$util.isInteger(message.groupContractPosition)) + return "groupContractPosition: integer expected"; + if (message.status != null && message.hasOwnProperty("status")) + switch (message.status) { + default: + return "status: enum value expected"; + case 0: + case 1: + break; + } + if (message.actionId != null && message.hasOwnProperty("actionId")) + if (!(message.actionId && typeof message.actionId.length === "number" || $util.isString(message.actionId))) + return "actionId: buffer expected"; + if (message.prove != null && message.hasOwnProperty("prove")) + if (typeof message.prove !== "boolean") + return "prove: boolean expected"; + return null; + }; + + /** + * Creates a GetGroupActionSignersRequestV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} GetGroupActionSignersRequestV0 + */ + GetGroupActionSignersRequestV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0(); + if (object.contractId != null) + if (typeof object.contractId === "string") + $util.base64.decode(object.contractId, message.contractId = $util.newBuffer($util.base64.length(object.contractId)), 0); + else if (object.contractId.length >= 0) + message.contractId = object.contractId; + if (object.groupContractPosition != null) + message.groupContractPosition = object.groupContractPosition >>> 0; + switch (object.status) { + case "ACTIVE": + case 0: + message.status = 0; + break; + case "CLOSED": + case 1: + message.status = 1; + break; + } + if (object.actionId != null) + if (typeof object.actionId === "string") + $util.base64.decode(object.actionId, message.actionId = $util.newBuffer($util.base64.length(object.actionId)), 0); + else if (object.actionId.length >= 0) + message.actionId = object.actionId; + if (object.prove != null) + message.prove = Boolean(object.prove); + return message; + }; + + /** + * Creates a plain object from a GetGroupActionSignersRequestV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} message GetGroupActionSignersRequestV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionSignersRequestV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.contractId = ""; + else { + object.contractId = []; + if (options.bytes !== Array) + object.contractId = $util.newBuffer(object.contractId); + } + object.groupContractPosition = 0; + object.status = options.enums === String ? "ACTIVE" : 0; + if (options.bytes === String) + object.actionId = ""; + else { + object.actionId = []; + if (options.bytes !== Array) + object.actionId = $util.newBuffer(object.actionId); + } + object.prove = false; + } + if (message.contractId != null && message.hasOwnProperty("contractId")) + object.contractId = options.bytes === String ? $util.base64.encode(message.contractId, 0, message.contractId.length) : options.bytes === Array ? Array.prototype.slice.call(message.contractId) : message.contractId; + if (message.groupContractPosition != null && message.hasOwnProperty("groupContractPosition")) + object.groupContractPosition = message.groupContractPosition; + if (message.status != null && message.hasOwnProperty("status")) + object.status = options.enums === String ? $root.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus[message.status] : message.status; + if (message.actionId != null && message.hasOwnProperty("actionId")) + object.actionId = options.bytes === String ? $util.base64.encode(message.actionId, 0, message.actionId.length) : options.bytes === Array ? Array.prototype.slice.call(message.actionId) : message.actionId; + if (message.prove != null && message.hasOwnProperty("prove")) + object.prove = message.prove; + return object; + }; + + /** + * Converts this GetGroupActionSignersRequestV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionSignersRequestV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GetGroupActionSignersRequestV0; + })(); + + return GetGroupActionSignersRequest; + })(); + + v0.GetGroupActionSignersResponse = (function() { + + /** + * Properties of a GetGroupActionSignersResponse. + * @memberof org.dash.platform.dapi.v0 + * @interface IGetGroupActionSignersResponse + * @property {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0|null} [v0] GetGroupActionSignersResponse v0 + */ + + /** + * Constructs a new GetGroupActionSignersResponse. + * @memberof org.dash.platform.dapi.v0 + * @classdesc Represents a GetGroupActionSignersResponse. + * @implements IGetGroupActionSignersResponse + * @constructor + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersResponse=} [properties] Properties to set + */ + function GetGroupActionSignersResponse(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionSignersResponse v0. + * @member {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0|null|undefined} v0 + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @instance + */ + GetGroupActionSignersResponse.prototype.v0 = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionSignersResponse version. + * @member {"v0"|undefined} version + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @instance + */ + Object.defineProperty(GetGroupActionSignersResponse.prototype, "version", { + get: $util.oneOfGetter($oneOfFields = ["v0"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionSignersResponse instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersResponse=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} GetGroupActionSignersResponse instance + */ + GetGroupActionSignersResponse.create = function create(properties) { + return new GetGroupActionSignersResponse(properties); + }; + + /** + * Encodes the specified GetGroupActionSignersResponse message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersResponse} message GetGroupActionSignersResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.v0 != null && Object.hasOwnProperty.call(message, "v0")) + $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.encode(message.v0, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionSignersResponse message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {org.dash.platform.dapi.v0.IGetGroupActionSignersResponse} message GetGroupActionSignersResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionSignersResponse message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} GetGroupActionSignersResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionSignersResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} GetGroupActionSignersResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionSignersResponse message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionSignersResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + properties.version = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.verify(message.v0); + if (error) + return "v0." + error; + } + } + return null; + }; + + /** + * Creates a GetGroupActionSignersResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} GetGroupActionSignersResponse + */ + GetGroupActionSignersResponse.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse(); + if (object.v0 != null) { + if (typeof object.v0 !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.v0: object expected"); + message.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.fromObject(object.v0); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionSignersResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse} message GetGroupActionSignersResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionSignersResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (message.v0 != null && message.hasOwnProperty("v0")) { + object.v0 = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject(message.v0, options); + if (options.oneofs) + object.version = "v0"; + } + return object; + }; + + /** + * Converts this GetGroupActionSignersResponse to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionSignersResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 = (function() { + + /** + * Properties of a GetGroupActionSignersResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @interface IGetGroupActionSignersResponseV0 + * @property {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners|null} [groupActionSigners] GetGroupActionSignersResponseV0 groupActionSigners + * @property {org.dash.platform.dapi.v0.IProof|null} [proof] GetGroupActionSignersResponseV0 proof + * @property {org.dash.platform.dapi.v0.IResponseMetadata|null} [metadata] GetGroupActionSignersResponseV0 metadata + */ + + /** + * Constructs a new GetGroupActionSignersResponseV0. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse + * @classdesc Represents a GetGroupActionSignersResponseV0. + * @implements IGetGroupActionSignersResponseV0 + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0=} [properties] Properties to set + */ + function GetGroupActionSignersResponseV0(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GetGroupActionSignersResponseV0 groupActionSigners. + * @member {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners|null|undefined} groupActionSigners + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @instance + */ + GetGroupActionSignersResponseV0.prototype.groupActionSigners = null; + + /** + * GetGroupActionSignersResponseV0 proof. + * @member {org.dash.platform.dapi.v0.IProof|null|undefined} proof + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @instance + */ + GetGroupActionSignersResponseV0.prototype.proof = null; + + /** + * GetGroupActionSignersResponseV0 metadata. + * @member {org.dash.platform.dapi.v0.IResponseMetadata|null|undefined} metadata + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @instance + */ + GetGroupActionSignersResponseV0.prototype.metadata = null; + + // OneOf field names bound to virtual getters and setters + var $oneOfFields; + + /** + * GetGroupActionSignersResponseV0 result. + * @member {"groupActionSigners"|"proof"|undefined} result + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @instance + */ + Object.defineProperty(GetGroupActionSignersResponseV0.prototype, "result", { + get: $util.oneOfGetter($oneOfFields = ["groupActionSigners", "proof"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new GetGroupActionSignersResponseV0 instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} GetGroupActionSignersResponseV0 instance + */ + GetGroupActionSignersResponseV0.create = function create(properties) { + return new GetGroupActionSignersResponseV0(properties); + }; + + /** + * Encodes the specified GetGroupActionSignersResponseV0 message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0} message GetGroupActionSignersResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersResponseV0.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.groupActionSigners != null && Object.hasOwnProperty.call(message, "groupActionSigners")) + $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.encode(message.groupActionSigners, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + if (message.proof != null && Object.hasOwnProperty.call(message, "proof")) + $root.org.dash.platform.dapi.v0.Proof.encode(message.proof, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim(); + if (message.metadata != null && Object.hasOwnProperty.call(message, "metadata")) + $root.org.dash.platform.dapi.v0.ResponseMetadata.encode(message.metadata, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GetGroupActionSignersResponseV0 message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.IGetGroupActionSignersResponseV0} message GetGroupActionSignersResponseV0 message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GetGroupActionSignersResponseV0.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GetGroupActionSignersResponseV0 message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} GetGroupActionSignersResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersResponseV0.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.groupActionSigners = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.decode(reader, reader.uint32()); + break; + case 2: + message.proof = $root.org.dash.platform.dapi.v0.Proof.decode(reader, reader.uint32()); + break; + case 3: + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GetGroupActionSignersResponseV0 message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} GetGroupActionSignersResponseV0 + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GetGroupActionSignersResponseV0.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GetGroupActionSignersResponseV0 message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GetGroupActionSignersResponseV0.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + var properties = {}; + if (message.groupActionSigners != null && message.hasOwnProperty("groupActionSigners")) { + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.verify(message.groupActionSigners); + if (error) + return "groupActionSigners." + error; + } + } + if (message.proof != null && message.hasOwnProperty("proof")) { + if (properties.result === 1) + return "result: multiple values"; + properties.result = 1; + { + var error = $root.org.dash.platform.dapi.v0.Proof.verify(message.proof); + if (error) + return "proof." + error; + } + } + if (message.metadata != null && message.hasOwnProperty("metadata")) { + var error = $root.org.dash.platform.dapi.v0.ResponseMetadata.verify(message.metadata); + if (error) + return "metadata." + error; + } + return null; + }; + + /** + * Creates a GetGroupActionSignersResponseV0 message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} GetGroupActionSignersResponseV0 + */ + GetGroupActionSignersResponseV0.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0(); + if (object.groupActionSigners != null) { + if (typeof object.groupActionSigners !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.groupActionSigners: object expected"); + message.groupActionSigners = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.fromObject(object.groupActionSigners); + } + if (object.proof != null) { + if (typeof object.proof !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.proof: object expected"); + message.proof = $root.org.dash.platform.dapi.v0.Proof.fromObject(object.proof); + } + if (object.metadata != null) { + if (typeof object.metadata !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.metadata: object expected"); + message.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.fromObject(object.metadata); + } + return message; + }; + + /** + * Creates a plain object from a GetGroupActionSignersResponseV0 message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} message GetGroupActionSignersResponseV0 + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GetGroupActionSignersResponseV0.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) + object.metadata = null; + if (message.groupActionSigners != null && message.hasOwnProperty("groupActionSigners")) { + object.groupActionSigners = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject(message.groupActionSigners, options); + if (options.oneofs) + object.result = "groupActionSigners"; + } + if (message.proof != null && message.hasOwnProperty("proof")) { + object.proof = $root.org.dash.platform.dapi.v0.Proof.toObject(message.proof, options); + if (options.oneofs) + object.result = "proof"; + } + if (message.metadata != null && message.hasOwnProperty("metadata")) + object.metadata = $root.org.dash.platform.dapi.v0.ResponseMetadata.toObject(message.metadata, options); + return object; + }; + + /** + * Converts this GetGroupActionSignersResponseV0 to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @instance + * @returns {Object.<string,*>} JSON object + */ + GetGroupActionSignersResponseV0.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + GetGroupActionSignersResponseV0.GroupActionSigner = (function() { + + /** + * Properties of a GroupActionSigner. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @interface IGroupActionSigner + * @property {Uint8Array|null} [signerId] GroupActionSigner signerId + * @property {number|null} [power] GroupActionSigner power + */ + + /** + * Constructs a new GroupActionSigner. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @classdesc Represents a GroupActionSigner. + * @implements IGroupActionSigner + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner=} [properties] Properties to set + */ + function GroupActionSigner(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupActionSigner signerId. + * @member {Uint8Array} signerId + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @instance + */ + GroupActionSigner.prototype.signerId = $util.newBuffer([]); + + /** + * GroupActionSigner power. + * @member {number} power + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @instance + */ + GroupActionSigner.prototype.power = 0; + + /** + * Creates a new GroupActionSigner instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} GroupActionSigner instance + */ + GroupActionSigner.create = function create(properties) { + return new GroupActionSigner(properties); + }; + + /** + * Encodes the specified GroupActionSigner message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner} message GroupActionSigner message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionSigner.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.signerId != null && Object.hasOwnProperty.call(message, "signerId")) + writer.uint32(/* id 1, wireType 2 =*/10).bytes(message.signerId); + if (message.power != null && Object.hasOwnProperty.call(message, "power")) + writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.power); + return writer; + }; + + /** + * Encodes the specified GroupActionSigner message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner} message GroupActionSigner message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionSigner.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupActionSigner message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} GroupActionSigner + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionSigner.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.signerId = reader.bytes(); + break; + case 2: + message.power = reader.uint32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupActionSigner message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} GroupActionSigner + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionSigner.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupActionSigner message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupActionSigner.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.signerId != null && message.hasOwnProperty("signerId")) + if (!(message.signerId && typeof message.signerId.length === "number" || $util.isString(message.signerId))) + return "signerId: buffer expected"; + if (message.power != null && message.hasOwnProperty("power")) + if (!$util.isInteger(message.power)) + return "power: integer expected"; + return null; + }; + + /** + * Creates a GroupActionSigner message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} GroupActionSigner + */ + GroupActionSigner.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner(); + if (object.signerId != null) + if (typeof object.signerId === "string") + $util.base64.decode(object.signerId, message.signerId = $util.newBuffer($util.base64.length(object.signerId)), 0); + else if (object.signerId.length >= 0) + message.signerId = object.signerId; + if (object.power != null) + message.power = object.power >>> 0; + return message; + }; + + /** + * Creates a plain object from a GroupActionSigner message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} message GroupActionSigner + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupActionSigner.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + if (options.bytes === String) + object.signerId = ""; + else { + object.signerId = []; + if (options.bytes !== Array) + object.signerId = $util.newBuffer(object.signerId); + } + object.power = 0; + } + if (message.signerId != null && message.hasOwnProperty("signerId")) + object.signerId = options.bytes === String ? $util.base64.encode(message.signerId, 0, message.signerId.length) : options.bytes === Array ? Array.prototype.slice.call(message.signerId) : message.signerId; + if (message.power != null && message.hasOwnProperty("power")) + object.power = message.power; + return object; + }; + + /** + * Converts this GroupActionSigner to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupActionSigner.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupActionSigner; + })(); + + GetGroupActionSignersResponseV0.GroupActionSigners = (function() { + + /** + * Properties of a GroupActionSigners. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @interface IGroupActionSigners + * @property {Array.<org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner>|null} [signers] GroupActionSigners signers + */ + + /** + * Constructs a new GroupActionSigners. + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 + * @classdesc Represents a GroupActionSigners. + * @implements IGroupActionSigners + * @constructor + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners=} [properties] Properties to set + */ + function GroupActionSigners(properties) { + this.signers = []; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * GroupActionSigners signers. + * @member {Array.<org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigner>} signers + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @instance + */ + GroupActionSigners.prototype.signers = $util.emptyArray; + + /** + * Creates a new GroupActionSigners instance using the specified properties. + * @function create + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners=} [properties] Properties to set + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} GroupActionSigners instance + */ + GroupActionSigners.create = function create(properties) { + return new GroupActionSigners(properties); + }; + + /** + * Encodes the specified GroupActionSigners message. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.verify|verify} messages. + * @function encode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners} message GroupActionSigners message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionSigners.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.signers != null && message.signers.length) + for (var i = 0; i < message.signers.length; ++i) + $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.encode(message.signers[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified GroupActionSigners message, length delimited. Does not implicitly {@link org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.verify|verify} messages. + * @function encodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.IGroupActionSigners} message GroupActionSigners message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + GroupActionSigners.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a GroupActionSigners message from the specified reader or buffer. + * @function decode + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} GroupActionSigners + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionSigners.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.signers && message.signers.length)) + message.signers = []; + message.signers.push($root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a GroupActionSigners message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} GroupActionSigners + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + GroupActionSigners.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a GroupActionSigners message. + * @function verify + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {Object.<string,*>} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + GroupActionSigners.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.signers != null && message.hasOwnProperty("signers")) { + if (!Array.isArray(message.signers)) + return "signers: array expected"; + for (var i = 0; i < message.signers.length; ++i) { + var error = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.verify(message.signers[i]); + if (error) + return "signers." + error; + } + } + return null; + }; + + /** + * Creates a GroupActionSigners message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {Object.<string,*>} object Plain object + * @returns {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} GroupActionSigners + */ + GroupActionSigners.fromObject = function fromObject(object) { + if (object instanceof $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners) + return object; + var message = new $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners(); + if (object.signers) { + if (!Array.isArray(object.signers)) + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.signers: array expected"); + message.signers = []; + for (var i = 0; i < object.signers.length; ++i) { + if (typeof object.signers[i] !== "object") + throw TypeError(".org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.signers: object expected"); + message.signers[i] = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.fromObject(object.signers[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a GroupActionSigners message. Also converts values to other types if specified. + * @function toObject + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @static + * @param {org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} message GroupActionSigners + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.<string,*>} Plain object + */ + GroupActionSigners.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.arrays || options.defaults) + object.signers = []; + if (message.signers && message.signers.length) { + object.signers = []; + for (var j = 0; j < message.signers.length; ++j) + object.signers[j] = $root.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject(message.signers[j], options); + } + return object; + }; + + /** + * Converts this GroupActionSigners to JSON. + * @function toJSON + * @memberof org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners + * @instance + * @returns {Object.<string,*>} JSON object + */ + GroupActionSigners.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return GroupActionSigners; + })(); + + return GetGroupActionSignersResponseV0; + })(); + + return GetGroupActionSignersResponse; + })(); + return v0; })(); diff --git a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js index ca80ce2ad7f..36356ff116d 100644 --- a/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js +++ b/packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js @@ -139,6 +139,69 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlock goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase', null, { proto }); @@ -158,6 +221,25 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResp goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase', null, { proto }); @@ -209,6 +291,25 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); @@ -231,6 +332,9 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsReq goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase', null, { proto }); @@ -273,6 +377,34 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusRe goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase', null, { proto }); @@ -1652,6 +1784,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -4256,385 +4451,20015 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0'; } - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.Proof.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest'; +} /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.toObject = function(includeInstance, msg) { - var f, obj = { - grovedbProof: msg.getGrovedbProof_asB64(), - quorumHash: msg.getQuorumHash_asB64(), - signature: msg.getSignature_asB64(), - round: jspb.Message.getFieldWithDefault(msg, 4, 0), - blockIdHash: msg.getBlockIdHash_asB64(), - quorumType: jspb.Message.getFieldWithDefault(msg, 6, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.repeatedFields_, null); }; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0'; } - - /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.Proof} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.Proof; - return proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse'; +} /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.Proof} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setGrovedbProof(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setQuorumHash(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setSignature(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setRound(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setBlockIdHash(value); - break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setQuorumType(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0'; +} /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry'; +} /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.Proof} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getGrovedbProof_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getQuorumHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getSignature_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getRound(); - if (f !== 0) { - writer.writeUint32( - 4, - f - ); - } - f = message.getBlockIdHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getQuorumType(); - if (f !== 0) { - writer.writeUint32( - 6, - f - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances'; +} /** - * optional bytes grovedb_proof = 1; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest'; +} /** - * optional bytes grovedb_proof = 1; - * This is a type-conversion wrapper around `getGrovedbProof()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getGrovedbProof())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0'; +} /** - * optional bytes grovedb_proof = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getGrovedbProof()` - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getGrovedbProof())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse'; +} /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setGrovedbProof = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0'; +} /** - * optional bytes quorum_hash = 2; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry'; +} /** - * optional bytes quorum_hash = 2; - * This is a type-conversion wrapper around `getQuorumHash()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getQuorumHash())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances'; +} /** - * optional bytes quorum_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHash()` - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getQuorumHash())); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest'; +} /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0'; +} /** - * optional bytes signature = 3; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse'; +} /** - * optional bytes signature = 3; - * This is a type-conversion wrapper around `getSignature()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getSignature())); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0'; +} /** - * optional bytes signature = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSignature()` - * @return {!Uint8Array} - */ + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.Proof.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.Proof.toObject = function(includeInstance, msg) { + var f, obj = { + grovedbProof: msg.getGrovedbProof_asB64(), + quorumHash: msg.getQuorumHash_asB64(), + signature: msg.getSignature_asB64(), + round: jspb.Message.getFieldWithDefault(msg, 4, 0), + blockIdHash: msg.getBlockIdHash_asB64(), + quorumType: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.Proof.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.Proof; + return proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setGrovedbProof(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSignature(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setRound(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBlockIdHash(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setQuorumType(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.Proof} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGrovedbProof_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getSignature_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getRound(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } + f = message.getBlockIdHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } + f = message.getQuorumType(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } +}; + + +/** + * optional bytes grovedb_proof = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes grovedb_proof = 1; + * This is a type-conversion wrapper around `getGrovedbProof()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getGrovedbProof())); +}; + + +/** + * optional bytes grovedb_proof = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getGrovedbProof()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getGrovedbProof())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setGrovedbProof = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes quorum_hash = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes quorum_hash = 2; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); +}; + + +/** + * optional bytes quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes signature = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes signature = 3; + * This is a type-conversion wrapper around `getSignature()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSignature())); +}; + + +/** + * optional bytes signature = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSignature()` + * @return {!Uint8Array} + */ proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getSignature())); + this.getSignature())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setSignature = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 round = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getRound = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setRound = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional bytes block_id_hash = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes block_id_hash = 5; + * This is a type-conversion wrapper around `getBlockIdHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBlockIdHash())); +}; + + +/** + * optional bytes block_id_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBlockIdHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBlockIdHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setBlockIdHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + +/** + * optional uint32 quorum_type = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumType = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumType = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInstance, msg) { + var f, obj = { + height: jspb.Message.getFieldWithDefault(msg, 1, "0"), + coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + epoch: jspb.Message.getFieldWithDefault(msg, 3, 0), + timeMs: jspb.Message.getFieldWithDefault(msg, 4, "0"), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 5, 0), + chainId: jspb.Message.getFieldWithDefault(msg, 6, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + return proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setHeight(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreChainLockedHeight(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTimeMs(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setChainId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getCoreChainLockedHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getEpoch(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 5, + f + ); + } + f = message.getChainId(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } +}; + + +/** + * optional uint64 height = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional uint32 core_chain_locked_height = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getCoreChainLockedHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setCoreChainLockedHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional uint32 epoch = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setEpoch = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional uint64 time_ms = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); +}; + + +/** + * optional uint32 protocol_version = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + +/** + * optional string chain_id = 6; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getChainId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setChainId = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = function(includeInstance, msg) { + var f, obj = { + code: jspb.Message.getFieldWithDefault(msg, 1, 0), + message: jspb.Message.getFieldWithDefault(msg, 2, ""), + data: msg.getData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; + return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCode(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCode(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } +}; + + +/** + * optional uint32 code = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getCode = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setCode = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bytes data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes data = 3; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject = function(includeInstance, msg) { + var f, obj = { + stateTransition: msg.getStateTransition_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest; + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStateTransition(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStateTransition_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes state_transition = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes state_transition = 1; + * This is a type-conversion wrapper around `getStateTransition()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStateTransition())); +}; + + +/** + * optional bytes state_transition = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStateTransition()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStateTransition())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} returns this + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.setStateTransition = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse; + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + contractId: msg.getContractId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetIdentityContractNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentity(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identity = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentity())); +}; + + +/** + * optional bytes identity = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentity()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentity())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setIdentityNonce(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_nonce = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_CONTRACT_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setIdentityContractNonce(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_contract_nonce = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + BALANCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + BALANCE_AND_REVISION: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); + msg.setBalanceAndRevision(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalanceAndRevision(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), + revision: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setRevision(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalance(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getRevision(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional uint64 revision = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; + + +/** + * optional BalanceAndRevision balance_and_revision = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { + return this.setBalanceAndRevision(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { + REQUEST_NOT_SET: 0, + ALL_KEYS: 1, + SPECIFIC_KEYS: 2, + SEARCH_KEY: 3 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { + var f, obj = { + allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), + specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), + searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; + return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.AllKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); + msg.setAllKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); + msg.setSpecificKeys(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.SearchKey; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); + msg.setSearchKey(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAllKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter + ); + } + f = message.getSpecificKeys(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter + ); + } + f = message.getSearchKey(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + ); + } +}; + + +/** + * optional AllKeys all_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { + return this.setAllKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional SpecificKeys specific_keys = 2; + * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { + return this.setSpecificKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional SearchKey search_key = 3; + * @return {?proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { + return this.setSearchKey(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.AllKeys; + return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { + var f, obj = { + keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; + return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addKeyIds(values[i]); + } + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeyIdsList(); + if (f.length > 0) { + writer.writePackedUint32( + 1, + f + ); + } +}; + + +/** + * repeated uint32 key_ids = 1; + * @return {!Array<number>} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { + return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array<number>} value + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { + return this.setKeyIdsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { + var f, obj = { + purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SearchKey; + return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = msg.getPurposeMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); + }); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPurposeMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); + } +}; + + +/** + * map<uint32, SecurityLevelMap> purpose_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + proto.org.dash.platform.dapi.v0.SecurityLevelMap)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { + this.getPurposeMapMap().clear(); + return this;}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { + var f, obj = { + securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = msg.getSecurityLevelMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); + }); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSecurityLevelMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { + CURRENT_KEY_OF_KIND_REQUEST: 0, + ALL_KEYS_OF_KIND_REQUEST: 1 +}; + +/** + * map<uint32, KeyKindRequestType> security_level_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { + this.getSecurityLevelMapMap().clear(); + return this;}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); + msg.setRequestType(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 4: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 4, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional KeyRequestType request_type = 2; + * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { + return this.setRequestType(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional google.protobuf.UInt32Value limit = 3; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional google.protobuf.UInt32Value offset = 4; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentityKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + KEYS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); + msg.setKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { + var f, obj = { + keysBytesList: msg.getKeysBytesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeysBytesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes keys_bytes = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes keys_bytes = 1; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); +}; + + +/** + * optional Keys keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { + return this.setKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesIdsList: msg.getIdentitiesIdsList_asB64(), + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), + purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIdentitiesIds(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 4: + var values = /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); + for (var i = 0; i < values.length; i++) { + msg.addPurposes(values[i]); + } + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } + f = message.getPurposesList(); + if (f.length > 0) { + writer.writePackedEnum( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * repeated bytes identities_ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes identities_ids = 1; + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentitiesIdsList())); +}; + + +/** + * repeated bytes identities_ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentitiesIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { + return this.setIdentitiesIdsList([]); +}; + + +/** + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional string document_type_name = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * repeated KeyPurpose purposes = 4; + * @return {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { + return /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { + return this.setPurposesList([]); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentitiesContractKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES_KEYS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); + msg.setIdentitiesKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { + var f, obj = { + purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), + keysBytesList: msg.getKeysBytesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); + msg.setPurpose(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPurpose(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getKeysBytesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } +}; + + +/** + * optional KeyPurpose purpose = 1; + * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * repeated bytes keys_bytes = 2; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys_bytes = 2; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + keysList: jspb.Message.toObjectList(msg.getKeysList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); + msg.addKeys(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getKeysList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated PurposeKeys keys = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { + var f, obj = { + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); + msg.addEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityKeys entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; + + +/** + * optional IdentitiesKeys identities_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { + return this.setIdentitiesKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesContractKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional uint32 epoch = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * repeated bytes ids = 2; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes ids = 2; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetEvonodesProposedEpochBlocksByIdsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + EVONODES_PROPOSED_BLOCK_COUNTS_INFO: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + evonodesProposedBlockCountsInfo: (f = msg.getEvonodesProposedBlockCountsInfo()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader); + msg.setEvonodesProposedBlockCountsInfo(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEvonodesProposedBlockCountsInfo(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject = function(includeInstance, msg) { + var f, obj = { + proTxHash: msg.getProTxHash_asB64(), + count: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setCount(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCount(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional bytes pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 count = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getCount = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setCount = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject = function(includeInstance, msg) { + var f, obj = { + evonodesProposedBlockCountsList: jspb.Message.toObjectList(msg.getEvonodesProposedBlockCountsList(), + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader); + msg.addEvonodesProposedBlockCounts(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEvonodesProposedBlockCountsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated EvonodeProposedBlocks evonodes_proposed_block_counts = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.getEvonodesProposedBlockCountsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.setEvonodesProposedBlockCountsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.addEvonodesProposedBlockCounts = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.clearEvonodesProposedBlockCountsList = function() { + return this.setEvonodesProposedBlockCountsList([]); +}; + + +/** + * optional EvonodesProposedBlocks evonodes_proposed_block_counts_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getEvonodesProposedBlockCountsInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setEvonodesProposedBlockCountsInfo = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearEvonodesProposedBlockCountsInfo = function() { + return this.setEvonodesProposedBlockCountsInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasEvonodesProposedBlockCountsInfo = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetEvonodesProposedEpochBlocksResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_ = [[3,4]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase = { + START_NOT_SET: 0, + START_AFTER: 3, + START_AT: 4 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), + limit: jspb.Message.getFieldWithDefault(msg, 2, 0), + startAfter: msg.getStartAfter_asB64(), + startAt: msg.getStartAt_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAfter(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAt(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( + 2, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBytes( + 3, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeBytes( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional uint32 epoch = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional uint32 limit = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional bytes start_after = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes start_after = 3; + * This is a type-conversion wrapper around `getStartAfter()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAfter())); +}; + + +/** + * optional bytes start_after = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAfter()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAfter())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAfter = function(value) { + return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAfter = function() { + return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAfter = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bytes start_at = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes start_at = 4; + * This is a type-conversion wrapper around `getStartAt()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); +}; + + +/** + * optional bytes start_at = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAt()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetEvonodesProposedEpochBlocksByRangeRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentitiesBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES_BALANCES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesBalances: (f = msg.getIdentitiesBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader); + msg.setIdentitiesBalances(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesBalances(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 balance = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.hasBalance = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject = function(includeInstance, msg) { + var f, obj = { + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader); + msg.addEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityBalance entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; + + +/** + * optional IdentitiesBalances identities_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getIdentitiesBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setIdentitiesBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearIdentitiesBalances = function() { + return this.setIdentitiesBalances(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasIdentitiesBalances = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3,4,5,6,7]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), + contractsList: jspb.Message.toObjectList(msg.getContractsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), + documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance), + votesList: jspb.Message.toObjectList(msg.getVotesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject, includeInstance), + identityTokenBalancesList: jspb.Message.toObjectList(msg.getIdentityTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject, includeInstance), + identityTokenInfosList: jspb.Message.toObjectList(msg.getIdentityTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject, includeInstance), + tokenStatusesList: jspb.Message.toObjectList(msg.getTokenStatusesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); + msg.addIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); + msg.addContracts(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); + msg.addDocuments(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader); + msg.addVotes(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader); + msg.addIdentityTokenBalances(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader); + msg.addIdentityTokenInfos(value); + break; + case 7: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader); + msg.addTokenStatuses(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + ); + } + f = message.getContractsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + ); + } + f = message.getDocumentsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + ); + } + f = message.getVotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter + ); + } + f = message.getIdentityTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter + ); + } + f = message.getIdentityTokenInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter + ); + } + f = message.getTokenStatusesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 7, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + documentId: msg.getDocumentId_asB64(), + documentContestedStatus: jspb.Message.getFieldWithDefault(msg, 5, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentType(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDocumentTypeKeepsHistory(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocumentId(value); + break; + case 5: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (reader.readEnum()); + msg.setDocumentContestedStatus(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentType(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDocumentTypeKeepsHistory(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getDocumentId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getDocumentContestedStatus(); + if (f !== 0.0) { + writer.writeEnum( + 5, + f + ); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus = { + NOT_CONTESTED: 0, + MAYBE_CONTESTED: 1, + CONTESTED: 2 +}; + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool document_type_keeps_history = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional bytes document_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes document_id = 4; + * This is a type-conversion wrapper around `getDocumentId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDocumentId())); +}; + + +/** + * optional bytes document_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDocumentId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional DocumentContestedStatus document_contested_status = 5; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentContestedStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentContestedStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); + msg.setRequestType(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f !== 0.0) { + writer.writeEnum( + 2, + f + ); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { + FULL_IDENTITY: 0, + BALANCE: 1, + KEYS: 2, + REVISION: 3 +}; + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional Type request_type = 2; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase = { + REQUEST_TYPE_NOT_SET: 0, + CONTESTED_RESOURCE_VOTE_STATUS_REQUEST: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getRequestTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contestedResourceVoteStatusRequest: (f = msg.getContestedResourceVoteStatusRequest()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader); + msg.setContestedResourceVoteStatusRequest(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContestedResourceVoteStatusRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.repeatedFields_ = [4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + indexValuesList: msg.getIndexValuesList_asB64(), + voterIdentifier: msg.getVoterIdentifier_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIndexValues(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setVoterIdentifier(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f + ); + } + f = message.getVoterIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type_name = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string index_name = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * repeated bytes index_values = 4; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * repeated bytes index_values = 4; + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIndexValuesList())); +}; + + +/** + * repeated bytes index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIndexValuesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.addIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.clearIndexValuesList = function() { + return this.setIndexValuesList([]); +}; + + +/** + * optional bytes voter_identifier = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes voter_identifier = 5; + * This is a type-conversion wrapper around `getVoterIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getVoterIdentifier())); +}; + + +/** + * optional bytes voter_identifier = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getVoterIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getVoterIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setVoterIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + +/** + * optional ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getContestedResourceVoteStatusRequest = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.setContestedResourceVoteStatusRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.clearContestedResourceVoteStatusRequest = function() { + return this.setContestedResourceVoteStatusRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.hasContestedResourceVoteStatusRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64(), + identityId: msg.getIdentityId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64(), + identityId: msg.getIdentityId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated IdentityRequest identities = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { + return this.setIdentitiesList([]); +}; + + +/** + * repeated ContractRequest contracts = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addContracts = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearContractsList = function() { + return this.setContractsList([]); +}; + + +/** + * repeated DocumentRequest documents = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getDocumentsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, 3)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setDocumentsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addDocuments = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * repeated VoteStatusRequest votes = 4; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getVotesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, 4)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setVotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 4, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addVotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearVotesList = function() { + return this.setVotesList([]); +}; + + +/** + * repeated IdentityTokenBalanceRequest identity_token_balances = 5; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentityTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, 5)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentityTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 5, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentityTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentityTokenBalancesList = function() { + return this.setIdentityTokenBalancesList([]); +}; + + +/** + * repeated IdentityTokenInfoRequest identity_token_infos = 6; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentityTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, 6)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentityTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 6, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentityTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentityTokenInfosList = function() { + return this.setIdentityTokenInfosList([]); +}; + + +/** + * repeated TokenStatusRequest token_statuses = 7; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getTokenStatusesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, 7)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setTokenStatusesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 7, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addTokenStatuses = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 7, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearTokenStatusesList = function() { + return this.setTokenStatusesList([]); +}; + + +/** + * optional GetProofsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse; + return proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + PROOF: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; + return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Proof proof = 1; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional ResponseMetadata metadata = 2; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional GetProofsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetDataContractRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACT: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContract: msg.getDataContract_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDataContract(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes data_contract = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data_contract = 1; + * This is a type-conversion wrapper around `getDataContract()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDataContract())); +}; + + +/** + * optional bytes data_contract = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDataContract()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDataContract())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setDataContract = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearDataContract = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasDataContract = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetDataContractsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject = function(includeInstance, msg) { + var f, obj = { + identifier: msg.getIdentifier_asB64(), + dataContract: (f = msg.getDataContract()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentifier(value); + break; + case 2: + var value = new google_protobuf_wrappers_pb.BytesValue; + reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); + msg.setDataContract(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDataContract(); + if (f != null) { + writer.writeMessage( + 2, + f, + google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identifier = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identifier = 1; + * This is a type-conversion wrapper around `getIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentifier())); +}; + + +/** + * optional bytes identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.BytesValue data_contract = 2; + * @return {?proto.google.protobuf.BytesValue} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getDataContract = function() { + return /** @type{?proto.google.protobuf.BytesValue} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); +}; + + +/** + * @param {?proto.google.protobuf.BytesValue|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setDataContract = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.clearDataContract = function() { + return this.setDataContract(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.hasDataContract = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader); + msg.addDataContractEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated DataContractEntry data_contract_entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.getDataContractEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.setDataContractEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.addDataContractEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.clearDataContractEntriesList = function() { + return this.setDataContractEntriesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContracts: (f = msg.getDataContracts()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader); + msg.setDataContracts(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContracts(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional DataContracts data_contracts = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getDataContracts = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setDataContracts = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearDataContracts = function() { + return this.setDataContracts(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasDataContracts = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + startAtMs: jspb.Message.getFieldWithDefault(msg, 4, "0"), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartAtMs(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 2, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getStartAtMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.UInt32Value limit = 2; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional google.protobuf.UInt32Value offset = 3; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional uint64 start_at_ms = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getStartAtMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setStartAtMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetDataContractHistoryRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACT_HISTORY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractHistory: (f = msg.getDataContractHistory()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader); + msg.setDataContractHistory(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractHistory(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setSignature = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(opt_includeInstance, this); }; /** - * optional uint32 round = 4; - * @return {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getRound = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject = function(includeInstance, msg) { + var f, obj = { + date: jspb.Message.getFieldWithDefault(msg, 1, "0"), + value: msg.getValue_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setRound = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes block_id_hash = 5; + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setDate(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDate(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getValue_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional uint64 date = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getDate = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * optional bytes block_id_hash = 5; - * This is a type-conversion wrapper around `getBlockIdHash()` + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setDate = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional bytes value = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes value = 2; + * This is a type-conversion wrapper around `getValue()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getBlockIdHash())); + this.getValue())); }; /** - * optional bytes block_id_hash = 5; + * optional bytes value = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getBlockIdHash()` + * This is a type-conversion wrapper around `getValue()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getBlockIdHash())); + this.getValue())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setBlockIdHash = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setValue = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; + /** - * optional uint32 quorum_type = 6; - * @return {number} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader); + msg.addDataContractEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated DataContractHistoryEntry data_contract_entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.getDataContractEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.setDataContractEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.addDataContractEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.clearDataContractEntriesList = function() { + return this.setDataContractEntriesList([]); +}; + + +/** + * optional DataContractHistory data_contract_history = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getDataContractHistory = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setDataContractHistory = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearDataContractHistory = function() { + return this.setDataContractHistory(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasDataContractHistory = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractHistoryResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumType = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumType = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -4648,8 +24473,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject(opt_includeInstance, this); }; @@ -4658,18 +24483,13 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeInstance, msg) { var f, obj = { - height: jspb.Message.getFieldWithDefault(msg, 1, 0), - coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - epoch: jspb.Message.getFieldWithDefault(msg, 3, 0), - timeMs: jspb.Message.getFieldWithDefault(msg, 4, 0), - protocolVersion: jspb.Message.getFieldWithDefault(msg, 5, 0), - chainId: jspb.Message.getFieldWithDefault(msg, 6, "") + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4683,23 +24503,23 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - return proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest; + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4707,28 +24527,9 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setHeight(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreChainLockedHeight(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTimeMs(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint32()); - msg.setProtocolVersion(value); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setChainId(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -4743,9 +24544,9 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4753,168 +24554,52 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getHeight(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getCoreChainLockedHeight(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getEpoch(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getTimeMs(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getProtocolVersion(); - if (f !== 0) { - writer.writeUint32( - 5, - f - ); - } - f = message.getChainId(); - if (f.length > 0) { - writer.writeString( - 6, - f + f, + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 height = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setHeight = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint32 core_chain_locked_height = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getCoreChainLockedHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setCoreChainLockedHeight = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 epoch = 3; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional uint64 time_ms = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional uint32 protocol_version = 5; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getProtocolVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); -}; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setProtocolVersion = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_ = [[6,7]]; /** - * optional string chain_id = 6; - * @return {string} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getChainId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase = { + START_NOT_SET: 0, + START_AFTER: 6, + START_AT: 7 }; - /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setChainId = function(value) { - return jspb.Message.setProto3StringField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -4928,8 +24613,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(opt_includeInstance, this); }; @@ -4938,15 +24623,20 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - code: jspb.Message.getFieldWithDefault(msg, 1, 0), - message: jspb.Message.getFieldWithDefault(msg, 2, ""), - data: msg.getData_asB64() + dataContractId: msg.getDataContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + where: msg.getWhere_asB64(), + orderBy: msg.getOrderBy_asB64(), + limit: jspb.Message.getFieldWithDefault(msg, 5, 0), + startAfter: msg.getStartAfter_asB64(), + startAt: msg.getStartAt_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 8, false) }; if (includeInstance) { @@ -4960,23 +24650,23 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; - return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4984,16 +24674,36 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCode(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDataContractId(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setMessage(value); + msg.setDocumentType(value); break; case 3: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); + msg.setWhere(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setOrderBy(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 6: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAfter(value); + break; + case 7: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAt(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -5008,9 +24718,9 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5018,508 +24728,433 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getCode(); - if (f !== 0) { - writer.writeUint32( + f = message.getDataContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getMessage(); + f = message.getDocumentType(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getData_asU8(); + f = message.getWhere_asU8(); if (f.length > 0) { writer.writeBytes( 3, f ); } + f = message.getOrderBy_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getLimit(); + if (f !== 0) { + writer.writeUint32( + 5, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 6)); + if (f != null) { + writer.writeBytes( + 6, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeBytes( + 7, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 8, + f + ); + } }; /** - * optional uint32 code = 1; - * @return {number} + * optional bytes data_contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getCode = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * optional bytes data_contract_id = 1; + * This is a type-conversion wrapper around `getDataContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setCode = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDataContractId())); }; /** - * optional string message = 2; + * optional bytes data_contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDataContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDataContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDataContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getMessage = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDocumentType = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setMessage = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDocumentType = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bytes data = 3; + * optional bytes where = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * optional bytes data = 3; - * This is a type-conversion wrapper around `getData()` + * optional bytes where = 3; + * This is a type-conversion wrapper around `getWhere()` * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); + this.getWhere())); }; /** - * optional bytes data = 3; + * optional bytes where = 3; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` + * This is a type-conversion wrapper around `getWhere()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); + this.getWhere())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setData = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setWhere = function(value) { return jspb.Message.setProto3BytesField(this, 3, value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bytes order_by = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional bytes order_by = 4; + * This is a type-conversion wrapper around `getOrderBy()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject = function(includeInstance, msg) { - var f, obj = { - stateTransition: msg.getStateTransition_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getOrderBy())); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + * optional bytes order_by = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getOrderBy()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest; - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getOrderBy())); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStateTransition(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setOrderBy = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * optional uint32 limit = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStateTransition_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); }; /** - * optional bytes state_transition = 1; + * optional bytes start_after = 6; * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; /** - * optional bytes state_transition = 1; - * This is a type-conversion wrapper around `getStateTransition()` + * optional bytes start_after = 6; + * This is a type-conversion wrapper around `getStartAfter()` * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStateTransition())); + this.getStartAfter())); }; /** - * optional bytes state_transition = 1; + * optional bytes start_after = 6; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStateTransition()` + * This is a type-conversion wrapper around `getStartAfter()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStateTransition())); + this.getStartAfter())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.setStateTransition = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAfter = function(value) { + return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAfter = function() { + return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAfter = function() { + return jspb.Message.getField(this, 6) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + * optional bytes start_at = 7; + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse; - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + * optional bytes start_at = 7; + * This is a type-conversion wrapper around `getStartAt()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes start_at = 7; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAt()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 7) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} + * optional bool prove = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional GetDocumentsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter - ); - } -}; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); +}; @@ -5536,8 +25171,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); }; @@ -5546,14 +25181,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototyp * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5567,23 +25201,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5591,12 +25225,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserial var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -5611,9 +25242,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserial * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5621,126 +25252,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototyp /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter ); } }; -/** - * optional bytes id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); -}; - - -/** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetIdentityRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -5750,21 +25278,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DOCUMENTS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); }; @@ -5782,8 +25311,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); }; @@ -5792,13 +25321,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) + documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -5812,23 +25343,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5836,9 +25367,19 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); + msg.setDocuments(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5853,9 +25394,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5863,24 +25404,47 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getDocuments(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5896,8 +25460,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); }; @@ -5906,14 +25470,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + documentsList: msg.getDocumentsList_asB64() }; if (includeInstance) { @@ -5927,23 +25490,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5952,11 +25515,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + msg.addDocuments(value); break; default: reader.skipField(); @@ -5971,9 +25530,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5981,113 +25540,218 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getDocumentsList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } }; /** - * optional bytes identity_id = 1; - * @return {string} + * repeated bytes documents = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * repeated bytes documents = 1; + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getDocumentsList())); }; /** - * optional bytes identity_id = 1; + * repeated bytes documents = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getDocumentsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * optional bool prove = 2; + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * optional Documents documents = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { + return this.setDocuments(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetIdentityNonceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDocumentsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6096,7 +25760,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6110,21 +25774,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0])); }; @@ -6142,8 +25806,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject(opt_includeInstance, this); }; @@ -6152,13 +25816,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObje * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6172,23 +25836,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = funct /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6196,8 +25860,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinar var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6213,9 +25877,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinar * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6223,18 +25887,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serial /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter ); } }; @@ -6256,8 +25920,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(opt_includeInstance, this); }; @@ -6266,15 +25930,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - contractId: msg.getContractId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + publicKeyHash: msg.getPublicKeyHash_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -6288,23 +25951,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6313,13 +25976,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setPublicKeyHash(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -6336,9 +25995,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6346,30 +26005,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getPublicKeyHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } f = message.getProve(); if (f) { writer.writeBool( - 3, + 2, f ); } @@ -6377,131 +26029,89 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** - * optional bytes identity_id = 1; + * optional bytes public_key_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes public_key_hash = 1; + * This is a type-conversion wrapper around `getPublicKeyHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getPublicKeyHash())); }; /** - * optional bytes identity_id = 1; + * optional bytes public_key_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getPublicKeyHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getPublicKeyHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setPublicKeyHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bytes contract_id = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes contract_id = 2; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional bool prove = 3; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityContractNonceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * optional GetIdentityByPublicKeyHashRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6510,7 +26120,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6524,21 +26134,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0])); }; @@ -6556,8 +26166,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject(opt_includeInstance, this); }; @@ -6566,13 +26176,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6586,23 +26196,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6610,8 +26220,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6627,9 +26237,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6637,24 +26247,50 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -6670,8 +26306,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(opt_includeInstance, this); }; @@ -6680,14 +26316,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6701,23 +26338,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6726,11 +26363,17 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentity(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6745,9 +26388,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6755,113 +26398,196 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes id = 1; + * optional bytes identity = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentity())); }; /** - * optional bytes id = 1; + * optional bytes identity = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentity()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentity())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); }; /** - * optional bool prove = 2; + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetIdentityBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityByPublicKeyHashResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6870,7 +26596,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = fu * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6884,21 +26610,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = func * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0])); }; @@ -6916,8 +26642,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject(opt_includeInstance, this); }; @@ -6926,13 +26652,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6946,23 +26672,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6970,8 +26696,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6987,9 +26713,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6997,18 +26723,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter ); } }; @@ -7030,8 +26756,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(opt_includeInstance, this); }; @@ -7040,13 +26766,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), + stateTransitionHash: msg.getStateTransitionHash_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -7061,23 +26787,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7086,7 +26812,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setStateTransitionHash(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -7105,9 +26831,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7115,13 +26841,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getStateTransitionHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, @@ -7139,43 +26865,43 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** - * optional bytes id = 1; + * optional bytes state_transition_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes state_transition_hash = 1; + * This is a type-conversion wrapper around `getStateTransitionHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getStateTransitionHash())); }; /** - * optional bytes id = 1; + * optional bytes state_transition_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getStateTransitionHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getStateTransitionHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setStateTransitionHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -7184,44 +26910,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * optional WaitForStateTransitionResultRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7230,7 +26956,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7244,21 +26970,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.h * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0])); }; @@ -7276,8 +27002,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject(opt_includeInstance, this); }; @@ -7286,13 +27012,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7306,23 +27032,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7330,8 +27056,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7347,9 +27073,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7357,18 +27083,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter ); } }; @@ -7383,22 +27109,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = fu * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITY: 1, + ERROR: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0])); }; @@ -7416,8 +27142,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(opt_includeInstance, this); }; @@ -7426,13 +27152,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), + error: (f = msg.getError()) && proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7448,23 +27174,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7472,8 +27198,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + var value = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader); + msg.setError(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7498,9 +27225,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7508,17 +27235,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + f = message.getError(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter ); } f = message.getProof(); @@ -7536,58 +27264,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serial f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); - } -}; - - -/** - * optional bytes identity = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); + } }; /** - * optional bytes identity = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` - * @return {!Uint8Array} + * optional StateTransitionBroadcastError error = 1; + * @return {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getError = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError, 1)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); + * @param {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setError = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearError = function() { + return this.setError(undefined); }; @@ -7595,7 +27300,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasError = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7604,7 +27309,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -7612,18 +27317,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -7632,7 +27337,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -7641,7 +27346,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -7649,18 +27354,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -7669,35 +27374,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * optional WaitForStateTransitionResultResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7706,7 +27411,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7720,21 +27425,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0])); }; @@ -7752,8 +27457,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject(opt_includeInstance, this); }; @@ -7762,13 +27467,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7782,23 +27487,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7806,8 +27511,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7823,9 +27528,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7833,50 +27538,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_NONCE: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -7892,8 +27571,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(opt_includeInstance, this); }; @@ -7902,15 +27581,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + height: jspb.Message.getFieldWithDefault(msg, 1, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -7924,23 +27602,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7948,18 +27626,12 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityNonce(value); + var value = /** @type {number} */ (reader.readInt32()); + msg.setHeight(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -7974,9 +27646,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7984,99 +27656,90 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getHeight(); + if (f !== 0) { + writer.writeInt32( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getProve(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional uint64 identity_nonce = 1; + * optional int32 height = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getHeight = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setHeight = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional bool prove = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional GetConsensusParamsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -8084,110 +27747,340 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject = function(includeInstance, msg) { + var f, obj = { + maxBytes: jspb.Message.getFieldWithDefault(msg, 1, ""), + maxGas: jspb.Message.getFieldWithDefault(msg, 2, ""), + timeIotaMs: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxBytes(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxGas(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setTimeIotaMs(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMaxBytes(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMaxGas(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getTimeIotaMs(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } }; /** - * Returns whether this field is set. - * @return {boolean} + * optional string max_bytes = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxBytes = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional GetIdentityNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxBytes = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); + * optional string max_gas = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxGas = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxGas = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional string time_iota_ms = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getTimeIotaMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setTimeIotaMs = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); -}; + @@ -8204,8 +28097,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(opt_includeInstance, this); }; @@ -8214,13 +28107,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) + maxAgeNumBlocks: jspb.Message.getFieldWithDefault(msg, 1, ""), + maxAgeDuration: jspb.Message.getFieldWithDefault(msg, 2, ""), + maxBytes: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -8234,23 +28129,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8258,9 +28153,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {string} */ (reader.readString()); + msg.setMaxAgeNumBlocks(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxAgeDuration(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxBytes(value); break; default: reader.skipField(); @@ -8275,9 +28177,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8285,52 +28187,93 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getMaxAgeNumBlocks(); + if (f.length > 0) { + writer.writeString( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter + f + ); + } + f = message.getMaxAgeDuration(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getMaxBytes(); + if (f.length > 0) { + writer.writeString( + 3, + f ); } }; +/** + * optional string max_age_num_blocks = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeNumBlocks = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeNumBlocks = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional string max_age_duration = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeDuration = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + /** - * @enum {number} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_CONTRACT_NONCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeDuration = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + * optional string max_bytes = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxBytes = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxBytes = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -8344,8 +28287,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(opt_includeInstance, this); }; @@ -8354,15 +28297,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + block: (f = msg.getBlock()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(includeInstance, f), + evidence: (f = msg.getEvidence()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(includeInstance, f) }; if (includeInstance) { @@ -8376,23 +28318,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8400,18 +28342,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityContractNonce(value); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader); + msg.setBlock(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader); + msg.setEvidence(value); break; default: reader.skipField(); @@ -8426,9 +28364,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8436,99 +28374,56 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( - 1, - f - ); - } - f = message.getProof(); + f = message.getBlock(); if (f != null) { writer.writeMessage( - 2, + 1, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = message.getEvidence(); if (f != null) { writer.writeMessage( - 3, + 2, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter ); } }; /** - * optional uint64 identity_contract_nonce = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional ConsensusParamsBlock block = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getBlock = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setBlock = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearBlock = function() { + return this.setBlock(undefined); }; @@ -8536,36 +28431,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasBlock = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional ConsensusParamsEvidence evidence = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getEvidence = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setEvidence = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearEvidence = function() { + return this.setEvidence(undefined); }; @@ -8573,35 +28468,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasEvidence = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional GetIdentityContractNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * optional GetConsensusParamsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -8610,7 +28505,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -8624,21 +28519,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0])); }; @@ -8656,8 +28551,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject(opt_includeInstance, this); }; @@ -8666,13 +28561,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -8686,23 +28581,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8710,8 +28605,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -8726,63 +28621,37 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom /** * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter + ); + } }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -8796,8 +28665,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(opt_includeInstance, this); }; @@ -8806,15 +28675,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) }; if (includeInstance) { @@ -8828,23 +28695,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8852,18 +28719,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -8878,9 +28735,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8888,172 +28745,64 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getProve(); + if (f) { + writer.writeBool( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); }; /** - * Returns whether this field is set. + * optional bool prove = 1; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; /** - * optional GetIdentityBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * optional GetProtocolVersionUpgradeStateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -9062,7 +28811,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = f * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9076,21 +28825,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = fun * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0])); }; @@ -9108,8 +28857,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject(opt_includeInstance, this); }; @@ -9118,13 +28867,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9138,23 +28887,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9162,8 +28911,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -9179,9 +28928,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9189,18 +28938,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter ); } }; @@ -9215,22 +28964,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeB * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase = { RESULT_NOT_SET: 0, - BALANCE_AND_REVISION: 1, + VERSIONS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0])); }; @@ -9248,8 +28997,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(opt_includeInstance, this); }; @@ -9258,13 +29007,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), + versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -9280,23 +29029,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9304,9 +29053,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); - msg.setBalanceAndRevision(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader); + msg.setVersions(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -9331,9 +29080,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9341,18 +29090,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalanceAndRevision(); + f = message.getVersions(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter ); } f = message.getProof(); @@ -9375,6 +29124,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -9390,8 +29146,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(opt_includeInstance, this); }; @@ -9400,14 +29156,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + versionsList: jspb.Message.toObjectList(msg.getVersionsList(), + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject, includeInstance) }; if (includeInstance) { @@ -9421,23 +29177,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9445,12 +29201,165 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader); + msg.addVersions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVersionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated VersionEntry versions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.getVersionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.setVersionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.addVersions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.clearVersionsList = function() { + return this.setVersionsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + versionNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), + voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setVersionNumber(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRevision(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVoteCount(value); break; default: reader.skipField(); @@ -9465,9 +29374,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9475,22 +29384,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalance(); + f = message.getVersionNumber(); if (f !== 0) { - writer.writeUint64( + writer.writeUint32( 1, f ); } - f = message.getRevision(); + f = message.getVoteCount(); if (f !== 0) { - writer.writeUint64( + writer.writeUint32( 2, f ); @@ -9499,66 +29408,66 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** - * optional uint64 balance = 1; + * optional uint32 version_number = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVersionNumber = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVersionNumber = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional uint64 revision = 2; + * optional uint32 vote_count = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVoteCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVoteCount = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional BalanceAndRevision balance_and_revision = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * optional Versions versions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getVersions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setVersions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { - return this.setBalanceAndRevision(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearVersions = function() { + return this.setVersions(undefined); }; @@ -9566,7 +29475,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasVersions = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9575,7 +29484,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -9583,18 +29492,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -9603,7 +29512,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -9612,7 +29521,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -9620,18 +29529,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -9640,35 +29549,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * optional GetProtocolVersionUpgradeStateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -9677,7 +29586,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9691,23 +29600,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { - REQUEST_NOT_SET: 0, - ALL_KEYS: 1, - SPECIFIC_KEYS: 2, - SEARCH_KEY: 3 +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0])); }; @@ -9725,8 +29632,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject(opt_includeInstance, this); }; @@ -9735,15 +29642,13 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { - allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), - specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), - searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9757,23 +29662,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; - return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9781,19 +29686,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.AllKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); - msg.setAllKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); - msg.setSpecificKeys(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.SearchKey; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); - msg.setSearchKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9808,9 +29703,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9818,150 +29713,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getAllKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter - ); - } - f = message.getSpecificKeys(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter - ); - } - f = message.getSearchKey(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter ); } }; -/** - * optional AllKeys all_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.AllKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { - return this.setAllKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional SpecificKeys specific_keys = 2; - * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { - return this.setSpecificKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional SearchKey search_key = 3; - * @return {?proto.org.dash.platform.dapi.v0.SearchKey} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { - return this.setSearchKey(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { - return jspb.Message.getField(this, 3) != null; -}; - - @@ -9978,8 +29746,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(opt_includeInstance, this); }; @@ -9988,13 +29756,15 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - + startProTxHash: msg.getStartProTxHash_asB64(), + count: jspb.Message.getFieldWithDefault(msg, 2, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -10008,29 +29778,41 @@ proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.AllKeys; - return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartProTxHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; default: reader.skipField(); break; @@ -10044,9 +29826,9 @@ proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(m * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10054,176 +29836,179 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getStartProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCount(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; +/** + * optional bytes start_pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bytes start_pro_tx_hash = 1; + * This is a type-conversion wrapper around `getStartProTxHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartProTxHash())); +}; +/** + * optional bytes start_pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartProTxHash())); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setStartProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional uint32 count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { - var f, obj = { - keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f - }; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; - return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); - for (var i = 0; i < values.length; i++) { - msg.addKeyIds(values[i]); - } - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional GetProtocolVersionUpgradeVoteStatusRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0], value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKeyIdsList(); - if (f.length > 0) { - writer.writePackedUint32( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * repeated uint32 key_ids = 1; - * @return {!Array<number>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { - return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * @param {!Array<number>} value - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_ = [[1]]; /** - * @param {number} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { - return this.setKeyIdsList([]); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -10237,8 +30022,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject(opt_includeInstance, this); }; @@ -10247,13 +30032,13 @@ proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_incl * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject = function(includeInstance, msg) { var f, obj = { - purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10267,23 +30052,23 @@ proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, m /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SearchKey; - return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10291,10 +30076,9 @@ proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getPurposeMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); - }); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -10309,9 +30093,9 @@ proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10319,41 +30103,49 @@ proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPurposeMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter + ); } }; + /** - * map<uint32, SecurityLevelMap> purpose_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - proto.org.dash.platform.dapi.v0.SecurityLevelMap)); -}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_ = [[1,2]]; /** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { - this.getPurposeMapMap().clear(); - return this;}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VERSIONS: 1, + PROOF: 2 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0])); +}; @@ -10370,8 +30162,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(opt_includeInstance, this); }; @@ -10380,13 +30172,15 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -10400,23 +30194,23 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10424,10 +30218,19 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getSecurityLevelMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); - }); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader); + msg.setVersions(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -10442,9 +30245,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10452,74 +30255,46 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSecurityLevelMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + f = message.getVersions(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); } }; -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { - CURRENT_KEY_OF_KIND_REQUEST: 0, - ALL_KEYS_OF_KIND_REQUEST: 1 -}; - -/** - * map<uint32, KeyKindRequestType> security_level_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { - this.getSecurityLevelMapMap().clear(); - return this;}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.repeatedFields_ = [1]; @@ -10536,8 +30311,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(opt_includeInstance, this); }; @@ -10546,13 +30321,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) + versionSignalsList: jspb.Message.toObjectList(msg.getVersionSignalsList(), + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject, includeInstance) }; if (includeInstance) { @@ -10566,23 +30342,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10590,9 +30366,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader); + msg.addVersionSignals(value); break; default: reader.skipField(); @@ -10607,9 +30383,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10617,23 +30393,61 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getVersionSignalsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter ); } }; +/** + * repeated VersionSignal version_signals = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.getVersionSignalsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.setVersionSignalsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.addVersionSignals = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.clearVersionSignalsList = function() { + return this.setVersionSignalsList([]); +}; + + @@ -10650,8 +30464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject(opt_includeInstance, this); }; @@ -10660,17 +30474,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + proTxHash: msg.getProTxHash_asB64(), + version: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -10684,23 +30495,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10709,26 +30520,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setProTxHash(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); - msg.setRequestType(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 4: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVersion(value); break; default: reader.skipField(); @@ -10743,9 +30539,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10753,47 +30549,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getProTxHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f != null) { - writer.writeMessage( + f = message.getVersion(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter - ); - } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 4, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 5, f ); } @@ -10801,72 +30573,90 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** - * optional bytes identity_id = 1; + * optional bytes pro_tx_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getProTxHash())); }; /** - * optional bytes identity_id = 1; + * optional bytes pro_tx_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getProTxHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getProTxHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setProTxHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional KeyRequestType request_type = 2; - * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + * optional uint32 version = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setVersion = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional VersionSignals versions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getVersions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setVersions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { - return this.setRequestType(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearVersions = function() { + return this.setVersions(undefined); }; @@ -10874,36 +30664,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasVersions = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional google.protobuf.UInt32Value limit = 3; - * @return {?proto.google.protobuf.UInt32Value} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -10911,36 +30701,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional google.protobuf.UInt32Value offset = 4; - * @return {?proto.google.protobuf.UInt32Value} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -10948,53 +30738,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional bool prove = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * optional GetProtocolVersionUpgradeVoteStatusResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -11003,7 +30775,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -11017,21 +30789,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = functio * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0])); }; @@ -11049,8 +30821,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject(opt_includeInstance, this); }; @@ -11059,13 +30831,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -11079,23 +30851,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11103,8 +30875,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -11120,9 +30892,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11130,50 +30902,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - KEYS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -11189,8 +30935,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(opt_includeInstance, this); }; @@ -11199,15 +30945,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startEpoch: (f = msg.getStartEpoch()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 2, 0), + ascending: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -11221,23 +30968,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11245,19 +30992,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); - msg.setKeys(value); + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setStartEpoch(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAscending(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -11272,9 +31021,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11282,392 +31031,486 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeys(); + f = message.getStartEpoch(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getCount(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( + f = message.getAscending(); + if (f) { + writer.writeBool( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 4, + f ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional google.protobuf.UInt32Value start_epoch = 1; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getStartEpoch = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 1)); +}; + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setStartEpoch = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.clearStartEpoch = function() { + return this.setStartEpoch(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { - var f, obj = { - keysBytesList: msg.getKeysBytesList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.hasStartEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * optional uint32 count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeysBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional bool ascending = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKeysBytesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * repeated bytes keys_bytes = 1; - * @return {!Array<string>} + * optional bool prove = 4; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * repeated bytes keys_bytes = 1; - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<string>} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysBytesList())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * repeated bytes keys_bytes = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<!Uint8Array>} + * optional GetEpochsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysBytesList())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { - return this.setKeysBytesList([]); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0])); }; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Keys keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject(opt_includeInstance, this); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { - return this.setKeys(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter + ); + } }; + /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + EPOCHS: 1, + PROOF: 2 }; - /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0])); }; -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + epochs: (f = msg.getEpochs()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentityKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader); + msg.setEpochs(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEpochs(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.repeatedFields_ = [1]; @@ -11684,8 +31527,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(opt_includeInstance, this); }; @@ -11694,13 +31537,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) + epochInfosList: jspb.Message.toObjectList(msg.getEpochInfosList(), + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject, includeInstance) }; if (includeInstance) { @@ -11714,23 +31558,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11738,9 +31582,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader); + msg.addEpochInfos(value); break; default: reader.skipField(); @@ -11755,9 +31599,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11765,30 +31609,61 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getEpochInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter ); } }; +/** + * repeated EpochInfo epoch_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.getEpochInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, 1)); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.setEpochInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.addEpochInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.clearEpochInfosList = function() { + return this.setEpochInfosList([]); +}; + + @@ -11805,8 +31680,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject(opt_includeInstance, this); }; @@ -11815,17 +31690,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject = function(includeInstance, msg) { var f, obj = { - identitiesIdsList: msg.getIdentitiesIdsList_asB64(), - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), - purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + number: jspb.Message.getFieldWithDefault(msg, 1, 0), + firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, "0"), + firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), + startTime: jspb.Message.getFieldWithDefault(msg, 4, "0"), + feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -11839,23 +31715,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11863,26 +31739,28 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIdentitiesIds(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setNumber(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFirstBlockHeight(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setFirstCoreBlockHeight(value); break; case 4: - var values = /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); - for (var i = 0; i < values.length; i++) { - msg.addPurposes(values[i]); - } + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartTime(value); break; case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readDouble()); + msg.setFeeMultiplier(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); break; default: reader.skipField(); @@ -11897,9 +31775,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11907,269 +31785,227 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = message.getNumber(); + if (f !== 0) { + writer.writeUint32( 1, f ); } - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getFirstBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 2, f ); } - f = /** @type {string} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeString( + f = message.getFirstCoreBlockHeight(); + if (f !== 0) { + writer.writeUint32( 3, f ); } - f = message.getPurposesList(); - if (f.length > 0) { - writer.writePackedEnum( + f = message.getStartTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 4, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getFeeMultiplier(); + if (f !== 0.0) { + writer.writeDouble( 5, f ); } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } }; /** - * repeated bytes identities_ids = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes identities_ids = 1; - * This is a type-conversion wrapper around `getIdentitiesIdsList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdentitiesIdsList())); -}; - - -/** - * repeated bytes identities_ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentitiesIdsList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdentitiesIdsList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional uint32 number = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { - return this.setIdentitiesIdsList([]); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setNumber = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional bytes contract_id = 2; + * optional uint64 first_block_height = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * optional bytes contract_id = 2; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); }; /** - * optional bytes contract_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * optional uint32 first_core_block_height = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstCoreBlockHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstCoreBlockHeight = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * optional string document_type_name = 3; + * optional uint64 start_time = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getStartTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setStartTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional double fee_multiplier = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFeeMultiplier = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFeeMultiplier = function(value) { + return jspb.Message.setProto3FloatField(this, 5, value); }; /** - * repeated KeyPurpose purposes = 4; - * @return {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} + * optional uint32 protocol_version = 6; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { - return /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { - return jspb.Message.setField(this, 4, value || []); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional EpochInfos epochs = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getEpochs = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos, 1)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { - return this.setPurposesList([]); + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setEpochs = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); }; /** - * optional bool prove = 5; - * @return {boolean} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearEpochs = function() { + return this.setEpochs(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasEpochs = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional GetIdentitiesContractKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -12177,147 +32013,82 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + * optional GetEpochsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -12330,22 +32101,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinar * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES_KEYS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0])); }; @@ -12363,8 +32133,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject(opt_includeInstance, this); }; @@ -12373,15 +32143,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function(includeInstance, msg) { var f, obj = { - identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -12395,23 +32163,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12419,19 +32187,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); - msg.setIdentitiesKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -12446,9 +32204,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12456,34 +32214,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter ); } }; @@ -12495,7 +32237,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.repeatedFields_ = [4,5]; @@ -12512,8 +32254,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(opt_includeInstance, this); }; @@ -12522,14 +32264,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), - keysBytesList: msg.getKeysBytesList_asB64() + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + startIndexValuesList: msg.getStartIndexValuesList_asB64(), + endIndexValuesList: msg.getEndIndexValuesList_asB64(), + startAtValueInfo: (f = msg.getStartAtValueInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 7, 0), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -12543,170 +32292,163 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); - msg.setPurpose(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeysBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPurpose(); - if (f !== 0.0) { - writer.writeEnum( - 1, - f - ); - } - f = message.getKeysBytesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f - ); - } -}; - - -/** - * optional KeyPurpose purpose = 1; - * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); -}; - - -/** - * repeated bytes keys_bytes = 2; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); -}; - - -/** - * repeated bytes keys_bytes = 2; - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysBytesList())); -}; - - -/** - * repeated bytes keys_bytes = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysBytesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 2, value || []); + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addStartIndexValues(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addEndIndexValues(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader); + msg.setStartAtValueInfo(value); + break; + case 7: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { - return this.setKeysBytesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getStartIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f + ); + } + f = message.getEndIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 5, + f + ); + } + f = message.getStartAtValueInfo(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeUint32( + 7, + f + ); + } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f + ); + } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -12722,8 +32464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(opt_includeInstance, this); }; @@ -12732,15 +32474,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - keysList: jspb.Message.toObjectList(msg.getKeysList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + startValue: msg.getStartValue_asB64(), + startValueIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -12754,23 +32495,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12779,12 +32520,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setStartValue(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); - msg.addKeys(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartValueIncluded(value); break; default: reader.skipField(); @@ -12799,9 +32539,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12809,295 +32549,314 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getStartValue_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getKeysList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getStartValueIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity_id = 1; + * optional bytes start_value = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes start_value = 1; + * This is a type-conversion wrapper around `getStartValue()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getStartValue())); }; /** - * optional bytes identity_id = 1; + * optional bytes start_value = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getStartValue()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getStartValue())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValue = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * repeated PurposeKeys keys = 2; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} + * optional bool start_value_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValueIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValueIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { - return this.setKeysList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional string document_type_name = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional string index_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { - var f, obj = { - entriesList: jspb.Message.toObjectList(msg.getEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * repeated bytes start_index_values = 4; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * repeated bytes start_index_values = 4; + * This is a type-conversion wrapper around `getStartIndexValuesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getStartIndexValuesList())); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * repeated bytes start_index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartIndexValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); - msg.addEntries(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getStartIndexValuesList())); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addStartIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** - * repeated IdentityKeys entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartIndexValuesList = function() { + return this.setStartIndexValuesList([]); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * repeated bytes end_index_values = 5; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * repeated bytes end_index_values = 5; + * This is a type-conversion wrapper around `getEndIndexValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getEndIndexValuesList())); +}; + + +/** + * repeated bytes end_index_values = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEndIndexValuesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getEndIndexValuesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setEndIndexValuesList = function(value) { + return jspb.Message.setField(this, 5, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addEndIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 5, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { - return this.setEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearEndIndexValuesList = function() { + return this.setEndIndexValuesList([]); }; /** - * optional IdentitiesKeys identities_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * optional StartAtValueInfo start_at_value_info = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartAtValueInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo, 6)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartAtValueInfo = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { - return this.setIdentitiesKeys(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartAtValueInfo = function() { + return this.setStartAtValueInfo(undefined); }; @@ -13105,36 +32864,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasStartAtValueInfo = function() { + return jspb.Message.getField(this, 6) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional uint32 count = 7; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 7, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 7, undefined); }; @@ -13142,72 +32900,71 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bool order_ascending = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); }; /** - * optional GetIdentitiesContractKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * optional GetContestedResourcesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -13216,7 +32973,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clea * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -13230,21 +32987,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0])); }; @@ -13262,8 +33019,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject(opt_includeInstance, this); }; @@ -13272,13 +33029,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -13292,23 +33049,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13316,8 +33073,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -13333,9 +33090,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13343,18 +33100,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter ); } }; @@ -13362,11 +33119,30 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.seria /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CONTESTED_RESOURCE_VALUES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0])); +}; @@ -13383,8 +33159,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(opt_includeInstance, this); }; @@ -13393,15 +33169,15 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + contestedResourceValues: (f = msg.getContestedResourceValues()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -13415,23 +33191,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13439,16 +33215,19 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader); + msg.setContestedResourceValues(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -13463,9 +33242,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13473,175 +33252,354 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getContestedResourceValues(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter ); } - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; + /** - * optional uint32 epoch = 1; - * @return {number} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject = function(includeInstance, msg) { + var f, obj = { + contestedResourceValuesList: msg.getContestedResourceValuesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 1, undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addContestedResourceValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated bytes ids = 2; + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContestedResourceValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes contested_resource_values = 1; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes ids = 2; - * This is a type-conversion wrapper around `getIdsList()` + * repeated bytes contested_resource_values = 1; + * This is a type-conversion wrapper around `getContestedResourceValuesList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); + this.getContestedResourceValuesList())); }; /** - * repeated bytes ids = 2; + * repeated bytes contested_resource_values = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` + * This is a type-conversion wrapper around `getContestedResourceValuesList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); + this.getContestedResourceValuesList())); }; /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.setContestedResourceValuesList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.addContestedResourceValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.clearContestedResourceValuesList = function() { + return this.setContestedResourceValuesList([]); }; /** - * optional bool prove = 3; + * optional ContestedResourceValues contested_resource_values = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getContestedResourceValues = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setContestedResourceValues = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearContestedResourceValues = function() { + return this.setContestedResourceValues(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasContestedResourceValues = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetEvonodesProposedEpochBlocksByIdsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetContestedResourcesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -13650,7 +33608,7 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -13664,21 +33622,21 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0])); }; @@ -13696,8 +33654,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject(opt_includeInstance, this); }; @@ -13706,13 +33664,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -13726,23 +33684,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13750,8 +33708,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -13767,9 +33725,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13777,50 +33735,24 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - EVONODES_PROPOSED_BLOCK_COUNTS_INFO: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -13836,8 +33768,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(opt_includeInstance, this); }; @@ -13846,15 +33778,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - evonodesProposedBlockCountsInfo: (f = msg.getEvonodesProposedBlockCountsInfo()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startTimeInfo: (f = msg.getStartTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(includeInstance, f), + endTimeInfo: (f = msg.getEndTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(includeInstance, f), + limit: jspb.Message.getFieldWithDefault(msg, 3, 0), + offset: jspb.Message.getFieldWithDefault(msg, 4, 0), + ascending: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -13868,23 +33803,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13892,19 +33827,30 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader); - msg.setEvonodesProposedBlockCountsInfo(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader); + msg.setStartTimeInfo(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader); + msg.setEndTimeInfo(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAscending(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -13919,9 +33865,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13929,34 +33875,54 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEvonodesProposedBlockCountsInfo(); + f = message.getStartTimeInfo(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter ); } - f = message.getProof(); + f = message.getEndTimeInfo(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = /** @type {number} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeUint32( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeUint32( + 4, + f + ); + } + f = message.getAscending(); + if (f) { + writer.writeBool( + 5, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f ); } }; @@ -13978,8 +33944,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(opt_includeInstance, this); }; @@ -13988,14 +33954,14 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - count: jspb.Message.getFieldWithDefault(msg, 2, 0) + startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, "0"), + startTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -14009,23 +33975,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14033,12 +33999,12 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartTimeMs(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setCount(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartTimeIncluded(value); break; default: reader.skipField(); @@ -14053,9 +34019,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14063,22 +34029,22 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getStartTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, f ); } - f = message.getCount(); - if (f !== 0) { - writer.writeUint64( + f = message.getStartTimeIncluded(); + if (f) { + writer.writeBool( 2, f ); @@ -14087,73 +34053,42 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** - * optional bytes pro_tx_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` + * optional uint64 start_time_ms = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional uint64 count = 2; - * @return {number} + * optional bool start_time_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -14169,8 +34104,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(opt_includeInstance, this); }; @@ -14179,14 +34114,14 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject = function(includeInstance, msg) { var f, obj = { - evonodesProposedBlockCountsList: jspb.Message.toObjectList(msg.getEvonodesProposedBlockCountsList(), - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject, includeInstance) + endTimeMs: jspb.Message.getFieldWithDefault(msg, 1, "0"), + endTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -14200,23 +34135,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14224,9 +34159,12 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader); - msg.addEvonodesProposedBlockCounts(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setEndTimeMs(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEndTimeIncluded(value); break; default: reader.skipField(); @@ -14241,9 +34179,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14251,86 +34189,90 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEvonodesProposedBlockCountsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getEndTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter + f + ); + } + f = message.getEndTimeIncluded(); + if (f) { + writer.writeBool( + 2, + f ); } }; /** - * repeated EvonodeProposedBlocks evonodes_proposed_block_counts = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} + * optional uint64 end_time_ms = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.getEvonodesProposedBlockCountsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.setEvonodesProposedBlockCountsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * optional bool end_time_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.addEvonodesProposedBlockCounts = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, opt_index); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.clearEvonodesProposedBlockCountsList = function() { - return this.setEvonodesProposedBlockCountsList([]); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional EvonodesProposedBlocks evonodes_proposed_block_counts_info = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * optional StartAtTimeInfo start_time_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getEvonodesProposedBlockCountsInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getStartTimeInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setEvonodesProposedBlockCountsInfo = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setStartTimeInfo = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearEvonodesProposedBlockCountsInfo = function() { - return this.setEvonodesProposedBlockCountsInfo(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearStartTimeInfo = function() { + return this.setStartTimeInfo(undefined); }; @@ -14338,36 +34280,36 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasEvonodesProposedBlockCountsInfo = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasStartTimeInfo = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional EndAtTimeInfo end_time_info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getEndTimeInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setEndTimeInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearEndTimeInfo = function() { + return this.setEndTimeInfo(undefined); }; @@ -14375,72 +34317,143 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasEndTimeInfo = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional uint32 limit = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional uint32 offset = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getOffset = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setField(this, 4, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearOffset = function() { + return jspb.Message.setField(this, 4, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool ascending = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); }; /** - * Returns whether this field is set. + * optional bool prove = 6; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); }; /** - * optional GetEvonodesProposedEpochBlocksResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + * optional GetVotePollsByEndDateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -14449,7 +34462,7 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -14463,21 +34476,21 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0])); }; @@ -14495,8 +34508,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject(opt_includeInstance, this); }; @@ -14505,13 +34518,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -14525,23 +34538,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14549,8 +34562,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.des var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -14566,9 +34579,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14576,18 +34589,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter ); } }; @@ -14602,22 +34615,22 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.ser * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_ = [[3,4]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase = { - START_NOT_SET: 0, - START_AFTER: 3, - START_AT: 4 +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VOTE_POLLS_BY_TIMESTAMPS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0])); }; @@ -14635,8 +34648,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(opt_includeInstance, this); }; @@ -14645,17 +34658,15 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), - limit: jspb.Message.getFieldWithDefault(msg, 2, 0), - startAfter: msg.getStartAfter_asB64(), - startAt: msg.getStartAt_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + votePollsByTimestamps: (f = msg.getVotePollsByTimestamps()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -14669,23 +34680,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14693,24 +34704,19 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader); + msg.setVotePollsByTimestamps(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAfter(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAt(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -14725,9 +34731,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14735,322 +34741,256 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getVotePollsByTimestamps(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); + f = message.getProof(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + f = message.getMetadata(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 3, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeBytes( - 4, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 5, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * optional uint32 epoch = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 1, value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 1, undefined); -}; - /** - * Returns whether this field is set. - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 1) != null; -}; - +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.repeatedFields_ = [2]; -/** - * optional uint32 limit = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject(opt_includeInstance, this); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearLimit = function() { - return jspb.Message.setField(this, 2, undefined); -}; - +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject = function(includeInstance, msg) { + var f, obj = { + timestamp: jspb.Message.getFieldWithDefault(msg, 1, "0"), + serializedVotePollsList: msg.getSerializedVotePollsList_asB64() + }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes start_after = 3; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes start_after = 3; - * This is a type-conversion wrapper around `getStartAfter()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTimestamp(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addSerializedVotePolls(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes start_after = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAfter()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAfter = function(value) { - return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestamp(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getSerializedVotePollsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * optional uint64 timestamp = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAfter = function() { - return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getTimestamp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAfter = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setTimestamp = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional bytes start_at = 4; - * @return {string} + * repeated bytes serialized_vote_polls = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional bytes start_at = 4; - * This is a type-conversion wrapper around `getStartAt()` - * @return {string} + * repeated bytes serialized_vote_polls = 2; + * This is a type-conversion wrapper around `getSerializedVotePollsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getSerializedVotePollsList())); }; /** - * optional bytes start_at = 4; + * repeated bytes serialized_vote_polls = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional bool prove = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); -}; - - -/** - * optional GetEvonodesProposedEpochBlocksByRangeRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this + * This is a type-conversion wrapper around `getSerializedVotePollsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getSerializedVotePollsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setSerializedVotePollsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.addSerializedVotePolls = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + /** - * @enum {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.clearSerializedVotePollsList = function() { + return this.setSerializedVotePollsList([]); }; + + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.repeatedFields_ = [1]; @@ -15067,8 +35007,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(opt_includeInstance, this); }; @@ -15077,13 +35017,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(includeInstance, f) + votePollsByTimestampsList: jspb.Message.toObjectList(msg.getVotePollsByTimestampsList(), + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject, includeInstance), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -15097,23 +35039,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15121,9 +35063,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader); + msg.addVotePollsByTimestamps(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); break; default: reader.skipField(); @@ -15138,9 +35084,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15148,257 +35094,221 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getVotePollsByTimestampsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * repeated SerializedVotePollsByTimestamp vote_polls_by_timestamps = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getVotePollsByTimestampsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, 1)); +}; + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setVotePollsByTimestampsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.addVotePollsByTimestamps = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.clearVotePollsByTimestampsList = function() { + return this.setVotePollsByTimestampsList([]); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * optional bool finished_results = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional SerializedVotePollsByTimestamps vote_polls_by_timestamps = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getVotePollsByTimestamps = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps, 1)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setVotePollsByTimestamps = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes ids = 1; - * @return {!Array<string>} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearVotePollsByTimestamps = function() { + return this.setVotePollsByTimestamps(undefined); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasVotePollsByTimestamps = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<!Uint8Array>} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bool prove = 2; - * @return {boolean} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesBalancesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * optional GetVotePollsByEndDateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -15407,7 +35317,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -15421,21 +35331,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0])); }; @@ -15453,8 +35363,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject(opt_includeInstance, this); }; @@ -15463,13 +35373,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -15483,23 +35393,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15507,8 +35417,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -15524,9 +35434,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15534,18 +35444,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter ); } }; @@ -15553,30 +35463,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToW /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES_BALANCES: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.repeatedFields_ = [4]; @@ -15593,8 +35484,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(opt_includeInstance, this); }; @@ -15603,15 +35494,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identitiesBalances: (f = msg.getIdentitiesBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + indexValuesList: msg.getIndexValuesList_asB64(), + resultType: jspb.Message.getFieldWithDefault(msg, 5, 0), + allowIncludeLockedAndAbstainingVoteTally: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 8, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -15625,23 +35522,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15649,19 +35546,41 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader); - msg.setIdentitiesBalances(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIndexValues(value); + break; + case 5: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (reader.readEnum()); + msg.setResultType(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAllowIncludeLockedAndAbstainingVoteTally(value); + break; + case 7: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); + msg.setStartAtIdentifierInfo(value); + break; + case 8: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -15676,9 +35595,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15686,39 +35605,88 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesBalances(); - if (f != null) { - writer.writeMessage( + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f ); } - f = message.getProof(); + f = message.getResultType(); + if (f !== 0.0) { + writer.writeEnum( + 5, + f + ); + } + f = message.getAllowIncludeLockedAndAbstainingVoteTally(); + if (f) { + writer.writeBool( + 6, + f + ); + } + f = message.getStartAtIdentifierInfo(); if (f != null) { writer.writeMessage( - 2, + 7, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = /** @type {number} */ (jspb.Message.getField(message, 8)); if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + writer.writeUint32( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType = { + DOCUMENTS: 0, + VOTE_TALLY: 1, + DOCUMENTS_AND_VOTE_TALLY: 2 +}; + @@ -15735,8 +35703,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); }; @@ -15745,14 +35713,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - balance: jspb.Message.getFieldWithDefault(msg, 2, 0) + startIdentifier: msg.getStartIdentifier_asB64(), + startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -15766,23 +35734,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15791,11 +35759,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setStartIdentifier(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartIdentifierIncluded(value); break; default: reader.skipField(); @@ -15810,9 +35778,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15820,22 +35788,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getStartIdentifier_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint64( + f = message.getStartIdentifierIncluded(); + if (f) { + writer.writeBool( 2, f ); @@ -15844,268 +35812,265 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** - * optional bytes identity_id = 1; + * optional bytes start_identifier = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes start_identifier = 1; + * This is a type-conversion wrapper around `getStartIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getStartIdentifier())); }; /** - * optional bytes identity_id = 1; + * optional bytes start_identifier = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getStartIdentifier()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getStartIdentifier())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint64 balance = 2; - * @return {number} + * optional bool start_identifier_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setBalance = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.clearBalance = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.hasBalance = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.repeatedFields_ = [1]; - +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional string document_type_name = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject = function(includeInstance, msg) { - var f, obj = { - entriesList: jspb.Message.toObjectList(msg.getEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * optional string index_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader); - msg.addEntries(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * repeated bytes index_values = 4; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * repeated bytes index_values = 4; + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIndexValuesList())); }; /** - * repeated IdentityBalance entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} + * repeated bytes index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.getEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIndexValuesList())); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.setEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance=} opt_value + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.addEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.addIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.clearEntriesList = function() { - return this.setEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearIndexValuesList = function() { + return this.setIndexValuesList([]); }; /** - * optional IdentitiesBalances identities_balances = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * optional ResultType result_type = 5; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getIdentitiesBalances = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getResultType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setResultType = function(value) { + return jspb.Message.setProto3EnumField(this, 5, value); +}; + + +/** + * optional bool allow_include_locked_and_abstaining_vote_tally = 6; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getAllowIncludeLockedAndAbstainingVoteTally = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setAllowIncludeLockedAndAbstainingVoteTally = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional StartAtIdentifierInfo start_at_identifier_info = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getStartAtIdentifierInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo, 7)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setIdentitiesBalances = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setStartAtIdentifierInfo = function(value) { + return jspb.Message.setWrapperField(this, 7, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearIdentitiesBalances = function() { - return this.setIdentitiesBalances(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearStartAtIdentifierInfo = function() { + return this.setStartAtIdentifierInfo(undefined); }; @@ -16113,36 +36078,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasIdentitiesBalances = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasStartAtIdentifierInfo = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional uint32 count = 8; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 8, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 8, undefined); }; @@ -16150,82 +36114,202 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 8) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); +}; + + +/** + * optional GetContestedResourceVoteStateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentitiesBalancesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter + ); + } }; @@ -16238,21 +36322,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CONTESTED_RESOURCE_CONTENDERS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0])); }; @@ -16270,8 +36355,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(opt_includeInstance, this); }; @@ -16280,13 +36365,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + contestedResourceContenders: (f = msg.getContestedResourceContenders()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -16300,23 +36387,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16324,9 +36411,19 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader); + msg.setContestedResourceContenders(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -16341,9 +36438,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16351,31 +36448,40 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getContestedResourceContenders(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3,4]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -16391,8 +36497,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(opt_includeInstance, this); }; @@ -16401,20 +36507,18 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject = function(includeInstance, msg) { var f, obj = { - identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), - contractsList: jspb.Message.toObjectList(msg.getContractsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), - documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance), - votesList: jspb.Message.toObjectList(msg.getVotesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject, includeInstance) + finishedVoteOutcome: jspb.Message.getFieldWithDefault(msg, 1, 0), + wonByIdentityId: msg.getWonByIdentityId_asB64(), + finishedAtBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, "0"), + finishedAtCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), + finishedAtBlockTimeMs: jspb.Message.getFieldWithDefault(msg, 5, "0"), + finishedAtEpoch: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -16428,23 +36532,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16452,24 +36556,28 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); - msg.addIdentities(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (reader.readEnum()); + msg.setFinishedVoteOutcome(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); - msg.addContracts(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setWonByIdentityId(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); - msg.addDocuments(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFinishedAtBlockHeight(value); break; case 4: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader); - msg.addVotes(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setFinishedAtCoreBlockHeight(value); + break; + case 5: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFinishedAtBlockTimeMs(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setFinishedAtEpoch(value); break; default: reader.skipField(); @@ -16484,9 +36592,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16494,47 +36602,223 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedVoteOutcome(); + if (f !== 0.0) { + writer.writeEnum( 1, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + f ); } - f = message.getContractsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + f ); } - f = message.getDocumentsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedAtBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 3, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + f ); } - f = message.getVotesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedAtCoreBlockHeight(); + if (f !== 0) { + writer.writeUint32( 4, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter + f + ); + } + f = message.getFinishedAtBlockTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 5, + f + ); + } + f = message.getFinishedAtEpoch(); + if (f !== 0) { + writer.writeUint32( + 6, + f ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome = { + TOWARDS_IDENTITY: 0, + LOCKED: 1, + NO_PREVIOUS_WINNER: 2 +}; + +/** + * optional FinishedVoteOutcome finished_vote_outcome = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedVoteOutcome = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedVoteOutcome = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * This is a type-conversion wrapper around `getWonByIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getWonByIdentityId())); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getWonByIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getWonByIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setWonByIdentityId = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.clearWonByIdentityId = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.hasWonByIdentityId = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional uint64 finished_at_block_height = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 3, value); +}; + + +/** + * optional uint32 finished_at_core_block_height = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtCoreBlockHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtCoreBlockHeight = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional uint64 finished_at_block_time_ms = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 5, value); +}; + + +/** + * optional uint32 finished_at_epoch = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtEpoch = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.repeatedFields_ = [1]; @@ -16551,8 +36835,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(opt_includeInstance, this); }; @@ -16561,17 +36845,17 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - documentId: msg.getDocumentId_asB64(), - documentContestedStatus: jspb.Message.getFieldWithDefault(msg, 5, 0) + contendersList: jspb.Message.toObjectList(msg.getContendersList(), + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject, includeInstance), + abstainVoteTally: jspb.Message.getFieldWithDefault(msg, 2, 0), + lockVoteTally: jspb.Message.getFieldWithDefault(msg, 3, 0), + finishedVoteInfo: (f = msg.getFinishedVoteInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(includeInstance, f) }; if (includeInstance) { @@ -16585,23 +36869,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16609,24 +36893,22 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader); + msg.addContenders(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setAbstainVoteTally(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDocumentTypeKeepsHistory(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setLockVoteTally(value); break; case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocumentId(value); - break; - case 5: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (reader.readEnum()); - msg.setDocumentContestedStatus(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader); + msg.setFinishedVoteInfo(value); break; default: reader.skipField(); @@ -16641,9 +36923,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16651,194 +36933,189 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getContendersList(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter ); } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( 2, f ); } - f = message.getDocumentTypeKeepsHistory(); - if (f) { - writer.writeBool( + f = /** @type {number} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeUint32( 3, f ); } - f = message.getDocumentId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getFinishedVoteInfo(); + if (f != null) { + writer.writeMessage( 4, - f - ); - } - f = message.getDocumentContestedStatus(); - if (f !== 0.0) { - writer.writeEnum( - 5, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter ); } }; /** - * @enum {number} + * repeated Contender contenders = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus = { - NOT_CONTESTED: 0, - MAYBE_CONTESTED: 1, - CONTESTED: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getContendersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, 1)); }; + /** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setContendersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.addContenders = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, opt_index); }; /** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearContendersList = function() { + return this.setContendersList([]); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional uint32 abstain_vote_tally = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getAbstainVoteTally = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * optional string document_type = 2; - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setAbstainVoteTally = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearAbstainVoteTally = function() { + return jspb.Message.setField(this, 2, undefined); }; /** - * optional bool document_type_keeps_history = 3; + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasAbstainVoteTally = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional uint32 lock_vote_tally = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getLockVoteTally = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * optional bytes document_id = 4; - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setLockVoteTally = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * optional bytes document_id = 4; - * This is a type-conversion wrapper around `getDocumentId()` - * @return {string} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearLockVoteTally = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * optional bytes document_id = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentId()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasLockVoteTally = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional FinishedVoteInfo finished_vote_info = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getFinishedVoteInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo, 4)); }; /** - * optional DocumentContestedStatus document_contested_status = 5; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setFinishedVoteInfo = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentContestedStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearFinishedVoteInfo = function() { + return this.setFinishedVoteInfo(undefined); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentContestedStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasFinishedVoteInfo = function() { + return jspb.Message.getField(this, 4) != null; }; @@ -16858,8 +37135,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject(opt_includeInstance, this); }; @@ -16868,14 +37145,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + identifier: msg.getIdentifier_asB64(), + voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0), + document: msg.getDocument_asB64() }; if (includeInstance) { @@ -16889,23 +37167,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16914,11 +37192,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setIdentifier(value); break; case 2: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); - msg.setRequestType(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVoteCount(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocument(value); break; default: reader.skipField(); @@ -16933,9 +37215,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16943,250 +37225,319 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getIdentifier_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f !== 0.0) { - writer.writeEnum( + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( 2, f ); } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBytes( + 3, + f + ); + } }; /** - * @enum {number} + * optional bytes identifier = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { - FULL_IDENTITY: 0, - BALANCE: 1, - KEYS: 2, - REVISION: 3 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; + /** - * optional bytes identity_id = 1; + * optional bytes identifier = 1; + * This is a type-conversion wrapper around `getIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentifier())); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 vote_count = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getVoteCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setVoteCount = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearVoteCount = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasVoteCount = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional bytes document = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes document = 3; + * This is a type-conversion wrapper around `getDocument()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getDocument())); }; /** - * optional bytes identity_id = 1; + * optional bytes document = 3; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getDocument()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getDocument())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setDocument = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * optional Type request_type = 2; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearDocument = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasDocument = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional ContestedResourceContenders contested_resource_contenders = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getContestedResourceContenders = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders, 1)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setContestedResourceContenders = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +}; + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearContestedResourceContenders = function() { + return this.setContestedResourceContenders(undefined); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasContestedResourceContenders = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { - var f, obj = { - contractId: msg.getContractId_asB64() - }; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes contract_id = 1; - * @return {string} + * optional GetContestedResourceVoteStateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0, 1)); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0], value); }; /** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -17199,21 +37550,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase = { - REQUEST_TYPE_NOT_SET: 0, - CONTESTED_RESOURCE_VOTE_STATUS_REQUEST: 1 +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getRequestTypeCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0])); }; @@ -17231,8 +37582,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject(opt_includeInstance, this); }; @@ -17241,13 +37592,13 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceVoteStatusRequest: (f = msg.getContestedResourceVoteStatusRequest()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17261,23 +37612,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17285,9 +37636,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader); - msg.setContestedResourceVoteStatusRequest(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -17302,9 +37653,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17312,18 +37663,18 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceVoteStatusRequest(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter ); } }; @@ -17335,7 +37686,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.repeatedFields_ = [4]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.repeatedFields_ = [4]; @@ -17352,8 +37703,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(opt_includeInstance, this); }; @@ -17362,17 +37713,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject = function(includeInstance, msg) { var f, obj = { contractId: msg.getContractId_asB64(), documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), indexValuesList: msg.getIndexValuesList_asB64(), - voterIdentifier: msg.getVoterIdentifier_asB64() + contestantId: msg.getContestantId_asB64(), + startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 7, 0), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -17386,23 +37741,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17427,7 +37782,24 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe break; case 5: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setVoterIdentifier(value); + msg.setContestantId(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); + msg.setStartAtIdentifierInfo(value); + break; + case 7: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -17442,9 +37814,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17452,11 +37824,11 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getContractId_asU8(); if (f.length > 0) { @@ -17486,13 +37858,226 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe f ); } - f = message.getVoterIdentifier_asU8(); + f = message.getContestantId_asU8(); if (f.length > 0) { writer.writeBytes( 5, f ); } + f = message.getStartAtIdentifierInfo(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeUint32( + 7, + f + ); + } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { + var f, obj = { + startIdentifier: msg.getStartIdentifier_asB64(), + startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartIdentifier(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartIdentifierIncluded(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStartIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getStartIdentifierIncluded(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes start_identifier = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes start_identifier = 1; + * This is a type-conversion wrapper around `getStartIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartIdentifier())); +}; + + +/** + * optional bytes start_identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool start_identifier_included = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; @@ -17500,7 +38085,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional bytes contract_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; @@ -17510,7 +38095,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getContractId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getContractId())); }; @@ -17523,7 +38108,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getContractId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getContractId())); }; @@ -17531,9 +38116,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setContractId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContractId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -17542,16 +38127,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional string document_type_name = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getDocumentTypeName = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getDocumentTypeName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setDocumentTypeName = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setDocumentTypeName = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; @@ -17560,16 +38145,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional string index_name = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexName = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexName = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexName = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; @@ -17578,7 +38163,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * repeated bytes index_values = 4; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList = function() { return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; @@ -17588,7 +38173,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getIndexValuesList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( this.getIndexValuesList())); }; @@ -17601,7 +38186,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getIndexValuesList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( this.getIndexValuesList())); }; @@ -17609,9 +38194,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexValuesList = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexValuesList = function(value) { return jspb.Message.setField(this, 4, value || []); }; @@ -17619,277 +38204,197 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.addIndexValues = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.addIndexValues = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.clearIndexValuesList = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearIndexValuesList = function() { return this.setIndexValuesList([]); }; /** - * optional bytes voter_identifier = 5; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * optional bytes voter_identifier = 5; - * This is a type-conversion wrapper around `getVoterIdentifier()` + * optional bytes contestant_id = 5; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getVoterIdentifier())); -}; - - -/** - * optional bytes voter_identifier = 5; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getVoterIdentifier()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getVoterIdentifier())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setVoterIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); -}; - - -/** - * optional ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getContestedResourceVoteStatusRequest = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.setContestedResourceVoteStatusRequest = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.clearContestedResourceVoteStatusRequest = function() { - return this.setContestedResourceVoteStatusRequest(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.hasContestedResourceVoteStatusRequest = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * repeated IdentityRequest identities = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes contestant_id = 5; + * This is a type-conversion wrapper around `getContestantId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContestantId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * optional bytes contestant_id = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContestantId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContestantId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { - return this.setIdentitiesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContestantId = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); }; /** - * repeated ContractRequest contracts = 2; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} + * optional StartAtIdentifierInfo start_at_identifier_info = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getStartAtIdentifierInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo, 6)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setStartAtIdentifierInfo = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addContracts = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearStartAtIdentifierInfo = function() { + return this.setStartAtIdentifierInfo(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearContractsList = function() { - return this.setContractsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasStartAtIdentifierInfo = function() { + return jspb.Message.getField(this, 6) != null; }; /** - * repeated DocumentRequest documents = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} + * optional uint32 count = 7; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getDocumentsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setDocumentsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 7, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addDocuments = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 7, undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * repeated VoteStatusRequest votes = 4; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} + * optional bool order_ascending = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getVotesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, 4)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setVotesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 4, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addVotes = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearVotesList = function() { - return this.setVotesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); }; /** - * optional GetProofsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * optional GetContestedResourceVotersForIdentityRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -17898,7 +38403,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -17912,21 +38417,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0])); }; @@ -17944,8 +38449,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject(opt_includeInstance, this); }; @@ -17954,13 +38459,13 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17974,23 +38479,23 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse; - return proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17998,8 +38503,8 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -18015,9 +38520,9 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18025,18 +38530,18 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter ); } }; @@ -18051,21 +38556,22 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = func * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase = { RESULT_NOT_SET: 0, - PROOF: 1 + CONTESTED_RESOURCE_VOTERS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0])); }; @@ -18083,8 +38589,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(opt_includeInstance, this); }; @@ -18093,12 +38599,13 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject = function(includeInstance, msg) { var f, obj = { + contestedResourceVoters: (f = msg.getContestedResourceVoters()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -18114,23 +38621,23 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; - return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18138,11 +38645,16 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader); + msg.setContestedResourceVoters(value); + break; + case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); msg.setProof(value); break; - case 2: + case 3: var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); msg.setMetadata(value); @@ -18160,9 +38672,9 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18170,24 +38682,32 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProof(); + f = message.getContestedResourceVoters(); if (f != null) { writer.writeMessage( 1, f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } f = message.getMetadata(); if (f != null) { writer.writeMessage( - 2, + 3, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); @@ -18195,30 +38715,277 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeB }; + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject = function(includeInstance, msg) { + var f, obj = { + votersList: msg.getVotersList_asB64(), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addVoters(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVotersList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes voters = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes voters = 1; + * This is a type-conversion wrapper around `getVotersList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getVotersList())); +}; + + +/** + * repeated bytes voters = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getVotersList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getVotersList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setVotersList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.addVoters = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.clearVotersList = function() { + return this.setVotersList([]); +}; + + +/** + * optional bool finished_results = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional ContestedResourceVoters contested_resource_voters = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getContestedResourceVoters = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setContestedResourceVoters = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearContestedResourceVoters = function() { + return this.setContestedResourceVoters(undefined); +}; + + /** - * optional Proof proof = 1; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasContestedResourceVoters = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 1)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -18227,35 +38994,35 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 2; + * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 2)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -18264,35 +39031,35 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetProofsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * optional GetContestedResourceVotersForIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -18301,7 +39068,7 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -18315,21 +39082,21 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0])); }; @@ -18347,8 +39114,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject(opt_includeInstance, this); }; @@ -18357,13 +39124,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -18377,23 +39144,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18401,8 +39168,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -18418,9 +39185,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18428,18 +39195,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter ); } }; @@ -18461,8 +39228,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(opt_includeInstance, this); }; @@ -18471,14 +39238,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + startAtVotePollIdInfo: (f = msg.getStartAtVotePollIdInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -18492,23 +39263,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18517,9 +39288,28 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader); + msg.setStartAtVotePollIdInfo(value); + break; + case 6: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -18536,9 +39326,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18546,292 +39336,61 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getLimit(); + if (f != null) { + writer.writeMessage( 2, - f + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter ); } -}; - - -/** - * optional bytes id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); -}; - - -/** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetDataContractRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 4, + f + ); } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); + f = message.getStartAtVotePollIdInfo(); if (f != null) { writer.writeMessage( - 1, + 5, f, - proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DATA_CONTRACT: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -18847,8 +39406,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(opt_includeInstance, this); }; @@ -18857,15 +39416,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject = function(includeInstance, msg) { var f, obj = { - dataContract: msg.getDataContract_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startAtPollIdentifier: msg.getStartAtPollIdentifier_asB64(), + startPollIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -18879,23 +39437,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18904,17 +39462,11 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDataContract(value); + msg.setStartAtPollIdentifier(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartPollIdentifierIncluded(value); break; default: reader.skipField(); @@ -18929,9 +39481,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18939,123 +39491,156 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { + f = message.getStartAtPollIdentifier_asU8(); + if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getStartPollIdentifierIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes data_contract = 1; + * optional bytes start_at_poll_identifier = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes data_contract = 1; - * This is a type-conversion wrapper around `getDataContract()` + * optional bytes start_at_poll_identifier = 1; + * This is a type-conversion wrapper around `getStartAtPollIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDataContract())); + this.getStartAtPollIdentifier())); }; /** - * optional bytes data_contract = 1; + * optional bytes start_at_poll_identifier = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDataContract()` + * This is a type-conversion wrapper around `getStartAtPollIdentifier()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDataContract())); + this.getStartAtPollIdentifier())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setDataContract = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartAtPollIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * optional bool start_poll_identifier_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearDataContract = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartPollIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasDataContract = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartPollIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.UInt32Value limit = 2; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); }; @@ -19063,36 +39648,36 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasLimit = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional google.protobuf.UInt32Value offset = 3; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOffset = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); }; @@ -19100,35 +39685,108 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasOffset = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDataContractResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * optional bool order_ascending = 4; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional StartAtVotePollIdInfo start_at_vote_poll_id_info = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getStartAtVotePollIdInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setStartAtVotePollIdInfo = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearStartAtVotePollIdInfo = function() { + return this.setStartAtVotePollIdInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasStartAtVotePollIdInfo = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional bool prove = 6; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional GetContestedResourceIdentityVotesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -19137,7 +39795,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -19151,21 +39809,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0])); }; @@ -19183,8 +39841,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject(opt_includeInstance, this); }; @@ -19193,13 +39851,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -19213,23 +39871,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19237,8 +39895,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -19254,9 +39912,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19264,18 +39922,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter ); } }; @@ -19283,11 +39941,30 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VOTES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0])); +}; @@ -19304,8 +39981,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(opt_includeInstance, this); }; @@ -19314,14 +39991,15 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + votes: (f = msg.getVotes()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -19335,224 +40013,107 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * repeated bytes ids = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); -}; - - -/** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetDataContractsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0], value); + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader); + msg.setVotes(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVotes(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.repeatedFields_ = [1]; @@ -19569,8 +40130,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(opt_includeInstance, this); }; @@ -19579,13 +40140,15 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(includeInstance, f) + contestedResourceIdentityVotesList: jspb.Message.toObjectList(msg.getContestedResourceIdentityVotesList(), + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject, includeInstance), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -19599,23 +40162,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19623,9 +40186,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader); + msg.addContestedResourceIdentityVotes(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); break; default: reader.skipField(); @@ -19640,9 +40207,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19650,23 +40217,86 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getContestedResourceIdentityVotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f ); } }; +/** + * repeated ContestedResourceIdentityVote contested_resource_identity_votes = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getContestedResourceIdentityVotesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setContestedResourceIdentityVotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.addContestedResourceIdentityVotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.clearContestedResourceIdentityVotesList = function() { + return this.setContestedResourceIdentityVotesList([]); +}; + + +/** + * optional bool finished_results = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + @@ -19683,8 +40313,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(opt_includeInstance, this); }; @@ -19693,14 +40323,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject = function(includeInstance, msg) { var f, obj = { - identifier: msg.getIdentifier_asB64(), - dataContract: (f = msg.getDataContract()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) + voteChoiceType: jspb.Message.getFieldWithDefault(msg, 1, 0), + identityId: msg.getIdentityId_asB64() }; if (includeInstance) { @@ -19714,23 +40344,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19738,13 +40368,12 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentifier(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (reader.readEnum()); + msg.setVoteChoiceType(value); break; case 2: - var value = new google_protobuf_wrappers_pb.BytesValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); - msg.setDataContract(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; default: reader.skipField(); @@ -19759,9 +40388,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19769,97 +40398,104 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getVoteChoiceType(); + if (f !== 0.0) { + writer.writeEnum( 1, f ); } - f = message.getDataContract(); + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeBytes( 2, - f, - google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + f ); } }; /** - * optional bytes identifier = 1; - * @return {string} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType = { + TOWARDS_IDENTITY: 0, + ABSTAIN: 1, + LOCK: 2 +}; + +/** + * optional VoteChoiceType vote_choice_type = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getVoteChoiceType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * optional bytes identifier = 1; - * This is a type-conversion wrapper around `getIdentifier()` - * @return {string} + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentifier())); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setVoteChoiceType = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * optional bytes identifier = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentifier()` - * @return {!Uint8Array} + * optional bytes identity_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentifier())); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * optional google.protobuf.BytesValue data_contract = 2; - * @return {?proto.google.protobuf.BytesValue} + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getDataContract = function() { - return /** @type{?proto.google.protobuf.BytesValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * @param {?proto.google.protobuf.BytesValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setDataContract = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setIdentityId = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.clearDataContract = function() { - return this.setDataContract(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.clearIdentityId = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -19867,7 +40503,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.hasDataContract = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.hasIdentityId = function() { return jspb.Message.getField(this, 2) != null; }; @@ -19878,7 +40514,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.repeatedFields_ = [3]; @@ -19895,8 +40531,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject(opt_includeInstance, this); }; @@ -19905,14 +40541,16 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject = function(includeInstance, msg) { var f, obj = { - dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject, includeInstance) + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + serializedIndexStorageValuesList: msg.getSerializedIndexStorageValuesList_asB64(), + voteChoice: (f = msg.getVoteChoice()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(includeInstance, f) }; if (includeInstance) { @@ -19926,23 +40564,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19950,9 +40588,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader); - msg.addDataContractEntries(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addSerializedIndexStorageValues(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader); + msg.setVoteChoice(value); break; default: reader.skipField(); @@ -19967,9 +40617,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19977,254 +40627,227 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractEntriesList(); + f = message.getContractId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSerializedIndexStorageValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 3, + f + ); + } + f = message.getVoteChoice(); + if (f != null) { + writer.writeMessage( + 4, f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter ); } }; /** - * repeated DataContractEntry data_contract_entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.getDataContractEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.setDataContractEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.addDataContractEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.clearDataContractEntriesList = function() { - return this.setDataContractEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type_name = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * repeated bytes serialized_index_storage_values = 3; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * repeated bytes serialized_index_storage_values = 3; + * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getSerializedIndexStorageValuesList())); +}; + /** - * @enum {number} + * repeated bytes serialized_index_storage_values = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DATA_CONTRACTS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getSerializedIndexStorageValuesList())); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setSerializedIndexStorageValuesList = function(value) { + return jspb.Message.setField(this, 3, value || []); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.addSerializedIndexStorageValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - dataContracts: (f = msg.getDataContracts()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearSerializedIndexStorageValuesList = function() { + return this.setSerializedIndexStorageValuesList([]); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + * optional ResourceVoteChoice vote_choice = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getVoteChoice = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice, 4)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader); - msg.setDataContracts(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setVoteChoice = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearVoteChoice = function() { + return this.setVoteChoice(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDataContracts(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.hasVoteChoice = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional DataContracts data_contracts = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * optional ContestedResourceIdentityVotes votes = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getDataContracts = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getVotes = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setDataContracts = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setVotes = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearDataContracts = function() { - return this.setDataContracts(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearVotes = function() { + return this.setVotes(undefined); }; @@ -20232,7 +40855,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasDataContracts = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasVotes = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20241,7 +40864,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -20249,18 +40872,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -20269,7 +40892,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -20278,7 +40901,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -20286,18 +40909,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -20306,35 +40929,35 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDataContractsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + * optional GetContestedResourceIdentityVotesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -20343,7 +40966,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = fun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20357,21 +40980,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = funct * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0])); }; @@ -20389,8 +41012,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject(opt_includeInstance, this); }; @@ -20399,13 +41022,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -20419,23 +41042,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20443,8 +41066,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -20460,9 +41083,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20470,18 +41093,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter ); } }; @@ -20503,8 +41126,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(opt_includeInstance, this); }; @@ -20513,17 +41136,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { id: msg.getId_asB64(), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - startAtMs: jspb.Message.getFieldWithDefault(msg, 4, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -20537,23 +41157,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20565,20 +41185,6 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis msg.setId(value); break; case 2: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartAtMs(value); - break; - case 5: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -20595,9 +41201,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20605,11 +41211,11 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getId_asU8(); if (f.length > 0) { @@ -20618,33 +41224,10 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis f ); } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getStartAtMs(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } f = message.getProve(); if (f) { writer.writeBool( - 5, + 2, f ); } @@ -20655,7 +41238,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * optional bytes id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; @@ -20665,7 +41248,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * This is a type-conversion wrapper around `getId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getId())); }; @@ -20678,7 +41261,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * This is a type-conversion wrapper around `getId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getId())); }; @@ -20686,147 +41269,55 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional google.protobuf.UInt32Value limit = 2; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional google.protobuf.UInt32Value offset = 3; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional uint64 start_at_ms = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getStartAtMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setStartAtMs = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional bool prove = 5; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetDataContractHistoryRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * optional GetPrefundedSpecializedBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -20835,7 +41326,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20849,21 +41340,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0])); }; @@ -20881,8 +41372,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject(opt_includeInstance, this); }; @@ -20891,13 +41382,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObjec * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -20911,23 +41402,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = functi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20935,8 +41426,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -20952,9 +41443,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20962,18 +41453,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.seriali /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter ); } }; @@ -20988,22 +41479,22 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryTo * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - DATA_CONTRACT_HISTORY: 1, + BALANCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0])); }; @@ -21021,8 +41512,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(opt_includeInstance, this); }; @@ -21031,13 +41522,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - dataContractHistory: (f = msg.getDataContractHistory()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(includeInstance, f), + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -21053,23 +41544,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21077,9 +41568,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader); - msg.setDataContractHistory(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -21104,9 +41594,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21114,18 +41604,17 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractHistory(); + f = /** @type {string} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -21147,197 +41636,178 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi }; +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject = function(includeInstance, msg) { - var f, obj = { - date: jspb.Message.getFieldWithDefault(msg, 1, 0), - value: msg.getValue_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], undefined); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasBalance = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setDate(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDate(); - if (f !== 0) { - writer.writeUint64( - 1, - f - ); - } - f = message.getValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint64 date = 1; - * @return {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getDate = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setDate = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * optional bytes value = 2; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes value = 2; - * This is a type-conversion wrapper around `getValue()` - * @return {string} + * optional GetPrefundedSpecializedBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0, 1)); }; /** - * optional bytes value = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0])); +}; @@ -21354,8 +41824,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject(opt_includeInstance, this); }; @@ -21364,14 +41834,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = function(includeInstance, msg) { var f, obj = { - dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -21385,23 +41854,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21409,9 +41878,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader); - msg.addDataContractEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -21426,9 +41895,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21436,196 +41905,177 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter ); } }; -/** - * repeated DataContractHistoryEntry data_contract_entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.getDataContractEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.setDataContractEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.addDataContractEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.clearDataContractEntriesList = function() { - return this.setDataContractEntriesList([]); -}; - - -/** - * optional DataContractHistory data_contract_history = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getDataContractHistory = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setDataContractHistory = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); -}; - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearDataContractHistory = function() { - return this.setDataContractHistory(undefined); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Returns whether this field is set. - * @return {boolean} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasDataContractHistory = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(opt_includeInstance, this); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProve(); + if (f) { + writer.writeBool( + 1, + f + ); + } }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + * optional bool prove = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; /** - * optional GetDataContractHistoryResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * optional GetTotalCreditsInPlatformRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -21634,7 +42084,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -21648,21 +42098,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0])); }; @@ -21680,8 +42130,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject(opt_includeInstance, this); }; @@ -21690,13 +42140,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -21710,23 +42160,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest; - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21734,8 +42184,8 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -21751,9 +42201,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21761,18 +42211,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter ); } }; @@ -21787,22 +42237,22 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = fu * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_ = [[6,7]]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase = { - START_NOT_SET: 0, - START_AFTER: 6, - START_AT: 7 +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CREDITS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0])); }; @@ -21820,8 +42270,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(opt_includeInstance, this); }; @@ -21830,20 +42280,15 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - dataContractId: msg.getDataContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - where: msg.getWhere_asB64(), - orderBy: msg.getOrderBy_asB64(), - limit: jspb.Message.getFieldWithDefault(msg, 5, 0), - startAfter: msg.getStartAfter_asB64(), - startAt: msg.getStartAt_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 8, false) + credits: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -21857,23 +42302,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21881,36 +42326,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDataContractId(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setCredits(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setWhere(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setOrderBy(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); - break; - case 6: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAfter(value); - break; - case 7: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAt(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -21925,9 +42352,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21935,395 +42362,631 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( 1, f ); } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getWhere_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getOrderBy_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } - f = message.getLimit(); - if (f !== 0) { - writer.writeUint32( - 5, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 6)); + f = message.getProof(); if (f != null) { - writer.writeBytes( - 6, - f + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 7)); + f = message.getMetadata(); if (f != null) { - writer.writeBytes( - 7, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 8, - f + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes data_contract_id = 1; + * optional uint64 credits = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getCredits = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * optional bytes data_contract_id = 1; - * This is a type-conversion wrapper around `getDataContractId()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDataContractId())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setCredits = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); }; /** - * optional bytes data_contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDataContractId()` - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDataContractId())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearCredits = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDataContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasCredits = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional string document_type = 2; - * @return {string} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bytes where = 3; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bytes where = 3; - * This is a type-conversion wrapper around `getWhere()` - * @return {string} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getWhere())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetTotalCreditsInPlatformResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes where = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getWhere()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getWhere())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setWhere = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } }; + /** - * optional bytes order_by = 4; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); }; /** - * optional bytes order_by = 4; - * This is a type-conversion wrapper around `getOrderBy()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getOrderBy())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes order_by = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getOrderBy()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getOrderBy())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setOrderBy = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint32 limit = 5; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; /** - * optional bytes start_after = 6; - * @return {string} + * repeated bytes path = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes start_after = 6; - * This is a type-conversion wrapper around `getStartAfter()` - * @return {string} + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getPathList())); }; /** - * optional bytes start_after = 6; + * repeated bytes path = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAfter()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getPathList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAfter = function(value) { - return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAfter = function() { - return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAfter = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); }; /** - * optional bytes start_at = 7; - * @return {string} + * repeated bytes keys = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional bytes start_at = 7; - * This is a type-conversion wrapper around `getStartAt()` - * @return {string} + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); }; /** - * optional bytes start_at = 7; + * repeated bytes keys = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); }; /** - * optional bool prove = 8; + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetDocumentsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -22332,7 +42995,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22346,21 +43009,21 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); }; @@ -22378,8 +43041,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); }; @@ -22388,13 +43051,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -22408,23 +43071,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22432,8 +43095,8 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -22449,9 +43112,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22459,18 +43122,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter ); } }; @@ -22485,22 +43148,22 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { RESULT_NOT_SET: 0, - DOCUMENTS: 1, + ELEMENTS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); }; @@ -22518,8 +43181,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); }; @@ -22528,13 +43191,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -22550,23 +43213,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22574,9 +43237,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); - msg.setDocuments(value); + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -22601,9 +43264,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22611,18 +43274,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDocuments(); + f = message.getElements(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter ); } f = message.getProof(); @@ -22650,7 +43313,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.seri * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; @@ -22667,8 +43330,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); }; @@ -22677,13 +43340,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { var f, obj = { - documentsList: msg.getDocumentsList_asB64() + elementsList: msg.getElementsList_asB64() }; if (includeInstance) { @@ -22697,23 +43360,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22722,7 +43385,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addDocuments(value); + msg.addElements(value); break; default: reader.skipField(); @@ -22737,9 +43400,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22747,13 +43410,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDocumentsList_asU8(); + f = message.getElementsList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( 1, @@ -22764,43 +43427,43 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** - * repeated bytes documents = 1; + * repeated bytes elements = 1; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes documents = 1; - * This is a type-conversion wrapper around `getDocumentsList()` + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getDocumentsList())); + this.getElementsList())); }; /** - * repeated bytes documents = 1; + * repeated bytes elements = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentsList()` + * This is a type-conversion wrapper around `getElementsList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getDocumentsList())); + this.getElementsList())); }; /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { return jspb.Message.setField(this, 1, value || []); }; @@ -22808,47 +43471,47 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); }; /** - * optional Documents documents = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { - return this.setDocuments(undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); }; @@ -22856,7 +43519,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22865,7 +43528,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -22873,18 +43536,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -22893,7 +43556,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -22902,7 +43565,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -22910,18 +43573,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -22930,35 +43593,35 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDocumentsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -22967,7 +43630,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22981,21 +43644,21 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function( * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0])); }; @@ -23013,8 +43676,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); }; @@ -23023,13 +43686,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toOb * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -23043,23 +43706,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = fun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; + return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23067,8 +43730,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBin var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -23084,9 +43747,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBin * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23094,18 +43757,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.seri /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter ); } }; @@ -23127,8 +43790,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(opt_includeInstance, this); }; @@ -23137,14 +43800,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - publicKeyHash: msg.getPublicKeyHash_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; if (includeInstance) { @@ -23158,37 +43820,29 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; + return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setPublicKeyHash(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; default: reader.skipField(); break; @@ -23202,9 +43856,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23212,152 +43866,376 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPublicKeyHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); +}; + + +/** + * optional GetStatusRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; } + return obj; }; +} /** - * optional bytes public_key_hash = 1; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes public_key_hash = 1; - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getPublicKeyHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes public_key_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHash()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getPublicKeyHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setPublicKeyHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter + ); + } }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bool prove = 2; - * @return {boolean} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(opt_includeInstance, this); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(includeInstance, f), + node: (f = msg.getNode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(includeInstance, f), + chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(includeInstance, f), + stateSync: (f = msg.getStateSync()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(includeInstance, f), + time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentityByPublicKeyHashRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader); + msg.setVersion(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader); + msg.setNode(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader); + msg.setChain(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader); + msg.setNetwork(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader); + msg.setStateSync(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader); + msg.setTime(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVersion(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter + ); + } + f = message.getNode(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter + ); + } + f = message.getChain(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter + ); + } + f = message.getNetwork(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter + ); + } + f = message.getStateSync(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter + ); + } + f = message.getTime(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter + ); + } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -23373,8 +44251,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(opt_includeInstance, this); }; @@ -23383,13 +44261,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toO * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(includeInstance, f) + software: (f = msg.getSoftware()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(includeInstance, f), + protocol: (f = msg.getProtocol()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(includeInstance, f) }; if (includeInstance) { @@ -23403,23 +44282,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = fu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23427,9 +44306,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader); + msg.setSoftware(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader); + msg.setProtocol(value); break; default: reader.skipField(); @@ -23444,9 +44328,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23454,50 +44338,32 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.ser /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getSoftware(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter + ); + } + f = message.getProtocol(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -23513,8 +44379,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(opt_includeInstance, this); }; @@ -23523,15 +44389,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + dapi: jspb.Message.getFieldWithDefault(msg, 1, ""), + drive: jspb.Message.getFieldWithDefault(msg, 2, ""), + tenderdash: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -23545,23 +44411,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23569,18 +44435,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDapi(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDrive(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readString()); + msg.setTenderdash(value); break; default: reader.skipField(); @@ -23595,9 +44459,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23605,86 +44469,78 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeBytes( + f = message.getDapi(); + if (f.length > 0) { + writer.writeString( 1, f ); } - f = message.getProof(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeString( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity = 1; + * optional string dapi = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDapi = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDapi = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional bytes identity = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` - * @return {!Uint8Array} + * optional string drive = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDrive = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDrive = function(value) { + return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearDrive = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -23692,36 +44548,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasIdentity = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasDrive = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional string tenderdash = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getTenderdash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setTenderdash = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearTenderdash = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -23729,110 +44584,139 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasTenderdash = function() { + return jspb.Message.getField(this, 3) != null; }; -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject = function(includeInstance, msg) { + var f, obj = { + tenderdash: (f = msg.getTenderdash()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(includeInstance, f), + drive: (f = msg.getDrive()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(includeInstance, f) + }; -/** - * optional GetIdentityByPublicKeyHashResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0, 1)); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader(msg, reader); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader); + msg.setTenderdash(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader); + msg.setDrive(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_ = [[1]]; - /** - * @enum {number} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTenderdash(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter + ); + } + f = message.getDrive(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter + ); + } }; -/** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0])); -}; + @@ -23849,8 +44733,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(opt_includeInstance, this); }; @@ -23859,13 +44743,14 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(includeInstance, f) + p2p: jspb.Message.getFieldWithDefault(msg, 1, 0), + block: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -23879,23 +44764,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23903,9 +44788,12 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setP2p(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlock(value); break; default: reader.skipField(); @@ -23920,30 +44808,72 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getP2p(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getBlock(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } +}; + + +/** + * optional uint32 p2p = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getP2p = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setP2p = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 block = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getBlock = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setBlock = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; @@ -23963,8 +44893,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(opt_includeInstance, this); }; @@ -23973,14 +44903,14 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject = function(includeInstance, msg) { var f, obj = { - stateTransitionHash: msg.getStateTransitionHash_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + latest: jspb.Message.getFieldWithDefault(msg, 3, 0), + current: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -23994,36 +44924,36 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStateTransitionHash(value); + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLatest(value); break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCurrent(value); break; default: reader.skipField(); @@ -24038,9 +44968,9 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24048,23 +44978,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStateTransitionHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, + f = message.getLatest(); + if (f !== 0) { + writer.writeUint32( + 3, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, + f = message.getCurrent(); + if (f !== 0) { + writer.writeUint32( + 4, f ); } @@ -24072,90 +45002,66 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** - * optional bytes state_transition_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes state_transition_hash = 1; - * This is a type-conversion wrapper around `getStateTransitionHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStateTransitionHash())); -}; - - -/** - * optional bytes state_transition_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStateTransitionHash()` - * @return {!Uint8Array} + * optional uint32 latest = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStateTransitionHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getLatest = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setStateTransitionHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setLatest = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * optional bool prove = 2; - * @return {boolean} + * optional uint32 current = 4; + * @return {number} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getCurrent = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setCurrent = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); }; /** - * optional WaitForStateTransitionResultRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * optional Tenderdash tenderdash = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getTenderdash = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setTenderdash = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearTenderdash = function() { + return this.setTenderdash(undefined); }; @@ -24163,179 +45069,125 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasTenderdash = function() { return jspb.Message.getField(this, 1) != null; }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional Drive drive = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getDrive = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive, 2)); +}; + /** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setDrive = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; + /** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearDrive = function() { + return this.setDrive(undefined); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasDrive = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Software software = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getSoftware = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setSoftware = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearSoftware = function() { + return this.setSoftware(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasSoftware = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Protocol protocol = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getProtocol = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol, 2)); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_ = [[1,2]]; + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setProtocol = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + /** - * @enum {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - ERROR: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearProtocol = function() { + return this.setProtocol(undefined); }; + /** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasProtocol = function() { + return jspb.Message.getField(this, 2) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -24349,8 +45201,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(opt_includeInstance, this); }; @@ -24359,15 +45211,16 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject = function(includeInstance, msg) { var f, obj = { - error: (f = msg.getError()) && proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + local: jspb.Message.getFieldWithDefault(msg, 1, "0"), + block: jspb.Message.getFieldWithDefault(msg, 2, "0"), + genesis: jspb.Message.getFieldWithDefault(msg, 3, "0"), + epoch: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -24381,23 +45234,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -24405,19 +45258,20 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader); - msg.setError(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setLocal(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBlock(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setGenesis(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); break; default: reader.skipField(); @@ -24432,9 +45286,9 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24442,175 +45296,85 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getError(); - if (f != null) { - writer.writeMessage( + f = message.getLocal(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter + f ); } - f = message.getProof(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeUint32( + 4, + f ); } }; /** - * optional StateTransitionBroadcastError error = 1; - * @return {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getError = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setError = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearError = function() { - return this.setError(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasError = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this + * optional uint64 local = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getLocal = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setLocal = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional WaitForStateTransitionResultResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * optional uint64 block = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getBlock = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0], value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setBlock = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearBlock = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -24618,147 +45382,80 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasBlock = function() { + return jspb.Message.getField(this, 2) != null; }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_ = [[1]]; - /** - * @enum {number} + * optional uint64 genesis = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getGenesis = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "0")); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setGenesis = function(value) { + return jspb.Message.setField(this, 3, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearGenesis = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasGenesis = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} + * optional uint32 epoch = 4; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 4, undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 4) != null; }; @@ -24778,8 +45475,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(opt_includeInstance, this); }; @@ -24788,14 +45485,14 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject = function(includeInstance, msg) { var f, obj = { - height: jspb.Message.getFieldWithDefault(msg, 1, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + id: msg.getId_asB64(), + proTxHash: msg.getProTxHash_asB64() }; if (includeInstance) { @@ -24809,23 +45506,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -24833,12 +45530,12 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setHeight(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); break; default: reader.skipField(); @@ -24853,9 +45550,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24863,22 +45560,22 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getHeight(); - if (f !== 0) { - writer.writeInt32( + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, f ); @@ -24887,106 +45584,110 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** - * optional int32 height = 1; - * @return {number} + * optional bytes id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setHeight = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); }; /** - * optional bool prove = 2; - * @return {boolean} + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional GetConsensusParamsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * optional bytes pro_tx_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0], value); + * optional bytes pro_tx_hash = 2; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this + * optional bytes pro_tx_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setProTxHash = function(value) { + return jspb.Message.setField(this, 2, value); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.clearProTxHash = function() { + return jspb.Message.setField(this, 2, undefined); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.hasProTxHash = function() { + return jspb.Message.getField(this, 2) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -25000,8 +45701,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(opt_includeInstance, this); }; @@ -25010,13 +45711,21 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(includeInstance, f) + catchingUp: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + latestBlockHash: msg.getLatestBlockHash_asB64(), + latestAppHash: msg.getLatestAppHash_asB64(), + latestBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, "0"), + earliestBlockHash: msg.getEarliestBlockHash_asB64(), + earliestAppHash: msg.getEarliestAppHash_asB64(), + earliestBlockHeight: jspb.Message.getFieldWithDefault(msg, 7, "0"), + maxPeerBlockHeight: jspb.Message.getFieldWithDefault(msg, 9, "0"), + coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 10, 0) }; if (includeInstance) { @@ -25030,23 +45739,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25054,9 +45763,40 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFrom var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setCatchingUp(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLatestBlockHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLatestAppHash(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setLatestBlockHeight(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEarliestBlockHash(value); + break; + case 6: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEarliestAppHash(value); + break; + case 7: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setEarliestBlockHeight(value); + break; + case 9: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setMaxPeerBlockHeight(value); + break; + case 10: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreChainLockedHeight(value); break; default: reader.skipField(); @@ -25071,9 +45811,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25081,400 +45821,351 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getCatchingUp(); + if (f) { + writer.writeBool( 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter + f + ); + } + f = message.getLatestBlockHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getLatestAppHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getLatestBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getEarliestBlockHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } + f = message.getEarliestAppHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 6, + f + ); + } + f = message.getEarliestBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 7, + f + ); + } + f = message.getMaxPeerBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 9, + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 10)); + if (f != null) { + writer.writeUint32( + 10, + f ); } }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bool catching_up = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCatchingUp = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject = function(includeInstance, msg) { - var f, obj = { - maxBytes: jspb.Message.getFieldWithDefault(msg, 1, ""), - maxGas: jspb.Message.getFieldWithDefault(msg, 2, ""), - timeIotaMs: jspb.Message.getFieldWithDefault(msg, 3, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCatchingUp = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + * optional bytes latest_block_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + * optional bytes latest_block_hash = 2; + * This is a type-conversion wrapper around `getLatestBlockHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxBytes(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxGas(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setTimeIotaMs(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLatestBlockHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes latest_block_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLatestBlockHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLatestBlockHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMaxBytes(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getMaxGas(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getTimeIotaMs(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * optional string max_bytes = 1; + * optional bytes latest_app_hash = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxBytes = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * optional bytes latest_app_hash = 3; + * This is a type-conversion wrapper around `getLatestAppHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxBytes = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLatestAppHash())); }; /** - * optional string max_gas = 2; - * @return {string} + * optional bytes latest_app_hash = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLatestAppHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxGas = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLatestAppHash())); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxGas = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestAppHash = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); }; /** - * optional string time_iota_ms = 3; + * optional uint64 latest_block_height = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getTimeIotaMs = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setTimeIotaMs = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; +/** + * optional bytes earliest_block_hash = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bytes earliest_block_hash = 5; + * This is a type-conversion wrapper around `getEarliestBlockHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEarliestBlockHash())); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional bytes earliest_block_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEarliestBlockHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject = function(includeInstance, msg) { - var f, obj = { - maxAgeNumBlocks: jspb.Message.getFieldWithDefault(msg, 1, ""), - maxAgeDuration: jspb.Message.getFieldWithDefault(msg, 2, ""), - maxBytes: jspb.Message.getFieldWithDefault(msg, 3, "") - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEarliestBlockHash())); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} + * optional bytes earliest_app_hash = 6; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} + * optional bytes earliest_app_hash = 6; + * This is a type-conversion wrapper around `getEarliestAppHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxAgeNumBlocks(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxAgeDuration(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEarliestAppHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes earliest_app_hash = 6; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEarliestAppHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEarliestAppHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMaxAgeNumBlocks(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getMaxAgeDuration(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getMaxBytes(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestAppHash = function(value) { + return jspb.Message.setProto3BytesField(this, 6, value); }; /** - * optional string max_age_num_blocks = 1; + * optional uint64 earliest_block_height = 7; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeNumBlocks = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeNumBlocks = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 7, value); }; /** - * optional string max_age_duration = 2; + * optional uint64 max_peer_block_height = 9; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeDuration = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getMaxPeerBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeDuration = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setMaxPeerBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 9, value); }; /** - * optional string max_bytes = 3; - * @return {string} + * optional uint32 core_chain_locked_height = 10; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxBytes = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCoreChainLockedHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxBytes = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCoreChainLockedHeight = function(value) { + return jspb.Message.setField(this, 10, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.clearCoreChainLockedHeight = function() { + return jspb.Message.setField(this, 10, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.hasCoreChainLockedHeight = function() { + return jspb.Message.getField(this, 10) != null; }; @@ -25494,8 +46185,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(opt_includeInstance, this); }; @@ -25504,14 +46195,15 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject = function(includeInstance, msg) { var f, obj = { - block: (f = msg.getBlock()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(includeInstance, f), - evidence: (f = msg.getEvidence()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(includeInstance, f) + chainId: jspb.Message.getFieldWithDefault(msg, 1, ""), + peersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), + listening: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -25525,23 +46217,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25549,14 +46241,16 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader); - msg.setBlock(value); + var value = /** @type {string} */ (reader.readString()); + msg.setChainId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader); - msg.setEvidence(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPeersCount(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setListening(value); break; default: reader.skipField(); @@ -25571,9 +46265,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25581,170 +46275,93 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBlock(); - if (f != null) { - writer.writeMessage( + f = message.getChainId(); + if (f.length > 0) { + writer.writeString( 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter + f ); } - f = message.getEvidence(); - if (f != null) { - writer.writeMessage( + f = message.getPeersCount(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter + f + ); + } + f = message.getListening(); + if (f) { + writer.writeBool( + 3, + f ); } }; -/** - * optional ConsensusParamsBlock block = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getBlock = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setBlock = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearBlock = function() { - return this.setBlock(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasBlock = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional ConsensusParamsEvidence evidence = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getEvidence = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setEvidence = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearEvidence = function() { - return this.setEvidence(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasEvidence = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional GetConsensusParamsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0], value); +/** + * optional string chain_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getChainId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setChainId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional uint32 peers_count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getPeersCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setPeersCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + /** - * @enum {number} + * optional bool listening = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getListening = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setListening = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -25758,8 +46375,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(opt_includeInstance, this); }; @@ -25768,13 +46385,20 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(includeInstance, f) + totalSyncedTime: jspb.Message.getFieldWithDefault(msg, 1, "0"), + remainingTime: jspb.Message.getFieldWithDefault(msg, 2, "0"), + totalSnapshots: jspb.Message.getFieldWithDefault(msg, 3, 0), + chunkProcessAvgTime: jspb.Message.getFieldWithDefault(msg, 4, "0"), + snapshotHeight: jspb.Message.getFieldWithDefault(msg, 5, "0"), + snapshotChunksCount: jspb.Message.getFieldWithDefault(msg, 6, "0"), + backfilledBlocks: jspb.Message.getFieldWithDefault(msg, 7, "0"), + backfillBlocksTotal: jspb.Message.getFieldWithDefault(msg, 8, "0") }; if (includeInstance) { @@ -25788,23 +46412,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25812,9 +46436,36 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTotalSyncedTime(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setRemainingTime(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setTotalSnapshots(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setChunkProcessAvgTime(value); + break; + case 5: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setSnapshotHeight(value); + break; + case 6: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setSnapshotChunksCount(value); + break; + case 7: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBackfilledBlocks(value); + break; + case 8: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBackfillBlocksTotal(value); break; default: reader.skipField(); @@ -25829,9 +46480,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25839,178 +46490,240 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getTotalSyncedTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter + f + ); + } + f = message.getRemainingTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } + f = message.getTotalSnapshots(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getChunkProcessAvgTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getSnapshotHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 5, + f + ); + } + f = message.getSnapshotChunksCount(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 6, + f + ); + } + f = message.getBackfilledBlocks(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 7, + f + ); + } + f = message.getBackfillBlocksTotal(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 8, + f ); } }; +/** + * optional uint64 total_synced_time = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSyncedTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSyncedTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional uint64 remaining_time = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getRemainingTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setRemainingTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional uint32 total_snapshots = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSnapshots = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSnapshots = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * optional uint64 chunk_process_avg_time = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getChunkProcessAvgTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setChunkProcessAvgTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional uint64 snapshot_height = 5; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getProve(); - if (f) { - writer.writeBool( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "0")); }; /** - * optional bool prove = 1; - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 5, value); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} returns this + * optional uint64 snapshot_chunks_count = 6; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotChunksCount = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "0")); }; /** - * optional GetProtocolVersionUpgradeStateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotChunksCount = function(value) { + return jspb.Message.setProto3StringIntField(this, 6, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this + * optional uint64 backfilled_blocks = 7; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfilledBlocks = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfilledBlocks = function(value) { + return jspb.Message.setProto3StringIntField(this, 7, value); +}; + + +/** + * optional uint64 backfill_blocks_total = 8; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfillBlocksTotal = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfillBlocksTotal = function(value) { + return jspb.Message.setProto3StringIntField(this, 8, value); +}; + + +/** + * optional Version version = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getVersion = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setVersion = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearVersion = function() { + return this.setVersion(undefined); }; @@ -26018,325 +46731,258 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasVersion = function() { return jspb.Message.getField(this, 1) != null; }; +/** + * optional Node node = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNode = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node, 2)); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNode = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNode = function() { + return this.setNode(undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNode = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} + * optional Chain chain = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getChain = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain, 3)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setChain = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearChain = function() { + return this.setChain(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(includeInstance, f) - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasChain = function() { + return jspb.Message.getField(this, 3) != null; +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional Network network = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNetwork = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network, 4)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNetwork = function() { + return this.setNetwork(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional StateSync state_sync = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getStateSync = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync, 5)); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setStateSync = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearStateSync = function() { + return this.setStateSync(undefined); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasStateSync = function() { + return jspb.Message.getField(this, 5) != null; +}; + /** - * @enum {number} + * optional Time time = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VERSIONS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getTime = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time, 6)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0])); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setTime = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearTime = function() { + return this.setTime(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasTime = function() { + return jspb.Message.getField(this, 6) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} + * optional GetStatusResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader); - msg.setVersions(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersions(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +}; @@ -26353,8 +46999,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); }; @@ -26363,14 +47009,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - versionsList: jspb.Message.toObjectList(msg.getVersionsList(), - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -26384,23 +47029,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -26408,9 +47053,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader); - msg.addVersions(value); + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -26425,9 +47070,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -26435,61 +47080,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersionsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * repeated VersionEntry versions = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.getVersionsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.setVersionsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.addVersions = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.clearVersionsList = function() { - return this.setVersionsList([]); -}; - - @@ -26506,8 +47113,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); }; @@ -26516,14 +47123,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - versionNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), - voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; if (includeInstance) { @@ -26537,37 +47143,29 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVersionNumber(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVoteCount(value); - break; default: reader.skipField(); break; @@ -26579,212 +47177,51 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersionNumber(); - if (f !== 0) { - writer.writeUint32( - 1, - f - ); - } - f = message.getVoteCount(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } -}; - - -/** - * optional uint32 version_number = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVersionNumber = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVersionNumber = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint32 vote_count = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVoteCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVoteCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional Versions versions = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getVersions = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setVersions = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearVersions = function() { - return this.setVersions(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasVersions = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; /** - * optional GetProtocolVersionUpgradeStateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} + * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -26793,7 +47230,7 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -26807,21 +47244,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); }; @@ -26839,8 +47276,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); }; @@ -26849,13 +47286,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -26869,23 +47306,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -26893,8 +47330,8 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -26910,9 +47347,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -26920,18 +47357,18 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter ); } }; @@ -26953,8 +47390,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); }; @@ -26963,15 +47400,15 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { var f, obj = { - startProTxHash: msg.getStartProTxHash_asB64(), - count: jspb.Message.getFieldWithDefault(msg, 2, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + proTxHash: msg.getProTxHash_asB64(), + nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), + isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -26985,23 +47422,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27010,15 +47447,15 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartProTxHash(value); + msg.setProTxHash(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); + var value = /** @type {string} */ (reader.readString()); + msg.setNodeIp(value); break; case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + msg.setIsBanned(value); break; default: reader.skipField(); @@ -27033,9 +47470,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27043,27 +47480,27 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartProTxHash_asU8(); + f = message.getProTxHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getCount(); - if (f !== 0) { - writer.writeUint32( + f = message.getNodeIp(); + if (f.length > 0) { + writer.writeString( 2, f ); } - f = message.getProve(); + f = message.getIsBanned(); if (f) { writer.writeBool( 3, @@ -27074,145 +47511,90 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** - * optional bytes start_pro_tx_hash = 1; + * optional bytes pro_tx_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_pro_tx_hash = 1; - * This is a type-conversion wrapper around `getStartProTxHash()` + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartProTxHash())); + this.getProTxHash())); }; /** - * optional bytes start_pro_tx_hash = 1; + * optional bytes pro_tx_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartProTxHash()` + * This is a type-conversion wrapper around `getProTxHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartProTxHash())); + this.getProTxHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setStartProTxHash = function(value) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 2; - * @return {number} + * optional string node_ip = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bool prove = 3; + * optional bool is_banned = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { return jspb.Message.setProto3BooleanField(this, 3, value); }; -/** - * optional GetProtocolVersionUpgradeVoteStatusRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; @@ -27229,8 +47611,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); }; @@ -27239,13 +47621,17 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(includeInstance, f) + quorumHash: msg.getQuorumHash_asB64(), + coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), + thresholdPublicKey: msg.getThresholdPublicKey_asB64() }; if (includeInstance) { @@ -27259,23 +47645,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27283,9 +47669,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreHeight(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setThresholdPublicKey(value); break; default: reader.skipField(); @@ -27300,9 +47698,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27310,352 +47708,192 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, + f + ); + } + f = message.getCoreHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter ); } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VERSIONS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; + f = message.getThresholdPublicKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); } - return obj; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional bytes quorum_hash = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional bytes quorum_hash = 1; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader); - msg.setVersions(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes quorum_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersions(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional uint32 core_height = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject = function(includeInstance, msg) { - var f, obj = { - versionSignalsList: jspb.Message.toObjectList(msg.getVersionSignalsList(), - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + * repeated ValidatorV0 members = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader); - msg.addVersionSignals(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersionSignalsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { + return this.setMembersList([]); }; /** - * repeated VersionSignal version_signals = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} + * optional bytes threshold_public_key = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.getVersionSignalsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.setVersionSignalsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes threshold_public_key = 4; + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getThresholdPublicKey())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * optional bytes threshold_public_key = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.addVersionSignals = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, opt_index); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getThresholdPublicKey())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.clearVersionSignalsList = function() { - return this.setVersionSignalsList([]); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -27671,8 +47909,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); }; @@ -27681,14 +47919,18 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - version: jspb.Message.getFieldWithDefault(msg, 2, 0) + quorumHashesList: msg.getQuorumHashesList_asB64(), + currentQuorumHash: msg.getCurrentQuorumHash_asB64(), + validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), + lastBlockProposer: msg.getLastBlockProposer_asB64(), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -27702,23 +47944,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27727,11 +47969,25 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + msg.addQuorumHashes(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVersion(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCurrentQuorumHash(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); + msg.addValidatorSets(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLastBlockProposer(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -27746,9 +48002,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27756,187 +48012,259 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); + f = message.getQuorumHashesList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getVersion(); - if (f !== 0) { - writer.writeUint32( + f = message.getCurrentQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( 2, f ); } + f = message.getValidatorSetsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter + ); + } + f = message.getLastBlockProposer_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * optional bytes pro_tx_hash = 1; - * @return {string} + * repeated bytes quorum_hashes = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} + * repeated bytes quorum_hashes = 1; + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getQuorumHashesList())); }; /** - * optional bytes pro_tx_hash = 1; + * repeated bytes quorum_hashes = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getQuorumHashesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * optional uint32 version = 2; - * @return {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { + return this.setQuorumHashesList([]); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + * optional bytes current_quorum_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setVersion = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * optional VersionSignals versions = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + * optional bytes current_quorum_hash = 2; + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getVersions = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getCurrentQuorumHash())); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * optional bytes current_quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getCurrentQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * repeated ValidatorSetV0 validator_sets = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setVersions = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearVersions = function() { - return this.setVersions(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasVersions = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { + return this.setValidatorSetsList([]); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes last_block_proposer = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); + * optional bytes last_block_proposer = 4; + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLastBlockProposer())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * optional bytes last_block_proposer = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLastBlockProposer())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; /** - * optional ResponseMetadata metadata = 3; + * optional ResponseMetadata metadata = 5; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -27945,35 +48273,35 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * optional GetProtocolVersionUpgradeVoteStatusResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -27982,7 +48310,7 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -27996,21 +48324,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_[0])); }; @@ -28028,8 +48356,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.toObject(opt_includeInstance, this); }; @@ -28038,13 +48366,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -28058,23 +48386,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28082,8 +48410,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -28099,9 +48427,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28109,24 +48437,31 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter ); } }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.repeatedFields_ = [2]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28142,8 +48477,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject(opt_includeInstance, this); }; @@ -28152,16 +48487,15 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - startEpoch: (f = msg.getStartEpoch()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 2, 0), - ascending: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + identityId: msg.getIdentityId_asB64(), + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -28175,23 +48509,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28199,19 +48533,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setStartEpoch(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addTokenIds(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAscending(value); - break; - case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -28228,9 +48557,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28238,38 +48567,30 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartEpoch(); - if (f != null) { - writer.writeMessage( + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getCount(); - if (f !== 0) { - writer.writeUint32( - 2, f ); } - f = message.getAscending(); - if (f) { - writer.writeBool( - 3, + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, f ); } f = message.getProve(); if (f) { writer.writeBool( - 4, + 3, f ); } @@ -28277,120 +48598,150 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.seri /** - * optional google.protobuf.UInt32Value start_epoch = 1; - * @return {?proto.google.protobuf.UInt32Value} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getStartEpoch = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setStartEpoch = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.clearStartEpoch = function() { - return this.setStartEpoch(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.hasStartEpoch = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 2; - * @return {number} + * repeated bytes token_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * repeated bytes token_ids = 2; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * optional bool ascending = 3; - * @return {boolean} + * repeated bytes token_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional bool prove = 4; + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); +}; + + +/** + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetEpochsInfoRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * optional GetIdentityTokenBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -28399,7 +48750,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -28413,21 +48764,21 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function( * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_[0])); }; @@ -28445,8 +48796,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.toObject(opt_includeInstance, this); }; @@ -28455,13 +48806,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -28475,23 +48826,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28499,8 +48850,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -28516,9 +48867,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28526,18 +48877,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter ); } }; @@ -28552,22 +48903,22 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase = { RESULT_NOT_SET: 0, - EPOCHS: 1, + TOKEN_BALANCES: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0])); }; @@ -28585,8 +48936,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject(opt_includeInstance, this); }; @@ -28595,13 +48946,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epochs: (f = msg.getEpochs()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(includeInstance, f), + tokenBalances: (f = msg.getTokenBalances()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -28617,23 +48968,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28641,9 +48992,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader); - msg.setEpochs(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader); + msg.setTokenBalances(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -28668,9 +49019,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28678,18 +49029,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpochs(); + f = message.getTokenBalances(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter ); } f = message.getProof(); @@ -28712,13 +49063,6 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.se -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28734,8 +49078,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject(opt_includeInstance, this); }; @@ -28744,14 +49088,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject = function(includeInstance, msg) { var f, obj = { - epochInfosList: jspb.Message.toObjectList(msg.getEpochInfosList(), - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject, includeInstance) + tokenId: msg.getTokenId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -28765,23 +49109,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28789,9 +49133,12 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader); - msg.addEpochInfos(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; default: reader.skipField(); @@ -28806,9 +49153,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28816,62 +49163,115 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpochInfosList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64( + 2, + f ); } }; /** - * repeated EpochInfo epoch_infos = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.getEpochInfosList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.setEpochInfosList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.addEpochInfos = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.clearEpochInfosList = function() { - return this.setEpochInfosList([]); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 balance = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.hasBalance = function() { + return jspb.Message.getField(this, 2) != null; }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28887,8 +49287,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject(opt_includeInstance, this); }; @@ -28897,18 +49297,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject = function(includeInstance, msg) { var f, obj = { - number: jspb.Message.getFieldWithDefault(msg, 1, 0), - firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), - startTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), - protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) + tokenBalancesList: jspb.Message.toObjectList(msg.getTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject, includeInstance) }; if (includeInstance) { @@ -28922,23 +49318,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28946,28 +49342,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setNumber(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFirstBlockHeight(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFirstCoreBlockHeight(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartTime(value); - break; - case 5: - var value = /** @type {number} */ (reader.readDouble()); - msg.setFeeMultiplier(value); - break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setProtocolVersion(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader); + msg.addTokenBalances(value); break; default: reader.skipField(); @@ -28982,9 +49359,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28992,190 +49369,86 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getNumber(); - if (f !== 0) { - writer.writeUint32( + f = message.getTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getFirstBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 2, - f - ); - } - f = message.getFirstCoreBlockHeight(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getStartTime(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getFeeMultiplier(); - if (f !== 0.0) { - writer.writeDouble( - 5, - f - ); - } - f = message.getProtocolVersion(); - if (f !== 0) { - writer.writeUint32( - 6, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter ); } }; /** - * optional uint32 number = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getNumber = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setNumber = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint64 first_block_height = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 first_core_block_height = 3; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstCoreBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstCoreBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional uint64 start_time = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getStartTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setStartTime = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional double fee_multiplier = 5; - * @return {number} + * repeated TokenBalanceEntry token_balances = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFeeMultiplier = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.getTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFeeMultiplier = function(value) { - return jspb.Message.setProto3FloatField(this, 5, value); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.setTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * optional uint32 protocol_version = 6; - * @return {number} + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.addTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, opt_index); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.clearTokenBalancesList = function() { + return this.setTokenBalancesList([]); }; /** - * optional EpochInfos epochs = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * optional TokenBalances token_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getEpochs = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getTokenBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setEpochs = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setTokenBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearEpochs = function() { - return this.setEpochs(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearTokenBalances = function() { + return this.setTokenBalances(undefined); }; @@ -29183,7 +49456,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasEpochs = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasTokenBalances = function() { return jspb.Message.getField(this, 1) != null; }; @@ -29192,7 +49465,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -29200,18 +49473,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -29220,7 +49493,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -29229,7 +49502,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -29237,18 +49510,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -29257,35 +49530,35 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetEpochsInfoResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0, 1)); +/** + * optional GetIdentityTokenBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -29294,7 +49567,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -29308,21 +49581,21 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_[0])); }; @@ -29340,8 +49613,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.toObject(opt_includeInstance, this); }; @@ -29350,13 +49623,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -29370,23 +49643,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -29394,8 +49667,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -29411,9 +49684,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -29421,18 +49694,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter ); } }; @@ -29444,7 +49717,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWr * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.repeatedFields_ = [4,5]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.repeatedFields_ = [2]; @@ -29461,8 +49734,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject(opt_includeInstance, this); }; @@ -29471,21 +49744,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - startIndexValuesList: msg.getStartIndexValuesList_asB64(), - endIndexValuesList: msg.getEndIndexValuesList_asB64(), - startAtValueInfo: (f = msg.getStartAtValueInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 7, 0), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + tokenId: msg.getTokenId_asB64(), + identityIdsList: msg.getIdentityIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -29499,23 +49766,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -29524,38 +49791,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addStartIndexValues(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addEndIndexValues(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader); - msg.setStartAtValueInfo(value); - break; - case 7: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); + msg.addIdentityIds(value); break; - case 9: + case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -29572,9 +49814,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -29582,197 +49824,30 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getStartIndexValuesList_asU8(); + f = message.getIdentityIdsList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getEndIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 5, - f - ); - } - f = message.getStartAtValueInfo(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 7)); - if (f != null) { - writer.writeUint32( - 7, - f - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 8, + 2, f ); } f = message.getProve(); if (f) { writer.writeBool( - 9, - f - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject = function(includeInstance, msg) { - var f, obj = { - startValue: msg.getStartValue_asB64(), - startValueIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartValue(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartValueIncluded(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getStartValueIncluded(); - if (f) { - writer.writeBool( - 2, + 3, f ); } @@ -29780,398 +49855,150 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** - * optional bytes start_value = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes start_value = 1; - * This is a type-conversion wrapper around `getStartValue()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartValue())); -}; - - -/** - * optional bytes start_value = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartValue()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartValue())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool start_value_included = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValueIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValueIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type_name = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string index_name = 3; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * repeated bytes start_index_values = 4; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); -}; - - -/** - * repeated bytes start_index_values = 4; - * This is a type-conversion wrapper around `getStartIndexValuesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getStartIndexValuesList())); -}; - - -/** - * repeated bytes start_index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIndexValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getStartIndexValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addStartIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartIndexValuesList = function() { - return this.setStartIndexValuesList([]); -}; - - -/** - * repeated bytes end_index_values = 5; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); -}; - - -/** - * repeated bytes end_index_values = 5; - * This is a type-conversion wrapper around `getEndIndexValuesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getEndIndexValuesList())); -}; - - -/** - * repeated bytes end_index_values = 5; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEndIndexValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getEndIndexValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setEndIndexValuesList = function(value) { - return jspb.Message.setField(this, 5, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addEndIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 5, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearEndIndexValuesList = function() { - return this.setEndIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional StartAtValueInfo start_at_value_info = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartAtValueInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo, 6)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartAtValueInfo = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartAtValueInfo = function() { - return this.setStartAtValueInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasStartAtValueInfo = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 7; - * @return {number} + * repeated bytes identity_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * repeated bytes identity_ids = 2; + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentityIdsList())); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * repeated bytes identity_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 7, undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentityIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setIdentityIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional bool order_ascending = 8; - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.addIdentityIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.clearIdentityIdsList = function() { + return this.setIdentityIdsList([]); }; /** - * optional bool prove = 9; + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetContestedResourcesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * optional GetIdentitiesTokenBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -30180,7 +50007,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -30194,21 +50021,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_[0])); }; @@ -30226,8 +50053,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.toObject(opt_includeInstance, this); }; @@ -30236,13 +50063,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -30256,23 +50083,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30280,8 +50107,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -30297,9 +50124,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30307,18 +50134,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter ); } }; @@ -30333,22 +50160,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToW * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_VALUES: 1, + IDENTITY_TOKEN_BALANCES: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0])); }; @@ -30366,8 +50193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject(opt_includeInstance, this); }; @@ -30376,13 +50203,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceValues: (f = msg.getContestedResourceValues()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(includeInstance, f), + identityTokenBalances: (f = msg.getIdentityTokenBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -30398,23 +50225,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30422,9 +50249,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader); - msg.setContestedResourceValues(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader); + msg.setIdentityTokenBalances(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -30449,9 +50276,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30459,18 +50286,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceValues(); + f = message.getIdentityTokenBalances(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter ); } f = message.getProof(); @@ -30493,13 +50320,6 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -30515,8 +50335,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject(opt_includeInstance, this); }; @@ -30525,13 +50345,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceValuesList: msg.getContestedResourceValuesList_asB64() + identityId: msg.getIdentityId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -30545,23 +50366,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30570,7 +50391,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addContestedResourceValues(value); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; default: reader.skipField(); @@ -30585,9 +50410,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30595,145 +50420,95 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceValuesList_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64( + 2, + f + ); + } }; /** - * repeated bytes contested_resource_values = 1; - * @return {!Array<string>} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes contested_resource_values = 1; - * This is a type-conversion wrapper around `getContestedResourceValuesList()` - * @return {!Array<string>} + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getContestedResourceValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * repeated bytes contested_resource_values = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContestedResourceValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getContestedResourceValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.setContestedResourceValuesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.addContestedResourceValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.clearContestedResourceValuesList = function() { - return this.setContestedResourceValuesList([]); -}; - - -/** - * optional ContestedResourceValues contested_resource_values = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getContestedResourceValues = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setContestedResourceValues = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearContestedResourceValues = function() { - return this.setContestedResourceValues(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional uint64 balance = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasContestedResourceValues = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -30741,110 +50516,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.hasBalance = function() { return jspb.Message.getField(this, 2) != null; }; -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional GetContestedResourcesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.repeatedFields_ = [1]; @@ -30861,8 +50544,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject(opt_includeInstance, this); }; @@ -30871,13 +50554,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(includeInstance, f) + identityTokenBalancesList: jspb.Message.toObjectList(msg.getIdentityTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject, includeInstance) }; if (includeInstance) { @@ -30891,23 +50575,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30915,9 +50599,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader); + msg.addIdentityTokenBalances(value); break; default: reader.skipField(); @@ -30932,9 +50616,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30942,199 +50626,234 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getIdentityTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter ); } }; +/** + * repeated IdentityTokenBalanceEntry identity_token_balances = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.getIdentityTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.setIdentityTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.addIdentityTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.clearIdentityTokenBalancesList = function() { + return this.setIdentityTokenBalancesList([]); +}; + + +/** + * optional IdentityTokenBalances identity_token_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getIdentityTokenBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setIdentityTokenBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearIdentityTokenBalances = function() { + return this.setIdentityTokenBalances(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasIdentityTokenBalances = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional GetIdentitiesTokenBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - startTimeInfo: (f = msg.getStartTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(includeInstance, f), - endTimeInfo: (f = msg.getEndTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(includeInstance, f), - limit: jspb.Message.getFieldWithDefault(msg, 3, 0), - offset: jspb.Message.getFieldWithDefault(msg, 4, 0), - ascending: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_[0], value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader); - msg.setStartTimeInfo(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader); - msg.setEndTimeInfo(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setOffset(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAscending(value); - break; - case 6: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartTimeInfo(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter - ); - } - f = message.getEndTimeInfo(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint32( - 3, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeUint32( - 4, - f - ); - } - f = message.getAscending(); - if (f) { - writer.writeBool( - 5, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 6, - f - ); - } -}; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_[0])); +}; @@ -31151,8 +50870,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.toObject(opt_includeInstance, this); }; @@ -31161,14 +50880,13 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.toObject = function(includeInstance, msg) { var f, obj = { - startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), - startTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -31182,23 +50900,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31206,12 +50924,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartTimeMs(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartTimeIncluded(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -31226,9 +50941,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31236,65 +50951,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartTimeMs(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getStartTimeIncluded(); - if (f) { - writer.writeBool( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 start_time_ms = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional bool start_time_included = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.repeatedFields_ = [2]; @@ -31311,8 +50991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject(opt_includeInstance, this); }; @@ -31321,14 +51001,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - endTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), - endTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -31342,23 +51023,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31366,12 +51047,16 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setEndTimeMs(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addTokenIds(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setEndTimeIncluded(value); + msg.setProve(value); break; default: reader.skipField(); @@ -31386,9 +51071,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31396,23 +51081,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEndTimeMs(); - if (f !== 0) { - writer.writeUint64( + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getEndTimeIncluded(); + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -31420,139 +51112,151 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** - * optional uint64 end_time_ms = 1; - * @return {number} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * optional bool end_time_included = 2; - * @return {boolean} + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional StartAtTimeInfo start_time_info = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * repeated bytes token_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getStartTimeInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setStartTimeInfo = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * repeated bytes token_ids = 2; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * repeated bytes token_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearStartTimeInfo = function() { - return this.setStartTimeInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasStartTimeInfo = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional EndAtTimeInfo end_time_info = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getEndTimeInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setEndTimeInfo = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearEndTimeInfo = function() { - return this.setEndTimeInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasEndTimeInfo = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional uint32 limit = 3; - * @return {number} + * optional GetIdentityTokenInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setField(this, 3, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearLimit = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -31560,117 +51264,147 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * optional uint32 offset = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getOffset = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setField(this, 4, value); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_ = [[1]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearOffset = function() { - return jspb.Message.setField(this, 4, undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_[0])); }; -/** - * optional bool ascending = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.toObject(opt_includeInstance, this); }; /** - * optional bool prove = 6; - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject(includeInstance, f) + }; -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetVotePollsByEndDateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter + ); + } }; @@ -31683,21 +51417,22 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + TOKEN_INFOS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0])); }; @@ -31715,8 +51450,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -31725,13 +51460,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(includeInstance, f) + tokenInfos: (f = msg.getTokenInfos()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -31745,23 +51482,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31769,9 +51506,19 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader); + msg.setTokenInfos(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -31786,9 +51533,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31796,52 +51543,172 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getTokenInfos(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(opt_includeInstance, this); +}; + /** - * @enum {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VOTE_POLLS_BY_TIMESTAMPS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject = function(includeInstance, msg) { + var f, obj = { + frozen: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} + /** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFrozen(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFrozen(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool frozen = 1; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.getFrozen = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.setFrozen = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -31855,8 +51722,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject(opt_includeInstance, this); }; @@ -31865,15 +51732,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - votePollsByTimestamps: (f = msg.getVotePollsByTimestamps()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + tokenId: msg.getTokenId_asB64(), + info: (f = msg.getInfo()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -31887,23 +51753,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31911,19 +51777,13 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader); - msg.setVotePollsByTimestamps(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader); + msg.setInfo(value); break; default: reader.skipField(); @@ -31938,9 +51798,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31948,46 +51808,116 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotePollsByTimestamps(); - if (f != null) { - writer.writeMessage( + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter + f ); } - f = message.getProof(); + f = message.getInfo(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter ); } }; +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional TokenIdentityInfoEntry info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.clearInfo = function() { + return this.setInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; +}; + + /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.repeatedFields_ = [1]; @@ -32004,8 +51934,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject(opt_includeInstance, this); }; @@ -32014,14 +51944,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject = function(includeInstance, msg) { var f, obj = { - timestamp: jspb.Message.getFieldWithDefault(msg, 1, 0), - serializedVotePollsList: msg.getSerializedVotePollsList_asB64() + tokenInfosList: jspb.Message.toObjectList(msg.getTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject, includeInstance) }; if (includeInstance) { @@ -32035,23 +51965,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32059,12 +51989,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTimestamp(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addSerializedVotePolls(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader); + msg.addTokenInfos(value); break; default: reader.skipField(); @@ -32079,9 +52006,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32089,105 +52016,345 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTimestamp(); - if (f !== 0) { - writer.writeUint64( - 1, - f - ); - } - f = message.getSerializedVotePollsList_asU8(); + f = message.getTokenInfosList(); if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter ); } }; /** - * optional uint64 timestamp = 1; - * @return {number} + * repeated TokenInfoEntry token_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getTimestamp = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.getTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.setTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setTimestamp = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.addTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, opt_index); }; /** - * repeated bytes serialized_vote_polls = 2; - * @return {!Array<string>} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.clearTokenInfosList = function() { + return this.setTokenInfosList([]); }; /** - * repeated bytes serialized_vote_polls = 2; - * This is a type-conversion wrapper around `getSerializedVotePollsList()` - * @return {!Array<string>} + * optional TokenInfos token_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getTokenInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setTokenInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearTokenInfos = function() { + return this.setTokenInfos(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasTokenInfos = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityTokenInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getSerializedVotePollsList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * repeated bytes serialized_vote_polls = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSerializedVotePollsList()` - * @return {!Array<!Uint8Array>} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getSerializedVotePollsList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setSerializedVotePollsList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.addSerializedVotePolls = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.clearSerializedVotePollsList = function() { - return this.setSerializedVotePollsList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter + ); + } }; @@ -32197,7 +52364,7 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.repeatedFields_ = [2]; @@ -32214,8 +52381,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject(opt_includeInstance, this); }; @@ -32224,15 +52391,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - votePollsByTimestampsList: jspb.Message.toObjectList(msg.getVotePollsByTimestampsList(), - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject, includeInstance), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + tokenId: msg.getTokenId_asB64(), + identityIdsList: msg.getIdentityIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -32246,23 +52413,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32270,13 +52437,16 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader); - msg.addVotePollsByTimestamps(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIdentityIds(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + msg.setProve(value); break; default: reader.skipField(); @@ -32291,9 +52461,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32301,24 +52471,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotePollsByTimestampsList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter + f ); } - f = message.getFinishedResults(); + f = message.getIdentityIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -32326,196 +52502,150 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** - * repeated SerializedVotePollsByTimestamp vote_polls_by_timestamps = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getVotePollsByTimestampsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setVotePollsByTimestampsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.addVotePollsByTimestamps = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.clearVotePollsByTimestampsList = function() { - return this.setVotePollsByTimestampsList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * optional bool finished_results = 2; - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this + * repeated bytes identity_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional SerializedVotePollsByTimestamps vote_polls_by_timestamps = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * repeated bytes identity_ids = 2; + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getVotePollsByTimestamps = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setVotePollsByTimestamps = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentityIdsList())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this + * repeated bytes identity_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearVotePollsByTimestamps = function() { - return this.setVotePollsByTimestamps(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentityIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasVotePollsByTimestamps = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setIdentityIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.addIdentityIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.clearIdentityIdsList = function() { + return this.setIdentityIdsList([]); }; /** - * Returns whether this field is set. + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetVotePollsByEndDateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * optional GetIdentitiesTokenInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -32524,7 +52654,7 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -32538,21 +52668,21 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_[0])); }; @@ -32570,8 +52700,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.toObject(opt_includeInstance, this); }; @@ -32580,13 +52710,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -32600,23 +52730,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32624,8 +52754,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -32641,9 +52771,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32651,18 +52781,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter ); } }; @@ -32670,11 +52800,30 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBi /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.repeatedFields_ = [4]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_TOKEN_INFOS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0])); +}; @@ -32691,8 +52840,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -32701,21 +52850,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - indexValuesList: msg.getIndexValuesList_asB64(), - resultType: jspb.Message.getFieldWithDefault(msg, 5, 0), - allowIncludeLockedAndAbstainingVoteTally: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), - startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 8, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + identityTokenInfos: (f = msg.getIdentityTokenInfos()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -32729,23 +52872,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32753,41 +52896,19 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader); + msg.setIdentityTokenInfos(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIndexValues(value); - break; - case 5: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (reader.readEnum()); - msg.setResultType(value); - break; - case 6: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAllowIncludeLockedAndAbstainingVoteTally(value); - break; - case 7: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); - msg.setStartAtIdentifierInfo(value); - break; - case 8: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 9: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -32802,9 +52923,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32812,73 +52933,145 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getIdentityTokenInfos(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getResultType(); - if (f !== 0.0) { - writer.writeEnum( - 5, - f - ); - } - f = message.getAllowIncludeLockedAndAbstainingVoteTally(); - if (f) { - writer.writeBool( - 6, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getStartAtIdentifierInfo(); + f = message.getMetadata(); if (f != null) { writer.writeMessage( - 7, + 3, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 8)); - if (f != null) { - writer.writeUint32( - 8, - f - ); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject = function(includeInstance, msg) { + var f, obj = { + frozen: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; } - f = message.getProve(); + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFrozen(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFrozen(); if (f) { writer.writeBool( - 9, + 1, f ); } @@ -32886,17 +53079,26 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** - * @enum {number} + * optional bool frozen = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType = { - DOCUMENTS: 0, - VOTE_TALLY: 1, - DOCUMENTS_AND_VOTE_TALLY: 2 +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.getFrozen = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.setFrozen = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -32910,8 +53112,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject(opt_includeInstance, this); }; @@ -32920,14 +53122,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - startIdentifier: msg.getStartIdentifier_asB64(), - startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + info: (f = msg.getInfo()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -32941,23 +53143,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32966,11 +53168,12 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartIdentifier(value); + msg.setIdentityId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartIdentifierIncluded(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader); + msg.setInfo(value); break; default: reader.skipField(); @@ -32985,9 +53188,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32995,289 +53198,331 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartIdentifier_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getStartIdentifierIncluded(); - if (f) { - writer.writeBool( + f = message.getInfo(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter ); } }; /** - * optional bytes start_identifier = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_identifier = 1; - * This is a type-conversion wrapper around `getStartIdentifier()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartIdentifier())); + this.getIdentityId())); }; /** - * optional bytes start_identifier = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIdentifier()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartIdentifier())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool start_identifier_included = 2; - * @return {boolean} + * optional TokenIdentityInfoEntry info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry, 2)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * optional bytes contract_id = 1; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.clearInfo = function() { + return this.setInfo(undefined); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; }; -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.repeatedFields_ = [1]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional string document_type_name = 2; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject(opt_includeInstance, this); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject = function(includeInstance, msg) { + var f, obj = { + tokenInfosList: jspb.Message.toObjectList(msg.getTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional string index_name = 3; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader(msg, reader); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader); + msg.addTokenInfos(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated bytes index_values = 4; - * @return {!Array<string>} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * repeated bytes index_values = 4; - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<string>} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter + ); + } }; /** - * repeated bytes index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<!Uint8Array>} + * repeated TokenInfoEntry token_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.getTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.setTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.addIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.addTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearIndexValuesList = function() { - return this.setIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.clearTokenInfosList = function() { + return this.setTokenInfosList([]); }; /** - * optional ResultType result_type = 5; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} + * optional IdentityTokenInfos identity_token_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getResultType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getIdentityTokenInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos, 1)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setResultType = function(value) { - return jspb.Message.setProto3EnumField(this, 5, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setIdentityTokenInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0], value); }; /** - * optional bool allow_include_locked_and_abstaining_vote_tally = 6; - * @return {boolean} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getAllowIncludeLockedAndAbstainingVoteTally = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearIdentityTokenInfos = function() { + return this.setIdentityTokenInfos(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setAllowIncludeLockedAndAbstainingVoteTally = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasIdentityTokenInfos = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional StartAtIdentifierInfo start_at_identifier_info = 7; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getStartAtIdentifierInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo, 7)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setStartAtIdentifierInfo = function(value) { - return jspb.Message.setWrapperField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearStartAtIdentifierInfo = function() { - return this.setStartAtIdentifierInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -33285,35 +53530,36 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasStartAtIdentifierInfo = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint32 count = 8; - * @return {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 8, value); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 8, undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -33321,53 +53567,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 8) != null; -}; - - -/** - * optional bool prove = 9; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetContestedResourceVoteStateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * optional GetIdentitiesTokenInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -33376,7 +53604,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -33390,21 +53618,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.h * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_[0])); }; @@ -33422,8 +53650,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.toObject(opt_includeInstance, this); }; @@ -33432,13 +53660,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -33452,23 +53680,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -33476,8 +53704,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -33493,9 +53721,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -33503,18 +53731,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter ); } }; @@ -33522,172 +53750,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeB /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_CONTENDERS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - contestedResourceContenders: (f = msg.getContestedResourceContenders()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader); - msg.setContestedResourceContenders(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getContestedResourceContenders(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.repeatedFields_ = [1]; @@ -33704,8 +53771,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject(opt_includeInstance, this); }; @@ -33714,18 +53781,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - finishedVoteOutcome: jspb.Message.getFieldWithDefault(msg, 1, 0), - wonByIdentityId: msg.getWonByIdentityId_asB64(), - finishedAtBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), - finishedAtCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), - finishedAtBlockTimeMs: jspb.Message.getFieldWithDefault(msg, 5, 0), - finishedAtEpoch: jspb.Message.getFieldWithDefault(msg, 6, 0) + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -33739,23 +53802,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -33763,28 +53826,12 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (reader.readEnum()); - msg.setFinishedVoteOutcome(value); - break; - case 2: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setWonByIdentityId(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFinishedAtBlockHeight(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFinishedAtCoreBlockHeight(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFinishedAtBlockTimeMs(value); + msg.addTokenIds(value); break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFinishedAtEpoch(value); + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -33799,9 +53846,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -33809,223 +53856,170 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getFinishedVoteOutcome(); - if (f !== 0.0) { - writer.writeEnum( + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, f ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( + f = message.getProve(); + if (f) { + writer.writeBool( 2, f ); } - f = message.getFinishedAtBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 3, - f - ); - } - f = message.getFinishedAtCoreBlockHeight(); - if (f !== 0) { - writer.writeUint32( - 4, - f - ); - } - f = message.getFinishedAtBlockTimeMs(); - if (f !== 0) { - writer.writeUint64( - 5, - f - ); - } - f = message.getFinishedAtEpoch(); - if (f !== 0) { - writer.writeUint32( - 6, - f - ); - } -}; - - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome = { - TOWARDS_IDENTITY: 0, - LOCKED: 1, - NO_PREVIOUS_WINNER: 2 -}; - -/** - * optional FinishedVoteOutcome finished_vote_outcome = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedVoteOutcome = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * repeated bytes token_ids = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedVoteOutcome = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes won_by_identity_id = 2; - * @return {string} + * repeated bytes token_ids = 1; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * optional bytes won_by_identity_id = 2; - * This is a type-conversion wrapper around `getWonByIdentityId()` - * @return {string} + * repeated bytes token_ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getWonByIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * optional bytes won_by_identity_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getWonByIdentityId()` - * @return {!Uint8Array} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getWonByIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setWonByIdentityId = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.clearWonByIdentityId = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); }; /** - * Returns whether this field is set. + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.hasWonByIdentityId = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * optional uint64 finished_at_block_height = 3; - * @return {number} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * optional GetTokenStatusesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0, 1)); }; /** - * optional uint32 finished_at_core_block_height = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtCoreBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_[0], value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtCoreBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * optional uint64 finished_at_block_time_ms = 5; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - /** - * optional uint32 finished_at_epoch = 6; - * @return {number} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_ = [[1]]; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_[0])); +}; @@ -34042,8 +54036,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.toObject(opt_includeInstance, this); }; @@ -34052,17 +54046,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.toObject = function(includeInstance, msg) { var f, obj = { - contendersList: jspb.Message.toObjectList(msg.getContendersList(), - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject, includeInstance), - abstainVoteTally: jspb.Message.getFieldWithDefault(msg, 2, 0), - lockVoteTally: jspb.Message.getFieldWithDefault(msg, 3, 0), - finishedVoteInfo: (f = msg.getFinishedVoteInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -34076,23 +54066,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34100,22 +54090,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader); - msg.addContenders(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setAbstainVoteTally(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLockVoteTally(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader); - msg.setFinishedVoteInfo(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -34130,9 +54107,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34140,189 +54117,188 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContendersList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint32( - 2, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint32( - 3, - f - ); - } - f = message.getFinishedVoteInfo(); + f = message.getV0(); if (f != null) { writer.writeMessage( - 4, + 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated Contender contenders = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getContendersList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setContendersList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.addContenders = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearContendersList = function() { - return this.setContendersList([]); -}; - /** - * optional uint32 abstain_vote_tally = 2; - * @return {number} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getAbstainVoteTally = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_ = [[1,2]]; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setAbstainVoteTally = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + TOKEN_STATUSES: 1, + PROOF: 2 }; - /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearAbstainVoteTally = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0])); }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasAbstainVoteTally = function() { - return jspb.Message.getField(this, 2) != null; -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint32 lock_vote_tally = 3; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getLockVoteTally = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setLockVoteTally = function(value) { - return jspb.Message.setField(this, 3, value); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + tokenStatuses: (f = msg.getTokenStatuses()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearLockVoteTally = function() { - return jspb.Message.setField(this, 3, undefined); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasLockVoteTally = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * optional FinishedVoteInfo finished_vote_info = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getFinishedVoteInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo, 4)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setFinishedVoteInfo = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader); + msg.setTokenStatuses(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearFinishedVoteInfo = function() { - return this.setFinishedVoteInfo(undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasFinishedVoteInfo = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenStatuses(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; @@ -34342,8 +54318,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject(opt_includeInstance, this); }; @@ -34352,15 +54328,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject = function(includeInstance, msg) { var f, obj = { - identifier: msg.getIdentifier_asB64(), - voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0), - document: msg.getDocument_asB64() + tokenId: msg.getTokenId_asB64(), + paused: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -34374,23 +54349,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34399,15 +54374,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentifier(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVoteCount(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocument(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setPaused(value); break; default: reader.skipField(); @@ -34422,9 +54393,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34432,30 +54403,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentifier_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint32( - 2, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + f = /** @type {boolean} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeBytes( - 3, + writer.writeBool( + 2, f ); } @@ -34463,70 +54427,70 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** - * optional bytes identifier = 1; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identifier = 1; - * This is a type-conversion wrapper around `getIdentifier()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentifier())); + this.getTokenId())); }; /** - * optional bytes identifier = 1; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentifier()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentifier())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.setTokenId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 vote_count = 2; - * @return {number} + * optional bool paused = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getVoteCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getPaused = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setVoteCount = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.setPaused = function(value) { return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearVoteCount = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.clearPaused = function() { return jspb.Message.setField(this, 2, undefined); }; @@ -34535,96 +54499,196 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasVoteCount = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.hasPaused = function() { return jspb.Message.getField(this, 2) != null; }; + /** - * optional bytes document = 3; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject(opt_includeInstance, this); }; /** - * optional bytes document = 3; - * This is a type-conversion wrapper around `getDocument()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocument())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject = function(includeInstance, msg) { + var f, obj = { + tokenStatusesList: jspb.Message.toObjectList(msg.getTokenStatusesList(), + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes document = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocument()` + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader); + msg.addTokenStatuses(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocument())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setDocument = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenStatusesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter + ); + } }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * repeated TokenStatusEntry token_statuses = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearDocument = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.getTokenStatusesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, 1)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.setTokenStatusesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasDocument = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.addTokenStatuses = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, opt_index); }; /** - * optional ContestedResourceContenders contested_resource_contenders = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getContestedResourceContenders = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders, 1)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.clearTokenStatusesList = function() { + return this.setTokenStatusesList([]); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * optional TokenStatuses token_statuses = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getTokenStatuses = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setContestedResourceContenders = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setTokenStatuses = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearContestedResourceContenders = function() { - return this.setContestedResourceContenders(undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearTokenStatuses = function() { + return this.setTokenStatuses(undefined); }; @@ -34632,7 +54696,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasContestedResourceContenders = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasTokenStatuses = function() { return jspb.Message.getField(this, 1) != null; }; @@ -34641,7 +54705,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -34649,18 +54713,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -34669,7 +54733,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -34678,7 +54742,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -34686,18 +54750,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -34706,35 +54770,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetContestedResourceVoteStateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} + * optional GetTokenStatusesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -34743,7 +54807,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -34757,21 +54821,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_[0])); }; @@ -34789,8 +54853,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.toObject(opt_includeInstance, this); }; @@ -34799,13 +54863,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -34819,23 +54883,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34843,8 +54907,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.des var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -34860,9 +54924,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34870,31 +54934,24 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.repeatedFields_ = [4]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -34910,8 +54967,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject(opt_includeInstance, this); }; @@ -34920,21 +54977,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - indexValuesList: msg.getIndexValuesList_asB64(), - contestantId: msg.getContestantId_asB64(), - startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 7, 0), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + tokenId: msg.getTokenId_asB64(), + startAtInfo: (f = msg.getStartAtInfo()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject(includeInstance, f), + limit: jspb.Message.getFieldWithDefault(msg, 3, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -34948,23 +55000,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34973,38 +55025,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader); + msg.setStartAtInfo(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIndexValues(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContestantId(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); - msg.setStartAtIdentifierInfo(value); - break; - case 7: var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); + msg.setLimit(value); break; - case 9: + case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -35021,9 +55053,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35031,73 +55063,38 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getContestantId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getStartAtIdentifierInfo(); + f = message.getStartAtInfo(); if (f != null) { writer.writeMessage( - 6, + 2, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 7)); + f = /** @type {number} */ (jspb.Message.getField(message, 3)); if (f != null) { writer.writeUint32( - 7, - f - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 8, + 3, f ); } f = message.getProve(); if (f) { writer.writeBool( - 9, + 4, f ); } @@ -35120,8 +55117,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject(opt_includeInstance, this); }; @@ -35130,14 +55127,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject = function(includeInstance, msg) { var f, obj = { - startIdentifier: msg.getStartIdentifier_asB64(), - startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), + startRecipient: msg.getStartRecipient_asB64(), + startRecipientIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -35151,23 +55149,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35175,12 +55173,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartIdentifier(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setStartTimeMs(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartRecipient(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartIdentifierIncluded(value); + msg.setStartRecipientIncluded(value); break; default: reader.skipField(); @@ -35195,9 +55197,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35205,295 +55207,217 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getStartTimeMs(); + if (f !== 0) { + writer.writeUint64( 1, f ); } - f = message.getStartIdentifierIncluded(); - if (f) { - writer.writeBool( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, f ); } + f = /** @type {boolean} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBool( + 3, + f + ); + } }; /** - * optional bytes start_identifier = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes start_identifier = 1; - * This is a type-conversion wrapper around `getStartIdentifier()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartIdentifier())); -}; - - -/** - * optional bytes start_identifier = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIdentifier()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartIdentifier())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool start_identifier_included = 2; - * @return {boolean} + * optional uint64 start_time_ms = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartTimeMs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartTimeMs = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional bytes contract_id = 1; + * optional bytes start_recipient = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` + * optional bytes start_recipient = 2; + * This is a type-conversion wrapper around `getStartRecipient()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + this.getStartRecipient())); }; /** - * optional bytes contract_id = 1; + * optional bytes start_recipient = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` + * This is a type-conversion wrapper around `getStartRecipient()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); + this.getStartRecipient())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type_name = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string index_name = 3; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartRecipient = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * repeated bytes index_values = 4; - * @return {!Array<string>} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.clearStartRecipient = function() { + return jspb.Message.setField(this, 2, undefined); }; /** - * repeated bytes index_values = 4; - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.hasStartRecipient = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * repeated bytes index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<!Uint8Array>} + * optional bool start_recipient_included = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipientIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartRecipientIncluded = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.addIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.clearStartRecipientIncluded = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearIndexValuesList = function() { - return this.setIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.hasStartRecipientIncluded = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes contestant_id = 5; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes contestant_id = 5; - * This is a type-conversion wrapper around `getContestantId()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContestantId())); + this.getTokenId())); }; /** - * optional bytes contestant_id = 5; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContestantId()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContestantId())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContestantId = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional StartAtIdentifierInfo start_at_identifier_info = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * optional StartAtInfo start_at_info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getStartAtIdentifierInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo, 6)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getStartAtInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setStartAtIdentifierInfo = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setStartAtInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearStartAtIdentifierInfo = function() { - return this.setStartAtIdentifierInfo(undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.clearStartAtInfo = function() { + return this.setStartAtInfo(undefined); }; @@ -35501,35 +55425,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasStartAtIdentifierInfo = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.hasStartAtInfo = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint32 count = 7; + * optional uint32 limit = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 3, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 7, undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -35537,71 +55461,53 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 7) != null; -}; - - -/** - * optional bool order_ascending = 8; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bool prove = 9; + * optional bool prove = 4; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * optional GetContestedResourceVotersForIdentityRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * optional GetTokenPreProgrammedDistributionsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -35610,7 +55516,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -35624,21 +55530,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_[0])); }; @@ -35656,8 +55562,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.toObject(opt_includeInstance, this); }; @@ -35666,13 +55572,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -35686,23 +55592,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35710,8 +55616,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -35727,9 +55633,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35737,18 +55643,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter ); } }; @@ -35763,22 +55669,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.se * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_VOTERS: 1, + TOKEN_DISTRIBUTIONS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0])); }; @@ -35796,8 +55702,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject(opt_includeInstance, this); }; @@ -35806,13 +55712,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceVoters: (f = msg.getContestedResourceVoters()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(includeInstance, f), + tokenDistributions: (f = msg.getTokenDistributions()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -35828,23 +55734,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35852,9 +55758,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader); - msg.setContestedResourceVoters(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader); + msg.setTokenDistributions(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -35879,9 +55785,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35889,18 +55795,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceVoters(); + f = message.getTokenDistributions(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter ); } f = message.getProof(); @@ -35923,13 +55829,6 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -35945,8 +55844,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject(opt_includeInstance, this); }; @@ -35955,14 +55854,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject = function(includeInstance, msg) { var f, obj = { - votersList: msg.getVotersList_asB64(), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + recipientId: msg.getRecipientId_asB64(), + amount: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -35976,23 +55875,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36001,11 +55900,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addVoters(value); + msg.setRecipientId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; default: reader.skipField(); @@ -36020,9 +55919,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36030,22 +55929,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotersList_asU8(); + f = message.getRecipientId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } - f = message.getFinishedResults(); - if (f) { - writer.writeBool( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 2, f ); @@ -36054,109 +55953,440 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** - * repeated bytes voters = 1; - * @return {!Array<string>} + * optional bytes recipient_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes voters = 1; - * This is a type-conversion wrapper around `getVotersList()` - * @return {!Array<string>} + * optional bytes recipient_id = 1; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getVotersList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; /** - * repeated bytes voters = 1; + * optional bytes recipient_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getVotersList()` - * @return {!Array<!Uint8Array>} + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getVotersList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setVotersList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * optional uint64 amount = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + timestamp: jspb.Message.getFieldWithDefault(msg, 1, 0), + distributionsList: jspb.Message.toObjectList(msg.getDistributionsList(), + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTimestamp(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader); + msg.addDistributions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestamp(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getDistributionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 timestamp = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.getTimestamp = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.setTimestamp = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * repeated TokenDistributionEntry distributions = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.getDistributionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.setDistributionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.addVoters = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.addDistributions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.clearVotersList = function() { - return this.setVotersList([]); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.clearDistributionsList = function() { + return this.setDistributionsList([]); }; + /** - * optional bool finished_results = 2; - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject(opt_includeInstance, this); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject = function(includeInstance, msg) { + var f, obj = { + tokenDistributionsList: jspb.Message.toObjectList(msg.getTokenDistributionsList(), + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional ContestedResourceVoters contested_resource_voters = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getContestedResourceVoters = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader); + msg.addTokenDistributions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenDistributionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated TokenTimedDistributionEntry token_distributions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.getTokenDistributionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setContestedResourceVoters = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.setTokenDistributionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.addTokenDistributions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.clearTokenDistributionsList = function() { + return this.setTokenDistributionsList([]); +}; + + +/** + * optional TokenDistributions token_distributions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getTokenDistributions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setTokenDistributions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearContestedResourceVoters = function() { - return this.setContestedResourceVoters(undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearTokenDistributions = function() { + return this.setTokenDistributions(undefined); }; @@ -36164,7 +56394,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasContestedResourceVoters = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasTokenDistributions = function() { return jspb.Message.getField(this, 1) != null; }; @@ -36173,7 +56403,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -36181,18 +56411,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -36201,7 +56431,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -36210,7 +56440,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -36218,18 +56448,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -36238,35 +56468,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetContestedResourceVotersForIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0, 1)); +/** + * optional GetTokenPreProgrammedDistributionsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -36275,7 +56505,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -36289,21 +56519,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_[0])); }; @@ -36321,8 +56551,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.toObject(opt_includeInstance, this); }; @@ -36331,13 +56561,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -36351,23 +56581,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObjec /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36375,8 +56605,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deseria var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -36392,9 +56622,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deseria * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36402,18 +56632,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter ); } }; @@ -36435,8 +56665,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject(opt_includeInstance, this); }; @@ -36445,18 +56675,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - startAtVotePollIdInfo: (f = msg.getStartAtVotePollIdInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(includeInstance, f), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) + tokenId: msg.getTokenId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -36470,23 +56696,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36495,28 +56721,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setTokenId(value); break; case 2: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader); - msg.setStartAtVotePollIdInfo(value); - break; - case 6: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -36533,9 +56740,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36543,175 +56750,20 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 4, - f - ); - } - f = message.getStartAtVotePollIdInfo(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter - ); - } f = message.getProve(); - if (f) { - writer.writeBool( - 6, - f - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject = function(includeInstance, msg) { - var f, obj = { - startAtPollIdentifier: msg.getStartAtPollIdentifier_asB64(), - startPollIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAtPollIdentifier(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartPollIdentifierIncluded(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartAtPollIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getStartPollIdentifierIncluded(); if (f) { writer.writeBool( 2, @@ -36722,278 +56774,89 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** - * optional bytes start_at_poll_identifier = 1; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_at_poll_identifier = 1; - * This is a type-conversion wrapper around `getStartAtPollIdentifier()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAtPollIdentifier())); + this.getTokenId())); }; /** - * optional bytes start_at_poll_identifier = 1; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAtPollIdentifier()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAtPollIdentifier())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartAtPollIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.setTokenId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool start_poll_identifier_included = 2; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartPollIdentifierIncluded = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartPollIdentifierIncluded = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional bytes identity_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); -}; - - -/** - * optional bytes identity_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional google.protobuf.UInt32Value limit = 2; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional google.protobuf.UInt32Value offset = 3; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional bool order_ascending = 4; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); -}; - - -/** - * optional StartAtVotePollIdInfo start_at_vote_poll_id_info = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getStartAtVotePollIdInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo, 5)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setStartAtVotePollIdInfo = function(value) { - return jspb.Message.setWrapperField(this, 5, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearStartAtVotePollIdInfo = function() { - return this.setStartAtVotePollIdInfo(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasStartAtVotePollIdInfo = function() { - return jspb.Message.getField(this, 5) != null; -}; - - -/** - * optional bool prove = 6; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); -}; - - -/** - * optional GetContestedResourceIdentityVotesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * optional GetTokenTotalSupplyRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -37002,7 +56865,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -37016,21 +56879,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_[0])); }; @@ -37048,8 +56911,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.toObject(opt_includeInstance, this); }; @@ -37058,13 +56921,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -37078,23 +56941,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37102,8 +56965,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -37119,9 +56982,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37129,18 +56992,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter ); } }; @@ -37155,22 +57018,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serial * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase = { RESULT_NOT_SET: 0, - VOTES: 1, + TOKEN_TOTAL_SUPPLY: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0])); }; @@ -37188,8 +57051,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject(opt_includeInstance, this); }; @@ -37198,13 +57061,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - votes: (f = msg.getVotes()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(includeInstance, f), + tokenTotalSupply: (f = msg.getTokenTotalSupply()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -37220,23 +57083,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37244,9 +57107,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader); - msg.setVotes(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader); + msg.setTokenTotalSupply(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -37271,9 +57134,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37281,18 +57144,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotes(); + f = message.getTokenTotalSupply(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter ); } f = message.getProof(); @@ -37309,18 +57172,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon 3, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.repeatedFields_ = [1]; + ); + } +}; + + @@ -37337,8 +57193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject(opt_includeInstance, this); }; @@ -37347,15 +57203,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceIdentityVotesList: jspb.Message.toObjectList(msg.getContestedResourceIdentityVotesList(), - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject, includeInstance), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + tokenId: msg.getTokenId_asB64(), + totalAggregatedAmountInUserAccounts: jspb.Message.getFieldWithDefault(msg, 2, 0), + totalSystemAmount: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -37369,23 +57225,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37393,13 +57249,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader); - msg.addContestedResourceIdentityVotes(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setTotalAggregatedAmountInUserAccounts(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTotalSystemAmount(value); break; default: reader.skipField(); @@ -37414,9 +57273,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37424,285 +57283,250 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceIdentityVotesList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter + f ); } - f = message.getFinishedResults(); - if (f) { - writer.writeBool( + f = message.getTotalAggregatedAmountInUserAccounts(); + if (f !== 0) { + writer.writeUint64( 2, f ); } + f = message.getTotalSystemAmount(); + if (f !== 0) { + writer.writeUint64( + 3, + f + ); + } }; /** - * repeated ContestedResourceIdentityVote contested_resource_identity_votes = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getContestedResourceIdentityVotesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, 1)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setContestedResourceIdentityVotesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.addContestedResourceIdentityVotes = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.clearContestedResourceIdentityVotesList = function() { - return this.setContestedResourceIdentityVotesList([]); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool finished_results = 2; - * @return {boolean} + * optional uint64 total_aggregated_amount_in_user_accounts = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTotalAggregatedAmountInUserAccounts = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTotalAggregatedAmountInUserAccounts = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; +/** + * optional uint64 total_system_amount = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTotalSystemAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTotalSystemAmount = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional TokenTotalSupplyEntry token_total_supply = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject = function(includeInstance, msg) { - var f, obj = { - voteChoiceType: jspb.Message.getFieldWithDefault(msg, 1, 0), - identityId: msg.getIdentityId_asB64() - }; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getTokenTotalSupply = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry, 1)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setTokenTotalSupply = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0], value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearTokenTotalSupply = function() { + return this.setTokenTotalSupply(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (reader.readEnum()); - msg.setVoteChoiceType(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasTokenTotalSupply = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVoteChoiceType(); - if (f !== 0.0) { - writer.writeEnum( - 1, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( - 2, - f - ); - } + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0], value); }; /** - * @enum {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType = { - TOWARDS_IDENTITY: 0, - ABSTAIN: 1, - LOCK: 2 +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; + /** - * optional VoteChoiceType vote_choice_type = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getVoteChoiceType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setVoteChoiceType = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bytes identity_id = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * optional bytes identity_id = 2; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * optional bytes identity_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * optional GetTokenTotalSupplyResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setIdentityId = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0, 1)); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.clearIdentityId = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -37710,18 +57534,36 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.hasIdentityId = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.repeatedFields_ = [3]; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_[0])); +}; @@ -37738,8 +57580,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.toObject(opt_includeInstance, this); }; @@ -37748,16 +57590,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - serializedIndexStorageValuesList: msg.getSerializedIndexStorageValuesList_asB64(), - voteChoice: (f = msg.getVoteChoice()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -37771,23 +57610,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest; + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37795,21 +57634,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addSerializedIndexStorageValues(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader); - msg.setVoteChoice(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -37824,9 +57651,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37834,264 +57661,262 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getSerializedIndexStorageValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 3, - f - ); - } - f = message.getVoteChoice(); + f = message.getV0(); if (f != null) { writer.writeMessage( - 4, + 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional string document_type_name = 2; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject(opt_includeInstance, this); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; -/** - * repeated bytes serialized_index_storage_values = 3; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * repeated bytes serialized_index_storage_values = 3; - * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` - * @return {!Array<string>} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getSerializedIndexStorageValuesList())); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * repeated bytes serialized_index_storage_values = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` - * @return {!Array<!Uint8Array>} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getSerializedIndexStorageValuesList())); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setSerializedIndexStorageValuesList = function(value) { - return jspb.Message.setField(this, 3, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.addSerializedIndexStorageValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearSerializedIndexStorageValuesList = function() { - return this.setSerializedIndexStorageValuesList([]); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional ResourceVoteChoice vote_choice = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getVoteChoice = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice, 4)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setVoteChoice = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearVoteChoice = function() { - return this.setVoteChoice(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.hasVoteChoice = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional ContestedResourceIdentityVotes votes = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * optional uint32 group_contract_position = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getVotes = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setVotes = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearVotes = function() { - return this.setVotes(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasVotes = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional GetGroupInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -38099,82 +57924,147 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_[0])); }; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetContestedResourceIdentityVotesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter + ); + } }; @@ -38187,21 +58077,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_INFO: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0])); }; @@ -38219,8 +58110,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject(opt_includeInstance, this); }; @@ -38229,13 +58120,15 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(includeInstance, f) + groupInfo: (f = msg.getGroupInfo()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -38249,23 +58142,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38273,9 +58166,19 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader); + msg.setGroupInfo(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -38290,9 +58193,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38300,18 +58203,34 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getGroupInfo(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; @@ -38333,8 +58252,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject(opt_includeInstance, this); }; @@ -38343,14 +58262,14 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + memberId: msg.getMemberId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -38364,23 +58283,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38389,11 +58308,11 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setMemberId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPower(value); break; default: reader.skipField(); @@ -38408,9 +58327,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38418,22 +58337,22 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getMemberId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getPower(); + if (f !== 0) { + writer.writeUint32( 2, f ); @@ -38442,127 +58361,72 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** - * optional bytes id = 1; + * optional bytes member_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes member_id = 1; + * This is a type-conversion wrapper around `getMemberId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getMemberId())); }; /** - * optional bytes id = 1; + * optional bytes member_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getMemberId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getMemberId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.setMemberId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetPrefundedSpecializedBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this + * optional uint32 power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.setPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.repeatedFields_ = [1]; @@ -38579,8 +58443,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject(opt_includeInstance, this); }; @@ -38589,13 +58453,15 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(includeInstance, f) + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject, includeInstance), + groupRequiredPower: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -38609,23 +58475,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38633,9 +58499,13 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupRequiredPower(value); break; default: reader.skipField(); @@ -38650,9 +58520,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38660,52 +58530,89 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter + ); + } + f = message.getGroupRequiredPower(); + if (f !== 0) { + writer.writeUint32( + 2, + f ); } }; +/** + * repeated GroupMemberEntry members = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, 1)); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, opt_index); +}; + /** - * @enum {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.clearMembersList = function() { + return this.setMembersList([]); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} + * optional uint32 group_required_power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.getGroupRequiredPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.setGroupRequiredPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -38719,8 +58626,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject(opt_includeInstance, this); }; @@ -38729,15 +58636,13 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + groupInfo: (f = msg.getGroupInfo()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -38751,23 +58656,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38775,18 +58680,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader); + msg.setGroupInfo(value); break; default: reader.skipField(); @@ -38801,9 +58697,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38811,62 +58707,85 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( - 1, - f - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); + f = message.getGroupInfo(); if (f != null) { writer.writeMessage( - 3, + 1, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter ); } }; /** - * optional uint64 balance = 1; - * @return {number} + * optional GroupInfoEntry group_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.getGroupInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.setGroupInfo = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.clearGroupInfo = function() { + return this.setGroupInfo(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.hasGroupInfo = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * optional GroupInfo group_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getGroupInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setGroupInfo = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearGroupInfo = function() { + return this.setGroupInfo(undefined); }; @@ -38874,7 +58793,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasBalance = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasGroupInfo = function() { return jspb.Message.getField(this, 1) != null; }; @@ -38883,7 +58802,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -38891,18 +58810,18 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -38911,35 +58830,35 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; + * optional ResponseMetadata metadata = 4; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 4)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -38948,35 +58867,35 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional GetPrefundedSpecializedBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * optional GetGroupInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -38985,7 +58904,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -38999,21 +58918,21 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_[0])); }; @@ -39031,8 +58950,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.toObject(opt_includeInstance, this); }; @@ -39041,13 +58960,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -39061,23 +58980,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39085,8 +59004,8 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -39102,9 +59021,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39112,18 +59031,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter ); } }; @@ -39145,8 +59064,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject(opt_includeInstance, this); }; @@ -39155,13 +59074,14 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject = function(includeInstance, msg) { var f, obj = { - prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + startGroupContractPosition: jspb.Message.getFieldWithDefault(msg, 1, 0), + startGroupContractPositionIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -39175,23 +59095,185 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setStartGroupContractPosition(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartGroupContractPositionIncluded(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStartGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getStartGroupContractPositionIncluded(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional uint32 start_group_contract_position = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.getStartGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.setStartGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional bool start_group_contract_position_included = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.getStartGroupContractPositionIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.setStartGroupContractPositionIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + startAtGroupContractPosition: (f = msg.getStartAtGroupContractPosition()) && proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 3, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39199,6 +59281,19 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits var field = reader.getFieldNumber(); switch (field) { case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader); + msg.setStartAtGroupContractPosition(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -39215,9 +59310,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39225,16 +59320,38 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getStartAtGroupContractPosition(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeUint32( + 3, + f + ); + } f = message.getProve(); if (f) { writer.writeBool( - 1, + 4, f ); } @@ -39242,47 +59359,162 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** - * optional bool prove = 1; + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional StartAtGroupContractPosition start_at_group_contract_position = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getStartAtGroupContractPosition = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setStartAtGroupContractPosition = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.clearStartAtGroupContractPosition = function() { + return this.setStartAtGroupContractPosition(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.hasStartAtGroupContractPosition = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional uint32 count = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bool prove = 4; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * optional GetTotalCreditsInPlatformRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * optional GetGroupInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -39291,7 +59523,7 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -39305,21 +59537,21 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_[0])); }; @@ -39337,8 +59569,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.toObject(opt_includeInstance, this); }; @@ -39347,13 +59579,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toOb * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -39367,23 +59599,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = fun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39391,8 +59623,8 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBin var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -39408,9 +59640,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBin * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39418,18 +59650,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.seri /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter ); } }; @@ -39444,22 +59676,22 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinar * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CREDITS: 1, + GROUP_INFOS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0])); }; @@ -39477,8 +59709,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -39487,13 +59719,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - credits: jspb.Message.getFieldWithDefault(msg, 1, 0), + groupInfos: (f = msg.getGroupInfos()) && proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -39509,23 +59741,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39533,15 +59765,16 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setCredits(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader); + msg.setGroupInfos(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); msg.setProof(value); break; - case 3: + case 4: var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); msg.setMetadata(value); @@ -39559,9 +59792,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39569,17 +59802,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getGroupInfos(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter ); } f = message.getProof(); @@ -39593,7 +59827,7 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit f = message.getMetadata(); if (f != null) { writer.writeMessage( - 3, + 4, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); @@ -39601,178 +59835,197 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit }; -/** - * optional uint64 credits = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getCredits = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setCredits = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearCredits = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], undefined); -}; - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasCredits = function() { - return jspb.Message.getField(this, 1) != null; -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject(opt_includeInstance, this); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject = function(includeInstance, msg) { + var f, obj = { + memberId: msg.getMemberId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setMemberId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setPower(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMemberId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getPower(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } }; /** - * optional GetTotalCreditsInPlatformResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * optional bytes member_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0], value); + * optional bytes member_id = 1; + * This is a type-conversion wrapper around `getMemberId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getMemberId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this + * optional bytes member_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getMemberId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getMemberId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.setMemberId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional uint32 power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + /** - * @enum {number} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.setPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; + + /** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.repeatedFields_ = [2]; @@ -39789,8 +60042,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject(opt_includeInstance, this); }; @@ -39799,13 +60052,16 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 1, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject, includeInstance), + groupRequiredPower: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -39819,23 +60075,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39843,9 +60099,17 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupRequiredPower(value); break; default: reader.skipField(); @@ -39860,9 +60124,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39870,30 +60134,118 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( 1, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, f, - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter + ); + } + f = message.getGroupRequiredPower(); + if (f !== 0) { + writer.writeUint32( + 3, + f ); } }; +/** + * optional uint32 group_contract_position = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * repeated GroupMemberEntry members = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.clearMembersList = function() { + return this.setMembersList([]); +}; + + +/** + * optional uint32 group_required_power = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getGroupRequiredPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setGroupRequiredPower = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.repeatedFields_ = [1]; @@ -39910,8 +60262,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject(opt_includeInstance, this); }; @@ -39920,15 +60272,14 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject = function(includeInstance, msg) { var f, obj = { - pathList: msg.getPathList_asB64(), - keysList: msg.getKeysList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + groupInfosList: jspb.Message.toObjectList(msg.getGroupInfosList(), + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject, includeInstance) }; if (includeInstance) { @@ -39942,23 +60293,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39966,16 +60317,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addPath(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeys(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader); + msg.addGroupInfos(value); break; default: reader.skipField(); @@ -39990,9 +60334,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40000,200 +60344,196 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPathList_asU8(); + f = message.getGroupInfosList(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getKeysList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter ); } }; /** - * repeated bytes path = 1; - * @return {!Array<string>} + * repeated GroupPositionInfoEntry group_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.getGroupInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, 1)); }; /** - * repeated bytes path = 1; - * This is a type-conversion wrapper around `getPathList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getPathList())); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.setGroupInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * repeated bytes path = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPathList()` - * @return {!Array<!Uint8Array>} + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getPathList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.addGroupInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, opt_index); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.clearGroupInfosList = function() { + return this.setGroupInfosList([]); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * optional GroupInfos group_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getGroupInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos, 1)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { - return this.setPathList([]); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setGroupInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes keys = 2; - * @return {!Array<string>} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearGroupInfos = function() { + return this.setGroupInfos(undefined); }; /** - * repeated bytes keys = 2; - * This is a type-conversion wrapper around `getKeysList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasGroupInfos = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * repeated bytes keys = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysList()` - * @return {!Array<!Uint8Array>} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * optional ResponseMetadata metadata = 4; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { - return this.setKeysList([]); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 4)); }; /** - * optional bool prove = 3; - * @return {boolean} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional GetPathElementsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * optional GetGroupInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -40202,7 +60542,7 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -40216,21 +60556,21 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = functio * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_[0])); }; @@ -40248,8 +60588,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.toObject(opt_includeInstance, this); }; @@ -40258,13 +60598,13 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -40278,23 +60618,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40302,8 +60642,8 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -40319,9 +60659,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40329,49 +60669,31 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter ); } }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; - /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - ELEMENTS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus = { + ACTIVE: 0, + CLOSED: 1 }; -/** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); -}; @@ -40388,8 +60710,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject(opt_includeInstance, this); }; @@ -40398,15 +60720,14 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject = function(includeInstance, msg) { var f, obj = { - elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startActionId: msg.getStartActionId_asB64(), + startActionIdIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -40420,23 +60741,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40444,19 +60765,12 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); - msg.setElements(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartActionId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartActionIdIncluded(value); break; default: reader.skipField(); @@ -40471,9 +60785,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40481,46 +60795,89 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getElements(); - if (f != null) { - writer.writeMessage( + f = message.getStartActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getStartActionIdIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; +/** + * optional bytes start_action_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes start_action_id = 1; + * This is a type-conversion wrapper around `getStartActionId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartActionId())); +}; + + +/** + * optional bytes start_action_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartActionId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartActionId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.setStartActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bool start_action_id_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionIdIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.setStartActionIdIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + @@ -40537,8 +60894,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject(opt_includeInstance, this); }; @@ -40547,13 +60904,18 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - elementsList: msg.getElementsList_asB64() + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + status: jspb.Message.getFieldWithDefault(msg, 3, 0), + startAtActionId: (f = msg.getStartAtActionId()) && proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 5, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -40567,23 +60929,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40592,7 +60954,28 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addElements(value); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader); + msg.setStartAtActionId(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -40607,9 +60990,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40617,218 +61000,251 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getElementsList_asU8(); + f = message.getContractId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 3, + f + ); + } + f = message.getStartAtActionId(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 5)); + if (f != null) { + writer.writeUint32( + 5, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f + ); + } }; /** - * repeated bytes elements = 1; - * @return {!Array<string>} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes elements = 1; - * This is a type-conversion wrapper around `getElementsList()` - * @return {!Array<string>} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getElementsList())); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * repeated bytes elements = 1; + * optional bytes contract_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getElementsList()` - * @return {!Array<!Uint8Array>} + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getElementsList())); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * optional uint32 group_contract_position = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { - return this.setElementsList([]); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional Elements elements = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * optional ActionStatus status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional StartAtActionId start_at_action_id = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { - return this.setElements(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getStartAtActionId = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId, 4)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { - return jspb.Message.getField(this, 1) != null; + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setStartAtActionId = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.clearStartAtActionId = function() { + return this.setStartAtActionId(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.hasStartAtActionId = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional uint32 count = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 5, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 5, undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional bool prove = 6; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); }; /** - * optional GetPathElementsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * optional GetGroupActionsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -40837,7 +61253,7 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -40851,21 +61267,21 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_[0])); }; @@ -40883,8 +61299,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.toObject(opt_includeInstance, this); }; @@ -40893,13 +61309,13 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -40913,23 +61329,23 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40937,8 +61353,8 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -40954,9 +61370,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40964,24 +61380,50 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_ACTIONS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -40997,8 +61439,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject(opt_includeInstance, this); }; @@ -41007,13 +61449,157 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { + groupActions: (f = msg.getGroupActions()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader); + msg.setGroupActions(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGroupActions(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject(opt_includeInstance, this); +}; + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject = function(includeInstance, msg) { + var f, obj = { + amount: jspb.Message.getFieldWithDefault(msg, 1, 0), + recipientId: msg.getRecipientId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -41027,29 +61613,41 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRecipientId(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; default: reader.skipField(); break; @@ -41063,9 +61661,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41073,80 +61671,135 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getRecipientId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } }; /** - * optional GetStatusRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * optional uint64 amount = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this + * optional bytes recipient_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes recipient_id = 2; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; +/** + * optional bytes recipient_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + /** - * @enum {number} + * optional string public_note = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 3) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -41160,8 +61813,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject(opt_includeInstance, this); }; @@ -41170,13 +61823,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(includeInstance, f) + amount: jspb.Message.getFieldWithDefault(msg, 1, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41190,23 +61844,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41214,9 +61868,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41231,9 +61888,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41241,23 +61898,83 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f ); } }; +/** + * optional uint64 amount = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41274,8 +61991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject(opt_includeInstance, this); }; @@ -41284,18 +62001,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject = function(includeInstance, msg) { var f, obj = { - version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(includeInstance, f), - node: (f = msg.getNode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(includeInstance, f), - chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(includeInstance, f), - network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(includeInstance, f), - stateSync: (f = msg.getStateSync()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(includeInstance, f), - time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(includeInstance, f) + frozenId: msg.getFrozenId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41309,23 +62022,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41333,34 +62046,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader); - msg.setVersion(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader); - msg.setNode(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader); - msg.setChain(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader); - msg.setNetwork(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader); - msg.setStateSync(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader); - msg.setTime(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41375,9 +62066,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41385,63 +62076,107 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersion(); - if (f != null) { - writer.writeMessage( + f = message.getFrozenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter + f ); } - f = message.getNode(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter - ); - } - f = message.getChain(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter - ); - } - f = message.getNetwork(); - if (f != null) { - writer.writeMessage( - 4, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter - ); - } - f = message.getStateSync(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter - ); - } - f = message.getTime(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter + f ); } }; +/** + * optional bytes frozen_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); +}; + + +/** + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41458,8 +62193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject(opt_includeInstance, this); }; @@ -41468,14 +62203,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject = function(includeInstance, msg) { var f, obj = { - software: (f = msg.getSoftware()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(includeInstance, f), - protocol: (f = msg.getProtocol()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(includeInstance, f) + frozenId: msg.getFrozenId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41489,23 +62224,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41513,14 +62248,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader); - msg.setSoftware(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader); - msg.setProtocol(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41535,9 +62268,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41545,31 +62278,107 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSoftware(); - if (f != null) { - writer.writeMessage( + f = message.getFrozenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter + f ); } - f = message.getProtocol(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter + f ); } }; +/** + * optional bytes frozen_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); +}; + + +/** + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41586,8 +62395,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject(opt_includeInstance, this); }; @@ -41596,15 +62405,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject = function(includeInstance, msg) { var f, obj = { - dapi: jspb.Message.getFieldWithDefault(msg, 1, ""), - drive: jspb.Message.getFieldWithDefault(msg, 2, ""), - tenderdash: jspb.Message.getFieldWithDefault(msg, 3, "") + frozenId: msg.getFrozenId_asB64(), + amount: jspb.Message.getFieldWithDefault(msg, 2, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -41618,23 +62427,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41642,16 +62451,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setDapi(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDrive(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.setTenderdash(value); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41666,9 +62475,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41676,22 +62485,22 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDapi(); + f = message.getFrozenId_asU8(); if (f.length > 0) { - writer.writeString( + writer.writeBytes( 1, f ); } - f = /** @type {string} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeString( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 2, f ); @@ -41707,82 +62516,88 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** - * optional string dapi = 1; + * optional bytes frozen_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDapi = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDapi = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); }; /** - * optional string drive = 2; - * @return {string} + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDrive = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDrive = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * optional uint64 amount = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearDrive = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasDrive = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional string tenderdash = 3; + * optional string public_note = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getPublicNote = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setTenderdash = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setPublicNote = function(value) { return jspb.Message.setField(this, 3, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.clearPublicNote = function() { return jspb.Message.setField(this, 3, undefined); }; @@ -41791,7 +62606,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.hasPublicNote = function() { return jspb.Message.getField(this, 3) != null; }; @@ -41812,8 +62627,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject(opt_includeInstance, this); }; @@ -41822,14 +62637,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject = function(includeInstance, msg) { var f, obj = { - tenderdash: (f = msg.getTenderdash()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(includeInstance, f), - drive: (f = msg.getDrive()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(includeInstance, f) + senderKeyIndex: jspb.Message.getFieldWithDefault(msg, 1, 0), + recipientKeyIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + encryptedData: msg.getEncryptedData_asB64() }; if (includeInstance) { @@ -41843,23 +62659,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41867,14 +62683,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader); - msg.setTenderdash(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setSenderKeyIndex(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader); - msg.setDrive(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setRecipientKeyIndex(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptedData(value); break; default: reader.skipField(); @@ -41889,38 +62707,121 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSenderKeyIndex(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getRecipientKeyIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getEncryptedData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } +}; + + +/** + * optional uint32 sender_key_index = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getSenderKeyIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setSenderKeyIndex = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 recipient_key_index = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getRecipientKeyIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setRecipientKeyIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional bytes encrypted_data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes encrypted_data = 3; + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptedData())); +}; + + +/** + * optional bytes encrypted_data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptedData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTenderdash(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter - ); - } - f = message.getDrive(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setEncryptedData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); }; @@ -41940,8 +62841,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject(opt_includeInstance, this); }; @@ -41950,14 +62851,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject = function(includeInstance, msg) { var f, obj = { - p2p: jspb.Message.getFieldWithDefault(msg, 1, 0), - block: jspb.Message.getFieldWithDefault(msg, 2, 0) + rootEncryptionKeyIndex: jspb.Message.getFieldWithDefault(msg, 1, 0), + derivationEncryptionKeyIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + encryptedData: msg.getEncryptedData_asB64() }; if (includeInstance) { @@ -41971,23 +62873,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41996,11 +62898,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr switch (field) { case 1: var value = /** @type {number} */ (reader.readUint32()); - msg.setP2p(value); + msg.setRootEncryptionKeyIndex(value); break; case 2: var value = /** @type {number} */ (reader.readUint32()); - msg.setBlock(value); + msg.setDerivationEncryptionKeyIndex(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptedData(value); break; default: reader.skipField(); @@ -42015,9 +62921,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42025,65 +62931,114 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getP2p(); + f = message.getRootEncryptionKeyIndex(); if (f !== 0) { writer.writeUint32( 1, f ); } - f = message.getBlock(); + f = message.getDerivationEncryptionKeyIndex(); if (f !== 0) { writer.writeUint32( 2, f ); } + f = message.getEncryptedData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } }; /** - * optional uint32 p2p = 1; + * optional uint32 root_encryption_key_index = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getP2p = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getRootEncryptionKeyIndex = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setP2p = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setRootEncryptionKeyIndex = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional uint32 block = 2; + * optional uint32 derivation_encryption_key_index = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getDerivationEncryptionKeyIndex = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setBlock = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setDerivationEncryptionKeyIndex = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; +/** + * optional bytes encrypted_data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes encrypted_data = 3; + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptedData())); +}; + + +/** + * optional bytes encrypted_data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptedData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setEncryptedData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + @@ -42100,8 +63055,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject(opt_includeInstance, this); }; @@ -42110,14 +63065,17 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject = function(includeInstance, msg) { var f, obj = { - latest: jspb.Message.getFieldWithDefault(msg, 3, 0), - current: jspb.Message.getFieldWithDefault(msg, 4, 0) + recipientId: msg.getRecipientId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, ""), + sharedEncryptedNote: (f = msg.getSharedEncryptedNote()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject(includeInstance, f), + personalEncryptedNote: (f = msg.getPersonalEncryptedNote()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject(includeInstance, f), + amount: jspb.Message.getFieldWithDefault(msg, 5, 0) }; if (includeInstance) { @@ -42131,36 +63089,50 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRecipientId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLatest(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader); + msg.setSharedEncryptedNote(value); break; case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCurrent(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader); + msg.setPersonalEncryptedNote(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; default: reader.skipField(); @@ -42175,9 +63147,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42185,23 +63157,46 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getLatest(); - if (f !== 0) { - writer.writeUint32( - 3, + f = message.getRecipientId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, f ); } - f = message.getCurrent(); - if (f !== 0) { - writer.writeUint32( + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } + f = message.getSharedEncryptedNote(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter + ); + } + f = message.getPersonalEncryptedNote(); + if (f != null) { + writer.writeMessage( 4, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter + ); + } + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( + 5, f ); } @@ -42209,66 +63204,71 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** - * optional uint32 latest = 3; - * @return {number} + * optional bytes recipient_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getLatest = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this + * optional bytes recipient_id = 1; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setLatest = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; /** - * optional uint32 current = 4; - * @return {number} + * optional bytes recipient_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getCurrent = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setCurrent = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional Tenderdash tenderdash = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * optional string public_note = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getTenderdash = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setTenderdash = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearTenderdash = function() { - return this.setTenderdash(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -42276,36 +63276,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasTenderdash = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Drive drive = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * optional SharedEncryptedNote shared_encrypted_note = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getDrive = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getSharedEncryptedNote = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setDrive = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setSharedEncryptedNote = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearDrive = function() { - return this.setDrive(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearSharedEncryptedNote = function() { + return this.setSharedEncryptedNote(undefined); }; @@ -42313,36 +63313,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasDrive = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasSharedEncryptedNote = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional Software software = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * optional PersonalEncryptedNote personal_encrypted_note = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getSoftware = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getPersonalEncryptedNote = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote, 4)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setSoftware = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setPersonalEncryptedNote = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearSoftware = function() { - return this.setSoftware(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearPersonalEncryptedNote = function() { + return this.setPersonalEncryptedNote(undefined); }; @@ -42350,45 +63350,26 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasSoftware = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Protocol protocol = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getProtocol = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setProtocol = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasPersonalEncryptedNote = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * optional uint64 amount = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearProtocol = function() { - return this.setProtocol(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasProtocol = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); }; @@ -42408,8 +63389,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject(opt_includeInstance, this); }; @@ -42418,16 +63399,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject = function(includeInstance, msg) { var f, obj = { - local: jspb.Message.getFieldWithDefault(msg, 1, 0), - block: jspb.Message.getFieldWithDefault(msg, 2, 0), - genesis: jspb.Message.getFieldWithDefault(msg, 3, 0), - epoch: jspb.Message.getFieldWithDefault(msg, 4, 0) + actionType: jspb.Message.getFieldWithDefault(msg, 1, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -42441,23 +63420,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42465,20 +63444,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setLocal(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} */ (reader.readEnum()); + msg.setActionType(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBlock(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint64()); - msg.setGenesis(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -42493,9 +63464,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42503,84 +63474,78 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getLocal(); - if (f !== 0) { - writer.writeUint64( + f = message.getActionType(); + if (f !== 0.0) { + writer.writeEnum( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeUint64( + writer.writeString( 2, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint64( - 3, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeUint32( - 4, - f - ); - } }; /** - * optional uint64 local = 1; - * @return {number} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getLocal = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType = { + PAUSE: 0, + RESUME: 1 +}; + +/** + * optional ActionType action_type = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.getActionType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setLocal = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.setActionType = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * optional uint64 block = 2; - * @return {number} + * optional string public_note = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getBlock = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setBlock = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.setPublicNote = function(value) { return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.clearPublicNote = function() { return jspb.Message.setField(this, 2, undefined); }; @@ -42589,86 +63554,243 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.hasPublicNote = function() { return jspb.Message.getField(this, 2) != null; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint64 genesis = 3; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getGenesis = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setGenesis = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + tokenConfigUpdateItem: msg.getTokenConfigUpdateItem_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearGenesis = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenConfigUpdateItem(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasGenesis = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * optional uint32 epoch = 4; - * @return {number} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenConfigUpdateItem_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * optional bytes token_config_update_item = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_config_update_item = 1; + * This is a type-conversion wrapper around `getTokenConfigUpdateItem()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenConfigUpdateItem())); +}; + + +/** + * optional bytes token_config_update_item = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenConfigUpdateItem()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenConfigUpdateItem())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.setTokenConfigUpdateItem = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 4, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_ = [[1,2,3]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 4, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase = { + EVENT_TYPE_NOT_SET: 0, + TOKEN_EVENT: 1, + DOCUMENT_EVENT: 2, + CONTRACT_EVENT: 3 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getEventTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -42682,8 +63804,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject(opt_includeInstance, this); }; @@ -42692,14 +63814,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - proTxHash: msg.getProTxHash_asB64() + tokenEvent: (f = msg.getTokenEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject(includeInstance, f), + documentEvent: (f = msg.getDocumentEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject(includeInstance, f), + contractEvent: (f = msg.getContractEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -42713,23 +63836,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42737,12 +63860,19 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader); + msg.setTokenEvent(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader); + msg.setDocumentEvent(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader); + msg.setContractEvent(value); break; default: reader.skipField(); @@ -42757,9 +63887,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42767,119 +63897,138 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getTokenEvent(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + f = message.getDocumentEvent(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter + ); + } + f = message.getContractEvent(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter ); } }; /** - * optional bytes id = 1; - * @return {string} + * optional TokenEvent token_event = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getTokenEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent, 1)); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setTokenEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); }; /** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearTokenEvent = function() { + return this.setTokenEvent(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasTokenEvent = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional bytes pro_tx_hash = 2; - * @return {string} + * optional DocumentEvent document_event = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getDocumentEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent, 2)); }; /** - * optional bytes pro_tx_hash = 2; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setDocumentEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearDocumentEvent = function() { + return this.setDocumentEvent(undefined); }; /** - * optional bytes pro_tx_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasDocumentEvent = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * optional ContractEvent contract_event = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setProTxHash = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getContractEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent, 3)); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setContractEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.clearProTxHash = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearContractEvent = function() { + return this.setContractEvent(undefined); }; @@ -42887,12 +64036,37 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.hasProTxHash = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasContractEvent = function() { + return jspb.Message.getField(this, 3) != null; }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase = { + TYPE_NOT_SET: 0, + CREATE: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -42908,8 +64082,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject(opt_includeInstance, this); }; @@ -42918,21 +64092,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject = function(includeInstance, msg) { var f, obj = { - catchingUp: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), - latestBlockHash: msg.getLatestBlockHash_asB64(), - latestAppHash: msg.getLatestAppHash_asB64(), - latestBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), - earliestBlockHash: msg.getEarliestBlockHash_asB64(), - earliestAppHash: msg.getEarliestAppHash_asB64(), - earliestBlockHeight: jspb.Message.getFieldWithDefault(msg, 7, 0), - maxPeerBlockHeight: jspb.Message.getFieldWithDefault(msg, 9, 0), - coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 10, 0) + create: (f = msg.getCreate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -42946,23 +64112,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42970,40 +64136,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setCatchingUp(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLatestBlockHash(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLatestAppHash(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setLatestBlockHeight(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setEarliestBlockHash(value); - break; - case 6: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setEarliestAppHash(value); - break; - case 7: - var value = /** @type {number} */ (reader.readUint64()); - msg.setEarliestBlockHeight(value); - break; - case 9: - var value = /** @type {number} */ (reader.readUint64()); - msg.setMaxPeerBlockHeight(value); - break; - case 10: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreChainLockedHeight(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader); + msg.setCreate(value); break; default: reader.skipField(); @@ -43018,9 +64153,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43028,357 +64163,396 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getCatchingUp(); - if (f) { - writer.writeBool( - 1, - f - ); - } - f = message.getLatestBlockHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getLatestAppHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getLatestBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getEarliestBlockHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getEarliestAppHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 6, - f - ); - } - f = message.getEarliestBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 7, - f - ); - } - f = message.getMaxPeerBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 9, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 10)); + f = message.getCreate(); if (f != null) { - writer.writeUint32( - 10, - f + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter ); } }; /** - * optional bool catching_up = 1; - * @return {boolean} + * optional DocumentCreateEvent create = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCatchingUp = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.getCreate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent, 1)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCatchingUp = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.setCreate = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_[0], value); }; /** - * optional bytes latest_block_hash = 2; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.clearCreate = function() { + return this.setCreate(undefined); }; /** - * optional bytes latest_block_hash = 2; - * This is a type-conversion wrapper around `getLatestBlockHash()` - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLatestBlockHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.hasCreate = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * optional bytes latest_block_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLatestBlockHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLatestBlockHash())); -}; - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes latest_app_hash = 3; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject(opt_includeInstance, this); }; /** - * optional bytes latest_app_hash = 3; - * This is a type-conversion wrapper around `getLatestAppHash()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLatestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + createdDocument: msg.getCreatedDocument_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes latest_app_hash = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLatestAppHash()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLatestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestAppHash = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCreatedDocument(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint64 latest_block_height = 4; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCreatedDocument_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } }; /** - * optional bytes earliest_block_hash = 5; + * optional bytes created_document = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes earliest_block_hash = 5; - * This is a type-conversion wrapper around `getEarliestBlockHash()` + * optional bytes created_document = 1; + * This is a type-conversion wrapper around `getCreatedDocument()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getEarliestBlockHash())); + this.getCreatedDocument())); }; /** - * optional bytes earliest_block_hash = 5; + * optional bytes created_document = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEarliestBlockHash()` + * This is a type-conversion wrapper around `getCreatedDocument()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getEarliestBlockHash())); + this.getCreatedDocument())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHash = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.setCreatedDocument = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes earliest_app_hash = 6; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject(opt_includeInstance, this); }; /** - * optional bytes earliest_app_hash = 6; - * This is a type-conversion wrapper around `getEarliestAppHash()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getEarliestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + updatedContract: msg.getUpdatedContract_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes earliest_app_hash = 6; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEarliestAppHash()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getEarliestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestAppHash = function(value) { - return jspb.Message.setProto3BytesField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setUpdatedContract(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint64 earliest_block_height = 7; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUpdatedContract_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * optional bytes updated_contract = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional uint64 max_peer_block_height = 9; - * @return {number} + * optional bytes updated_contract = 1; + * This is a type-conversion wrapper around `getUpdatedContract()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getMaxPeerBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getUpdatedContract())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * optional bytes updated_contract = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getUpdatedContract()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setMaxPeerBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getUpdatedContract())); }; /** - * optional uint32 core_chain_locked_height = 10; - * @return {number} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCoreChainLockedHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.setUpdatedContract = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; + /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCoreChainLockedHeight = function(value) { - return jspb.Message.setField(this, 10, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_ = [[1]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.clearCoreChainLockedHeight = function() { - return jspb.Message.setField(this, 10, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase = { + TYPE_NOT_SET: 0, + UPDATE: 1 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.hasCoreChainLockedHeight = function() { - return jspb.Message.getField(this, 10) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -43392,8 +64566,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject(opt_includeInstance, this); }; @@ -43402,15 +64576,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject = function(includeInstance, msg) { var f, obj = { - chainId: jspb.Message.getFieldWithDefault(msg, 1, ""), - peersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), - listening: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + update: (f = msg.getUpdate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -43424,23 +64596,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -43448,16 +64620,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setChainId(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPeersCount(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setListening(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader); + msg.setUpdate(value); break; default: reader.skipField(); @@ -43472,9 +64637,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43482,90 +64647,92 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getChainId(); - if (f.length > 0) { - writer.writeString( + f = message.getUpdate(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getPeersCount(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getListening(); - if (f) { - writer.writeBool( - 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter ); } }; /** - * optional string chain_id = 1; - * @return {string} + * optional ContractUpdateEvent update = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getChainId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.getUpdate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent, 1)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setChainId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.setUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_[0], value); }; /** - * optional uint32 peers_count = 2; - * @return {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getPeersCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.clearUpdate = function() { + return this.setUpdate(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setPeersCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.hasUpdate = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional bool listening = 3; - * @return {boolean} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getListening = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_ = [[1,2,3,4,5,6,7,8]]; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setListening = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase = { + TYPE_NOT_SET: 0, + MINT: 1, + BURN: 2, + FREEZE: 3, + UNFREEZE: 4, + DESTROY_FROZEN_FUNDS: 5, + TRANSFER: 6, + EMERGENCY_ACTION: 7, + TOKEN_CONFIG_UPDATE: 8 }; - +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0])); +}; @@ -43582,8 +64749,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject(opt_includeInstance, this); }; @@ -43592,20 +64759,20 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject = function(includeInstance, msg) { var f, obj = { - totalSyncedTime: jspb.Message.getFieldWithDefault(msg, 1, 0), - remainingTime: jspb.Message.getFieldWithDefault(msg, 2, 0), - totalSnapshots: jspb.Message.getFieldWithDefault(msg, 3, 0), - chunkProcessAvgTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - snapshotHeight: jspb.Message.getFieldWithDefault(msg, 5, 0), - snapshotChunksCount: jspb.Message.getFieldWithDefault(msg, 6, 0), - backfilledBlocks: jspb.Message.getFieldWithDefault(msg, 7, 0), - backfillBlocksTotal: jspb.Message.getFieldWithDefault(msg, 8, 0) + mint: (f = msg.getMint()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject(includeInstance, f), + burn: (f = msg.getBurn()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject(includeInstance, f), + freeze: (f = msg.getFreeze()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject(includeInstance, f), + unfreeze: (f = msg.getUnfreeze()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject(includeInstance, f), + destroyFrozenFunds: (f = msg.getDestroyFrozenFunds()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject(includeInstance, f), + transfer: (f = msg.getTransfer()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject(includeInstance, f), + emergencyAction: (f = msg.getEmergencyAction()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject(includeInstance, f), + tokenConfigUpdate: (f = msg.getTokenConfigUpdate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -43619,23 +64786,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -43643,36 +64810,44 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTotalSyncedTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader); + msg.setMint(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRemainingTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader); + msg.setBurn(value); break; case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setTotalSnapshots(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader); + msg.setFreeze(value); break; case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setChunkProcessAvgTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader); + msg.setUnfreeze(value); break; case 5: - var value = /** @type {number} */ (reader.readUint64()); - msg.setSnapshotHeight(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader); + msg.setDestroyFrozenFunds(value); break; case 6: - var value = /** @type {number} */ (reader.readUint64()); - msg.setSnapshotChunksCount(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader); + msg.setTransfer(value); break; case 7: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBackfilledBlocks(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader); + msg.setEmergencyAction(value); break; case 8: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBackfillBlocksTotal(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader); + msg.setTokenConfigUpdate(value); break; default: reader.skipField(); @@ -43687,9 +64862,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43697,351 +64872,765 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTotalSyncedTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getMint(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter ); } - f = message.getRemainingTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getBurn(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter ); } - f = message.getTotalSnapshots(); - if (f !== 0) { - writer.writeUint32( + f = message.getFreeze(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter ); } - f = message.getChunkProcessAvgTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getUnfreeze(); + if (f != null) { + writer.writeMessage( 4, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter ); } - f = message.getSnapshotHeight(); - if (f !== 0) { - writer.writeUint64( + f = message.getDestroyFrozenFunds(); + if (f != null) { + writer.writeMessage( 5, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter ); } - f = message.getSnapshotChunksCount(); - if (f !== 0) { - writer.writeUint64( + f = message.getTransfer(); + if (f != null) { + writer.writeMessage( 6, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter ); } - f = message.getBackfilledBlocks(); - if (f !== 0) { - writer.writeUint64( + f = message.getEmergencyAction(); + if (f != null) { + writer.writeMessage( 7, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter ); } - f = message.getBackfillBlocksTotal(); - if (f !== 0) { - writer.writeUint64( + f = message.getTokenConfigUpdate(); + if (f != null) { + writer.writeMessage( 8, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter ); } }; /** - * optional uint64 total_synced_time = 1; - * @return {number} + * optional MintEvent mint = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSyncedTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getMint = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setMint = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSyncedTime = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearMint = function() { + return this.setMint(undefined); }; /** - * optional uint64 remaining_time = 2; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getRemainingTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasMint = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional BurnEvent burn = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setRemainingTime = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getBurn = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent, 2)); }; /** - * optional uint32 total_snapshots = 3; - * @return {number} + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setBurn = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSnapshots = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearBurn = function() { + return this.setBurn(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSnapshots = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasBurn = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint64 chunk_process_avg_time = 4; - * @return {number} + * optional FreezeEvent freeze = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getChunkProcessAvgTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getFreeze = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setFreeze = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setChunkProcessAvgTime = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearFreeze = function() { + return this.setFreeze(undefined); }; /** - * optional uint64 snapshot_height = 5; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasFreeze = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional UnfreezeEvent unfreeze = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getUnfreeze = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent, 4)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setUnfreeze = function(value) { + return jspb.Message.setOneofWrapperField(this, 4, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearUnfreeze = function() { + return this.setUnfreeze(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasUnfreeze = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional DestroyFrozenFundsEvent destroy_frozen_funds = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getDestroyFrozenFunds = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setDestroyFrozenFunds = function(value) { + return jspb.Message.setOneofWrapperField(this, 5, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearDestroyFrozenFunds = function() { + return this.setDestroyFrozenFunds(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasDestroyFrozenFunds = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional TransferEvent transfer = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTransfer = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent, 6)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setTransfer = function(value) { + return jspb.Message.setOneofWrapperField(this, 6, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearTransfer = function() { + return this.setTransfer(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasTransfer = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional EmergencyActionEvent emergency_action = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getEmergencyAction = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent, 7)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setEmergencyAction = function(value) { + return jspb.Message.setOneofWrapperField(this, 7, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearEmergencyAction = function() { + return this.setEmergencyAction(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasEmergencyAction = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional TokenConfigUpdateEvent token_config_update = 8; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTokenConfigUpdate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent, 8)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setTokenConfigUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 8, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearTokenConfigUpdate = function() { + return this.setTokenConfigUpdate(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasTokenConfigUpdate = function() { + return jspb.Message.getField(this, 8) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + actionId: msg.getActionId_asB64(), + event: (f = msg.getEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setActionId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader); + msg.setEvent(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getEvent(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional bytes action_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotHeight = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional uint64 snapshot_chunks_count = 6; - * @return {number} + * optional bytes action_id = 1; + * This is a type-conversion wrapper around `getActionId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotChunksCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getActionId())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional bytes action_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getActionId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotChunksCount = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getActionId())); }; /** - * optional uint64 backfilled_blocks = 7; - * @return {number} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfilledBlocks = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.setActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional GroupActionEvent event = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfilledBlocks = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent, 2)); }; /** - * optional uint64 backfill_blocks_total = 8; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfillBlocksTotal = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.setEvent = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfillBlocksTotal = function(value) { - return jspb.Message.setProto3IntField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.clearEvent = function() { + return this.setEvent(undefined); }; /** - * optional Version version = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getVersion = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.hasEvent = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setVersion = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.repeatedFields_ = [1]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearVersion = function() { - return this.setVersion(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasVersion = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject = function(includeInstance, msg) { + var f, obj = { + groupActionsList: jspb.Message.toObjectList(msg.getGroupActionsList(), + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional Node node = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNode = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNode = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader); + msg.addGroupActions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNode = function() { - return this.setNode(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNode = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGroupActionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter + ); + } }; /** - * optional Chain chain = 3; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * repeated GroupActionEntry group_actions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getChain = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.getGroupActionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setChain = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.setGroupActionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearChain = function() { - return this.setChain(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.addGroupActions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasChain = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.clearGroupActionsList = function() { + return this.setGroupActionsList([]); }; /** - * optional Network network = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * optional GroupActions group_actions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNetwork = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network, 4)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getGroupActions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNetwork = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setGroupActions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNetwork = function() { - return this.setNetwork(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearGroupActions = function() { + return this.setGroupActions(undefined); }; @@ -44049,36 +65638,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNetwork = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasGroupActions = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional StateSync state_sync = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getStateSync = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync, 5)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setStateSync = function(value) { - return jspb.Message.setWrapperField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearStateSync = function() { - return this.setStateSync(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -44086,36 +65675,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasStateSync = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Time time = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getTime = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time, 6)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setTime = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearTime = function() { - return this.setTime(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -44123,35 +65712,35 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasTime = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetStatusResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * optional GetGroupActionsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -44160,7 +65749,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -44174,21 +65763,21 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_[0])); }; @@ -44206,8 +65795,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.toObject(opt_includeInstance, this); }; @@ -44216,13 +65805,13 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -44236,23 +65825,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44260,8 +65849,8 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -44277,9 +65866,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44287,23 +65876,31 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus = { + ACTIVE: 0, + CLOSED: 1 +}; + @@ -44320,8 +65917,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject(opt_includeInstance, this); }; @@ -44330,13 +65927,17 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + status: jspb.Message.getFieldWithDefault(msg, 3, 0), + actionId: msg.getActionId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; if (includeInstance) { @@ -44350,29 +65951,49 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setActionId(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; default: reader.skipField(); break; @@ -44386,9 +66007,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44396,39 +66017,212 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 3, + f + ); + } + f = message.getActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; /** - * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 group_contract_position = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional ActionStatus status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); +}; + + +/** + * optional bytes action_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes action_id = 4; + * This is a type-conversion wrapper around `getActionId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getActionId())); +}; + + +/** + * optional bytes action_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getActionId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getActionId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetGroupActionSignersRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -44437,7 +66231,7 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -44451,21 +66245,21 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_[0])); }; @@ -44483,8 +66277,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.toObject(opt_includeInstance, this); }; @@ -44493,13 +66287,13 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -44513,23 +66307,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44537,8 +66331,8 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -44554,9 +66348,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44564,24 +66358,50 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_ACTION_SIGNERS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -44597,8 +66417,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject(opt_includeInstance, this); }; @@ -44607,15 +66427,15 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), - isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + groupActionSigners: (f = msg.getGroupActionSigners()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -44629,23 +66449,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44653,16 +66473,19 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader); + msg.setGroupActionSigners(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setNodeIp(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIsBanned(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -44677,9 +66500,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44687,121 +66510,39 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getGroupActionSigners(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter ); } - f = message.getNodeIp(); - if (f.length > 0) { - writer.writeString( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getIsBanned(); - if (f) { - writer.writeBool( + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * optional bytes pro_tx_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string node_ip = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional bool is_banned = 3; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; @@ -44818,8 +66559,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject(opt_includeInstance, this); }; @@ -44828,17 +66569,14 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject = function(includeInstance, msg) { var f, obj = { - quorumHash: msg.getQuorumHash_asB64(), - coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - membersList: jspb.Message.toObjectList(msg.getMembersList(), - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), - thresholdPublicKey: msg.getThresholdPublicKey_asB64() + signerId: msg.getSignerId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -44852,23 +66590,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44877,20 +66615,11 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.des switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setQuorumHash(value); + msg.setSignerId(value); break; case 2: var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreHeight(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); - msg.addMembers(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setThresholdPublicKey(value); + msg.setPower(value); break; default: reader.skipField(); @@ -44905,9 +66634,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44915,191 +66644,96 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getQuorumHash_asU8(); + f = message.getSignerId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getCoreHeight(); + f = message.getPower(); if (f !== 0) { writer.writeUint32( 2, f ); } - f = message.getMembersList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter - ); - } - f = message.getThresholdPublicKey_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } }; /** - * optional bytes quorum_hash = 1; + * optional bytes signer_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes quorum_hash = 1; - * This is a type-conversion wrapper around `getQuorumHash()` + * optional bytes signer_id = 1; + * This is a type-conversion wrapper around `getSignerId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getQuorumHash())); + this.getSignerId())); }; /** - * optional bytes quorum_hash = 1; + * optional bytes signer_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHash()` + * This is a type-conversion wrapper around `getSignerId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getQuorumHash())); + this.getSignerId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.setSignerId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 core_height = 2; + * optional uint32 power = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getPower = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.setPower = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; -/** - * repeated ValidatorV0 members = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { - return this.setMembersList([]); -}; - - -/** - * optional bytes threshold_public_key = 4; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * optional bytes threshold_public_key = 4; - * This is a type-conversion wrapper around `getThresholdPublicKey()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getThresholdPublicKey())); -}; - - -/** - * optional bytes threshold_public_key = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getThresholdPublicKey()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getThresholdPublicKey())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); -}; - - /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.repeatedFields_ = [1]; @@ -45116,8 +66750,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject(opt_includeInstance, this); }; @@ -45126,18 +66760,14 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject = function(includeInstance, msg) { var f, obj = { - quorumHashesList: msg.getQuorumHashesList_asB64(), - currentQuorumHash: msg.getCurrentQuorumHash_asB64(), - validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), - lastBlockProposer: msg.getLastBlockProposer_asB64(), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + signersList: jspb.Message.toObjectList(msg.getSignersList(), + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject, includeInstance) }; if (includeInstance) { @@ -45151,23 +66781,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -45175,26 +66805,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addQuorumHashes(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setCurrentQuorumHash(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); - msg.addValidatorSets(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLastBlockProposer(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader); + msg.addSigners(value); break; default: reader.skipField(); @@ -45209,9 +66822,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -45219,259 +66832,159 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getQuorumHashesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getCurrentQuorumHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getValidatorSetsList(); + f = message.getSignersList(); if (f.length > 0) { writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter - ); - } - f = message.getLastBlockProposer_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 5, + 1, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter ); } }; /** - * repeated bytes quorum_hashes = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes quorum_hashes = 1; - * This is a type-conversion wrapper around `getQuorumHashesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getQuorumHashesList())); -}; - - -/** - * repeated bytes quorum_hashes = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHashesList()` - * @return {!Array<!Uint8Array>} + * repeated GroupActionSigner signers = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getQuorumHashesList())); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.getSignersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { - return jspb.Message.setField(this, 1, value || []); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.setSignersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.addSigners = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { - return this.setQuorumHashesList([]); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * This is a type-conversion wrapper around `getCurrentQuorumHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getCurrentQuorumHash())); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getCurrentQuorumHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getCurrentQuorumHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.clearSignersList = function() { + return this.setSignersList([]); }; /** - * repeated ValidatorSetV0 validator_sets = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} + * optional GroupActionSigners group_action_signers = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getGroupActionSigners = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners, 1)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setGroupActionSigners = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0], value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearGroupActionSigners = function() { + return this.setGroupActionSigners(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { - return this.setValidatorSetsList([]); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasGroupActionSigners = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional bytes last_block_proposer = 4; - * @return {string} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional bytes last_block_proposer = 4; - * This is a type-conversion wrapper around `getLastBlockProposer()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLastBlockProposer())); + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0], value); }; /** - * optional bytes last_block_proposer = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLastBlockProposer()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLastBlockProposer())); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 5; + * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -45480,35 +66993,35 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * optional GetGroupActionSignersResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -45517,7 +67030,7 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h index bafa69fcb78..3ebaf8d2312 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h @@ -80,6 +80,42 @@ CF_EXTERN_C_BEGIN @class GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0; @class GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodeProposedBlocks; @class GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodesProposedBlocks; +@class GetGroupActionSignersRequest_GetGroupActionSignersRequestV0; +@class GetGroupActionSignersResponse_GetGroupActionSignersResponseV0; +@class GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner; +@class GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners; +@class GetGroupActionsRequest_GetGroupActionsRequestV0; +@class GetGroupActionsRequest_StartAtActionId; +@class GetGroupActionsResponse_GetGroupActionsResponseV0; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent; +@class GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent; +@class GetGroupInfoRequest_GetGroupInfoRequestV0; +@class GetGroupInfoResponse_GetGroupInfoResponseV0; +@class GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo; +@class GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry; +@class GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry; +@class GetGroupInfosRequest_GetGroupInfosRequestV0; +@class GetGroupInfosRequest_StartAtGroupContractPosition; +@class GetGroupInfosResponse_GetGroupInfosResponseV0; +@class GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos; +@class GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry; +@class GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry; @class GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0; @class GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0; @class GetIdentitiesBalancesResponse_GetIdentitiesBalancesResponseV0_IdentitiesBalances; @@ -89,6 +125,15 @@ CF_EXTERN_C_BEGIN @class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys; @class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys; @class GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys; +@class GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0; +@class GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0; +@class GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry; +@class GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances; +@class GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0; +@class GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0; +@class GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos; +@class GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry; +@class GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry; @class GetIdentityBalanceAndRevisionRequest_GetIdentityBalanceAndRevisionRequestV0; @class GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0; @class GetIdentityBalanceAndRevisionResponse_GetIdentityBalanceAndRevisionResponseV0_BalanceAndRevision; @@ -105,6 +150,15 @@ CF_EXTERN_C_BEGIN @class GetIdentityNonceResponse_GetIdentityNonceResponseV0; @class GetIdentityRequest_GetIdentityRequestV0; @class GetIdentityResponse_GetIdentityResponseV0; +@class GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0; +@class GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0; +@class GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry; +@class GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances; +@class GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0; +@class GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0; +@class GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry; +@class GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry; +@class GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos; @class GetPathElementsRequest_GetPathElementsRequestV0; @class GetPathElementsResponse_GetPathElementsResponseV0; @class GetPathElementsResponse_GetPathElementsResponseV0_Elements; @@ -114,6 +168,9 @@ CF_EXTERN_C_BEGIN @class GetProofsRequest_GetProofsRequestV0_ContractRequest; @class GetProofsRequest_GetProofsRequestV0_DocumentRequest; @class GetProofsRequest_GetProofsRequestV0_IdentityRequest; +@class GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest; +@class GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest; +@class GetProofsRequest_GetProofsRequestV0_TokenStatusRequest; @class GetProofsRequest_GetProofsRequestV0_VoteStatusRequest; @class GetProofsRequest_GetProofsRequestV0_VoteStatusRequest_ContestedResourceVoteStatusRequest; @class GetProofsResponse_GetProofsResponseV0; @@ -137,6 +194,19 @@ CF_EXTERN_C_BEGIN @class GetStatusResponse_GetStatusResponseV0_Version_Protocol_Drive; @class GetStatusResponse_GetStatusResponseV0_Version_Protocol_Tenderdash; @class GetStatusResponse_GetStatusResponseV0_Version_Software; +@class GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0; +@class GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo; +@class GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0; +@class GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry; +@class GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions; +@class GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry; +@class GetTokenStatusesRequest_GetTokenStatusesRequestV0; +@class GetTokenStatusesResponse_GetTokenStatusesResponseV0; +@class GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry; +@class GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses; +@class GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0; +@class GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0; +@class GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry; @class GetTotalCreditsInPlatformRequest_GetTotalCreditsInPlatformRequestV0; @class GetTotalCreditsInPlatformResponse_GetTotalCreditsInPlatformResponseV0; @class GetVotePollsByEndDateRequest_GetVotePollsByEndDateRequestV0; @@ -323,6 +393,79 @@ GPBEnumDescriptor *GetContestedResourceIdentityVotesResponse_GetContestedResourc **/ BOOL GetContestedResourceIdentityVotesResponse_GetContestedResourceIdentityVotesResponseV0_ResourceVoteChoice_VoteChoiceType_IsValidValue(int32_t value); +#pragma mark - Enum GetGroupActionsRequest_ActionStatus + +typedef GPB_ENUM(GetGroupActionsRequest_ActionStatus) { + /** + * Value used if any message's field encounters a value that is not defined + * by this enum. The message will also have C functions to get/set the rawValue + * of the field. + **/ + GetGroupActionsRequest_ActionStatus_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + /** Request the active actions */ + GetGroupActionsRequest_ActionStatus_Active = 0, + + /** Request the closed actions */ + GetGroupActionsRequest_ActionStatus_Closed = 1, +}; + +GPBEnumDescriptor *GetGroupActionsRequest_ActionStatus_EnumDescriptor(void); + +/** + * Checks to see if the given value is defined by the enum or was not known at + * the time this source was generated. + **/ +BOOL GetGroupActionsRequest_ActionStatus_IsValidValue(int32_t value); + +#pragma mark - Enum GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType + +/** Enum for emergency action types */ +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType) { + /** + * Value used if any message's field encounters a value that is not defined + * by this enum. The message will also have C functions to get/set the rawValue + * of the field. + **/ + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + /** Pause action */ + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Pause = 0, + + /** Resume action */ + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Resume = 1, +}; + +GPBEnumDescriptor *GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_EnumDescriptor(void); + +/** + * Checks to see if the given value is defined by the enum or was not known at + * the time this source was generated. + **/ +BOOL GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_IsValidValue(int32_t value); + +#pragma mark - Enum GetGroupActionSignersRequest_ActionStatus + +typedef GPB_ENUM(GetGroupActionSignersRequest_ActionStatus) { + /** + * Value used if any message's field encounters a value that is not defined + * by this enum. The message will also have C functions to get/set the rawValue + * of the field. + **/ + GetGroupActionSignersRequest_ActionStatus_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue, + /** Request the active actions */ + GetGroupActionSignersRequest_ActionStatus_Active = 0, + + /** Request the closed actions */ + GetGroupActionSignersRequest_ActionStatus_Closed = 1, +}; + +GPBEnumDescriptor *GetGroupActionSignersRequest_ActionStatus_EnumDescriptor(void); + +/** + * Checks to see if the given value is defined by the enum or was not known at + * the time this source was generated. + **/ +BOOL GetGroupActionSignersRequest_ActionStatus_IsValidValue(int32_t value); + #pragma mark - PlatformRoot /** @@ -1729,6 +1872,9 @@ typedef GPB_ENUM(GetProofsRequest_GetProofsRequestV0_FieldNumber) { GetProofsRequest_GetProofsRequestV0_FieldNumber_ContractsArray = 2, GetProofsRequest_GetProofsRequestV0_FieldNumber_DocumentsArray = 3, GetProofsRequest_GetProofsRequestV0_FieldNumber_VotesArray = 4, + GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentityTokenBalancesArray = 5, + GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentityTokenInfosArray = 6, + GetProofsRequest_GetProofsRequestV0_FieldNumber_TokenStatusesArray = 7, }; GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0 : GPBMessage @@ -1752,6 +1898,18 @@ GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0 : GPBMessage /** The number of items in @c votesArray without causing the array to be created. */ @property(nonatomic, readonly) NSUInteger votesArray_Count; +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest*> *identityTokenBalancesArray; +/** The number of items in @c identityTokenBalancesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identityTokenBalancesArray_Count; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest*> *identityTokenInfosArray; +/** The number of items in @c identityTokenInfosArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identityTokenInfosArray_Count; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetProofsRequest_GetProofsRequestV0_TokenStatusRequest*> *tokenStatusesArray; +/** The number of items in @c tokenStatusesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenStatusesArray_Count; + @end #pragma mark - GetProofsRequest_GetProofsRequestV0_DocumentRequest @@ -1894,6 +2052,48 @@ GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0_VoteStatusRequest_Conte @end +#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest + +typedef GPB_ENUM(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest_FieldNumber) { + GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest_FieldNumber_TokenId = 1, + GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest_FieldNumber_IdentityId = 2, +}; + +GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@end + +#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest + +typedef GPB_ENUM(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest_FieldNumber) { + GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest_FieldNumber_TokenId = 1, + GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest_FieldNumber_IdentityId = 2, +}; + +GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@end + +#pragma mark - GetProofsRequest_GetProofsRequestV0_TokenStatusRequest + +typedef GPB_ENUM(GetProofsRequest_GetProofsRequestV0_TokenStatusRequest_FieldNumber) { + GetProofsRequest_GetProofsRequestV0_TokenStatusRequest_FieldNumber_TokenId = 1, +}; + +GPB_FINAL @interface GetProofsRequest_GetProofsRequestV0_TokenStatusRequest : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@end + #pragma mark - GetProofsResponse typedef GPB_ENUM(GetProofsResponse_FieldNumber) { @@ -4962,6 +5162,2052 @@ GPB_FINAL @interface GetCurrentQuorumsInfoResponse_GetCurrentQuorumsInfoResponse @end +#pragma mark - GetIdentityTokenBalancesRequest + +typedef GPB_ENUM(GetIdentityTokenBalancesRequest_FieldNumber) { + GetIdentityTokenBalancesRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityTokenBalancesRequest_Version_OneOfCase) { + GetIdentityTokenBalancesRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenBalancesRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenBalancesRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityTokenBalancesRequest_ClearVersionOneOfCase(GetIdentityTokenBalancesRequest *message); + +#pragma mark - GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 + +typedef GPB_ENUM(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber) { + GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_IdentityId = 1, + GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_TokenIdsArray = 2, + GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 : GPBMessage + +/** ID of the identity */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +/** List of token IDs */ +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSData*> *tokenIdsArray; +/** The number of items in @c tokenIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenIdsArray_Count; + +/** Flag to request a proof as the response */ +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentityTokenBalancesResponse + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_FieldNumber) { + GetIdentityTokenBalancesResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_Version_OneOfCase) { + GetIdentityTokenBalancesResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenBalancesResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenBalancesResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityTokenBalancesResponse_ClearVersionOneOfCase(GetIdentityTokenBalancesResponse *message); + +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber) { + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_TokenBalances = 1, + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_Proof = 2, + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_Result_OneOfCase) { + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_Result_OneOfCase_TokenBalances = 1, + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_Result_OneOfCase resultOneOfCase; + +/** Actual token balances */ +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances *tokenBalances; + +/** Proof of the token balances, if requested */ +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +/** Metadata about the blockchain state */ +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_ClearResultOneOfCase(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 *message); + +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry_FieldNumber) { + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry_FieldNumber_TokenId = 1, + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry_FieldNumber_Balance = 2, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry : GPBMessage + +/** Token ID */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +/** Token balance for the contract */ +@property(nonatomic, readwrite) uint64_t balance; + +@property(nonatomic, readwrite) BOOL hasBalance; +@end + +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances + +typedef GPB_ENUM(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances_FieldNumber) { + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances_FieldNumber_TokenBalancesArray = 1, +}; + +GPB_FINAL @interface GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances : GPBMessage + +/** List of token balances */ +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry*> *tokenBalancesArray; +/** The number of items in @c tokenBalancesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenBalancesArray_Count; + +@end + +#pragma mark - GetIdentitiesTokenBalancesRequest + +typedef GPB_ENUM(GetIdentitiesTokenBalancesRequest_FieldNumber) { + GetIdentitiesTokenBalancesRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesTokenBalancesRequest_Version_OneOfCase) { + GetIdentitiesTokenBalancesRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenBalancesRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenBalancesRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesTokenBalancesRequest_ClearVersionOneOfCase(GetIdentitiesTokenBalancesRequest *message); + +#pragma mark - GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 + +typedef GPB_ENUM(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber) { + GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_TokenId = 1, + GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_IdentityIdsArray = 2, + GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 : GPBMessage + +/** Token ID */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +/** List of identity IDs */ +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSData*> *identityIdsArray; +/** The number of items in @c identityIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identityIdsArray_Count; + +/** Flag to request a proof as the response */ +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentitiesTokenBalancesResponse + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_FieldNumber) { + GetIdentitiesTokenBalancesResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_Version_OneOfCase) { + GetIdentitiesTokenBalancesResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenBalancesResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenBalancesResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesTokenBalancesResponse_ClearVersionOneOfCase(GetIdentitiesTokenBalancesResponse *message); + +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber) { + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_IdentityTokenBalances = 1, + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_Proof = 2, + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_Result_OneOfCase) { + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_Result_OneOfCase_IdentityTokenBalances = 1, + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_Result_OneOfCase resultOneOfCase; + +/** Actual identity token balances */ +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances *identityTokenBalances; + +/** Proof of the balances, if requested */ +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +/** Metadata about the blockchain state */ +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_ClearResultOneOfCase(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 *message); + +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry_FieldNumber) { + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry_FieldNumber_IdentityId = 1, + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry_FieldNumber_Balance = 2, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry : GPBMessage + +/** Identity ID */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +/** Token balance for the identity */ +@property(nonatomic, readwrite) uint64_t balance; + +@property(nonatomic, readwrite) BOOL hasBalance; +@end + +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances + +typedef GPB_ENUM(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances_FieldNumber) { + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances_FieldNumber_IdentityTokenBalancesArray = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances : GPBMessage + +/** List of identity token balances */ +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry*> *identityTokenBalancesArray; +/** The number of items in @c identityTokenBalancesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identityTokenBalancesArray_Count; + +@end + +#pragma mark - GetIdentityTokenInfosRequest + +typedef GPB_ENUM(GetIdentityTokenInfosRequest_FieldNumber) { + GetIdentityTokenInfosRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityTokenInfosRequest_Version_OneOfCase) { + GetIdentityTokenInfosRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenInfosRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityTokenInfosRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenInfosRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityTokenInfosRequest_ClearVersionOneOfCase(GetIdentityTokenInfosRequest *message); + +#pragma mark - GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 + +typedef GPB_ENUM(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber) { + GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_IdentityId = 1, + GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_TokenIdsArray = 2, + GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSData*> *tokenIdsArray; +/** The number of items in @c tokenIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenIdsArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentityTokenInfosResponse + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_FieldNumber) { + GetIdentityTokenInfosResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_Version_OneOfCase) { + GetIdentityTokenInfosResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenInfosResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentityTokenInfosResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenInfosResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentityTokenInfosResponse_ClearVersionOneOfCase(GetIdentityTokenInfosResponse *message); + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber) { + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_TokenInfos = 1, + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_Proof = 2, + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_Result_OneOfCase) { + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_Result_OneOfCase_TokenInfos = 1, + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos *tokenInfos; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_ClearResultOneOfCase(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 *message); + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber) { + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber_Frozen = 1, +}; + +GPB_FINAL @interface GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry : GPBMessage + +@property(nonatomic, readwrite) BOOL frozen; + +@end + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry_FieldNumber) { + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry_FieldNumber_TokenId = 1, + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry_FieldNumber_Info = 2, +}; + +GPB_FINAL @interface GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry *info; +/** Test to see if @c info has been set. */ +@property(nonatomic, readwrite) BOOL hasInfo; + +@end + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos + +typedef GPB_ENUM(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos_FieldNumber) { + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos_FieldNumber_TokenInfosArray = 1, +}; + +GPB_FINAL @interface GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry*> *tokenInfosArray; +/** The number of items in @c tokenInfosArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenInfosArray_Count; + +@end + +#pragma mark - GetIdentitiesTokenInfosRequest + +typedef GPB_ENUM(GetIdentitiesTokenInfosRequest_FieldNumber) { + GetIdentitiesTokenInfosRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesTokenInfosRequest_Version_OneOfCase) { + GetIdentitiesTokenInfosRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenInfosRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosRequest : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenInfosRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesTokenInfosRequest_ClearVersionOneOfCase(GetIdentitiesTokenInfosRequest *message); + +#pragma mark - GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 + +typedef GPB_ENUM(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber) { + GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_TokenId = 1, + GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_IdentityIdsArray = 2, + GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSData*> *identityIdsArray; +/** The number of items in @c identityIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger identityIdsArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_FieldNumber) { + GetIdentitiesTokenInfosResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_Version_OneOfCase) { + GetIdentitiesTokenInfosResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenInfosResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosResponse : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenInfosResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetIdentitiesTokenInfosResponse_ClearVersionOneOfCase(GetIdentitiesTokenInfosResponse *message); + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber) { + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_IdentityTokenInfos = 1, + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_Proof = 2, + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_Result_OneOfCase) { + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_Result_OneOfCase_IdentityTokenInfos = 1, + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos *identityTokenInfos; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_ClearResultOneOfCase(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 *message); + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber) { + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber_Frozen = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry : GPBMessage + +@property(nonatomic, readwrite) BOOL frozen; + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry_FieldNumber) { + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry_FieldNumber_IdentityId = 1, + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry_FieldNumber_Info = 2, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *identityId; + +@property(nonatomic, readwrite, strong, null_resettable) GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry *info; +/** Test to see if @c info has been set. */ +@property(nonatomic, readwrite) BOOL hasInfo; + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos + +typedef GPB_ENUM(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos_FieldNumber) { + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos_FieldNumber_TokenInfosArray = 1, +}; + +GPB_FINAL @interface GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry*> *tokenInfosArray; +/** The number of items in @c tokenInfosArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenInfosArray_Count; + +@end + +#pragma mark - GetTokenStatusesRequest + +typedef GPB_ENUM(GetTokenStatusesRequest_FieldNumber) { + GetTokenStatusesRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenStatusesRequest_Version_OneOfCase) { + GetTokenStatusesRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenStatusesRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenStatusesRequest : GPBMessage + +@property(nonatomic, readonly) GetTokenStatusesRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenStatusesRequest_GetTokenStatusesRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenStatusesRequest_ClearVersionOneOfCase(GetTokenStatusesRequest *message); + +#pragma mark - GetTokenStatusesRequest_GetTokenStatusesRequestV0 + +typedef GPB_ENUM(GetTokenStatusesRequest_GetTokenStatusesRequestV0_FieldNumber) { + GetTokenStatusesRequest_GetTokenStatusesRequestV0_FieldNumber_TokenIdsArray = 1, + GetTokenStatusesRequest_GetTokenStatusesRequestV0_FieldNumber_Prove = 2, +}; + +GPB_FINAL @interface GetTokenStatusesRequest_GetTokenStatusesRequestV0 : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSData*> *tokenIdsArray; +/** The number of items in @c tokenIdsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenIdsArray_Count; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetTokenStatusesResponse + +typedef GPB_ENUM(GetTokenStatusesResponse_FieldNumber) { + GetTokenStatusesResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenStatusesResponse_Version_OneOfCase) { + GetTokenStatusesResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenStatusesResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenStatusesResponse : GPBMessage + +@property(nonatomic, readonly) GetTokenStatusesResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenStatusesResponse_GetTokenStatusesResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenStatusesResponse_ClearVersionOneOfCase(GetTokenStatusesResponse *message); + +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0 + +typedef GPB_ENUM(GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber) { + GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_TokenStatuses = 1, + GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_Proof = 2, + GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetTokenStatusesResponse_GetTokenStatusesResponseV0_Result_OneOfCase) { + GetTokenStatusesResponse_GetTokenStatusesResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenStatusesResponse_GetTokenStatusesResponseV0_Result_OneOfCase_TokenStatuses = 1, + GetTokenStatusesResponse_GetTokenStatusesResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetTokenStatusesResponse_GetTokenStatusesResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetTokenStatusesResponse_GetTokenStatusesResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses *tokenStatuses; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetTokenStatusesResponse_GetTokenStatusesResponseV0_ClearResultOneOfCase(GetTokenStatusesResponse_GetTokenStatusesResponseV0 *message); + +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry + +typedef GPB_ENUM(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry_FieldNumber) { + GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry_FieldNumber_TokenId = 1, + GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry_FieldNumber_Paused = 2, +}; + +GPB_FINAL @interface GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite) BOOL paused; + +@property(nonatomic, readwrite) BOOL hasPaused; +@end + +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses + +typedef GPB_ENUM(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses_FieldNumber) { + GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses_FieldNumber_TokenStatusesArray = 1, +}; + +GPB_FINAL @interface GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry*> *tokenStatusesArray; +/** The number of items in @c tokenStatusesArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenStatusesArray_Count; + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsRequest + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsRequest_FieldNumber) { + GetTokenPreProgrammedDistributionsRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsRequest_Version_OneOfCase) { + GetTokenPreProgrammedDistributionsRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenPreProgrammedDistributionsRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsRequest : GPBMessage + +@property(nonatomic, readonly) GetTokenPreProgrammedDistributionsRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenPreProgrammedDistributionsRequest_ClearVersionOneOfCase(GetTokenPreProgrammedDistributionsRequest *message); + +#pragma mark - GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber) { + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_TokenId = 1, + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_StartAtInfo = 2, + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_Limit = 3, + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_Prove = 4, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo *startAtInfo; +/** Test to see if @c startAtInfo has been set. */ +@property(nonatomic, readwrite) BOOL hasStartAtInfo; + +@property(nonatomic, readwrite) uint32_t limit; + +@property(nonatomic, readwrite) BOOL hasLimit; +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber) { + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartTimeMs = 1, + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartRecipient = 2, + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartRecipientIncluded = 3, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo : GPBMessage + +@property(nonatomic, readwrite) uint64_t startTimeMs; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *startRecipient; +/** Test to see if @c startRecipient has been set. */ +@property(nonatomic, readwrite) BOOL hasStartRecipient; + +@property(nonatomic, readwrite) BOOL startRecipientIncluded; + +@property(nonatomic, readwrite) BOOL hasStartRecipientIncluded; +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_FieldNumber) { + GetTokenPreProgrammedDistributionsResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_Version_OneOfCase) { + GetTokenPreProgrammedDistributionsResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenPreProgrammedDistributionsResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsResponse : GPBMessage + +@property(nonatomic, readonly) GetTokenPreProgrammedDistributionsResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenPreProgrammedDistributionsResponse_ClearVersionOneOfCase(GetTokenPreProgrammedDistributionsResponse *message); + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber) { + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_TokenDistributions = 1, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_Proof = 2, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_Result_OneOfCase) { + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_Result_OneOfCase_TokenDistributions = 1, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions *tokenDistributions; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_ClearResultOneOfCase(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 *message); + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry_FieldNumber) { + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry_FieldNumber_RecipientId = 1, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry_FieldNumber_Amount = 2, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *recipientId; + +@property(nonatomic, readwrite) uint64_t amount; + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry_FieldNumber) { + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry_FieldNumber_Timestamp = 1, + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry_FieldNumber_DistributionsArray = 2, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry : GPBMessage + +@property(nonatomic, readwrite) uint64_t timestamp; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry*> *distributionsArray; +/** The number of items in @c distributionsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger distributionsArray_Count; + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions + +typedef GPB_ENUM(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions_FieldNumber) { + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions_FieldNumber_TokenDistributionsArray = 1, +}; + +GPB_FINAL @interface GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry*> *tokenDistributionsArray; +/** The number of items in @c tokenDistributionsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger tokenDistributionsArray_Count; + +@end + +#pragma mark - GetTokenTotalSupplyRequest + +typedef GPB_ENUM(GetTokenTotalSupplyRequest_FieldNumber) { + GetTokenTotalSupplyRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenTotalSupplyRequest_Version_OneOfCase) { + GetTokenTotalSupplyRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenTotalSupplyRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenTotalSupplyRequest : GPBMessage + +@property(nonatomic, readonly) GetTokenTotalSupplyRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenTotalSupplyRequest_ClearVersionOneOfCase(GetTokenTotalSupplyRequest *message); + +#pragma mark - GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 + +typedef GPB_ENUM(GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0_FieldNumber) { + GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0_FieldNumber_TokenId = 1, + GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0_FieldNumber_Prove = 2, +}; + +GPB_FINAL @interface GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetTokenTotalSupplyResponse + +typedef GPB_ENUM(GetTokenTotalSupplyResponse_FieldNumber) { + GetTokenTotalSupplyResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetTokenTotalSupplyResponse_Version_OneOfCase) { + GetTokenTotalSupplyResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenTotalSupplyResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetTokenTotalSupplyResponse : GPBMessage + +@property(nonatomic, readonly) GetTokenTotalSupplyResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetTokenTotalSupplyResponse_ClearVersionOneOfCase(GetTokenTotalSupplyResponse *message); + +#pragma mark - GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 + +typedef GPB_ENUM(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber) { + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_TokenTotalSupply = 1, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_Proof = 2, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_Result_OneOfCase) { + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_Result_OneOfCase_TokenTotalSupply = 1, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry *tokenTotalSupply; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_ClearResultOneOfCase(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 *message); + +#pragma mark - GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry + +typedef GPB_ENUM(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber) { + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TokenId = 1, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TotalAggregatedAmountInUserAccounts = 2, + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TotalSystemAmount = 3, +}; + +GPB_FINAL @interface GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenId; + +@property(nonatomic, readwrite) uint64_t totalAggregatedAmountInUserAccounts; + +@property(nonatomic, readwrite) uint64_t totalSystemAmount; + +@end + +#pragma mark - GetGroupInfoRequest + +typedef GPB_ENUM(GetGroupInfoRequest_FieldNumber) { + GetGroupInfoRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupInfoRequest_Version_OneOfCase) { + GetGroupInfoRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfoRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupInfoRequest : GPBMessage + +@property(nonatomic, readonly) GetGroupInfoRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfoRequest_GetGroupInfoRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupInfoRequest_ClearVersionOneOfCase(GetGroupInfoRequest *message); + +#pragma mark - GetGroupInfoRequest_GetGroupInfoRequestV0 + +typedef GPB_ENUM(GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber) { + GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_ContractId = 1, + GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_GroupContractPosition = 2, + GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_Prove = 3, +}; + +GPB_FINAL @interface GetGroupInfoRequest_GetGroupInfoRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite) uint32_t groupContractPosition; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetGroupInfoResponse + +typedef GPB_ENUM(GetGroupInfoResponse_FieldNumber) { + GetGroupInfoResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupInfoResponse_Version_OneOfCase) { + GetGroupInfoResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfoResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupInfoResponse : GPBMessage + +@property(nonatomic, readonly) GetGroupInfoResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfoResponse_GetGroupInfoResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupInfoResponse_ClearVersionOneOfCase(GetGroupInfoResponse *message); + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0 + +typedef GPB_ENUM(GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber) { + GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_GroupInfo = 1, + GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_Proof = 2, + GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_Metadata = 4, +}; + +typedef GPB_ENUM(GetGroupInfoResponse_GetGroupInfoResponseV0_Result_OneOfCase) { + GetGroupInfoResponse_GetGroupInfoResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfoResponse_GetGroupInfoResponseV0_Result_OneOfCase_GroupInfo = 1, + GetGroupInfoResponse_GetGroupInfoResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetGroupInfoResponse_GetGroupInfoResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetGroupInfoResponse_GetGroupInfoResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo *groupInfo; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetGroupInfoResponse_GetGroupInfoResponseV0_ClearResultOneOfCase(GetGroupInfoResponse_GetGroupInfoResponseV0 *message); + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry + +typedef GPB_ENUM(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry_FieldNumber) { + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry_FieldNumber_MemberId = 1, + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry_FieldNumber_Power = 2, +}; + +GPB_FINAL @interface GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *memberId; + +@property(nonatomic, readwrite) uint32_t power; + +@end + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry + +typedef GPB_ENUM(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry_FieldNumber) { + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry_FieldNumber_MembersArray = 1, + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry_FieldNumber_GroupRequiredPower = 2, +}; + +GPB_FINAL @interface GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry*> *membersArray; +/** The number of items in @c membersArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger membersArray_Count; + +@property(nonatomic, readwrite) uint32_t groupRequiredPower; + +@end + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo + +typedef GPB_ENUM(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo_FieldNumber) { + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo_FieldNumber_GroupInfo = 1, +}; + +GPB_FINAL @interface GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry *groupInfo; +/** Test to see if @c groupInfo has been set. */ +@property(nonatomic, readwrite) BOOL hasGroupInfo; + +@end + +#pragma mark - GetGroupInfosRequest + +typedef GPB_ENUM(GetGroupInfosRequest_FieldNumber) { + GetGroupInfosRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupInfosRequest_Version_OneOfCase) { + GetGroupInfosRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfosRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupInfosRequest : GPBMessage + +@property(nonatomic, readonly) GetGroupInfosRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfosRequest_GetGroupInfosRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupInfosRequest_ClearVersionOneOfCase(GetGroupInfosRequest *message); + +#pragma mark - GetGroupInfosRequest_StartAtGroupContractPosition + +typedef GPB_ENUM(GetGroupInfosRequest_StartAtGroupContractPosition_FieldNumber) { + GetGroupInfosRequest_StartAtGroupContractPosition_FieldNumber_StartGroupContractPosition = 1, + GetGroupInfosRequest_StartAtGroupContractPosition_FieldNumber_StartGroupContractPositionIncluded = 2, +}; + +GPB_FINAL @interface GetGroupInfosRequest_StartAtGroupContractPosition : GPBMessage + +@property(nonatomic, readwrite) uint32_t startGroupContractPosition; + +@property(nonatomic, readwrite) BOOL startGroupContractPositionIncluded; + +@end + +#pragma mark - GetGroupInfosRequest_GetGroupInfosRequestV0 + +typedef GPB_ENUM(GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber) { + GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_ContractId = 1, + GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_StartAtGroupContractPosition = 2, + GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_Count = 3, + GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_Prove = 4, +}; + +GPB_FINAL @interface GetGroupInfosRequest_GetGroupInfosRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfosRequest_StartAtGroupContractPosition *startAtGroupContractPosition; +/** Test to see if @c startAtGroupContractPosition has been set. */ +@property(nonatomic, readwrite) BOOL hasStartAtGroupContractPosition; + +@property(nonatomic, readwrite) uint32_t count; + +@property(nonatomic, readwrite) BOOL hasCount; +@property(nonatomic, readwrite) BOOL prove; + +@end + +#pragma mark - GetGroupInfosResponse + +typedef GPB_ENUM(GetGroupInfosResponse_FieldNumber) { + GetGroupInfosResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupInfosResponse_Version_OneOfCase) { + GetGroupInfosResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfosResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupInfosResponse : GPBMessage + +@property(nonatomic, readonly) GetGroupInfosResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfosResponse_GetGroupInfosResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupInfosResponse_ClearVersionOneOfCase(GetGroupInfosResponse *message); + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0 + +typedef GPB_ENUM(GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber) { + GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_GroupInfos = 1, + GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_Proof = 2, + GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_Metadata = 4, +}; + +typedef GPB_ENUM(GetGroupInfosResponse_GetGroupInfosResponseV0_Result_OneOfCase) { + GetGroupInfosResponse_GetGroupInfosResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupInfosResponse_GetGroupInfosResponseV0_Result_OneOfCase_GroupInfos = 1, + GetGroupInfosResponse_GetGroupInfosResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetGroupInfosResponse_GetGroupInfosResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetGroupInfosResponse_GetGroupInfosResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos *groupInfos; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetGroupInfosResponse_GetGroupInfosResponseV0_ClearResultOneOfCase(GetGroupInfosResponse_GetGroupInfosResponseV0 *message); + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry + +typedef GPB_ENUM(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry_FieldNumber) { + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry_FieldNumber_MemberId = 1, + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry_FieldNumber_Power = 2, +}; + +GPB_FINAL @interface GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *memberId; + +@property(nonatomic, readwrite) uint32_t power; + +@end + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry + +typedef GPB_ENUM(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber) { + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_GroupContractPosition = 1, + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_MembersArray = 2, + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_GroupRequiredPower = 3, +}; + +GPB_FINAL @interface GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry : GPBMessage + +@property(nonatomic, readwrite) uint32_t groupContractPosition; + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry*> *membersArray; +/** The number of items in @c membersArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger membersArray_Count; + +@property(nonatomic, readwrite) uint32_t groupRequiredPower; + +@end + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos + +typedef GPB_ENUM(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos_FieldNumber) { + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos_FieldNumber_GroupInfosArray = 1, +}; + +GPB_FINAL @interface GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry*> *groupInfosArray; +/** The number of items in @c groupInfosArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger groupInfosArray_Count; + +@end + +#pragma mark - GetGroupActionsRequest + +typedef GPB_ENUM(GetGroupActionsRequest_FieldNumber) { + GetGroupActionsRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupActionsRequest_Version_OneOfCase) { + GetGroupActionsRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupActionsRequest : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsRequest_GetGroupActionsRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupActionsRequest_ClearVersionOneOfCase(GetGroupActionsRequest *message); + +#pragma mark - GetGroupActionsRequest_StartAtActionId + +typedef GPB_ENUM(GetGroupActionsRequest_StartAtActionId_FieldNumber) { + GetGroupActionsRequest_StartAtActionId_FieldNumber_StartActionId = 1, + GetGroupActionsRequest_StartAtActionId_FieldNumber_StartActionIdIncluded = 2, +}; + +GPB_FINAL @interface GetGroupActionsRequest_StartAtActionId : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *startActionId; + +@property(nonatomic, readwrite) BOOL startActionIdIncluded; + +@end + +#pragma mark - GetGroupActionsRequest_GetGroupActionsRequestV0 + +typedef GPB_ENUM(GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber) { + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_ContractId = 1, + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_GroupContractPosition = 2, + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Status = 3, + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_StartAtActionId = 4, + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Count = 5, + GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Prove = 6, +}; + +GPB_FINAL @interface GetGroupActionsRequest_GetGroupActionsRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite) uint32_t groupContractPosition; + +@property(nonatomic, readwrite) GetGroupActionsRequest_ActionStatus status; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsRequest_StartAtActionId *startAtActionId; +/** Test to see if @c startAtActionId has been set. */ +@property(nonatomic, readwrite) BOOL hasStartAtActionId; + +@property(nonatomic, readwrite) uint32_t count; + +@property(nonatomic, readwrite) BOOL hasCount; +@property(nonatomic, readwrite) BOOL prove; + +@end + +/** + * Fetches the raw value of a @c GetGroupActionsRequest_GetGroupActionsRequestV0's @c status property, even + * if the value was not defined by the enum at the time the code was generated. + **/ +int32_t GetGroupActionsRequest_GetGroupActionsRequestV0_Status_RawValue(GetGroupActionsRequest_GetGroupActionsRequestV0 *message); +/** + * Sets the raw value of an @c GetGroupActionsRequest_GetGroupActionsRequestV0's @c status property, allowing + * it to be set to a value that was not defined by the enum at the time the code + * was generated. + **/ +void SetGetGroupActionsRequest_GetGroupActionsRequestV0_Status_RawValue(GetGroupActionsRequest_GetGroupActionsRequestV0 *message, int32_t value); + +#pragma mark - GetGroupActionsResponse + +typedef GPB_ENUM(GetGroupActionsResponse_FieldNumber) { + GetGroupActionsResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_Version_OneOfCase) { + GetGroupActionsResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupActionsResponse_ClearVersionOneOfCase(GetGroupActionsResponse *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0 + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_GroupActions = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_Proof = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_Result_OneOfCase) { + GetGroupActionsResponse_GetGroupActionsResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_GetGroupActionsResponseV0_Result_OneOfCase_GroupActions = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_GetGroupActionsResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions *groupActions; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetGroupActionsResponse_GetGroupActionsResponseV0_ClearResultOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0 *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_Amount = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_RecipientId = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_PublicNote = 3, +}; + +/** + * Mint event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent : GPBMessage + +/** Amount to mint */ +@property(nonatomic, readwrite) uint64_t amount; + +/** Recipient identifier */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *recipientId; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent_FieldNumber_Amount = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent_FieldNumber_PublicNote = 2, +}; + +/** + * Burn event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent : GPBMessage + +/** Amount to burn */ +@property(nonatomic, readwrite) uint64_t amount; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent_FieldNumber_FrozenId = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent_FieldNumber_PublicNote = 2, +}; + +/** + * Freeze event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent : GPBMessage + +/** Identifier of the frozen entity */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *frozenId; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent_FieldNumber_FrozenId = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent_FieldNumber_PublicNote = 2, +}; + +/** + * Unfreeze event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent : GPBMessage + +/** Identifier of the unfrozen entity */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *frozenId; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_FrozenId = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_Amount = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_PublicNote = 3, +}; + +/** + * Destroy frozen funds event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent : GPBMessage + +/** Identifier of the frozen entity */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *frozenId; + +/** Amount to destroy */ +@property(nonatomic, readwrite) uint64_t amount; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_SenderKeyIndex = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_RecipientKeyIndex = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_EncryptedData = 3, +}; + +/** + * Shared encrypted note + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote : GPBMessage + +/** Sender key index */ +@property(nonatomic, readwrite) uint32_t senderKeyIndex; + +/** Recipient key index */ +@property(nonatomic, readwrite) uint32_t recipientKeyIndex; + +/** Encrypted data */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *encryptedData; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_RootEncryptionKeyIndex = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_DerivationEncryptionKeyIndex = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_EncryptedData = 3, +}; + +/** + * Personal encrypted note + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote : GPBMessage + +/** Root encryption key index */ +@property(nonatomic, readwrite) uint32_t rootEncryptionKeyIndex; + +/** Derivation encryption key index */ +@property(nonatomic, readwrite) uint32_t derivationEncryptionKeyIndex; + +/** Encrypted data */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *encryptedData; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_RecipientId = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_PublicNote = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_SharedEncryptedNote = 3, + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_PersonalEncryptedNote = 4, + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_Amount = 5, +}; + +/** + * Transfer event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent : GPBMessage + +/** Recipient identifier */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *recipientId; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +/** Shared encrypted note */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote *sharedEncryptedNote; +/** Test to see if @c sharedEncryptedNote has been set. */ +@property(nonatomic, readwrite) BOOL hasSharedEncryptedNote; + +/** Personal encrypted note */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote *personalEncryptedNote; +/** Test to see if @c personalEncryptedNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPersonalEncryptedNote; + +/** Amount transferred */ +@property(nonatomic, readwrite) uint64_t amount; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_ActionType = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_PublicNote = 2, +}; + +/** + * Emergency action event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent : GPBMessage + +/** Emergency action type */ +@property(nonatomic, readwrite) GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType actionType; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +/** + * Fetches the raw value of a @c GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent's @c actionType property, even + * if the value was not defined by the enum at the time the code was generated. + **/ +int32_t GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_RawValue(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *message); +/** + * Sets the raw value of an @c GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent's @c actionType property, allowing + * it to be set to a value that was not defined by the enum at the time the code + * was generated. + **/ +void SetGetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_RawValue(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *message, int32_t value); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent_FieldNumber_TokenConfigUpdateItem = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent_FieldNumber_PublicNote = 2, +}; + +/** + * Token config update event + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent : GPBMessage + +/** Token config update item */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *tokenConfigUpdateItem; + +/** Public note */ +@property(nonatomic, readwrite, copy, null_resettable) NSString *publicNote; +/** Test to see if @c publicNote has been set. */ +@property(nonatomic, readwrite) BOOL hasPublicNote; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_TokenEvent = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_DocumentEvent = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_ContractEvent = 3, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase) { + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase_TokenEvent = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase_DocumentEvent = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase_ContractEvent = 3, +}; + +/** + * Event associated with this action + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_EventType_OneOfCase eventTypeOneOfCase; + +/** Token event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent *tokenEvent; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent *documentEvent; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent *contractEvent; + +@end + +/** + * Clears whatever value was set for the oneof 'eventType'. + **/ +void GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_ClearEventTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_FieldNumber_Create = 1, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_Type_OneOfCase) { + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_Type_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_Type_OneOfCase_Create = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_Type_OneOfCase typeOneOfCase; + +/** Create event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent *create; + +@end + +/** + * Clears whatever value was set for the oneof 'type'. + **/ +void GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent_FieldNumber_CreatedDocument = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *createdDocument; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent_FieldNumber_UpdatedContract = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *updatedContract; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_FieldNumber_Update = 1, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_Type_OneOfCase) { + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_Type_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_Type_OneOfCase_Update = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_Type_OneOfCase typeOneOfCase; + +/** Contract update event */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent *update; + +@end + +/** + * Clears whatever value was set for the oneof 'type'. + **/ +void GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Mint = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Burn = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Freeze = 3, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Unfreeze = 4, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_DestroyFrozenFunds = 5, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Transfer = 6, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_EmergencyAction = 7, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_TokenConfigUpdate = 8, +}; + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase) { + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_Mint = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_Burn = 2, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_Freeze = 3, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_Unfreeze = 4, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_DestroyFrozenFunds = 5, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_Transfer = 6, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_EmergencyAction = 7, + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase_TokenConfigUpdate = 8, +}; + +/** + * Details for token events + **/ +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent : GPBMessage + +@property(nonatomic, readonly) GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_Type_OneOfCase typeOneOfCase; + +/** Mint event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent *mint; + +/** Burn event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent *burn; + +/** Freeze event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent *freeze; + +/** Unfreeze event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent *unfreeze; + +/** Destroy frozen funds */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent *destroyFrozenFunds; + +/** Transfer event details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent *transfer; + +/** Emergency action details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *emergencyAction; + +/** Token configuration update details */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent *tokenConfigUpdate; + +@end + +/** + * Clears whatever value was set for the oneof 'type'. + **/ +void GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent *message); + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry_FieldNumber_ActionId = 1, + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry_FieldNumber_Event = 2, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry : GPBMessage + +/** Unique identifier for the action */ +@property(nonatomic, readwrite, copy, null_resettable) NSData *actionId; + +/** The event data */ +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent *event; +/** Test to see if @c event has been set. */ +@property(nonatomic, readwrite) BOOL hasEvent; + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions + +typedef GPB_ENUM(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions_FieldNumber) { + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions_FieldNumber_GroupActionsArray = 1, +}; + +GPB_FINAL @interface GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry*> *groupActionsArray; +/** The number of items in @c groupActionsArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger groupActionsArray_Count; + +@end + +#pragma mark - GetGroupActionSignersRequest + +typedef GPB_ENUM(GetGroupActionSignersRequest_FieldNumber) { + GetGroupActionSignersRequest_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupActionSignersRequest_Version_OneOfCase) { + GetGroupActionSignersRequest_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionSignersRequest_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupActionSignersRequest : GPBMessage + +@property(nonatomic, readonly) GetGroupActionSignersRequest_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupActionSignersRequest_ClearVersionOneOfCase(GetGroupActionSignersRequest *message); + +#pragma mark - GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 + +typedef GPB_ENUM(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber) { + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_ContractId = 1, + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_GroupContractPosition = 2, + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Status = 3, + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_ActionId = 4, + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Prove = 5, +}; + +GPB_FINAL @interface GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *contractId; + +@property(nonatomic, readwrite) uint32_t groupContractPosition; + +@property(nonatomic, readwrite) GetGroupActionSignersRequest_ActionStatus status; + +@property(nonatomic, readwrite, copy, null_resettable) NSData *actionId; + +@property(nonatomic, readwrite) BOOL prove; + +@end + +/** + * Fetches the raw value of a @c GetGroupActionSignersRequest_GetGroupActionSignersRequestV0's @c status property, even + * if the value was not defined by the enum at the time the code was generated. + **/ +int32_t GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_Status_RawValue(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *message); +/** + * Sets the raw value of an @c GetGroupActionSignersRequest_GetGroupActionSignersRequestV0's @c status property, allowing + * it to be set to a value that was not defined by the enum at the time the code + * was generated. + **/ +void SetGetGroupActionSignersRequest_GetGroupActionSignersRequestV0_Status_RawValue(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *message, int32_t value); + +#pragma mark - GetGroupActionSignersResponse + +typedef GPB_ENUM(GetGroupActionSignersResponse_FieldNumber) { + GetGroupActionSignersResponse_FieldNumber_V0 = 1, +}; + +typedef GPB_ENUM(GetGroupActionSignersResponse_Version_OneOfCase) { + GetGroupActionSignersResponse_Version_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionSignersResponse_Version_OneOfCase_V0 = 1, +}; + +GPB_FINAL @interface GetGroupActionSignersResponse : GPBMessage + +@property(nonatomic, readonly) GetGroupActionSignersResponse_Version_OneOfCase versionOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 *v0; + +@end + +/** + * Clears whatever value was set for the oneof 'version'. + **/ +void GetGroupActionSignersResponse_ClearVersionOneOfCase(GetGroupActionSignersResponse *message); + +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 + +typedef GPB_ENUM(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber) { + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_GroupActionSigners = 1, + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_Proof = 2, + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_Metadata = 3, +}; + +typedef GPB_ENUM(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_Result_OneOfCase) { + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_Result_OneOfCase_GPBUnsetOneOfCase = 0, + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_Result_OneOfCase_GroupActionSigners = 1, + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_Result_OneOfCase_Proof = 2, +}; + +GPB_FINAL @interface GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 : GPBMessage + +@property(nonatomic, readonly) GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_Result_OneOfCase resultOneOfCase; + +@property(nonatomic, readwrite, strong, null_resettable) GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners *groupActionSigners; + +@property(nonatomic, readwrite, strong, null_resettable) Proof *proof; + +@property(nonatomic, readwrite, strong, null_resettable) ResponseMetadata *metadata; +/** Test to see if @c metadata has been set. */ +@property(nonatomic, readwrite) BOOL hasMetadata; + +@end + +/** + * Clears whatever value was set for the oneof 'result'. + **/ +void GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_ClearResultOneOfCase(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 *message); + +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner + +typedef GPB_ENUM(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner_FieldNumber) { + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner_FieldNumber_SignerId = 1, + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner_FieldNumber_Power = 2, +}; + +GPB_FINAL @interface GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner : GPBMessage + +@property(nonatomic, readwrite, copy, null_resettable) NSData *signerId; + +@property(nonatomic, readwrite) uint32_t power; + +@end + +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners + +typedef GPB_ENUM(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners_FieldNumber) { + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners_FieldNumber_SignersArray = 1, +}; + +GPB_FINAL @interface GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners : GPBMessage + +@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner*> *signersArray; +/** The number of items in @c signersArray without causing the array to be created. */ +@property(nonatomic, readonly) NSUInteger signersArray_Count; + +@end + NS_ASSUME_NONNULL_END CF_EXTERN_C_END diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m index e0bff0f273a..f9375f49869 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m @@ -105,6 +105,50 @@ GPBObjCClassDeclaration(GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0); GPBObjCClassDeclaration(GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodeProposedBlocks); GPBObjCClassDeclaration(GetEvonodesProposedEpochBlocksResponse_GetEvonodesProposedEpochBlocksResponseV0_EvonodesProposedBlocks); +GPBObjCClassDeclaration(GetGroupActionSignersRequest); +GPBObjCClassDeclaration(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0); +GPBObjCClassDeclaration(GetGroupActionSignersResponse); +GPBObjCClassDeclaration(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0); +GPBObjCClassDeclaration(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner); +GPBObjCClassDeclaration(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners); +GPBObjCClassDeclaration(GetGroupActionsRequest); +GPBObjCClassDeclaration(GetGroupActionsRequest_GetGroupActionsRequestV0); +GPBObjCClassDeclaration(GetGroupActionsRequest_StartAtActionId); +GPBObjCClassDeclaration(GetGroupActionsResponse); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent); +GPBObjCClassDeclaration(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent); +GPBObjCClassDeclaration(GetGroupInfoRequest); +GPBObjCClassDeclaration(GetGroupInfoRequest_GetGroupInfoRequestV0); +GPBObjCClassDeclaration(GetGroupInfoResponse); +GPBObjCClassDeclaration(GetGroupInfoResponse_GetGroupInfoResponseV0); +GPBObjCClassDeclaration(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo); +GPBObjCClassDeclaration(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry); +GPBObjCClassDeclaration(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry); +GPBObjCClassDeclaration(GetGroupInfosRequest); +GPBObjCClassDeclaration(GetGroupInfosRequest_GetGroupInfosRequestV0); +GPBObjCClassDeclaration(GetGroupInfosRequest_StartAtGroupContractPosition); +GPBObjCClassDeclaration(GetGroupInfosResponse); +GPBObjCClassDeclaration(GetGroupInfosResponse_GetGroupInfosResponseV0); +GPBObjCClassDeclaration(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos); +GPBObjCClassDeclaration(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry); +GPBObjCClassDeclaration(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry); GPBObjCClassDeclaration(GetIdentitiesBalancesRequest); GPBObjCClassDeclaration(GetIdentitiesBalancesRequest_GetIdentitiesBalancesRequestV0); GPBObjCClassDeclaration(GetIdentitiesBalancesResponse); @@ -118,6 +162,19 @@ GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentitiesKeys); GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_IdentityKeys); GPBObjCClassDeclaration(GetIdentitiesContractKeysResponse_GetIdentitiesContractKeysResponseV0_PurposeKeys); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesRequest); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesResponse); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry); +GPBObjCClassDeclaration(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosRequest); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosResponse); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry); +GPBObjCClassDeclaration(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionRequest); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionRequest_GetIdentityBalanceAndRevisionRequestV0); GPBObjCClassDeclaration(GetIdentityBalanceAndRevisionResponse); @@ -148,6 +205,19 @@ GPBObjCClassDeclaration(GetIdentityRequest_GetIdentityRequestV0); GPBObjCClassDeclaration(GetIdentityResponse); GPBObjCClassDeclaration(GetIdentityResponse_GetIdentityResponseV0); +GPBObjCClassDeclaration(GetIdentityTokenBalancesRequest); +GPBObjCClassDeclaration(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0); +GPBObjCClassDeclaration(GetIdentityTokenBalancesResponse); +GPBObjCClassDeclaration(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0); +GPBObjCClassDeclaration(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry); +GPBObjCClassDeclaration(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances); +GPBObjCClassDeclaration(GetIdentityTokenInfosRequest); +GPBObjCClassDeclaration(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0); +GPBObjCClassDeclaration(GetIdentityTokenInfosResponse); +GPBObjCClassDeclaration(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0); +GPBObjCClassDeclaration(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry); +GPBObjCClassDeclaration(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry); +GPBObjCClassDeclaration(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos); GPBObjCClassDeclaration(GetPathElementsRequest); GPBObjCClassDeclaration(GetPathElementsRequest_GetPathElementsRequestV0); GPBObjCClassDeclaration(GetPathElementsResponse); @@ -162,6 +232,9 @@ GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_ContractRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_DocumentRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_IdentityRequest); +GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest); +GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest); +GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_TokenStatusRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_VoteStatusRequest); GPBObjCClassDeclaration(GetProofsRequest_GetProofsRequestV0_VoteStatusRequest_ContestedResourceVoteStatusRequest); GPBObjCClassDeclaration(GetProofsResponse); @@ -192,6 +265,25 @@ GPBObjCClassDeclaration(GetStatusResponse_GetStatusResponseV0_Version_Protocol_Drive); GPBObjCClassDeclaration(GetStatusResponse_GetStatusResponseV0_Version_Protocol_Tenderdash); GPBObjCClassDeclaration(GetStatusResponse_GetStatusResponseV0_Version_Software); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsRequest); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsResponse); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions); +GPBObjCClassDeclaration(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry); +GPBObjCClassDeclaration(GetTokenStatusesRequest); +GPBObjCClassDeclaration(GetTokenStatusesRequest_GetTokenStatusesRequestV0); +GPBObjCClassDeclaration(GetTokenStatusesResponse); +GPBObjCClassDeclaration(GetTokenStatusesResponse_GetTokenStatusesResponseV0); +GPBObjCClassDeclaration(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry); +GPBObjCClassDeclaration(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses); +GPBObjCClassDeclaration(GetTokenTotalSupplyRequest); +GPBObjCClassDeclaration(GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0); +GPBObjCClassDeclaration(GetTokenTotalSupplyResponse); +GPBObjCClassDeclaration(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0); +GPBObjCClassDeclaration(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry); GPBObjCClassDeclaration(GetTotalCreditsInPlatformRequest); GPBObjCClassDeclaration(GetTotalCreditsInPlatformRequest_GetTotalCreditsInPlatformRequestV0); GPBObjCClassDeclaration(GetTotalCreditsInPlatformResponse); @@ -3949,6 +4041,9 @@ @implementation GetProofsRequest_GetProofsRequestV0 @dynamic contractsArray, contractsArray_Count; @dynamic documentsArray, documentsArray_Count; @dynamic votesArray, votesArray_Count; +@dynamic identityTokenBalancesArray, identityTokenBalancesArray_Count; +@dynamic identityTokenInfosArray, identityTokenInfosArray_Count; +@dynamic tokenStatusesArray, tokenStatusesArray_Count; typedef struct GetProofsRequest_GetProofsRequestV0__storage_ { uint32_t _has_storage_[1]; @@ -3956,6 +4051,9 @@ @implementation GetProofsRequest_GetProofsRequestV0 NSMutableArray *contractsArray; NSMutableArray *documentsArray; NSMutableArray *votesArray; + NSMutableArray *identityTokenBalancesArray; + NSMutableArray *identityTokenInfosArray; + NSMutableArray *tokenStatusesArray; } GetProofsRequest_GetProofsRequestV0__storage_; // This method is threadsafe because it is initially called @@ -4000,6 +4098,33 @@ + (GPBDescriptor *)descriptor { .flags = GPBFieldRepeated, .dataType = GPBDataTypeMessage, }, + { + .name = "identityTokenBalancesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentityTokenBalancesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, identityTokenBalancesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "identityTokenInfosArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_IdentityTokenInfosArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, identityTokenInfosArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "tokenStatusesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetProofsRequest_GetProofsRequestV0_TokenStatusRequest), + .number = GetProofsRequest_GetProofsRequestV0_FieldNumber_TokenStatusesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0__storage_, tokenStatusesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, }; GPBDescriptor *localDescriptor = [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0 class] @@ -4460,6 +4585,166 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest + +@implementation GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest + +@dynamic tokenId; +@dynamic identityId; + +typedef struct GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + NSData *identityId; +} GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest_FieldNumber_IdentityId, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_IdentityTokenBalanceRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest + +@implementation GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest + +@dynamic tokenId; +@dynamic identityId; + +typedef struct GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + NSData *identityId; +} GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest_FieldNumber_IdentityId, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_IdentityTokenInfoRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetProofsRequest_GetProofsRequestV0_TokenStatusRequest + +@implementation GetProofsRequest_GetProofsRequestV0_TokenStatusRequest + +@dynamic tokenId; + +typedef struct GetProofsRequest_GetProofsRequestV0_TokenStatusRequest__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; +} GetProofsRequest_GetProofsRequestV0_TokenStatusRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetProofsRequest_GetProofsRequestV0_TokenStatusRequest_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetProofsRequest_GetProofsRequestV0_TokenStatusRequest__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetProofsRequest_GetProofsRequestV0_TokenStatusRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetProofsRequest_GetProofsRequestV0_TokenStatusRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetProofsRequest_GetProofsRequestV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma mark - GetProofsResponse @implementation GetProofsResponse @@ -12826,6 +13111,5691 @@ + (GPBDescriptor *)descriptor { @end +#pragma mark - GetIdentityTokenBalancesRequest + +@implementation GetIdentityTokenBalancesRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityTokenBalancesRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 *v0; +} GetIdentityTokenBalancesRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0), + .number = GetIdentityTokenBalancesRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenBalancesRequest_ClearVersionOneOfCase(GetIdentityTokenBalancesRequest *message) { + GPBDescriptor *descriptor = [GetIdentityTokenBalancesRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 + +@implementation GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 + +@dynamic identityId; +@dynamic tokenIdsArray, tokenIdsArray_Count; +@dynamic prove; + +typedef struct GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; + NSMutableArray *tokenIdsArray; +} GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "tokenIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_TokenIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0__storage_, tokenIdsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesRequest_GetIdentityTokenBalancesRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenBalancesRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenBalancesResponse + +@implementation GetIdentityTokenBalancesResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityTokenBalancesResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 *v0; +} GetIdentityTokenBalancesResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0), + .number = GetIdentityTokenBalancesResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenBalancesResponse_ClearVersionOneOfCase(GetIdentityTokenBalancesResponse *message) { + GPBDescriptor *descriptor = [GetIdentityTokenBalancesResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 + +@implementation GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 + +@dynamic resultOneOfCase; +@dynamic tokenBalances; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances *tokenBalances; + Proof *proof; + ResponseMetadata *metadata; +} GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenBalances", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances), + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_TokenBalances, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_, tokenBalances), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenBalancesResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_ClearResultOneOfCase(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry + +@implementation GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry + +@dynamic tokenId; +@dynamic hasBalance, balance; + +typedef struct GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + uint64_t balance; +} GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "balance", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry_FieldNumber_Balance, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry__storage_, balance), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances + +@implementation GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances + +@dynamic tokenBalancesArray, tokenBalancesArray_Count; + +typedef struct GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenBalancesArray; +} GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenBalancesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalanceEntry), + .number = GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances_FieldNumber_TokenBalancesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances__storage_, tokenBalancesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0_TokenBalances__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenBalancesResponse_GetIdentityTokenBalancesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenBalancesRequest + +@implementation GetIdentitiesTokenBalancesRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentitiesTokenBalancesRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 *v0; +} GetIdentitiesTokenBalancesRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0), + .number = GetIdentitiesTokenBalancesRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenBalancesRequest_ClearVersionOneOfCase(GetIdentitiesTokenBalancesRequest *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenBalancesRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 + +@implementation GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 + +@dynamic tokenId; +@dynamic identityIdsArray, identityIdsArray_Count; +@dynamic prove; + +typedef struct GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + NSMutableArray *identityIdsArray; +} GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "identityIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_IdentityIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0__storage_, identityIdsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesRequest_GetIdentitiesTokenBalancesRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenBalancesRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenBalancesResponse + +@implementation GetIdentitiesTokenBalancesResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentitiesTokenBalancesResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 *v0; +} GetIdentitiesTokenBalancesResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0), + .number = GetIdentitiesTokenBalancesResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenBalancesResponse_ClearVersionOneOfCase(GetIdentitiesTokenBalancesResponse *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenBalancesResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 + +@implementation GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 + +@dynamic resultOneOfCase; +@dynamic identityTokenBalances; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances *identityTokenBalances; + Proof *proof; + ResponseMetadata *metadata; +} GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityTokenBalances", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances), + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_IdentityTokenBalances, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_, identityTokenBalances), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenBalancesResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_ClearResultOneOfCase(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry + +@implementation GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry + +@dynamic identityId; +@dynamic hasBalance, balance; + +typedef struct GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; + uint64_t balance; +} GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "balance", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry_FieldNumber_Balance, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry__storage_, balance), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt64, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances + +@implementation GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances + +@dynamic identityTokenBalancesArray, identityTokenBalancesArray_Count; + +typedef struct GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *identityTokenBalancesArray; +} GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityTokenBalancesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalanceEntry), + .number = GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances_FieldNumber_IdentityTokenBalancesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances__storage_, identityTokenBalancesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0_IdentityTokenBalances__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenBalancesResponse_GetIdentitiesTokenBalancesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenInfosRequest + +@implementation GetIdentityTokenInfosRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityTokenInfosRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 *v0; +} GetIdentityTokenInfosRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0), + .number = GetIdentityTokenInfosRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenInfosRequest_ClearVersionOneOfCase(GetIdentityTokenInfosRequest *message) { + GPBDescriptor *descriptor = [GetIdentityTokenInfosRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 + +@implementation GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 + +@dynamic identityId; +@dynamic tokenIdsArray, tokenIdsArray_Count; +@dynamic prove; + +typedef struct GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; + NSMutableArray *tokenIdsArray; +} GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "tokenIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_TokenIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0__storage_, tokenIdsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosRequest_GetIdentityTokenInfosRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenInfosRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenInfosResponse + +@implementation GetIdentityTokenInfosResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentityTokenInfosResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 *v0; +} GetIdentityTokenInfosResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0), + .number = GetIdentityTokenInfosResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenInfosResponse_ClearVersionOneOfCase(GetIdentityTokenInfosResponse *message) { + GPBDescriptor *descriptor = [GetIdentityTokenInfosResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 + +@implementation GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 + +@dynamic resultOneOfCase; +@dynamic tokenInfos; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos *tokenInfos; + Proof *proof; + ResponseMetadata *metadata; +} GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenInfos", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos), + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_TokenInfos, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_, tokenInfos), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenInfosResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_ClearResultOneOfCase(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry + +@implementation GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry + +@dynamic frozen; + +typedef struct GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry__storage_ { + uint32_t _has_storage_[1]; +} GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "frozen", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber_Frozen, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry + +@implementation GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry + +@dynamic tokenId; +@dynamic hasInfo, info; + +typedef struct GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry *info; +} GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "info", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenIdentityInfoEntry), + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry_FieldNumber_Info, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry__storage_, info), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos + +@implementation GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos + +@dynamic tokenInfosArray, tokenInfosArray_Count; + +typedef struct GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenInfosArray; +} GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenInfosArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfoEntry), + .number = GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos_FieldNumber_TokenInfosArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos__storage_, tokenInfosArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0_TokenInfos__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentityTokenInfosResponse_GetIdentityTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenInfosRequest + +@implementation GetIdentitiesTokenInfosRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentitiesTokenInfosRequest__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 *v0; +} GetIdentitiesTokenInfosRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0), + .number = GetIdentitiesTokenInfosRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenInfosRequest_ClearVersionOneOfCase(GetIdentitiesTokenInfosRequest *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenInfosRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 + +@implementation GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 + +@dynamic tokenId; +@dynamic identityIdsArray, identityIdsArray_Count; +@dynamic prove; + +typedef struct GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + NSMutableArray *identityIdsArray; +} GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "identityIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_IdentityIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0__storage_, identityIdsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosRequest_GetIdentitiesTokenInfosRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenInfosRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse + +@implementation GetIdentitiesTokenInfosResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetIdentitiesTokenInfosResponse__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 *v0; +} GetIdentitiesTokenInfosResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0), + .number = GetIdentitiesTokenInfosResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenInfosResponse_ClearVersionOneOfCase(GetIdentitiesTokenInfosResponse *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenInfosResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 + +@implementation GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 + +@dynamic resultOneOfCase; +@dynamic identityTokenInfos; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos *identityTokenInfos; + Proof *proof; + ResponseMetadata *metadata; +} GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityTokenInfos", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos), + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_IdentityTokenInfos, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_, identityTokenInfos), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenInfosResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_ClearResultOneOfCase(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 *message) { + GPBDescriptor *descriptor = [GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry + +@implementation GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry + +@dynamic frozen; + +typedef struct GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry__storage_ { + uint32_t _has_storage_[1]; +} GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "frozen", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry_FieldNumber_Frozen, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry + +@implementation GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry + +@dynamic identityId; +@dynamic hasInfo, info; + +typedef struct GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *identityId; + GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry *info; +} GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "identityId", + .dataTypeSpecific.clazz = Nil, + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry_FieldNumber_IdentityId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry__storage_, identityId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "info", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenIdentityInfoEntry), + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry_FieldNumber_Info, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry__storage_, info), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos + +@implementation GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos + +@dynamic tokenInfosArray, tokenInfosArray_Count; + +typedef struct GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenInfosArray; +} GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenInfosArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_TokenInfoEntry), + .number = GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos_FieldNumber_TokenInfosArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos__storage_, tokenInfosArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0_IdentityTokenInfos__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetIdentitiesTokenInfosResponse_GetIdentitiesTokenInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenStatusesRequest + +@implementation GetTokenStatusesRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenStatusesRequest__storage_ { + uint32_t _has_storage_[2]; + GetTokenStatusesRequest_GetTokenStatusesRequestV0 *v0; +} GetTokenStatusesRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenStatusesRequest_GetTokenStatusesRequestV0), + .number = GetTokenStatusesRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenStatusesRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenStatusesRequest_ClearVersionOneOfCase(GetTokenStatusesRequest *message) { + GPBDescriptor *descriptor = [GetTokenStatusesRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenStatusesRequest_GetTokenStatusesRequestV0 + +@implementation GetTokenStatusesRequest_GetTokenStatusesRequestV0 + +@dynamic tokenIdsArray, tokenIdsArray_Count; +@dynamic prove; + +typedef struct GetTokenStatusesRequest_GetTokenStatusesRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenIdsArray; +} GetTokenStatusesRequest_GetTokenStatusesRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenIdsArray", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenStatusesRequest_GetTokenStatusesRequestV0_FieldNumber_TokenIdsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetTokenStatusesRequest_GetTokenStatusesRequestV0__storage_, tokenIdsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenStatusesRequest_GetTokenStatusesRequestV0_FieldNumber_Prove, + .hasIndex = 0, + .offset = 1, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesRequest_GetTokenStatusesRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesRequest_GetTokenStatusesRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenStatusesRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenStatusesResponse + +@implementation GetTokenStatusesResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenStatusesResponse__storage_ { + uint32_t _has_storage_[2]; + GetTokenStatusesResponse_GetTokenStatusesResponseV0 *v0; +} GetTokenStatusesResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenStatusesResponse_GetTokenStatusesResponseV0), + .number = GetTokenStatusesResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenStatusesResponse_ClearVersionOneOfCase(GetTokenStatusesResponse *message) { + GPBDescriptor *descriptor = [GetTokenStatusesResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0 + +@implementation GetTokenStatusesResponse_GetTokenStatusesResponseV0 + +@dynamic resultOneOfCase; +@dynamic tokenStatuses; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses *tokenStatuses; + Proof *proof; + ResponseMetadata *metadata; +} GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenStatuses", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses), + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_TokenStatuses, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_, tokenStatuses), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesResponse_GetTokenStatusesResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesResponse_GetTokenStatusesResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenStatusesResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenStatusesResponse_GetTokenStatusesResponseV0_ClearResultOneOfCase(GetTokenStatusesResponse_GetTokenStatusesResponseV0 *message) { + GPBDescriptor *descriptor = [GetTokenStatusesResponse_GetTokenStatusesResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry + +@implementation GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry + +@dynamic tokenId; +@dynamic hasPaused, paused; + +typedef struct GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; +} GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "paused", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry_FieldNumber_Paused, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = GPBFieldOptional, + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenStatusesResponse_GetTokenStatusesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses + +@implementation GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses + +@dynamic tokenStatusesArray, tokenStatusesArray_Count; + +typedef struct GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenStatusesArray; +} GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenStatusesArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatusEntry), + .number = GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses_FieldNumber_TokenStatusesArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses__storage_, tokenStatusesArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenStatusesResponse_GetTokenStatusesResponseV0_TokenStatuses__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenStatusesResponse_GetTokenStatusesResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsRequest + +@implementation GetTokenPreProgrammedDistributionsRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenPreProgrammedDistributionsRequest__storage_ { + uint32_t _has_storage_[2]; + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 *v0; +} GetTokenPreProgrammedDistributionsRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0), + .number = GetTokenPreProgrammedDistributionsRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenPreProgrammedDistributionsRequest_ClearVersionOneOfCase(GetTokenPreProgrammedDistributionsRequest *message) { + GPBDescriptor *descriptor = [GetTokenPreProgrammedDistributionsRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 + +@implementation GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 + +@dynamic tokenId; +@dynamic hasStartAtInfo, startAtInfo; +@dynamic hasLimit, limit; +@dynamic prove; + +typedef struct GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t limit; + NSData *tokenId; + GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo *startAtInfo; +} GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "startAtInfo", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo), + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_StartAtInfo, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_, startAtInfo), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "limit", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_Limit, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_, limit), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt32, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_FieldNumber_Prove, + .hasIndex = 3, + .offset = 4, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo + +@implementation GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo + +@dynamic startTimeMs; +@dynamic hasStartRecipient, startRecipient; +@dynamic hasStartRecipientIncluded, startRecipientIncluded; + +typedef struct GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo__storage_ { + uint32_t _has_storage_[1]; + NSData *startRecipient; + uint64_t startTimeMs; +} GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "startTimeMs", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartTimeMs, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo__storage_, startTimeMs), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "startRecipient", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartRecipient, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo__storage_, startRecipient), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeBytes, + }, + { + .name = "startRecipientIncluded", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo_FieldNumber_StartRecipientIncluded, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. + .flags = GPBFieldOptional, + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0_StartAtInfo__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsRequest_GetTokenPreProgrammedDistributionsRequestV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse + +@implementation GetTokenPreProgrammedDistributionsResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenPreProgrammedDistributionsResponse__storage_ { + uint32_t _has_storage_[2]; + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 *v0; +} GetTokenPreProgrammedDistributionsResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0), + .number = GetTokenPreProgrammedDistributionsResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenPreProgrammedDistributionsResponse_ClearVersionOneOfCase(GetTokenPreProgrammedDistributionsResponse *message) { + GPBDescriptor *descriptor = [GetTokenPreProgrammedDistributionsResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 + +@implementation GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 + +@dynamic resultOneOfCase; +@dynamic tokenDistributions; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions *tokenDistributions; + Proof *proof; + ResponseMetadata *metadata; +} GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenDistributions", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions), + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_TokenDistributions, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_, tokenDistributions), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_ClearResultOneOfCase(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 *message) { + GPBDescriptor *descriptor = [GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry + +@implementation GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry + +@dynamic recipientId; +@dynamic amount; + +typedef struct GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *recipientId; + uint64_t amount; +} GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "recipientId", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry_FieldNumber_RecipientId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry__storage_, recipientId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "amount", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry_FieldNumber_Amount, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry__storage_, amount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry + +@implementation GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry + +@dynamic timestamp; +@dynamic distributionsArray, distributionsArray_Count; + +typedef struct GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *distributionsArray; + uint64_t timestamp; +} GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "timestamp", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry_FieldNumber_Timestamp, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry__storage_, timestamp), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "distributionsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributionEntry), + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry_FieldNumber_DistributionsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry__storage_, distributionsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions + +@implementation GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions + +@dynamic tokenDistributionsArray, tokenDistributionsArray_Count; + +typedef struct GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *tokenDistributionsArray; +} GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenDistributionsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenTimedDistributionEntry), + .number = GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions_FieldNumber_TokenDistributionsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions__storage_, tokenDistributionsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0_TokenDistributions__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenPreProgrammedDistributionsResponse_GetTokenPreProgrammedDistributionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenTotalSupplyRequest + +@implementation GetTokenTotalSupplyRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenTotalSupplyRequest__storage_ { + uint32_t _has_storage_[2]; + GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 *v0; +} GetTokenTotalSupplyRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0), + .number = GetTokenTotalSupplyRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenTotalSupplyRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenTotalSupplyRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenTotalSupplyRequest_ClearVersionOneOfCase(GetTokenTotalSupplyRequest *message) { + GPBDescriptor *descriptor = [GetTokenTotalSupplyRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 + +@implementation GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 + +@dynamic tokenId; +@dynamic prove; + +typedef struct GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; +} GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0_FieldNumber_Prove, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenTotalSupplyRequest_GetTokenTotalSupplyRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenTotalSupplyRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetTokenTotalSupplyResponse + +@implementation GetTokenTotalSupplyResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetTokenTotalSupplyResponse__storage_ { + uint32_t _has_storage_[2]; + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 *v0; +} GetTokenTotalSupplyResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0), + .number = GetTokenTotalSupplyResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenTotalSupplyResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenTotalSupplyResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenTotalSupplyResponse_ClearVersionOneOfCase(GetTokenTotalSupplyResponse *message) { + GPBDescriptor *descriptor = [GetTokenTotalSupplyResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 + +@implementation GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 + +@dynamic resultOneOfCase; +@dynamic tokenTotalSupply; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry *tokenTotalSupply; + Proof *proof; + ResponseMetadata *metadata; +} GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenTotalSupply", + .dataTypeSpecific.clazz = GPBObjCClass(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry), + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_TokenTotalSupply, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_, tokenTotalSupply), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenTotalSupplyResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_ClearResultOneOfCase(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 *message) { + GPBDescriptor *descriptor = [GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry + +@implementation GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry + +@dynamic tokenId; +@dynamic totalAggregatedAmountInUserAccounts; +@dynamic totalSystemAmount; + +typedef struct GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenId; + uint64_t totalAggregatedAmountInUserAccounts; + uint64_t totalSystemAmount; +} GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenId", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TokenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_, tokenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "totalAggregatedAmountInUserAccounts", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TotalAggregatedAmountInUserAccounts, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_, totalAggregatedAmountInUserAccounts), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "totalSystemAmount", + .dataTypeSpecific.clazz = Nil, + .number = GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry_FieldNumber_TotalSystemAmount, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_, totalSystemAmount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0_TokenTotalSupplyEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetTokenTotalSupplyResponse_GetTokenTotalSupplyResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfoRequest + +@implementation GetGroupInfoRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupInfoRequest__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfoRequest_GetGroupInfoRequestV0 *v0; +} GetGroupInfoRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfoRequest_GetGroupInfoRequestV0), + .number = GetGroupInfoRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfoRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfoRequest_ClearVersionOneOfCase(GetGroupInfoRequest *message) { + GPBDescriptor *descriptor = [GetGroupInfoRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfoRequest_GetGroupInfoRequestV0 + +@implementation GetGroupInfoRequest_GetGroupInfoRequestV0 + +@dynamic contractId; +@dynamic groupContractPosition; +@dynamic prove; + +typedef struct GetGroupInfoRequest_GetGroupInfoRequestV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t groupContractPosition; + NSData *contractId; +} GetGroupInfoRequest_GetGroupInfoRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_ContractId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfoRequest_GetGroupInfoRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "groupContractPosition", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_GroupContractPosition, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupInfoRequest_GetGroupInfoRequestV0__storage_, groupContractPosition), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoRequest_GetGroupInfoRequestV0_FieldNumber_Prove, + .hasIndex = 2, + .offset = 3, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoRequest_GetGroupInfoRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoRequest_GetGroupInfoRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfoRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfoResponse + +@implementation GetGroupInfoResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupInfoResponse__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfoResponse_GetGroupInfoResponseV0 *v0; +} GetGroupInfoResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0), + .number = GetGroupInfoResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfoResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfoResponse_ClearVersionOneOfCase(GetGroupInfoResponse *message) { + GPBDescriptor *descriptor = [GetGroupInfoResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0 + +@implementation GetGroupInfoResponse_GetGroupInfoResponseV0 + +@dynamic resultOneOfCase; +@dynamic groupInfo; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetGroupInfoResponse_GetGroupInfoResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo *groupInfo; + Proof *proof; + ResponseMetadata *metadata; +} GetGroupInfoResponse_GetGroupInfoResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupInfo", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo), + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_GroupInfo, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0__storage_, groupInfo), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoResponse_GetGroupInfoResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoResponse_GetGroupInfoResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfoResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfoResponse_GetGroupInfoResponseV0_ClearResultOneOfCase(GetGroupInfoResponse_GetGroupInfoResponseV0 *message) { + GPBDescriptor *descriptor = [GetGroupInfoResponse_GetGroupInfoResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry + +@implementation GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry + +@dynamic memberId; +@dynamic power; + +typedef struct GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry__storage_ { + uint32_t _has_storage_[1]; + uint32_t power; + NSData *memberId; +} GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "memberId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry_FieldNumber_MemberId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry__storage_, memberId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "power", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry_FieldNumber_Power, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry__storage_, power), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry + +@implementation GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry + +@dynamic membersArray, membersArray_Count; +@dynamic groupRequiredPower; + +typedef struct GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry__storage_ { + uint32_t _has_storage_[1]; + uint32_t groupRequiredPower; + NSMutableArray *membersArray; +} GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "membersArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupMemberEntry), + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry_FieldNumber_MembersArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry__storage_, membersArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "groupRequiredPower", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry_FieldNumber_GroupRequiredPower, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry__storage_, groupRequiredPower), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo + +@implementation GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo + +@dynamic hasGroupInfo, groupInfo; + +typedef struct GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo__storage_ { + uint32_t _has_storage_[1]; + GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry *groupInfo; +} GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupInfo", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfoEntry), + .number = GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo_FieldNumber_GroupInfo, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo__storage_, groupInfo), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfoResponse_GetGroupInfoResponseV0_GroupInfo__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfoResponse_GetGroupInfoResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfosRequest + +@implementation GetGroupInfosRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupInfosRequest__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfosRequest_GetGroupInfosRequestV0 *v0; +} GetGroupInfosRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosRequest_GetGroupInfosRequestV0), + .number = GetGroupInfosRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfosRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfosRequest_ClearVersionOneOfCase(GetGroupInfosRequest *message) { + GPBDescriptor *descriptor = [GetGroupInfosRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfosRequest_StartAtGroupContractPosition + +@implementation GetGroupInfosRequest_StartAtGroupContractPosition + +@dynamic startGroupContractPosition; +@dynamic startGroupContractPositionIncluded; + +typedef struct GetGroupInfosRequest_StartAtGroupContractPosition__storage_ { + uint32_t _has_storage_[1]; + uint32_t startGroupContractPosition; +} GetGroupInfosRequest_StartAtGroupContractPosition__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "startGroupContractPosition", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosRequest_StartAtGroupContractPosition_FieldNumber_StartGroupContractPosition, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfosRequest_StartAtGroupContractPosition__storage_, startGroupContractPosition), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "startGroupContractPositionIncluded", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosRequest_StartAtGroupContractPosition_FieldNumber_StartGroupContractPositionIncluded, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosRequest_StartAtGroupContractPosition class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosRequest_StartAtGroupContractPosition__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfosRequest_GetGroupInfosRequestV0 + +@implementation GetGroupInfosRequest_GetGroupInfosRequestV0 + +@dynamic contractId; +@dynamic hasStartAtGroupContractPosition, startAtGroupContractPosition; +@dynamic hasCount, count; +@dynamic prove; + +typedef struct GetGroupInfosRequest_GetGroupInfosRequestV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t count; + NSData *contractId; + GetGroupInfosRequest_StartAtGroupContractPosition *startAtGroupContractPosition; +} GetGroupInfosRequest_GetGroupInfosRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_ContractId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfosRequest_GetGroupInfosRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "startAtGroupContractPosition", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosRequest_StartAtGroupContractPosition), + .number = GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_StartAtGroupContractPosition, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupInfosRequest_GetGroupInfosRequestV0__storage_, startAtGroupContractPosition), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "count", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_Count, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupInfosRequest_GetGroupInfosRequestV0__storage_, count), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt32, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosRequest_GetGroupInfosRequestV0_FieldNumber_Prove, + .hasIndex = 3, + .offset = 4, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosRequest_GetGroupInfosRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosRequest_GetGroupInfosRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfosResponse + +@implementation GetGroupInfosResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupInfosResponse__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfosResponse_GetGroupInfosResponseV0 *v0; +} GetGroupInfosResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0), + .number = GetGroupInfosResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfosResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfosResponse_ClearVersionOneOfCase(GetGroupInfosResponse *message) { + GPBDescriptor *descriptor = [GetGroupInfosResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0 + +@implementation GetGroupInfosResponse_GetGroupInfosResponseV0 + +@dynamic resultOneOfCase; +@dynamic groupInfos; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetGroupInfosResponse_GetGroupInfosResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos *groupInfos; + Proof *proof; + ResponseMetadata *metadata; +} GetGroupInfosResponse_GetGroupInfosResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupInfos", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos), + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_GroupInfos, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0__storage_, groupInfos), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosResponse_GetGroupInfosResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosResponse_GetGroupInfosResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupInfosResponse_GetGroupInfosResponseV0_ClearResultOneOfCase(GetGroupInfosResponse_GetGroupInfosResponseV0 *message) { + GPBDescriptor *descriptor = [GetGroupInfosResponse_GetGroupInfosResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry + +@implementation GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry + +@dynamic memberId; +@dynamic power; + +typedef struct GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry__storage_ { + uint32_t _has_storage_[1]; + uint32_t power; + NSData *memberId; +} GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "memberId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry_FieldNumber_MemberId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry__storage_, memberId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "power", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry_FieldNumber_Power, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry__storage_, power), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry + +@implementation GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry + +@dynamic groupContractPosition; +@dynamic membersArray, membersArray_Count; +@dynamic groupRequiredPower; + +typedef struct GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_ { + uint32_t _has_storage_[1]; + uint32_t groupContractPosition; + uint32_t groupRequiredPower; + NSMutableArray *membersArray; +} GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupContractPosition", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_GroupContractPosition, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_, groupContractPosition), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "membersArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupMemberEntry), + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_MembersArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_, membersArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + { + .name = "groupRequiredPower", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry_FieldNumber_GroupRequiredPower, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_, groupRequiredPower), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos + +@implementation GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos + +@dynamic groupInfosArray, groupInfosArray_Count; + +typedef struct GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *groupInfosArray; +} GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupInfosArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupPositionInfoEntry), + .number = GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos_FieldNumber_GroupInfosArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos__storage_, groupInfosArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupInfosResponse_GetGroupInfosResponseV0_GroupInfos__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupInfosResponse_GetGroupInfosResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsRequest + +@implementation GetGroupActionsRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupActionsRequest__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsRequest_GetGroupActionsRequestV0 *v0; +} GetGroupActionsRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsRequest_GetGroupActionsRequestV0), + .number = GetGroupActionsRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsRequest_ClearVersionOneOfCase(GetGroupActionsRequest *message) { + GPBDescriptor *descriptor = [GetGroupActionsRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - Enum GetGroupActionsRequest_ActionStatus + +GPBEnumDescriptor *GetGroupActionsRequest_ActionStatus_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "Active\000Closed\000"; + static const int32_t values[] = { + GetGroupActionsRequest_ActionStatus_Active, + GetGroupActionsRequest_ActionStatus_Closed, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetGroupActionsRequest_ActionStatus) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:GetGroupActionsRequest_ActionStatus_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL GetGroupActionsRequest_ActionStatus_IsValidValue(int32_t value__) { + switch (value__) { + case GetGroupActionsRequest_ActionStatus_Active: + case GetGroupActionsRequest_ActionStatus_Closed: + return YES; + default: + return NO; + } +} + +#pragma mark - GetGroupActionsRequest_StartAtActionId + +@implementation GetGroupActionsRequest_StartAtActionId + +@dynamic startActionId; +@dynamic startActionIdIncluded; + +typedef struct GetGroupActionsRequest_StartAtActionId__storage_ { + uint32_t _has_storage_[1]; + NSData *startActionId; +} GetGroupActionsRequest_StartAtActionId__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "startActionId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_StartAtActionId_FieldNumber_StartActionId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_StartAtActionId__storage_, startActionId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "startActionIdIncluded", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_StartAtActionId_FieldNumber_StartActionIdIncluded, + .hasIndex = 1, + .offset = 2, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsRequest_StartAtActionId class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsRequest_StartAtActionId__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsRequest_GetGroupActionsRequestV0 + +@implementation GetGroupActionsRequest_GetGroupActionsRequestV0 + +@dynamic contractId; +@dynamic groupContractPosition; +@dynamic status; +@dynamic hasStartAtActionId, startAtActionId; +@dynamic hasCount, count; +@dynamic prove; + +typedef struct GetGroupActionsRequest_GetGroupActionsRequestV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t groupContractPosition; + GetGroupActionsRequest_ActionStatus status; + uint32_t count; + NSData *contractId; + GetGroupActionsRequest_StartAtActionId *startAtActionId; +} GetGroupActionsRequest_GetGroupActionsRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_ContractId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "groupContractPosition", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_GroupContractPosition, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_, groupContractPosition), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "status", + .dataTypeSpecific.enumDescFunc = GetGroupActionsRequest_ActionStatus_EnumDescriptor, + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Status, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_, status), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeEnum, + }, + { + .name = "startAtActionId", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsRequest_StartAtActionId), + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_StartAtActionId, + .hasIndex = 3, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_, startAtActionId), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "count", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Count, + .hasIndex = 4, + .offset = (uint32_t)offsetof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_, count), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeUInt32, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Prove, + .hasIndex = 5, + .offset = 6, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsRequest_GetGroupActionsRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsRequest_GetGroupActionsRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +int32_t GetGroupActionsRequest_GetGroupActionsRequestV0_Status_RawValue(GetGroupActionsRequest_GetGroupActionsRequestV0 *message) { + GPBDescriptor *descriptor = [GetGroupActionsRequest_GetGroupActionsRequestV0 descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Status]; + return GPBGetMessageRawEnumField(message, field); +} + +void SetGetGroupActionsRequest_GetGroupActionsRequestV0_Status_RawValue(GetGroupActionsRequest_GetGroupActionsRequestV0 *message, int32_t value) { + GPBDescriptor *descriptor = [GetGroupActionsRequest_GetGroupActionsRequestV0 descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionsRequest_GetGroupActionsRequestV0_FieldNumber_Status]; + GPBSetMessageRawEnumField(message, field, value); +} + +#pragma mark - GetGroupActionsResponse + +@implementation GetGroupActionsResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupActionsResponse__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0 *v0; +} GetGroupActionsResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0), + .number = GetGroupActionsResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_ClearVersionOneOfCase(GetGroupActionsResponse *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0 + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0 + +@dynamic resultOneOfCase; +@dynamic groupActions; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions *groupActions; + Proof *proof; + ResponseMetadata *metadata; +} GetGroupActionsResponse_GetGroupActionsResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupActions", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_GroupActions, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0__storage_, groupActions), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_GetGroupActionsResponseV0_ClearResultOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0 *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent + +@dynamic amount; +@dynamic recipientId; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *recipientId; + NSString *publicNote; + uint64_t amount; +} GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "amount", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_Amount, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_, amount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "recipientId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_RecipientId, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_, recipientId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent_FieldNumber_PublicNote, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent + +@dynamic amount; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent__storage_ { + uint32_t _has_storage_[1]; + NSString *publicNote; + uint64_t amount; +} GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "amount", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent_FieldNumber_Amount, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent__storage_, amount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent + +@dynamic frozenId; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *frozenId; + NSString *publicNote; +} GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "frozenId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent_FieldNumber_FrozenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent__storage_, frozenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent + +@dynamic frozenId; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *frozenId; + NSString *publicNote; +} GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "frozenId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent_FieldNumber_FrozenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent__storage_, frozenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent + +@dynamic frozenId; +@dynamic amount; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *frozenId; + NSString *publicNote; + uint64_t amount; +} GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "frozenId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_FrozenId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_, frozenId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "amount", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_Amount, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_, amount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent_FieldNumber_PublicNote, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote + +@dynamic senderKeyIndex; +@dynamic recipientKeyIndex; +@dynamic encryptedData; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_ { + uint32_t _has_storage_[1]; + uint32_t senderKeyIndex; + uint32_t recipientKeyIndex; + NSData *encryptedData; +} GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "senderKeyIndex", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_SenderKeyIndex, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_, senderKeyIndex), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "recipientKeyIndex", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_RecipientKeyIndex, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_, recipientKeyIndex), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "encryptedData", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote_FieldNumber_EncryptedData, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_, encryptedData), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote + +@dynamic rootEncryptionKeyIndex; +@dynamic derivationEncryptionKeyIndex; +@dynamic encryptedData; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_ { + uint32_t _has_storage_[1]; + uint32_t rootEncryptionKeyIndex; + uint32_t derivationEncryptionKeyIndex; + NSData *encryptedData; +} GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "rootEncryptionKeyIndex", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_RootEncryptionKeyIndex, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_, rootEncryptionKeyIndex), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "derivationEncryptionKeyIndex", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_DerivationEncryptionKeyIndex, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_, derivationEncryptionKeyIndex), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "encryptedData", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote_FieldNumber_EncryptedData, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_, encryptedData), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent + +@dynamic recipientId; +@dynamic hasPublicNote, publicNote; +@dynamic hasSharedEncryptedNote, sharedEncryptedNote; +@dynamic hasPersonalEncryptedNote, personalEncryptedNote; +@dynamic amount; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *recipientId; + NSString *publicNote; + GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote *sharedEncryptedNote; + GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote *personalEncryptedNote; + uint64_t amount; +} GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "recipientId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_RecipientId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_, recipientId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + { + .name = "sharedEncryptedNote", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_SharedEncryptedNote), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_SharedEncryptedNote, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_, sharedEncryptedNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "personalEncryptedNote", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_PersonalEncryptedNote), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_PersonalEncryptedNote, + .hasIndex = 3, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_, personalEncryptedNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "amount", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent_FieldNumber_Amount, + .hasIndex = 4, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_, amount), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt64, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent + +@dynamic actionType; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent__storage_ { + uint32_t _has_storage_[1]; + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType actionType; + NSString *publicNote; +} GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "actionType", + .dataTypeSpecific.enumDescFunc = GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_EnumDescriptor, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_ActionType, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent__storage_, actionType), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeEnum, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +int32_t GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_RawValue(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_ActionType]; + return GPBGetMessageRawEnumField(message, field); +} + +void SetGetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_RawValue(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *message, int32_t value) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_FieldNumber_ActionType]; + GPBSetMessageRawEnumField(message, field, value); +} + +#pragma mark - Enum GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType + +GPBEnumDescriptor *GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "Pause\000Resume\000"; + static const int32_t values[] = { + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Pause, + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Resume, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_IsValidValue(int32_t value__) { + switch (value__) { + case GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Pause: + case GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent_ActionType_Resume: + return YES; + default: + return NO; + } +} + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent + +@dynamic tokenConfigUpdateItem; +@dynamic hasPublicNote, publicNote; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *tokenConfigUpdateItem; + NSString *publicNote; +} GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenConfigUpdateItem", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent_FieldNumber_TokenConfigUpdateItem, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent__storage_, tokenConfigUpdateItem), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "publicNote", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent_FieldNumber_PublicNote, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent__storage_, publicNote), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeString, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent + +@dynamic eventTypeOneOfCase; +@dynamic tokenEvent; +@dynamic documentEvent; +@dynamic contractEvent; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent *tokenEvent; + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent *documentEvent; + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent *contractEvent; +} GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "tokenEvent", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_TokenEvent, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_, tokenEvent), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "documentEvent", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_DocumentEvent, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_, documentEvent), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "contractEvent", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_FieldNumber_ContractEvent, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_, contractEvent), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "eventType", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent_ClearEventTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent + +@dynamic typeOneOfCase; +@dynamic create; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent *create; +} GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "create", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_FieldNumber_Create, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent__storage_, create), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "type", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentEvent descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent + +@dynamic createdDocument; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *createdDocument; +} GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "createdDocument", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent_FieldNumber_CreatedDocument, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent__storage_, createdDocument), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_DocumentCreateEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent + +@dynamic updatedContract; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent__storage_ { + uint32_t _has_storage_[1]; + NSData *updatedContract; +} GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "updatedContract", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent_FieldNumber_UpdatedContract, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent__storage_, updatedContract), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent + +@dynamic typeOneOfCase; +@dynamic update; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent *update; +} GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "update", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractUpdateEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_FieldNumber_Update, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent__storage_, update), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "type", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_ContractEvent descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent + +@dynamic typeOneOfCase; +@dynamic mint; +@dynamic burn; +@dynamic freeze; +@dynamic unfreeze; +@dynamic destroyFrozenFunds; +@dynamic transfer; +@dynamic emergencyAction; +@dynamic tokenConfigUpdate; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent *mint; + GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent *burn; + GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent *freeze; + GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent *unfreeze; + GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent *destroyFrozenFunds; + GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent *transfer; + GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent *emergencyAction; + GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent *tokenConfigUpdate; +} GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "mint", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_MintEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Mint, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, mint), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "burn", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_BurnEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Burn, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, burn), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "freeze", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_FreezeEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Freeze, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, freeze), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "unfreeze", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_UnfreezeEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Unfreeze, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, unfreeze), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "destroyFrozenFunds", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_DestroyFrozenFundsEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_DestroyFrozenFunds, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, destroyFrozenFunds), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "transfer", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_TransferEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_Transfer, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, transfer), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "emergencyAction", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_EmergencyActionEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_EmergencyAction, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, emergencyAction), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "tokenConfigUpdate", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenConfigUpdateEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_FieldNumber_TokenConfigUpdate, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_, tokenConfigUpdate), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "type", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent_ClearTypeOneOfCase(GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent *message) { + GPBDescriptor *descriptor = [GetGroupActionsResponse_GetGroupActionsResponseV0_TokenEvent descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry + +@dynamic actionId; +@dynamic hasEvent, event; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry__storage_ { + uint32_t _has_storage_[1]; + NSData *actionId; + GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent *event; +} GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "actionId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry_FieldNumber_ActionId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry__storage_, actionId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "event", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEvent), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry_FieldNumber_Event, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry__storage_, event), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions + +@implementation GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions + +@dynamic groupActionsArray, groupActionsArray_Count; + +typedef struct GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *groupActionsArray; +} GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupActionsArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActionEntry), + .number = GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions_FieldNumber_GroupActionsArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions__storage_, groupActionsArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionsResponse_GetGroupActionsResponseV0_GroupActions__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionsResponse_GetGroupActionsResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionSignersRequest + +@implementation GetGroupActionSignersRequest + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupActionSignersRequest__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *v0; +} GetGroupActionSignersRequest__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0), + .number = GetGroupActionSignersRequest_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionSignersRequest__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersRequest class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersRequest__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionSignersRequest_ClearVersionOneOfCase(GetGroupActionSignersRequest *message) { + GPBDescriptor *descriptor = [GetGroupActionSignersRequest descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - Enum GetGroupActionSignersRequest_ActionStatus + +GPBEnumDescriptor *GetGroupActionSignersRequest_ActionStatus_EnumDescriptor(void) { + static _Atomic(GPBEnumDescriptor*) descriptor = nil; + if (!descriptor) { + static const char *valueNames = + "Active\000Closed\000"; + static const int32_t values[] = { + GetGroupActionSignersRequest_ActionStatus_Active, + GetGroupActionSignersRequest_ActionStatus_Closed, + }; + GPBEnumDescriptor *worker = + [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GetGroupActionSignersRequest_ActionStatus) + valueNames:valueNames + values:values + count:(uint32_t)(sizeof(values) / sizeof(int32_t)) + enumVerifier:GetGroupActionSignersRequest_ActionStatus_IsValidValue]; + GPBEnumDescriptor *expected = nil; + if (!atomic_compare_exchange_strong(&descriptor, &expected, worker)) { + [worker release]; + } + } + return descriptor; +} + +BOOL GetGroupActionSignersRequest_ActionStatus_IsValidValue(int32_t value__) { + switch (value__) { + case GetGroupActionSignersRequest_ActionStatus_Active: + case GetGroupActionSignersRequest_ActionStatus_Closed: + return YES; + default: + return NO; + } +} + +#pragma mark - GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 + +@implementation GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 + +@dynamic contractId; +@dynamic groupContractPosition; +@dynamic status; +@dynamic actionId; +@dynamic prove; + +typedef struct GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_ { + uint32_t _has_storage_[1]; + uint32_t groupContractPosition; + GetGroupActionSignersRequest_ActionStatus status; + NSData *contractId; + NSData *actionId; +} GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "contractId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_ContractId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_, contractId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "groupContractPosition", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_GroupContractPosition, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_, groupContractPosition), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + { + .name = "status", + .dataTypeSpecific.enumDescFunc = GetGroupActionSignersRequest_ActionStatus_EnumDescriptor, + .number = GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Status, + .hasIndex = 2, + .offset = (uint32_t)offsetof(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_, status), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldHasEnumDescriptor | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeEnum, + }, + { + .name = "actionId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_ActionId, + .hasIndex = 3, + .offset = (uint32_t)offsetof(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_, actionId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "prove", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Prove, + .hasIndex = 4, + .offset = 5, // Stored in _has_storage_ to save space. + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBool, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionSignersRequest)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +int32_t GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_Status_RawValue(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *message) { + GPBDescriptor *descriptor = [GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Status]; + return GPBGetMessageRawEnumField(message, field); +} + +void SetGetGroupActionSignersRequest_GetGroupActionSignersRequestV0_Status_RawValue(GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 *message, int32_t value) { + GPBDescriptor *descriptor = [GetGroupActionSignersRequest_GetGroupActionSignersRequestV0 descriptor]; + GPBFieldDescriptor *field = [descriptor fieldWithNumber:GetGroupActionSignersRequest_GetGroupActionSignersRequestV0_FieldNumber_Status]; + GPBSetMessageRawEnumField(message, field, value); +} + +#pragma mark - GetGroupActionSignersResponse + +@implementation GetGroupActionSignersResponse + +@dynamic versionOneOfCase; +@dynamic v0; + +typedef struct GetGroupActionSignersResponse__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 *v0; +} GetGroupActionSignersResponse__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "v0", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0), + .number = GetGroupActionSignersResponse_FieldNumber_V0, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse__storage_, v0), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersResponse class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersResponse__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "version", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionSignersResponse_ClearVersionOneOfCase(GetGroupActionSignersResponse *message) { + GPBDescriptor *descriptor = [GetGroupActionSignersResponse descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 + +@implementation GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 + +@dynamic resultOneOfCase; +@dynamic groupActionSigners; +@dynamic proof; +@dynamic hasMetadata, metadata; + +typedef struct GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_ { + uint32_t _has_storage_[2]; + GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners *groupActionSigners; + Proof *proof; + ResponseMetadata *metadata; +} GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "groupActionSigners", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners), + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_GroupActionSigners, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_, groupActionSigners), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "proof", + .dataTypeSpecific.clazz = GPBObjCClass(Proof), + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_Proof, + .hasIndex = -1, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_, proof), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + { + .name = "metadata", + .dataTypeSpecific.clazz = GPBObjCClass(ResponseMetadata), + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_FieldNumber_Metadata, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_, metadata), + .flags = GPBFieldOptional, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + static const char *oneofs[] = { + "result", + }; + [localDescriptor setupOneofs:oneofs + count:(uint32_t)(sizeof(oneofs) / sizeof(char*)) + firstHasIndex:-1]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionSignersResponse)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +void GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_ClearResultOneOfCase(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 *message) { + GPBDescriptor *descriptor = [GetGroupActionSignersResponse_GetGroupActionSignersResponseV0 descriptor]; + GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:0]; + GPBClearOneof(message, oneof); +} +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner + +@implementation GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner + +@dynamic signerId; +@dynamic power; + +typedef struct GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner__storage_ { + uint32_t _has_storage_[1]; + uint32_t power; + NSData *signerId; +} GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "signerId", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner_FieldNumber_SignerId, + .hasIndex = 0, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner__storage_, signerId), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeBytes, + }, + { + .name = "power", + .dataTypeSpecific.clazz = Nil, + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner_FieldNumber_Power, + .hasIndex = 1, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner__storage_, power), + .flags = (GPBFieldFlags)(GPBFieldOptional | GPBFieldClearHasIvarOnZero), + .dataType = GPBDataTypeUInt32, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + +#pragma mark - GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners + +@implementation GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners + +@dynamic signersArray, signersArray_Count; + +typedef struct GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners__storage_ { + uint32_t _has_storage_[1]; + NSMutableArray *signersArray; +} GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners__storage_; + +// This method is threadsafe because it is initially called +// in +initialize for each subclass. ++ (GPBDescriptor *)descriptor { + static GPBDescriptor *descriptor = nil; + if (!descriptor) { + static GPBMessageFieldDescription fields[] = { + { + .name = "signersArray", + .dataTypeSpecific.clazz = GPBObjCClass(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigner), + .number = GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners_FieldNumber_SignersArray, + .hasIndex = GPBNoHasBit, + .offset = (uint32_t)offsetof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners__storage_, signersArray), + .flags = GPBFieldRepeated, + .dataType = GPBDataTypeMessage, + }, + }; + GPBDescriptor *localDescriptor = + [GPBDescriptor allocDescriptorForClass:[GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners class] + rootClass:[PlatformRoot class] + file:PlatformRoot_FileDescriptor() + fields:fields + fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription)) + storageSize:sizeof(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0_GroupActionSigners__storage_) + flags:(GPBDescriptorInitializationFlags)(GPBDescriptorInitializationFlag_UsesClassRefs | GPBDescriptorInitializationFlag_Proto3OptionalKnown)]; + [localDescriptor setupContainingMessageClass:GPBObjCClass(GetGroupActionSignersResponse_GetGroupActionSignersResponseV0)]; + #if defined(DEBUG) && DEBUG + NSAssert(descriptor == nil, @"Startup recursed!"); + #endif // DEBUG + descriptor = localDescriptor; + } + return descriptor; +} + +@end + #pragma clang diagnostic pop diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h index 9bfcd4ba161..daff9fedb43 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h @@ -41,10 +41,22 @@ @class GetEvonodesProposedEpochBlocksByIdsRequest; @class GetEvonodesProposedEpochBlocksByRangeRequest; @class GetEvonodesProposedEpochBlocksResponse; +@class GetGroupActionSignersRequest; +@class GetGroupActionSignersResponse; +@class GetGroupActionsRequest; +@class GetGroupActionsResponse; +@class GetGroupInfoRequest; +@class GetGroupInfoResponse; +@class GetGroupInfosRequest; +@class GetGroupInfosResponse; @class GetIdentitiesBalancesRequest; @class GetIdentitiesBalancesResponse; @class GetIdentitiesContractKeysRequest; @class GetIdentitiesContractKeysResponse; +@class GetIdentitiesTokenBalancesRequest; +@class GetIdentitiesTokenBalancesResponse; +@class GetIdentitiesTokenInfosRequest; +@class GetIdentitiesTokenInfosResponse; @class GetIdentityBalanceAndRevisionRequest; @class GetIdentityBalanceAndRevisionResponse; @class GetIdentityBalanceRequest; @@ -59,6 +71,10 @@ @class GetIdentityNonceResponse; @class GetIdentityRequest; @class GetIdentityResponse; +@class GetIdentityTokenBalancesRequest; +@class GetIdentityTokenBalancesResponse; +@class GetIdentityTokenInfosRequest; +@class GetIdentityTokenInfosResponse; @class GetPathElementsRequest; @class GetPathElementsResponse; @class GetPrefundedSpecializedBalanceRequest; @@ -71,6 +87,12 @@ @class GetProtocolVersionUpgradeVoteStatusResponse; @class GetStatusRequest; @class GetStatusResponse; +@class GetTokenPreProgrammedDistributionsRequest; +@class GetTokenPreProgrammedDistributionsResponse; +@class GetTokenStatusesRequest; +@class GetTokenStatusesResponse; +@class GetTokenTotalSupplyRequest; +@class GetTokenTotalSupplyResponse; @class GetTotalCreditsInPlatformRequest; @class GetTotalCreditsInPlatformResponse; @class GetVotePollsByEndDateRequest; @@ -250,6 +272,50 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCUnaryProtoCall *)getCurrentQuorumsInfoWithMessage:(GetCurrentQuorumsInfoRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; +#pragma mark getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse) + +- (GRPCUnaryProtoCall *)getIdentityTokenBalancesWithMessage:(GetIdentityTokenBalancesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse) + +- (GRPCUnaryProtoCall *)getIdentitiesTokenBalancesWithMessage:(GetIdentitiesTokenBalancesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse) + +- (GRPCUnaryProtoCall *)getIdentityTokenInfosWithMessage:(GetIdentityTokenInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse) + +- (GRPCUnaryProtoCall *)getIdentitiesTokenInfosWithMessage:(GetIdentitiesTokenInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse) + +- (GRPCUnaryProtoCall *)getTokenStatusesWithMessage:(GetTokenStatusesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse) + +- (GRPCUnaryProtoCall *)getTokenPreProgrammedDistributionsWithMessage:(GetTokenPreProgrammedDistributionsRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse) + +- (GRPCUnaryProtoCall *)getTokenTotalSupplyWithMessage:(GetTokenTotalSupplyRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse) + +- (GRPCUnaryProtoCall *)getGroupInfoWithMessage:(GetGroupInfoRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse) + +- (GRPCUnaryProtoCall *)getGroupInfosWithMessage:(GetGroupInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse) + +- (GRPCUnaryProtoCall *)getGroupActionsWithMessage:(GetGroupActionsRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + +#pragma mark getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse) + +- (GRPCUnaryProtoCall *)getGroupActionSignersWithMessage:(GetGroupActionSignersRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions; + @end /** @@ -532,6 +598,83 @@ NS_ASSUME_NONNULL_BEGIN - (GRPCProtoCall *)RPCTogetCurrentQuorumsInfoWithRequest:(GetCurrentQuorumsInfoRequest *)request handler:(void(^)(GetCurrentQuorumsInfoResponse *_Nullable response, NSError *_Nullable error))handler; +#pragma mark getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse) + +- (void)getIdentityTokenBalancesWithRequest:(GetIdentityTokenBalancesRequest *)request handler:(void(^)(GetIdentityTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentityTokenBalancesWithRequest:(GetIdentityTokenBalancesRequest *)request handler:(void(^)(GetIdentityTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse) + +- (void)getIdentitiesTokenBalancesWithRequest:(GetIdentitiesTokenBalancesRequest *)request handler:(void(^)(GetIdentitiesTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentitiesTokenBalancesWithRequest:(GetIdentitiesTokenBalancesRequest *)request handler:(void(^)(GetIdentitiesTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse) + +- (void)getIdentityTokenInfosWithRequest:(GetIdentityTokenInfosRequest *)request handler:(void(^)(GetIdentityTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentityTokenInfosWithRequest:(GetIdentityTokenInfosRequest *)request handler:(void(^)(GetIdentityTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse) + +- (void)getIdentitiesTokenInfosWithRequest:(GetIdentitiesTokenInfosRequest *)request handler:(void(^)(GetIdentitiesTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetIdentitiesTokenInfosWithRequest:(GetIdentitiesTokenInfosRequest *)request handler:(void(^)(GetIdentitiesTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse) + +- (void)getTokenStatusesWithRequest:(GetTokenStatusesRequest *)request handler:(void(^)(GetTokenStatusesResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetTokenStatusesWithRequest:(GetTokenStatusesRequest *)request handler:(void(^)(GetTokenStatusesResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse) + +- (void)getTokenPreProgrammedDistributionsWithRequest:(GetTokenPreProgrammedDistributionsRequest *)request handler:(void(^)(GetTokenPreProgrammedDistributionsResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetTokenPreProgrammedDistributionsWithRequest:(GetTokenPreProgrammedDistributionsRequest *)request handler:(void(^)(GetTokenPreProgrammedDistributionsResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse) + +- (void)getTokenTotalSupplyWithRequest:(GetTokenTotalSupplyRequest *)request handler:(void(^)(GetTokenTotalSupplyResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetTokenTotalSupplyWithRequest:(GetTokenTotalSupplyRequest *)request handler:(void(^)(GetTokenTotalSupplyResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse) + +- (void)getGroupInfoWithRequest:(GetGroupInfoRequest *)request handler:(void(^)(GetGroupInfoResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetGroupInfoWithRequest:(GetGroupInfoRequest *)request handler:(void(^)(GetGroupInfoResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse) + +- (void)getGroupInfosWithRequest:(GetGroupInfosRequest *)request handler:(void(^)(GetGroupInfosResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetGroupInfosWithRequest:(GetGroupInfosRequest *)request handler:(void(^)(GetGroupInfosResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse) + +- (void)getGroupActionsWithRequest:(GetGroupActionsRequest *)request handler:(void(^)(GetGroupActionsResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetGroupActionsWithRequest:(GetGroupActionsRequest *)request handler:(void(^)(GetGroupActionsResponse *_Nullable response, NSError *_Nullable error))handler; + + +#pragma mark getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse) + +- (void)getGroupActionSignersWithRequest:(GetGroupActionSignersRequest *)request handler:(void(^)(GetGroupActionSignersResponse *_Nullable response, NSError *_Nullable error))handler; + +- (GRPCProtoCall *)RPCTogetGroupActionSignersWithRequest:(GetGroupActionSignersRequest *)request handler:(void(^)(GetGroupActionSignersResponse *_Nullable response, NSError *_Nullable error))handler; + + @end diff --git a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m index b8e6852fe61..9f91540f655 100644 --- a/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m +++ b/packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.m @@ -775,5 +775,225 @@ - (GRPCUnaryProtoCall *)getCurrentQuorumsInfoWithMessage:(GetCurrentQuorumsInfoR responseClass:[GetCurrentQuorumsInfoResponse class]]; } +#pragma mark getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse) + +- (void)getIdentityTokenBalancesWithRequest:(GetIdentityTokenBalancesRequest *)request handler:(void(^)(GetIdentityTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentityTokenBalancesWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentityTokenBalancesWithRequest:(GetIdentityTokenBalancesRequest *)request handler:(void(^)(GetIdentityTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentityTokenBalances" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentityTokenBalancesResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentityTokenBalancesWithMessage:(GetIdentityTokenBalancesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentityTokenBalances" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentityTokenBalancesResponse class]]; +} + +#pragma mark getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse) + +- (void)getIdentitiesTokenBalancesWithRequest:(GetIdentitiesTokenBalancesRequest *)request handler:(void(^)(GetIdentitiesTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentitiesTokenBalancesWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentitiesTokenBalancesWithRequest:(GetIdentitiesTokenBalancesRequest *)request handler:(void(^)(GetIdentitiesTokenBalancesResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentitiesTokenBalances" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentitiesTokenBalancesResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentitiesTokenBalancesWithMessage:(GetIdentitiesTokenBalancesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentitiesTokenBalances" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentitiesTokenBalancesResponse class]]; +} + +#pragma mark getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse) + +- (void)getIdentityTokenInfosWithRequest:(GetIdentityTokenInfosRequest *)request handler:(void(^)(GetIdentityTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentityTokenInfosWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentityTokenInfosWithRequest:(GetIdentityTokenInfosRequest *)request handler:(void(^)(GetIdentityTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentityTokenInfos" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentityTokenInfosResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentityTokenInfosWithMessage:(GetIdentityTokenInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentityTokenInfos" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentityTokenInfosResponse class]]; +} + +#pragma mark getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse) + +- (void)getIdentitiesTokenInfosWithRequest:(GetIdentitiesTokenInfosRequest *)request handler:(void(^)(GetIdentitiesTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetIdentitiesTokenInfosWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetIdentitiesTokenInfosWithRequest:(GetIdentitiesTokenInfosRequest *)request handler:(void(^)(GetIdentitiesTokenInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getIdentitiesTokenInfos" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetIdentitiesTokenInfosResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getIdentitiesTokenInfosWithMessage:(GetIdentitiesTokenInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getIdentitiesTokenInfos" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetIdentitiesTokenInfosResponse class]]; +} + +#pragma mark getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse) + +- (void)getTokenStatusesWithRequest:(GetTokenStatusesRequest *)request handler:(void(^)(GetTokenStatusesResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetTokenStatusesWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetTokenStatusesWithRequest:(GetTokenStatusesRequest *)request handler:(void(^)(GetTokenStatusesResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getTokenStatuses" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetTokenStatusesResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getTokenStatusesWithMessage:(GetTokenStatusesRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getTokenStatuses" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetTokenStatusesResponse class]]; +} + +#pragma mark getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse) + +- (void)getTokenPreProgrammedDistributionsWithRequest:(GetTokenPreProgrammedDistributionsRequest *)request handler:(void(^)(GetTokenPreProgrammedDistributionsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetTokenPreProgrammedDistributionsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetTokenPreProgrammedDistributionsWithRequest:(GetTokenPreProgrammedDistributionsRequest *)request handler:(void(^)(GetTokenPreProgrammedDistributionsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getTokenPreProgrammedDistributions" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetTokenPreProgrammedDistributionsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getTokenPreProgrammedDistributionsWithMessage:(GetTokenPreProgrammedDistributionsRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getTokenPreProgrammedDistributions" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetTokenPreProgrammedDistributionsResponse class]]; +} + +#pragma mark getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse) + +- (void)getTokenTotalSupplyWithRequest:(GetTokenTotalSupplyRequest *)request handler:(void(^)(GetTokenTotalSupplyResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetTokenTotalSupplyWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetTokenTotalSupplyWithRequest:(GetTokenTotalSupplyRequest *)request handler:(void(^)(GetTokenTotalSupplyResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getTokenTotalSupply" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetTokenTotalSupplyResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getTokenTotalSupplyWithMessage:(GetTokenTotalSupplyRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getTokenTotalSupply" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetTokenTotalSupplyResponse class]]; +} + +#pragma mark getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse) + +- (void)getGroupInfoWithRequest:(GetGroupInfoRequest *)request handler:(void(^)(GetGroupInfoResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetGroupInfoWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetGroupInfoWithRequest:(GetGroupInfoRequest *)request handler:(void(^)(GetGroupInfoResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getGroupInfo" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetGroupInfoResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getGroupInfoWithMessage:(GetGroupInfoRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getGroupInfo" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetGroupInfoResponse class]]; +} + +#pragma mark getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse) + +- (void)getGroupInfosWithRequest:(GetGroupInfosRequest *)request handler:(void(^)(GetGroupInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetGroupInfosWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetGroupInfosWithRequest:(GetGroupInfosRequest *)request handler:(void(^)(GetGroupInfosResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getGroupInfos" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetGroupInfosResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getGroupInfosWithMessage:(GetGroupInfosRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getGroupInfos" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetGroupInfosResponse class]]; +} + +#pragma mark getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse) + +- (void)getGroupActionsWithRequest:(GetGroupActionsRequest *)request handler:(void(^)(GetGroupActionsResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetGroupActionsWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetGroupActionsWithRequest:(GetGroupActionsRequest *)request handler:(void(^)(GetGroupActionsResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getGroupActions" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetGroupActionsResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getGroupActionsWithMessage:(GetGroupActionsRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getGroupActions" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetGroupActionsResponse class]]; +} + +#pragma mark getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse) + +- (void)getGroupActionSignersWithRequest:(GetGroupActionSignersRequest *)request handler:(void(^)(GetGroupActionSignersResponse *_Nullable response, NSError *_Nullable error))handler{ + [[self RPCTogetGroupActionSignersWithRequest:request handler:handler] start]; +} +// Returns a not-yet-started RPC object. +- (GRPCProtoCall *)RPCTogetGroupActionSignersWithRequest:(GetGroupActionSignersRequest *)request handler:(void(^)(GetGroupActionSignersResponse *_Nullable response, NSError *_Nullable error))handler{ + return [self RPCToMethod:@"getGroupActionSigners" + requestsWriter:[GRXWriter writerWithValue:request] + responseClass:[GetGroupActionSignersResponse class] + responsesWriteable:[GRXWriteable writeableWithSingleHandler:handler]]; +} +- (GRPCUnaryProtoCall *)getGroupActionSignersWithMessage:(GetGroupActionSignersRequest *)message responseHandler:(id<GRPCProtoResponseHandler>)handler callOptions:(GRPCCallOptions *_Nullable)callOptions { + return [self RPCToMethod:@"getGroupActionSigners" + message:message + responseHandler:handler + callOptions:callOptions + responseClass:[GetGroupActionSignersResponse class]]; +} + @end #endif diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py index be8a64f309d..9acd55ec163 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2.py @@ -23,7 +23,7 @@ syntax='proto3', serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x90\x01\n\x10ResponseMetadata\x12\x0e\n\x06height\x18\x01 \x01(\x04\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x0f\n\x07time_ms\x18\x04 \x01(\x04\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb8\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb2\x01\n\x1aGetIdentityNonceResponseV0\x12\x18\n\x0eidentity_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe1\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc3\x01\n\"GetIdentityContractNonceResponseV0\x12!\n\x17identity_contract_nonce\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xad\x01\n\x1cGetIdentityBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xa9\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\xfc\x02\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x12\x42\x61lanceAndRevision\x12\x0f\n\x07\x62\x61lance\x18\x01 \x01(\x04\x12\x10\n\x08revision\x18\x02 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa4\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1ah\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x08\n\x06_epochB\t\n\x07version\"\x8e\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xde\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\x04\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xf2\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xaf\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_epochB\x08\n\x06_limitB\t\n\x07version\"\xcd\x01\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a<\n\x1eGetIdentitiesBalancesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9b\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x86\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aH\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xcb\x0b\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xdd\n\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_typeB\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc1\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xac\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x13\n\x0bstart_at_ms\x18\x04 \x01(\x04\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xae\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x96\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x37\n\x18\x44\x61taContractHistoryEntry\x12\x0c\n\x04\x64\x61te\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x91\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x94\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\x9e\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1a\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x12\n\nstart_time\x18\x04 \x01(\x04\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xca\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xb8\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x45\n\x0fStartAtTimeInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a?\n\rEndAtTimeInfo\x12\x13\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\xff\x05\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xea\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x1eSerializedVotePollsByTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x8c\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xdf\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xd2\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12 \n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12!\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe9\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xb9\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x11\n\x07\x62\x61lance\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd5\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb4\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x11\n\x07\x63redits\x18\x01 \x01(\x04H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\x9c\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xab\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1as\n\x04Time\x12\r\n\x05local\x18\x01 \x01(\x04\x12\x12\n\x05\x62lock\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x14\n\x07genesis\x18\x03 \x01(\x04H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xa7\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1b\n\x13latest_block_height\x18\x04 \x01(\x04\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12\x1d\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x12\x1d\n\x15max_peer_block_height\x18\t \x01(\x04\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\xe9\x01\n\tStateSync\x12\x19\n\x11total_synced_time\x18\x01 \x01(\x04\x12\x16\n\x0eremaining_time\x18\x02 \x01(\x04\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\x1e\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x12\x17\n\x0fsnapshot_height\x18\x05 \x01(\x04\x12\x1d\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x12\x19\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x12\x1d\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\t\n\x07version\"\xb1\x01\n\x1cGetCurrentQuorumsInfoRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0H\x00\x1a \n\x1eGetCurrentQuorumsInfoRequestV0B\t\n\x07version\"\xa1\x05\n\x1dGetCurrentQuorumsInfoResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0H\x00\x1a\x46\n\x0bValidatorV0\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07node_ip\x18\x02 \x01(\t\x12\x11\n\tis_banned\x18\x03 \x01(\x08\x1a\xaf\x01\n\x0eValidatorSetV0\x12\x13\n\x0bquorum_hash\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ore_height\x18\x02 \x01(\r\x12U\n\x07members\x18\x03 \x03(\x0b\x32\x44.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0\x12\x1c\n\x14threshold_public_key\x18\x04 \x01(\x0c\x1a\x92\x02\n\x1fGetCurrentQuorumsInfoResponseV0\x12\x15\n\rquorum_hashes\x18\x01 \x03(\x0c\x12\x1b\n\x13\x63urrent_quorum_hash\x18\x02 \x01(\x0c\x12_\n\x0evalidator_sets\x18\x03 \x03(\x0b\x32G.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0\x12\x1b\n\x13last_block_proposer\x18\x04 \x01(\x0c\x12=\n\x08metadata\x18\x05 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\xa4$\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponse\x12\x8a\x01\n\x15getCurrentQuorumsInfo\x12\x37.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest\x1a\x38.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponseb\x06proto3' + serialized_pb=b'\n\x0eplatform.proto\x12\x19org.dash.platform.dapi.v0\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x81\x01\n\x05Proof\x12\x15\n\rgrovedb_proof\x18\x01 \x01(\x0c\x12\x13\n\x0bquorum_hash\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\x12\r\n\x05round\x18\x04 \x01(\r\x12\x15\n\rblock_id_hash\x18\x05 \x01(\x0c\x12\x13\n\x0bquorum_type\x18\x06 \x01(\r\"\x98\x01\n\x10ResponseMetadata\x12\x12\n\x06height\x18\x01 \x01(\x04\x42\x02\x30\x01\x12 \n\x18\x63ore_chain_locked_height\x18\x02 \x01(\r\x12\r\n\x05\x65poch\x18\x03 \x01(\r\x12\x13\n\x07time_ms\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x18\n\x10protocol_version\x18\x05 \x01(\r\x12\x10\n\x08\x63hain_id\x18\x06 \x01(\t\"L\n\x1dStateTransitionBroadcastError\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c\";\n\x1f\x42roadcastStateTransitionRequest\x12\x18\n\x10state_transition\x18\x01 \x01(\x0c\"\"\n BroadcastStateTransitionResponse\"\xa4\x01\n\x12GetIdentityRequest\x12P\n\x02v0\x18\x01 \x01(\x0b\x32\x42.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0H\x00\x1a\x31\n\x14GetIdentityRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xc1\x01\n\x17GetIdentityNonceRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0H\x00\x1a?\n\x19GetIdentityNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xf6\x01\n\x1fGetIdentityContractNonceRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0H\x00\x1a\\\n!GetIdentityContractNonceRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xc0\x01\n\x19GetIdentityBalanceRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0H\x00\x1a\x38\n\x1bGetIdentityBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xec\x01\n$GetIdentityBalanceAndRevisionRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0H\x00\x1a\x43\n&GetIdentityBalanceAndRevisionRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9e\x02\n\x13GetIdentityResponse\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0H\x00\x1a\xa7\x01\n\x15GetIdentityResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xbc\x02\n\x18GetIdentityNonceResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0H\x00\x1a\xb6\x01\n\x1aGetIdentityNonceResponseV0\x12\x1c\n\x0eidentity_nonce\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xe5\x02\n GetIdentityContractNonceResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0H\x00\x1a\xc7\x01\n\"GetIdentityContractNonceResponseV0\x12%\n\x17identity_contract_nonce\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xbd\x02\n\x1aGetIdentityBalanceResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0H\x00\x1a\xb1\x01\n\x1cGetIdentityBalanceResponseV0\x12\x15\n\x07\x62\x61lance\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb1\x04\n%GetIdentityBalanceAndRevisionResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0H\x00\x1a\x84\x03\n\'GetIdentityBalanceAndRevisionResponseV0\x12\x9b\x01\n\x14\x62\x61lance_and_revision\x18\x01 \x01(\x0b\x32{.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevisionH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a?\n\x12\x42\x61lanceAndRevision\x12\x13\n\x07\x62\x61lance\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x14\n\x08revision\x18\x02 \x01(\x04\x42\x02\x30\x01\x42\x08\n\x06resultB\t\n\x07version\"\xd1\x01\n\x0eKeyRequestType\x12\x36\n\x08\x61ll_keys\x18\x01 \x01(\x0b\x32\".org.dash.platform.dapi.v0.AllKeysH\x00\x12@\n\rspecific_keys\x18\x02 \x01(\x0b\x32\'.org.dash.platform.dapi.v0.SpecificKeysH\x00\x12:\n\nsearch_key\x18\x03 \x01(\x0b\x32$.org.dash.platform.dapi.v0.SearchKeyH\x00\x42\t\n\x07request\"\t\n\x07\x41llKeys\"\x1f\n\x0cSpecificKeys\x12\x0f\n\x07key_ids\x18\x01 \x03(\r\"\xb6\x01\n\tSearchKey\x12I\n\x0bpurpose_map\x18\x01 \x03(\x0b\x32\x34.org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry\x1a^\n\x0fPurposeMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12:\n\x05value\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.SecurityLevelMap:\x02\x38\x01\"\xbf\x02\n\x10SecurityLevelMap\x12]\n\x12security_level_map\x18\x01 \x03(\x0b\x32\x41.org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry\x1aw\n\x15SecurityLevelMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12M\n\x05value\x18\x02 \x01(\x0e\x32>.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType:\x02\x38\x01\"S\n\x12KeyKindRequestType\x12\x1f\n\x1b\x43URRENT_KEY_OF_KIND_REQUEST\x10\x00\x12\x1c\n\x18\x41LL_KEYS_OF_KIND_REQUEST\x10\x01\"\xda\x02\n\x16GetIdentityKeysRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0H\x00\x1a\xda\x01\n\x18GetIdentityKeysRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12?\n\x0crequest_type\x18\x02 \x01(\x0b\x32).org.dash.platform.dapi.v0.KeyRequestType\x12+\n\x05limit\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x04 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\x99\x03\n\x17GetIdentityKeysResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0H\x00\x1a\x96\x02\n\x19GetIdentityKeysResponseV0\x12\x61\n\x04keys\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.KeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1a\n\x04Keys\x12\x12\n\nkeys_bytes\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xef\x02\n GetIdentitiesContractKeysRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0H\x00\x1a\xd1\x01\n\"GetIdentitiesContractKeysRequestV0\x12\x16\n\x0eidentities_ids\x18\x01 \x03(\x0c\x12\x13\n\x0b\x63ontract_id\x18\x02 \x01(\x0c\x12\x1f\n\x12\x64ocument_type_name\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x37\n\x08purposes\x18\x04 \x03(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x15\n\x13_document_type_nameB\t\n\x07version\"\xdf\x06\n!GetIdentitiesContractKeysResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0H\x00\x1a\xbe\x05\n#GetIdentitiesContractKeysResponseV0\x12\x8a\x01\n\x0fidentities_keys\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeysH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aY\n\x0bPurposeKeys\x12\x36\n\x07purpose\x18\x01 \x01(\x0e\x32%.org.dash.platform.dapi.v0.KeyPurpose\x12\x12\n\nkeys_bytes\x18\x02 \x03(\x0c\x1a\x9f\x01\n\x0cIdentityKeys\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12z\n\x04keys\x18\x02 \x03(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys\x1a\x90\x01\n\x0eIdentitiesKeys\x12~\n\x07\x65ntries\x18\x01 \x03(\x0b\x32m.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeysB\x08\n\x06resultB\t\n\x07version\"\xa4\x02\n*GetEvonodesProposedEpochBlocksByIdsRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0H\x00\x1ah\n,GetEvonodesProposedEpochBlocksByIdsRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0b\n\x03ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\x08\n\x06_epochB\t\n\x07version\"\x92\x06\n&GetEvonodesProposedEpochBlocksResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0H\x00\x1a\xe2\x04\n(GetEvonodesProposedEpochBlocksResponseV0\x12\xb1\x01\n#evonodes_proposed_block_counts_info\x18\x01 \x01(\x0b\x32\x81\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocksH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a?\n\x15\x45vonodeProposedBlocks\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x11\n\x05\x63ount\x18\x02 \x01(\x04\x42\x02\x30\x01\x1a\xc4\x01\n\x16\x45vonodesProposedBlocks\x12\xa9\x01\n\x1e\x65vonodes_proposed_block_counts\x18\x01 \x03(\x0b\x32\x80\x01.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocksB\x08\n\x06resultB\t\n\x07version\"\xf2\x02\n,GetEvonodesProposedEpochBlocksByRangeRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0H\x00\x1a\xaf\x01\n.GetEvonodesProposedEpochBlocksByRangeRequestV0\x12\x12\n\x05\x65poch\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x02 \x01(\rH\x02\x88\x01\x01\x12\x15\n\x0bstart_after\x18\x03 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x04 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\x07\n\x05startB\x08\n\x06_epochB\x08\n\x06_limitB\t\n\x07version\"\xcd\x01\n\x1cGetIdentitiesBalancesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0H\x00\x1a<\n\x1eGetIdentitiesBalancesRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9f\x05\n\x1dGetIdentitiesBalancesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0H\x00\x1a\x8a\x04\n\x1fGetIdentitiesBalancesResponseV0\x12\x8a\x01\n\x13identities_balances\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aL\n\x0fIdentityBalance\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x18\n\x07\x62\x61lance\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x8f\x01\n\x12IdentitiesBalances\x12y\n\x07\x65ntries\x18\x01 \x03(\x0b\x32h.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalanceB\x08\n\x06resultB\t\n\x07version\"\xdb\x0f\n\x10GetProofsRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0H\x00\x1a\xed\x0e\n\x12GetProofsRequestV0\x12\x62\n\nidentities\x18\x01 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest\x12\x61\n\tcontracts\x18\x02 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest\x12\x61\n\tdocuments\x18\x03 \x03(\x0b\x32N.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest\x12_\n\x05votes\x18\x04 \x03(\x0b\x32P.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest\x12{\n\x17identity_token_balances\x18\x05 \x03(\x0b\x32Z.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest\x12u\n\x14identity_token_infos\x18\x06 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest\x12i\n\x0etoken_statuses\x18\x07 \x03(\x0b\x32Q.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest\x1a\xd5\x02\n\x0f\x44ocumentRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12#\n\x1b\x64ocument_type_keeps_history\x18\x03 \x01(\x08\x12\x13\n\x0b\x64ocument_id\x18\x04 \x01(\x0c\x12\x89\x01\n\x19\x64ocument_contested_status\x18\x05 \x01(\x0e\x32\x66.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus\"P\n\x17\x44ocumentContestedStatus\x12\x11\n\rNOT_CONTESTED\x10\x00\x12\x13\n\x0fMAYBE_CONTESTED\x10\x01\x12\r\n\tCONTESTED\x10\x02\x1a\xd1\x01\n\x0fIdentityRequest\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12i\n\x0crequest_type\x18\x02 \x01(\x0e\x32S.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type\">\n\x04Type\x12\x11\n\rFULL_IDENTITY\x10\x00\x12\x0b\n\x07\x42\x41LANCE\x10\x01\x12\x08\n\x04KEYS\x10\x02\x12\x0c\n\x08REVISION\x10\x03\x1a&\n\x0f\x43ontractRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x1a\xe7\x02\n\x11VoteStatusRequest\x12\xa5\x01\n&contested_resource_vote_status_request\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequestH\x00\x1a\x99\x01\n\"ContestedResourceVoteStatusRequest\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x18\n\x10voter_identifier\x18\x05 \x01(\x0c\x42\x0e\n\x0crequest_type\x1a\x44\n\x1bIdentityTokenBalanceRequest\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x13\n\x0bidentity_id\x18\x02 \x01(\x0c\x1a\x41\n\x18IdentityTokenInfoRequest\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x13\n\x0bidentity_id\x18\x02 \x01(\x0c\x1a&\n\x12TokenStatusRequest\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x42\t\n\x07version\"\x82\x02\n\x11GetProofsResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0H\x00\x1a\x91\x01\n\x13GetProofsResponseV0\x12\x31\n\x05proof\x18\x01 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x02 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb4\x01\n\x16GetDataContractRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0H\x00\x1a\x35\n\x18GetDataContractRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xb3\x02\n\x17GetDataContractResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0H\x00\x1a\xb0\x01\n\x19GetDataContractResponseV0\x12\x17\n\rdata_contract\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xb9\x01\n\x17GetDataContractsRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0H\x00\x1a\x37\n\x19GetDataContractsRequestV0\x12\x0b\n\x03ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xcf\x04\n\x18GetDataContractsResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0H\x00\x1a[\n\x11\x44\x61taContractEntry\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x32\n\rdata_contract\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.BytesValue\x1au\n\rDataContracts\x12\x64\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32\x45.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry\x1a\xf5\x01\n\x1aGetDataContractsResponseV0\x12[\n\x0e\x64\x61ta_contracts\x18\x01 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc5\x02\n\x1dGetDataContractHistoryRequest\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0H\x00\x1a\xb0\x01\n\x1fGetDataContractHistoryRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0bstart_at_ms\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05prove\x18\x05 \x01(\x08\x42\t\n\x07version\"\xb2\x05\n\x1eGetDataContractHistoryResponse\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0H\x00\x1a\x9a\x04\n GetDataContractHistoryResponseV0\x12\x8f\x01\n\x15\x64\x61ta_contract_history\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a;\n\x18\x44\x61taContractHistoryEntry\x12\x10\n\x04\x64\x61te\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\r\n\x05value\x18\x02 \x01(\x0c\x1a\xaa\x01\n\x13\x44\x61taContractHistory\x12\x92\x01\n\x15\x64\x61ta_contract_entries\x18\x01 \x03(\x0b\x32s.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntryB\x08\n\x06resultB\t\n\x07version\"\xb2\x02\n\x13GetDocumentsRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0H\x00\x1a\xbb\x01\n\x15GetDocumentsRequestV0\x12\x18\n\x10\x64\x61ta_contract_id\x18\x01 \x01(\x0c\x12\x15\n\rdocument_type\x18\x02 \x01(\t\x12\r\n\x05where\x18\x03 \x01(\x0c\x12\x10\n\x08order_by\x18\x04 \x01(\x0c\x12\r\n\x05limit\x18\x05 \x01(\r\x12\x15\n\x0bstart_after\x18\x06 \x01(\x0cH\x00\x12\x12\n\x08start_at\x18\x07 \x01(\x0cH\x00\x12\r\n\x05prove\x18\x08 \x01(\x08\x42\x07\n\x05startB\t\n\x07version\"\x95\x03\n\x14GetDocumentsResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0H\x00\x1a\x9b\x02\n\x16GetDocumentsResponseV0\x12\x65\n\tdocuments\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.DocumentsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1e\n\tDocuments\x12\x11\n\tdocuments\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xed\x01\n!GetIdentityByPublicKeyHashRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0H\x00\x1aM\n#GetIdentityByPublicKeyHashRequestV0\x12\x17\n\x0fpublic_key_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xda\x02\n\"GetIdentityByPublicKeyHashResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0H\x00\x1a\xb6\x01\n$GetIdentityByPublicKeyHashResponseV0\x12\x12\n\x08identity\x18\x01 \x01(\x0cH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xfb\x01\n#WaitForStateTransitionResultRequest\x12r\n\x02v0\x18\x01 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0H\x00\x1aU\n%WaitForStateTransitionResultRequestV0\x12\x1d\n\x15state_transition_hash\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x99\x03\n$WaitForStateTransitionResultResponse\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0H\x00\x1a\xef\x01\n&WaitForStateTransitionResultResponseV0\x12I\n\x05\x65rror\x18\x01 \x01(\x0b\x32\x38.org.dash.platform.dapi.v0.StateTransitionBroadcastErrorH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x19GetConsensusParamsRequest\x12^\n\x02v0\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0H\x00\x1a<\n\x1bGetConsensusParamsRequestV0\x12\x0e\n\x06height\x18\x01 \x01(\x05\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\x9c\x04\n\x1aGetConsensusParamsResponse\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0H\x00\x1aP\n\x14\x43onsensusParamsBlock\x12\x11\n\tmax_bytes\x18\x01 \x01(\t\x12\x0f\n\x07max_gas\x18\x02 \x01(\t\x12\x14\n\x0ctime_iota_ms\x18\x03 \x01(\t\x1a\x62\n\x17\x43onsensusParamsEvidence\x12\x1a\n\x12max_age_num_blocks\x18\x01 \x01(\t\x12\x18\n\x10max_age_duration\x18\x02 \x01(\t\x12\x11\n\tmax_bytes\x18\x03 \x01(\t\x1a\xda\x01\n\x1cGetConsensusParamsResponseV0\x12Y\n\x05\x62lock\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock\x12_\n\x08\x65vidence\x18\x02 \x01(\x0b\x32M.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidenceB\t\n\x07version\"\xe4\x01\n%GetProtocolVersionUpgradeStateRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0H\x00\x1a\x38\n\'GetProtocolVersionUpgradeStateRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xb5\x05\n&GetProtocolVersionUpgradeStateResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0H\x00\x1a\x85\x04\n(GetProtocolVersionUpgradeStateResponseV0\x12\x87\x01\n\x08versions\x18\x01 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x96\x01\n\x08Versions\x12\x89\x01\n\x08versions\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry\x1a:\n\x0cVersionEntry\x12\x16\n\x0eversion_number\x18\x01 \x01(\r\x12\x12\n\nvote_count\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xa3\x02\n*GetProtocolVersionUpgradeVoteStatusRequest\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0H\x00\x1ag\n,GetProtocolVersionUpgradeVoteStatusRequestV0\x12\x19\n\x11start_pro_tx_hash\x18\x01 \x01(\x0c\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xef\x05\n+GetProtocolVersionUpgradeVoteStatusResponse\x12\x82\x01\n\x02v0\x18\x01 \x01(\x0b\x32t.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0H\x00\x1a\xaf\x04\n-GetProtocolVersionUpgradeVoteStatusResponseV0\x12\x98\x01\n\x08versions\x18\x01 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignalsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xaf\x01\n\x0eVersionSignals\x12\x9c\x01\n\x0fversion_signals\x18\x01 \x03(\x0b\x32\x82\x01.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal\x1a\x35\n\rVersionSignal\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07version\x18\x02 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xf5\x01\n\x14GetEpochsInfoRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0H\x00\x1a|\n\x16GetEpochsInfoRequestV0\x12\x31\n\x0bstart_epoch\x18\x01 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\r\n\x05\x63ount\x18\x02 \x01(\r\x12\x11\n\tascending\x18\x03 \x01(\x08\x12\r\n\x05prove\x18\x04 \x01(\x08\x42\t\n\x07version\"\x99\x05\n\x15GetEpochsInfoResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0H\x00\x1a\x9c\x04\n\x17GetEpochsInfoResponseV0\x12\x65\n\x06\x65pochs\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1au\n\nEpochInfos\x12g\n\x0b\x65poch_infos\x18\x01 \x03(\x0b\x32R.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo\x1a\xa6\x01\n\tEpochInfo\x12\x0e\n\x06number\x18\x01 \x01(\r\x12\x1e\n\x12\x66irst_block_height\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x1f\n\x17\x66irst_core_block_height\x18\x03 \x01(\r\x12\x16\n\nstart_time\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x16\n\x0e\x66\x65\x65_multiplier\x18\x05 \x01(\x01\x12\x18\n\x10protocol_version\x18\x06 \x01(\rB\x08\n\x06resultB\t\n\x07version\"\xde\x04\n\x1cGetContestedResourcesRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0H\x00\x1a\xcc\x03\n\x1eGetContestedResourcesRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x1a\n\x12start_index_values\x18\x04 \x03(\x0c\x12\x18\n\x10\x65nd_index_values\x18\x05 \x03(\x0c\x12\x89\x01\n\x13start_at_value_info\x18\x06 \x01(\x0b\x32g.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1a\x45\n\x10StartAtValueInfo\x12\x13\n\x0bstart_value\x18\x01 \x01(\x0c\x12\x1c\n\x14start_value_included\x18\x02 \x01(\x08\x42\x16\n\x14_start_at_value_infoB\x08\n\x06_countB\t\n\x07version\"\x88\x04\n\x1dGetContestedResourcesResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0H\x00\x1a\xf3\x02\n\x1fGetContestedResourcesResponseV0\x12\x95\x01\n\x19\x63ontested_resource_values\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValuesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a<\n\x17\x43ontestedResourceValues\x12!\n\x19\x63ontested_resource_values\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\xd2\x05\n\x1cGetVotePollsByEndDateRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0H\x00\x1a\xc0\x04\n\x1eGetVotePollsByEndDateRequestV0\x12\x84\x01\n\x0fstart_time_info\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfoH\x00\x88\x01\x01\x12\x80\x01\n\rend_time_info\x18\x02 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfoH\x01\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x13\n\x06offset\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x11\n\tascending\x18\x05 \x01(\x08\x12\r\n\x05prove\x18\x06 \x01(\x08\x1aI\n\x0fStartAtTimeInfo\x12\x19\n\rstart_time_ms\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x1b\n\x13start_time_included\x18\x02 \x01(\x08\x1a\x43\n\rEndAtTimeInfo\x12\x17\n\x0b\x65nd_time_ms\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x19\n\x11\x65nd_time_included\x18\x02 \x01(\x08\x42\x12\n\x10_start_time_infoB\x10\n\x0e_end_time_infoB\x08\n\x06_limitB\t\n\x07_offsetB\t\n\x07version\"\x83\x06\n\x1dGetVotePollsByEndDateResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0H\x00\x1a\xee\x04\n\x1fGetVotePollsByEndDateResponseV0\x12\x9c\x01\n\x18vote_polls_by_timestamps\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestampsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aV\n\x1eSerializedVotePollsByTimestamp\x12\x15\n\ttimestamp\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x1d\n\x15serialized_vote_polls\x18\x02 \x03(\x0c\x1a\xd7\x01\n\x1fSerializedVotePollsByTimestamps\x12\x99\x01\n\x18vote_polls_by_timestamps\x18\x01 \x03(\x0b\x32w.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xff\x06\n$GetContestedResourceVoteStateRequest\x12t\n\x02v0\x18\x01 \x01(\x0b\x32\x66.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0H\x00\x1a\xd5\x05\n&GetContestedResourceVoteStateRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x86\x01\n\x0bresult_type\x18\x05 \x01(\x0e\x32q.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType\x12\x36\n.allow_include_locked_and_abstaining_vote_tally\x18\x06 \x01(\x08\x12\xa3\x01\n\x18start_at_identifier_info\x18\x07 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x08 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\"I\n\nResultType\x12\r\n\tDOCUMENTS\x10\x00\x12\x0e\n\nVOTE_TALLY\x10\x01\x12\x1c\n\x18\x44OCUMENTS_AND_VOTE_TALLY\x10\x02\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\x94\x0c\n%GetContestedResourceVoteStateResponse\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0H\x00\x1a\xe7\n\n\'GetContestedResourceVoteStateResponseV0\x12\xae\x01\n\x1d\x63ontested_resource_contenders\x18\x01 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContendersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xda\x03\n\x10\x46inishedVoteInfo\x12\xad\x01\n\x15\x66inished_vote_outcome\x18\x01 \x01(\x0e\x32\x8d\x01.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome\x12\x1f\n\x12won_by_identity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12$\n\x18\x66inished_at_block_height\x18\x03 \x01(\x04\x42\x02\x30\x01\x12%\n\x1d\x66inished_at_core_block_height\x18\x04 \x01(\r\x12%\n\x19\x66inished_at_block_time_ms\x18\x05 \x01(\x04\x42\x02\x30\x01\x12\x19\n\x11\x66inished_at_epoch\x18\x06 \x01(\r\"O\n\x13\x46inishedVoteOutcome\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\n\n\x06LOCKED\x10\x01\x12\x16\n\x12NO_PREVIOUS_WINNER\x10\x02\x42\x15\n\x13_won_by_identity_id\x1a\xc4\x03\n\x1b\x43ontestedResourceContenders\x12\x86\x01\n\ncontenders\x18\x01 \x03(\x0b\x32r.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender\x12\x1f\n\x12\x61\x62stain_vote_tally\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0flock_vote_tally\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x9a\x01\n\x12\x66inished_vote_info\x18\x04 \x01(\x0b\x32y.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfoH\x02\x88\x01\x01\x42\x15\n\x13_abstain_vote_tallyB\x12\n\x10_lock_vote_tallyB\x15\n\x13_finished_vote_info\x1ak\n\tContender\x12\x12\n\nidentifier\x18\x01 \x01(\x0c\x12\x17\n\nvote_count\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\x08\x64ocument\x18\x03 \x01(\x0cH\x01\x88\x01\x01\x42\r\n\x0b_vote_countB\x0b\n\t_documentB\x08\n\x06resultB\t\n\x07version\"\xd5\x05\n,GetContestedResourceVotersForIdentityRequest\x12\x84\x01\n\x02v0\x18\x01 \x01(\x0b\x32v.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0H\x00\x1a\x92\x04\n.GetContestedResourceVotersForIdentityRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\x12\n\nindex_name\x18\x03 \x01(\t\x12\x14\n\x0cindex_values\x18\x04 \x03(\x0c\x12\x15\n\rcontestant_id\x18\x05 \x01(\x0c\x12\xb4\x01\n\x18start_at_identifier_info\x18\x06 \x01(\x0b\x32\x8c\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfoH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x07 \x01(\rH\x01\x88\x01\x01\x12\x17\n\x0forder_ascending\x18\x08 \x01(\x08\x12\r\n\x05prove\x18\t \x01(\x08\x1aT\n\x15StartAtIdentifierInfo\x12\x18\n\x10start_identifier\x18\x01 \x01(\x0c\x12!\n\x19start_identifier_included\x18\x02 \x01(\x08\x42\x1b\n\x19_start_at_identifier_infoB\x08\n\x06_countB\t\n\x07version\"\xf1\x04\n-GetContestedResourceVotersForIdentityResponse\x12\x86\x01\n\x02v0\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0H\x00\x1a\xab\x03\n/GetContestedResourceVotersForIdentityResponseV0\x12\xb6\x01\n\x19\x63ontested_resource_voters\x18\x01 \x01(\x0b\x32\x90\x01.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVotersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x43\n\x17\x43ontestedResourceVoters\x12\x0e\n\x06voters\x18\x01 \x03(\x0c\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x42\x08\n\x06resultB\t\n\x07version\"\xad\x05\n(GetContestedResourceIdentityVotesRequest\x12|\n\x02v0\x18\x01 \x01(\x0b\x32n.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0H\x00\x1a\xf7\x03\n*GetContestedResourceIdentityVotesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12+\n\x05limit\x18\x02 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12,\n\x06offset\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x17\n\x0forder_ascending\x18\x04 \x01(\x08\x12\xae\x01\n\x1astart_at_vote_poll_id_info\x18\x05 \x01(\x0b\x32\x84\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfoH\x00\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x1a\x61\n\x15StartAtVotePollIdInfo\x12 \n\x18start_at_poll_identifier\x18\x01 \x01(\x0c\x12&\n\x1estart_poll_identifier_included\x18\x02 \x01(\x08\x42\x1d\n\x1b_start_at_vote_poll_id_infoB\t\n\x07version\"\xc8\n\n)GetContestedResourceIdentityVotesResponse\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0H\x00\x1a\x8f\t\n+GetContestedResourceIdentityVotesResponseV0\x12\xa1\x01\n\x05votes\x18\x01 \x01(\x0b\x32\x8f\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\xf7\x01\n\x1e\x43ontestedResourceIdentityVotes\x12\xba\x01\n!contested_resource_identity_votes\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote\x12\x18\n\x10\x66inished_results\x18\x02 \x01(\x08\x1a\xad\x02\n\x12ResourceVoteChoice\x12\xad\x01\n\x10vote_choice_type\x18\x01 \x01(\x0e\x32\x92\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType\x12\x18\n\x0bidentity_id\x18\x02 \x01(\x0cH\x00\x88\x01\x01\"=\n\x0eVoteChoiceType\x12\x14\n\x10TOWARDS_IDENTITY\x10\x00\x12\x0b\n\x07\x41\x42STAIN\x10\x01\x12\x08\n\x04LOCK\x10\x02\x42\x0e\n\x0c_identity_id\x1a\x95\x02\n\x1d\x43ontestedResourceIdentityVote\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1a\n\x12\x64ocument_type_name\x18\x02 \x01(\t\x12\'\n\x1fserialized_index_storage_values\x18\x03 \x03(\x0c\x12\x99\x01\n\x0bvote_choice\x18\x04 \x01(\x0b\x32\x83\x01.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoiceB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n%GetPrefundedSpecializedBalanceRequest\x12v\n\x02v0\x18\x01 \x01(\x0b\x32h.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0H\x00\x1a\x44\n\'GetPrefundedSpecializedBalanceRequestV0\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xed\x02\n&GetPrefundedSpecializedBalanceResponse\x12x\n\x02v0\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0H\x00\x1a\xbd\x01\n(GetPrefundedSpecializedBalanceResponseV0\x12\x15\n\x07\x62\x61lance\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xd0\x01\n GetTotalCreditsInPlatformRequest\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0H\x00\x1a\x33\n\"GetTotalCreditsInPlatformRequestV0\x12\r\n\x05prove\x18\x01 \x01(\x08\x42\t\n\x07version\"\xd9\x02\n!GetTotalCreditsInPlatformResponse\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0H\x00\x1a\xb8\x01\n#GetTotalCreditsInPlatformResponseV0\x12\x15\n\x07\x63redits\x18\x01 \x01(\x04\x42\x02\x30\x01H\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\x08\n\x06resultB\t\n\x07version\"\xc4\x01\n\x16GetPathElementsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0H\x00\x1a\x45\n\x18GetPathElementsRequestV0\x12\x0c\n\x04path\x18\x01 \x03(\x0c\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xa3\x03\n\x17GetPathElementsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0H\x00\x1a\xa0\x02\n\x19GetPathElementsResponseV0\x12i\n\x08\x65lements\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ElementsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x1c\n\x08\x45lements\x12\x10\n\x08\x65lements\x18\x01 \x03(\x0c\x42\x08\n\x06resultB\t\n\x07version\"\x81\x01\n\x10GetStatusRequest\x12L\n\x02v0\x18\x01 \x01(\x0b\x32>.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0H\x00\x1a\x14\n\x12GetStatusRequestV0B\t\n\x07version\"\xd0\x10\n\x11GetStatusResponse\x12N\n\x02v0\x18\x01 \x01(\x0b\x32@.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0H\x00\x1a\xdf\x0f\n\x13GetStatusResponseV0\x12Y\n\x07version\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version\x12S\n\x04node\x18\x02 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node\x12U\n\x05\x63hain\x18\x03 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain\x12Y\n\x07network\x18\x04 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network\x12^\n\nstate_sync\x18\x05 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync\x12S\n\x04time\x18\x06 \x01(\x0b\x32\x45.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time\x1a\xee\x04\n\x07Version\x12\x63\n\x08software\x18\x01 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software\x12\x63\n\x08protocol\x18\x02 \x01(\x0b\x32Q.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol\x1a^\n\x08Software\x12\x0c\n\x04\x64\x61pi\x18\x01 \x01(\t\x12\x12\n\x05\x64rive\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x17\n\ntenderdash\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\x08\n\x06_driveB\r\n\x0b_tenderdash\x1a\xb8\x02\n\x08Protocol\x12p\n\ntenderdash\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash\x12\x66\n\x05\x64rive\x18\x02 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive\x1a(\n\nTenderdash\x12\x0b\n\x03p2p\x18\x01 \x01(\r\x12\r\n\x05\x62lock\x18\x02 \x01(\r\x1a(\n\x05\x44rive\x12\x0e\n\x06latest\x18\x03 \x01(\r\x12\x0f\n\x07\x63urrent\x18\x04 \x01(\r\x1a\x7f\n\x04Time\x12\x11\n\x05local\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x16\n\x05\x62lock\x18\x02 \x01(\x04\x42\x02\x30\x01H\x00\x88\x01\x01\x12\x18\n\x07genesis\x18\x03 \x01(\x04\x42\x02\x30\x01H\x01\x88\x01\x01\x12\x12\n\x05\x65poch\x18\x04 \x01(\rH\x02\x88\x01\x01\x42\x08\n\x06_blockB\n\n\x08_genesisB\x08\n\x06_epoch\x1a<\n\x04Node\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x0bpro_tx_hash\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x42\x0e\n\x0c_pro_tx_hash\x1a\xb3\x02\n\x05\x43hain\x12\x13\n\x0b\x63\x61tching_up\x18\x01 \x01(\x08\x12\x19\n\x11latest_block_hash\x18\x02 \x01(\x0c\x12\x17\n\x0flatest_app_hash\x18\x03 \x01(\x0c\x12\x1f\n\x13latest_block_height\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x1b\n\x13\x65\x61rliest_block_hash\x18\x05 \x01(\x0c\x12\x19\n\x11\x65\x61rliest_app_hash\x18\x06 \x01(\x0c\x12!\n\x15\x65\x61rliest_block_height\x18\x07 \x01(\x04\x42\x02\x30\x01\x12!\n\x15max_peer_block_height\x18\t \x01(\x04\x42\x02\x30\x01\x12%\n\x18\x63ore_chain_locked_height\x18\n \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_core_chain_locked_height\x1a\x43\n\x07Network\x12\x10\n\x08\x63hain_id\x18\x01 \x01(\t\x12\x13\n\x0bpeers_count\x18\x02 \x01(\r\x12\x11\n\tlistening\x18\x03 \x01(\x08\x1a\x85\x02\n\tStateSync\x12\x1d\n\x11total_synced_time\x18\x01 \x01(\x04\x42\x02\x30\x01\x12\x1a\n\x0eremaining_time\x18\x02 \x01(\x04\x42\x02\x30\x01\x12\x17\n\x0ftotal_snapshots\x18\x03 \x01(\r\x12\"\n\x16\x63hunk_process_avg_time\x18\x04 \x01(\x04\x42\x02\x30\x01\x12\x1b\n\x0fsnapshot_height\x18\x05 \x01(\x04\x42\x02\x30\x01\x12!\n\x15snapshot_chunks_count\x18\x06 \x01(\x04\x42\x02\x30\x01\x12\x1d\n\x11\x62\x61\x63kfilled_blocks\x18\x07 \x01(\x04\x42\x02\x30\x01\x12!\n\x15\x62\x61\x63kfill_blocks_total\x18\x08 \x01(\x04\x42\x02\x30\x01\x42\t\n\x07version\"\xb1\x01\n\x1cGetCurrentQuorumsInfoRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0H\x00\x1a \n\x1eGetCurrentQuorumsInfoRequestV0B\t\n\x07version\"\xa1\x05\n\x1dGetCurrentQuorumsInfoResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0H\x00\x1a\x46\n\x0bValidatorV0\x12\x13\n\x0bpro_tx_hash\x18\x01 \x01(\x0c\x12\x0f\n\x07node_ip\x18\x02 \x01(\t\x12\x11\n\tis_banned\x18\x03 \x01(\x08\x1a\xaf\x01\n\x0eValidatorSetV0\x12\x13\n\x0bquorum_hash\x18\x01 \x01(\x0c\x12\x13\n\x0b\x63ore_height\x18\x02 \x01(\r\x12U\n\x07members\x18\x03 \x03(\x0b\x32\x44.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0\x12\x1c\n\x14threshold_public_key\x18\x04 \x01(\x0c\x1a\x92\x02\n\x1fGetCurrentQuorumsInfoResponseV0\x12\x15\n\rquorum_hashes\x18\x01 \x03(\x0c\x12\x1b\n\x13\x63urrent_quorum_hash\x18\x02 \x01(\x0c\x12_\n\x0evalidator_sets\x18\x03 \x03(\x0b\x32G.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0\x12\x1b\n\x13last_block_proposer\x18\x04 \x01(\x0c\x12=\n\x08metadata\x18\x05 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadataB\t\n\x07version\"\xf4\x01\n\x1fGetIdentityTokenBalancesRequest\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0H\x00\x1aZ\n!GetIdentityTokenBalancesRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x11\n\ttoken_ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xad\x05\n GetIdentityTokenBalancesResponse\x12l\n\x02v0\x18\x01 \x01(\x0b\x32^.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0H\x00\x1a\x8f\x04\n\"GetIdentityTokenBalancesResponseV0\x12\x86\x01\n\x0etoken_balances\x18\x01 \x01(\x0b\x32l.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aG\n\x11TokenBalanceEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\x9a\x01\n\rTokenBalances\x12\x88\x01\n\x0etoken_balances\x18\x01 \x03(\x0b\x32p.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntryB\x08\n\x06resultB\t\n\x07version\"\xfc\x01\n!GetIdentitiesTokenBalancesRequest\x12n\n\x02v0\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0H\x00\x1a\\\n#GetIdentitiesTokenBalancesRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x14\n\x0cidentity_ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xf2\x05\n\"GetIdentitiesTokenBalancesResponse\x12p\n\x02v0\x18\x01 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0H\x00\x1a\xce\x04\n$GetIdentitiesTokenBalancesResponseV0\x12\x9b\x01\n\x17identity_token_balances\x18\x01 \x01(\x0b\x32x.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalancesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1aR\n\x19IdentityTokenBalanceEntry\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x14\n\x07\x62\x61lance\x18\x02 \x01(\x04H\x00\x88\x01\x01\x42\n\n\x08_balance\x1a\xb7\x01\n\x15IdentityTokenBalances\x12\x9d\x01\n\x17identity_token_balances\x18\x01 \x03(\x0b\x32|.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntryB\x08\n\x06resultB\t\n\x07version\"\xe8\x01\n\x1cGetIdentityTokenInfosRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0H\x00\x1aW\n\x1eGetIdentityTokenInfosRequestV0\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x11\n\ttoken_ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\x98\x06\n\x1dGetIdentityTokenInfosResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0H\x00\x1a\x83\x05\n\x1fGetIdentityTokenInfosResponseV0\x12z\n\x0btoken_infos\x18\x01 \x01(\x0b\x32\x63.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a(\n\x16TokenIdentityInfoEntry\x12\x0e\n\x06\x66rozen\x18\x01 \x01(\x08\x1a\xb0\x01\n\x0eTokenInfoEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x82\x01\n\x04info\x18\x02 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntryH\x00\x88\x01\x01\x42\x07\n\x05_info\x1a\x8a\x01\n\nTokenInfos\x12|\n\x0btoken_infos\x18\x01 \x03(\x0b\x32g.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntryB\x08\n\x06resultB\t\n\x07version\"\xf0\x01\n\x1eGetIdentitiesTokenInfosRequest\x12h\n\x02v0\x18\x01 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0H\x00\x1aY\n GetIdentitiesTokenInfosRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x14\n\x0cidentity_ids\x18\x02 \x03(\x0c\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xca\x06\n\x1fGetIdentitiesTokenInfosResponse\x12j\n\x02v0\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0H\x00\x1a\xaf\x05\n!GetIdentitiesTokenInfosResponseV0\x12\x8f\x01\n\x14identity_token_infos\x18\x01 \x01(\x0b\x32o.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a(\n\x16TokenIdentityInfoEntry\x12\x0e\n\x06\x66rozen\x18\x01 \x01(\x08\x1a\xb7\x01\n\x0eTokenInfoEntry\x12\x13\n\x0bidentity_id\x18\x01 \x01(\x0c\x12\x86\x01\n\x04info\x18\x02 \x01(\x0b\x32s.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntryH\x00\x88\x01\x01\x42\x07\n\x05_info\x1a\x97\x01\n\x12IdentityTokenInfos\x12\x80\x01\n\x0btoken_infos\x18\x01 \x03(\x0b\x32k.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntryB\x08\n\x06resultB\t\n\x07version\"\xbf\x01\n\x17GetTokenStatusesRequest\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0H\x00\x1a=\n\x19GetTokenStatusesRequestV0\x12\x11\n\ttoken_ids\x18\x01 \x03(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xe7\x04\n\x18GetTokenStatusesResponse\x12\\\n\x02v0\x18\x01 \x01(\x0b\x32N.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0H\x00\x1a\xe1\x03\n\x1aGetTokenStatusesResponseV0\x12v\n\x0etoken_statuses\x18\x01 \x01(\x0b\x32\\.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusesH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x44\n\x10TokenStatusEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x13\n\x06paused\x18\x02 \x01(\x08H\x00\x88\x01\x01\x42\t\n\x07_paused\x1a\x88\x01\n\rTokenStatuses\x12w\n\x0etoken_statuses\x18\x01 \x03(\x0b\x32_.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntryB\x08\n\x06resultB\t\n\x07version\"\xef\x04\n)GetTokenPreProgrammedDistributionsRequest\x12~\n\x02v0\x18\x01 \x01(\x0b\x32p.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0H\x00\x1a\xb6\x03\n+GetTokenPreProgrammedDistributionsRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x98\x01\n\rstart_at_info\x18\x02 \x01(\x0b\x32|.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfoH\x00\x88\x01\x01\x12\x12\n\x05limit\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x04 \x01(\x08\x1a\x9a\x01\n\x0bStartAtInfo\x12\x15\n\rstart_time_ms\x18\x01 \x01(\x04\x12\x1c\n\x0fstart_recipient\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12%\n\x18start_recipient_included\x18\x03 \x01(\x08H\x01\x88\x01\x01\x42\x12\n\x10_start_recipientB\x1b\n\x19_start_recipient_includedB\x10\n\x0e_start_at_infoB\x08\n\x06_limitB\t\n\x07version\"\xec\x07\n*GetTokenPreProgrammedDistributionsResponse\x12\x80\x01\n\x02v0\x18\x01 \x01(\x0b\x32r.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0H\x00\x1a\xaf\x06\n,GetTokenPreProgrammedDistributionsResponseV0\x12\xa5\x01\n\x13token_distributions\x18\x01 \x01(\x0b\x32\x85\x01.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a>\n\x16TokenDistributionEntry\x12\x14\n\x0crecipient_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x1a\xd4\x01\n\x1bTokenTimedDistributionEntry\x12\x11\n\ttimestamp\x18\x01 \x01(\x04\x12\xa1\x01\n\rdistributions\x18\x02 \x03(\x0b\x32\x89\x01.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry\x1a\xc3\x01\n\x12TokenDistributions\x12\xac\x01\n\x13token_distributions\x18\x01 \x03(\x0b\x32\x8e\x01.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntryB\x08\n\x06resultB\t\n\x07version\"\xca\x01\n\x1aGetTokenTotalSupplyRequest\x12`\n\x02v0\x18\x01 \x01(\x0b\x32R.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0H\x00\x1a?\n\x1cGetTokenTotalSupplyRequestV0\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\r\n\x05prove\x18\x02 \x01(\x08\x42\t\n\x07version\"\xaf\x04\n\x1bGetTokenTotalSupplyResponse\x12\x62\n\x02v0\x18\x01 \x01(\x0b\x32T.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0H\x00\x1a\xa0\x03\n\x1dGetTokenTotalSupplyResponseV0\x12\x88\x01\n\x12token_total_supply\x18\x01 \x01(\x0b\x32j.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntryH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1ax\n\x15TokenTotalSupplyEntry\x12\x10\n\x08token_id\x18\x01 \x01(\x0c\x12\x30\n(total_aggregated_amount_in_user_accounts\x18\x02 \x01(\x04\x12\x1b\n\x13total_system_amount\x18\x03 \x01(\x04\x42\x08\n\x06resultB\t\n\x07version\"\xd2\x01\n\x13GetGroupInfoRequest\x12R\n\x02v0\x18\x01 \x01(\x0b\x32\x44.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0H\x00\x1a\\\n\x15GetGroupInfoRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17group_contract_position\x18\x02 \x01(\r\x12\r\n\x05prove\x18\x03 \x01(\x08\x42\t\n\x07version\"\xd4\x05\n\x14GetGroupInfoResponse\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0H\x00\x1a\xda\x04\n\x16GetGroupInfoResponseV0\x12\x66\n\ngroup_info\x18\x01 \x01(\x0b\x32P.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x04 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x34\n\x10GroupMemberEntry\x12\x11\n\tmember_id\x18\x01 \x01(\x0c\x12\r\n\x05power\x18\x02 \x01(\r\x1a\x98\x01\n\x0eGroupInfoEntry\x12h\n\x07members\x18\x01 \x03(\x0b\x32W.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry\x12\x1c\n\x14group_required_power\x18\x02 \x01(\r\x1a\x8a\x01\n\tGroupInfo\x12n\n\ngroup_info\x18\x01 \x01(\x0b\x32U.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntryH\x00\x88\x01\x01\x42\r\n\x0b_group_infoB\x08\n\x06resultB\t\n\x07version\"\xed\x03\n\x14GetGroupInfosRequest\x12T\n\x02v0\x18\x01 \x01(\x0b\x32\x46.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0H\x00\x1au\n\x1cStartAtGroupContractPosition\x12%\n\x1dstart_group_contract_position\x18\x01 \x01(\r\x12.\n&start_group_contract_position_included\x18\x02 \x01(\x08\x1a\xfc\x01\n\x16GetGroupInfosRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12{\n start_at_group_contract_position\x18\x02 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPositionH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x04 \x01(\x08\x42#\n!_start_at_group_contract_positionB\x08\n\x06_countB\t\n\x07version\"\xff\x05\n\x15GetGroupInfosResponse\x12V\n\x02v0\x18\x01 \x01(\x0b\x32H.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0H\x00\x1a\x82\x05\n\x17GetGroupInfosResponseV0\x12j\n\x0bgroup_infos\x18\x01 \x01(\x0b\x32S.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfosH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x04 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x34\n\x10GroupMemberEntry\x12\x11\n\tmember_id\x18\x01 \x01(\x0c\x12\r\n\x05power\x18\x02 \x01(\r\x1a\xc3\x01\n\x16GroupPositionInfoEntry\x12\x1f\n\x17group_contract_position\x18\x01 \x01(\r\x12j\n\x07members\x18\x02 \x03(\x0b\x32Y.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry\x12\x1c\n\x14group_required_power\x18\x03 \x01(\r\x1a\x82\x01\n\nGroupInfos\x12t\n\x0bgroup_infos\x18\x01 \x03(\x0b\x32_.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntryB\x08\n\x06resultB\t\n\x07version\"\xbe\x04\n\x16GetGroupActionsRequest\x12X\n\x02v0\x18\x01 \x01(\x0b\x32J.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0H\x00\x1aL\n\x0fStartAtActionId\x12\x17\n\x0fstart_action_id\x18\x01 \x01(\x0c\x12 \n\x18start_action_id_included\x18\x02 \x01(\x08\x1a\xc8\x02\n\x18GetGroupActionsRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17group_contract_position\x18\x02 \x01(\r\x12N\n\x06status\x18\x03 \x01(\x0e\x32>.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus\x12\x62\n\x12start_at_action_id\x18\x04 \x01(\x0b\x32\x41.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionIdH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x05 \x01(\rH\x01\x88\x01\x01\x12\r\n\x05prove\x18\x06 \x01(\x08\x42\x15\n\x13_start_at_action_idB\x08\n\x06_count\"&\n\x0c\x41\x63tionStatus\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\n\n\x06\x43LOSED\x10\x01\x42\t\n\x07version\"\xeb\x1d\n\x17GetGroupActionsResponse\x12Z\n\x02v0\x18\x01 \x01(\x0b\x32L.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0H\x00\x1a\xe8\x1c\n\x19GetGroupActionsResponseV0\x12r\n\rgroup_actions\x18\x01 \x01(\x0b\x32Y.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionsH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a[\n\tMintEvent\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x04\x12\x14\n\x0crecipient_id\x18\x02 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1a\x45\n\tBurnEvent\x12\x0e\n\x06\x61mount\x18\x01 \x01(\x04\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1aJ\n\x0b\x46reezeEvent\x12\x11\n\tfrozen_id\x18\x01 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1aL\n\rUnfreezeEvent\x12\x11\n\tfrozen_id\x18\x01 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1a\x66\n\x17\x44\x65stroyFrozenFundsEvent\x12\x11\n\tfrozen_id\x18\x01 \x01(\x0c\x12\x0e\n\x06\x61mount\x18\x02 \x01(\x04\x12\x18\n\x0bpublic_note\x18\x03 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1a\x64\n\x13SharedEncryptedNote\x12\x18\n\x10sender_key_index\x18\x01 \x01(\r\x12\x1b\n\x13recipient_key_index\x18\x02 \x01(\r\x12\x16\n\x0e\x65ncrypted_data\x18\x03 \x01(\x0c\x1a{\n\x15PersonalEncryptedNote\x12!\n\x19root_encryption_key_index\x18\x01 \x01(\r\x12\'\n\x1f\x64\x65rivation_encryption_key_index\x18\x02 \x01(\r\x12\x16\n\x0e\x65ncrypted_data\x18\x03 \x01(\x0c\x1a\xa7\x03\n\rTransferEvent\x12\x14\n\x0crecipient_id\x18\x01 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x84\x01\n\x15shared_encrypted_note\x18\x03 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNoteH\x01\x88\x01\x01\x12\x88\x01\n\x17personal_encrypted_note\x18\x04 \x01(\x0b\x32\x62.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNoteH\x02\x88\x01\x01\x12\x0e\n\x06\x61mount\x18\x05 \x01(\x04\x42\x0e\n\x0c_public_noteB\x18\n\x16_shared_encrypted_noteB\x1a\n\x18_personal_encrypted_note\x1a\xe9\x01\n\x14\x45mergencyActionEvent\x12\x81\x01\n\x0b\x61\x63tion_type\x18\x01 \x01(\x0e\x32l.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\"#\n\nActionType\x12\t\n\x05PAUSE\x10\x00\x12\n\n\x06RESUME\x10\x01\x42\x0e\n\x0c_public_note\x1a\x64\n\x16TokenConfigUpdateEvent\x12 \n\x18token_config_update_item\x18\x01 \x01(\x0c\x12\x18\n\x0bpublic_note\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_public_note\x1a\xfc\x02\n\x10GroupActionEvent\x12n\n\x0btoken_event\x18\x01 \x01(\x0b\x32W.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEventH\x00\x12t\n\x0e\x64ocument_event\x18\x02 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEventH\x00\x12t\n\x0e\x63ontract_event\x18\x03 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEventH\x00\x42\x0c\n\nevent_type\x1a\x8b\x01\n\rDocumentEvent\x12r\n\x06\x63reate\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEventH\x00\x42\x06\n\x04type\x1a/\n\x13\x44ocumentCreateEvent\x12\x18\n\x10\x63reated_document\x18\x01 \x01(\x0c\x1a/\n\x13\x43ontractUpdateEvent\x12\x18\n\x10updated_contract\x18\x01 \x01(\x0c\x1a\x8b\x01\n\rContractEvent\x12r\n\x06update\x18\x01 \x01(\x0b\x32`.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEventH\x00\x42\x06\n\x04type\x1a\xbb\x07\n\nTokenEvent\x12\x66\n\x04mint\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEventH\x00\x12\x66\n\x04\x62urn\x18\x02 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEventH\x00\x12j\n\x06\x66reeze\x18\x03 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEventH\x00\x12n\n\x08unfreeze\x18\x04 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEventH\x00\x12\x84\x01\n\x14\x64\x65stroy_frozen_funds\x18\x05 \x01(\x0b\x32\x64.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEventH\x00\x12n\n\x08transfer\x18\x06 \x01(\x0b\x32Z.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEventH\x00\x12}\n\x10\x65mergency_action\x18\x07 \x01(\x0b\x32\x61.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEventH\x00\x12\x82\x01\n\x13token_config_update\x18\x08 \x01(\x0b\x32\x63.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEventH\x00\x42\x06\n\x04type\x1a\x93\x01\n\x10GroupActionEntry\x12\x11\n\taction_id\x18\x01 \x01(\x0c\x12l\n\x05\x65vent\x18\x02 \x01(\x0b\x32].org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent\x1a\x84\x01\n\x0cGroupActions\x12t\n\rgroup_actions\x18\x01 \x03(\x0b\x32].org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntryB\x08\n\x06resultB\t\n\x07version\"\x88\x03\n\x1cGetGroupActionSignersRequest\x12\x64\n\x02v0\x18\x01 \x01(\x0b\x32V.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0H\x00\x1a\xce\x01\n\x1eGetGroupActionSignersRequestV0\x12\x13\n\x0b\x63ontract_id\x18\x01 \x01(\x0c\x12\x1f\n\x17group_contract_position\x18\x02 \x01(\r\x12T\n\x06status\x18\x03 \x01(\x0e\x32\x44.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus\x12\x11\n\taction_id\x18\x04 \x01(\x0c\x12\r\n\x05prove\x18\x05 \x01(\x08\"&\n\x0c\x41\x63tionStatus\x12\n\n\x06\x41\x43TIVE\x10\x00\x12\n\n\x06\x43LOSED\x10\x01\x42\t\n\x07version\"\x8b\x05\n\x1dGetGroupActionSignersResponse\x12\x66\n\x02v0\x18\x01 \x01(\x0b\x32X.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0H\x00\x1a\xf6\x03\n\x1fGetGroupActionSignersResponseV0\x12\x8b\x01\n\x14group_action_signers\x18\x01 \x01(\x0b\x32k.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSignersH\x00\x12\x31\n\x05proof\x18\x02 \x01(\x0b\x32 .org.dash.platform.dapi.v0.ProofH\x00\x12=\n\x08metadata\x18\x03 \x01(\x0b\x32+.org.dash.platform.dapi.v0.ResponseMetadata\x1a\x35\n\x11GroupActionSigner\x12\x11\n\tsigner_id\x18\x01 \x01(\x0c\x12\r\n\x05power\x18\x02 \x01(\r\x1a\x91\x01\n\x12GroupActionSigners\x12{\n\x07signers\x18\x01 \x03(\x0b\x32j.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSignerB\x08\n\x06resultB\t\n\x07version*Z\n\nKeyPurpose\x12\x12\n\x0e\x41UTHENTICATION\x10\x00\x12\x0e\n\nENCRYPTION\x10\x01\x12\x0e\n\nDECRYPTION\x10\x02\x12\x0c\n\x08TRANSFER\x10\x03\x12\n\n\x06VOTING\x10\x05\x32\x9a\x30\n\x08Platform\x12\x93\x01\n\x18\x62roadcastStateTransition\x12:.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest\x1a;.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse\x12l\n\x0bgetIdentity\x12-.org.dash.platform.dapi.v0.GetIdentityRequest\x1a..org.dash.platform.dapi.v0.GetIdentityResponse\x12x\n\x0fgetIdentityKeys\x12\x31.org.dash.platform.dapi.v0.GetIdentityKeysRequest\x1a\x32.org.dash.platform.dapi.v0.GetIdentityKeysResponse\x12\x96\x01\n\x19getIdentitiesContractKeys\x12;.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest\x1a<.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse\x12{\n\x10getIdentityNonce\x12\x32.org.dash.platform.dapi.v0.GetIdentityNonceRequest\x1a\x33.org.dash.platform.dapi.v0.GetIdentityNonceResponse\x12\x93\x01\n\x18getIdentityContractNonce\x12:.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse\x12\x81\x01\n\x12getIdentityBalance\x12\x34.org.dash.platform.dapi.v0.GetIdentityBalanceRequest\x1a\x35.org.dash.platform.dapi.v0.GetIdentityBalanceResponse\x12\x8a\x01\n\x15getIdentitiesBalances\x12\x37.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse\x12\xa2\x01\n\x1dgetIdentityBalanceAndRevision\x12?.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest\x1a@.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse\x12\xaf\x01\n#getEvonodesProposedEpochBlocksByIds\x12\x45.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\xb3\x01\n%getEvonodesProposedEpochBlocksByRange\x12G.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest\x1a\x41.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse\x12\x66\n\tgetProofs\x12+.org.dash.platform.dapi.v0.GetProofsRequest\x1a,.org.dash.platform.dapi.v0.GetProofsResponse\x12x\n\x0fgetDataContract\x12\x31.org.dash.platform.dapi.v0.GetDataContractRequest\x1a\x32.org.dash.platform.dapi.v0.GetDataContractResponse\x12\x8d\x01\n\x16getDataContractHistory\x12\x38.org.dash.platform.dapi.v0.GetDataContractHistoryRequest\x1a\x39.org.dash.platform.dapi.v0.GetDataContractHistoryResponse\x12{\n\x10getDataContracts\x12\x32.org.dash.platform.dapi.v0.GetDataContractsRequest\x1a\x33.org.dash.platform.dapi.v0.GetDataContractsResponse\x12o\n\x0cgetDocuments\x12..org.dash.platform.dapi.v0.GetDocumentsRequest\x1a/.org.dash.platform.dapi.v0.GetDocumentsResponse\x12\x99\x01\n\x1agetIdentityByPublicKeyHash\x12<.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest\x1a=.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse\x12\x9f\x01\n\x1cwaitForStateTransitionResult\x12>.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest\x1a?.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse\x12\x81\x01\n\x12getConsensusParams\x12\x34.org.dash.platform.dapi.v0.GetConsensusParamsRequest\x1a\x35.org.dash.platform.dapi.v0.GetConsensusParamsResponse\x12\xa5\x01\n\x1egetProtocolVersionUpgradeState\x12@.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest\x1a\x41.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse\x12\xb4\x01\n#getProtocolVersionUpgradeVoteStatus\x12\x45.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest\x1a\x46.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse\x12r\n\rgetEpochsInfo\x12/.org.dash.platform.dapi.v0.GetEpochsInfoRequest\x1a\x30.org.dash.platform.dapi.v0.GetEpochsInfoResponse\x12\x8a\x01\n\x15getContestedResources\x12\x37.org.dash.platform.dapi.v0.GetContestedResourcesRequest\x1a\x38.org.dash.platform.dapi.v0.GetContestedResourcesResponse\x12\xa2\x01\n\x1dgetContestedResourceVoteState\x12?.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest\x1a@.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse\x12\xba\x01\n%getContestedResourceVotersForIdentity\x12G.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest\x1aH.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse\x12\xae\x01\n!getContestedResourceIdentityVotes\x12\x43.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest\x1a\x44.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse\x12\x8a\x01\n\x15getVotePollsByEndDate\x12\x37.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest\x1a\x38.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse\x12\xa5\x01\n\x1egetPrefundedSpecializedBalance\x12@.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest\x1a\x41.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse\x12\x96\x01\n\x19getTotalCreditsInPlatform\x12;.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest\x1a<.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse\x12x\n\x0fgetPathElements\x12\x31.org.dash.platform.dapi.v0.GetPathElementsRequest\x1a\x32.org.dash.platform.dapi.v0.GetPathElementsResponse\x12\x66\n\tgetStatus\x12+.org.dash.platform.dapi.v0.GetStatusRequest\x1a,.org.dash.platform.dapi.v0.GetStatusResponse\x12\x8a\x01\n\x15getCurrentQuorumsInfo\x12\x37.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest\x1a\x38.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse\x12\x93\x01\n\x18getIdentityTokenBalances\x12:.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest\x1a;.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse\x12\x99\x01\n\x1agetIdentitiesTokenBalances\x12<.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest\x1a=.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse\x12\x8a\x01\n\x15getIdentityTokenInfos\x12\x37.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest\x1a\x38.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse\x12\x90\x01\n\x17getIdentitiesTokenInfos\x12\x39.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest\x1a:.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse\x12{\n\x10getTokenStatuses\x12\x32.org.dash.platform.dapi.v0.GetTokenStatusesRequest\x1a\x33.org.dash.platform.dapi.v0.GetTokenStatusesResponse\x12\xb1\x01\n\"getTokenPreProgrammedDistributions\x12\x44.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest\x1a\x45.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse\x12\x84\x01\n\x13getTokenTotalSupply\x12\x35.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest\x1a\x36.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse\x12o\n\x0cgetGroupInfo\x12..org.dash.platform.dapi.v0.GetGroupInfoRequest\x1a/.org.dash.platform.dapi.v0.GetGroupInfoResponse\x12r\n\rgetGroupInfos\x12/.org.dash.platform.dapi.v0.GetGroupInfosRequest\x1a\x30.org.dash.platform.dapi.v0.GetGroupInfosResponse\x12x\n\x0fgetGroupActions\x12\x31.org.dash.platform.dapi.v0.GetGroupActionsRequest\x1a\x32.org.dash.platform.dapi.v0.GetGroupActionsResponse\x12\x8a\x01\n\x15getGroupActionSigners\x12\x37.org.dash.platform.dapi.v0.GetGroupActionSignersRequest\x1a\x38.org.dash.platform.dapi.v0.GetGroupActionSignersResponseb\x06proto3' , dependencies=[google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,]) @@ -62,8 +62,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=31512, - serialized_end=31602, + serialized_start=47103, + serialized_end=47193, ) _sym_db.RegisterEnumDescriptor(_KEYPURPOSE) @@ -95,8 +95,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=4150, - serialized_end=4233, + serialized_start=4178, + serialized_end=4261, ) _sym_db.RegisterEnumDescriptor(_SECURITYLEVELMAP_KEYKINDREQUESTTYPE) @@ -125,8 +125,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=9342, - serialized_end=9422, + serialized_start=9729, + serialized_end=9809, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST_DOCUMENTCONTESTEDSTATUS) @@ -160,8 +160,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=9572, - serialized_end=9634, + serialized_start=9959, + serialized_end=10021, ) _sym_db.RegisterEnumDescriptor(_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST_TYPE) @@ -190,8 +190,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=21587, - serialized_end=21660, + serialized_start=22179, + serialized_end=22252, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0_RESULTTYPE) @@ -220,8 +220,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=22574, - serialized_end=22653, + serialized_start=23174, + serialized_end=23253, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO_FINISHEDVOTEOUTCOME) @@ -250,11 +250,86 @@ ], containing_type=None, serialized_options=None, - serialized_start=26282, - serialized_end=26343, + serialized_start=26882, + serialized_end=26943, ) _sym_db.RegisterEnumDescriptor(_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE_VOTECHOICETYPE) +_GETGROUPACTIONSREQUEST_ACTIONSTATUS = _descriptor.EnumDescriptor( + name='ActionStatus', + full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ACTIVE', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CLOSED', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=42181, + serialized_end=42219, +) +_sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSREQUEST_ACTIONSTATUS) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE = _descriptor.EnumDescriptor( + name='ActionType', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='PAUSE', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RESUME', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=43870, + serialized_end=43905, +) +_sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE) + +_GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS = _descriptor.EnumDescriptor( + name='ActionStatus', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ACTIVE', index=0, number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CLOSED', index=1, number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=42181, + serialized_end=42219, +) +_sym_db.RegisterEnumDescriptor(_GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS) + _PROOF = _descriptor.Descriptor( name='Proof', @@ -337,7 +412,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='core_chain_locked_height', full_name='org.dash.platform.dapi.v0.ResponseMetadata.core_chain_locked_height', index=1, number=2, type=13, cpp_type=3, label=1, @@ -358,7 +433,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='protocol_version', full_name='org.dash.platform.dapi.v0.ResponseMetadata.protocol_version', index=4, number=5, type=13, cpp_type=3, label=1, @@ -386,7 +461,7 @@ oneofs=[ ], serialized_start=273, - serialized_end=417, + serialized_end=425, ) @@ -431,8 +506,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=419, - serialized_end=495, + serialized_start=427, + serialized_end=503, ) @@ -463,8 +538,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=497, - serialized_end=556, + serialized_start=505, + serialized_end=564, ) @@ -488,8 +563,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=558, - serialized_end=592, + serialized_start=566, + serialized_end=600, ) @@ -527,8 +602,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=699, - serialized_end=748, + serialized_start=707, + serialized_end=756, ) _GETIDENTITYREQUEST = _descriptor.Descriptor( @@ -563,8 +638,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=595, - serialized_end=759, + serialized_start=603, + serialized_end=767, ) @@ -602,8 +677,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=881, - serialized_end=944, + serialized_start=889, + serialized_end=952, ) _GETIDENTITYNONCEREQUEST = _descriptor.Descriptor( @@ -638,8 +713,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=762, - serialized_end=955, + serialized_start=770, + serialized_end=963, ) @@ -684,8 +759,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1101, - serialized_end=1193, + serialized_start=1109, + serialized_end=1201, ) _GETIDENTITYCONTRACTNONCEREQUEST = _descriptor.Descriptor( @@ -720,8 +795,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=958, - serialized_end=1204, + serialized_start=966, + serialized_end=1212, ) @@ -759,8 +834,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1332, - serialized_end=1388, + serialized_start=1340, + serialized_end=1396, ) _GETIDENTITYBALANCEREQUEST = _descriptor.Descriptor( @@ -795,8 +870,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1207, - serialized_end=1399, + serialized_start=1215, + serialized_end=1407, ) @@ -834,8 +909,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1560, - serialized_end=1627, + serialized_start=1568, + serialized_end=1635, ) _GETIDENTITYBALANCEANDREVISIONREQUEST = _descriptor.Descriptor( @@ -870,8 +945,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1402, - serialized_end=1638, + serialized_start=1410, + serialized_end=1646, ) @@ -921,8 +996,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1749, - serialized_end=1916, + serialized_start=1757, + serialized_end=1924, ) _GETIDENTITYRESPONSE = _descriptor.Descriptor( @@ -957,8 +1032,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1641, - serialized_end=1927, + serialized_start=1649, + serialized_end=1935, ) @@ -976,7 +1051,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, @@ -1008,8 +1083,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2053, - serialized_end=2231, + serialized_start=2061, + serialized_end=2243, ) _GETIDENTITYNONCERESPONSE = _descriptor.Descriptor( @@ -1044,8 +1119,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1930, - serialized_end=2242, + serialized_start=1938, + serialized_end=2254, ) @@ -1063,7 +1138,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, @@ -1095,8 +1170,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2392, - serialized_end=2587, + serialized_start=2404, + serialized_end=2603, ) _GETIDENTITYCONTRACTNONCERESPONSE = _descriptor.Descriptor( @@ -1131,8 +1206,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2245, - serialized_end=2598, + serialized_start=2257, + serialized_end=2614, ) @@ -1150,7 +1225,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, @@ -1182,8 +1257,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2730, - serialized_end=2903, + serialized_start=2746, + serialized_end=2923, ) _GETIDENTITYBALANCERESPONSE = _descriptor.Descriptor( @@ -1218,8 +1293,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2601, - serialized_end=2914, + serialized_start=2617, + serialized_end=2934, ) @@ -1237,14 +1312,14 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='revision', full_name='org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.revision', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -1257,8 +1332,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3394, - serialized_end=3449, + serialized_start=3414, + serialized_end=3477, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0 = _descriptor.Descriptor( @@ -1307,8 +1382,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3079, - serialized_end=3459, + serialized_start=3099, + serialized_end=3487, ) _GETIDENTITYBALANCEANDREVISIONRESPONSE = _descriptor.Descriptor( @@ -1343,8 +1418,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=2917, - serialized_end=3470, + serialized_start=2937, + serialized_end=3498, ) @@ -1394,8 +1469,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=3473, - serialized_end=3682, + serialized_start=3501, + serialized_end=3710, ) @@ -1419,8 +1494,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3684, - serialized_end=3693, + serialized_start=3712, + serialized_end=3721, ) @@ -1451,8 +1526,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3695, - serialized_end=3726, + serialized_start=3723, + serialized_end=3754, ) @@ -1490,8 +1565,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3817, - serialized_end=3911, + serialized_start=3845, + serialized_end=3939, ) _SEARCHKEY = _descriptor.Descriptor( @@ -1521,8 +1596,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3729, - serialized_end=3911, + serialized_start=3757, + serialized_end=3939, ) @@ -1560,8 +1635,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4029, - serialized_end=4148, + serialized_start=4057, + serialized_end=4176, ) _SECURITYLEVELMAP = _descriptor.Descriptor( @@ -1592,8 +1667,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3914, - serialized_end=4233, + serialized_start=3942, + serialized_end=4261, ) @@ -1652,8 +1727,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4353, - serialized_end=4571, + serialized_start=4381, + serialized_end=4599, ) _GETIDENTITYKEYSREQUEST = _descriptor.Descriptor( @@ -1688,8 +1763,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4236, - serialized_end=4582, + serialized_start=4264, + serialized_end=4610, ) @@ -1720,8 +1795,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4947, - serialized_end=4973, + serialized_start=4975, + serialized_end=5001, ) _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0 = _descriptor.Descriptor( @@ -1770,8 +1845,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4705, - serialized_end=4983, + serialized_start=4733, + serialized_end=5011, ) _GETIDENTITYKEYSRESPONSE = _descriptor.Descriptor( @@ -1806,8 +1881,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4585, - serialized_end=4994, + serialized_start=4613, + serialized_end=5022, ) @@ -1871,8 +1946,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5144, - serialized_end=5353, + serialized_start=5172, + serialized_end=5381, ) _GETIDENTITIESCONTRACTKEYSREQUEST = _descriptor.Descriptor( @@ -1907,8 +1982,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4997, - serialized_end=5364, + serialized_start=5025, + serialized_end=5392, ) @@ -1946,8 +2021,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5811, - serialized_end=5900, + serialized_start=5839, + serialized_end=5928, ) _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS = _descriptor.Descriptor( @@ -1984,8 +2059,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=5903, - serialized_end=6062, + serialized_start=5931, + serialized_end=6090, ) _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS = _descriptor.Descriptor( @@ -2015,8 +2090,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6065, - serialized_end=6209, + serialized_start=6093, + serialized_end=6237, ) _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0 = _descriptor.Descriptor( @@ -2065,8 +2140,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5517, - serialized_end=6219, + serialized_start=5545, + serialized_end=6247, ) _GETIDENTITIESCONTRACTKEYSRESPONSE = _descriptor.Descriptor( @@ -2101,8 +2176,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5367, - serialized_end=6230, + serialized_start=5395, + serialized_end=6258, ) @@ -2152,8 +2227,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6410, - serialized_end=6514, + serialized_start=6438, + serialized_end=6542, ) _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST = _descriptor.Descriptor( @@ -2188,8 +2263,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6233, - serialized_end=6525, + serialized_start=6261, + serialized_end=6553, ) @@ -2214,7 +2289,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -2227,8 +2302,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7031, - serialized_end=7090, + serialized_start=7059, + serialized_end=7122, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODESPROPOSEDBLOCKS = _descriptor.Descriptor( @@ -2258,8 +2333,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7093, - serialized_end=7289, + serialized_start=7125, + serialized_end=7321, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0 = _descriptor.Descriptor( @@ -2308,8 +2383,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6693, - serialized_end=7299, + serialized_start=6721, + serialized_end=7331, ) _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE = _descriptor.Descriptor( @@ -2344,8 +2419,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=6528, - serialized_end=7310, + serialized_start=6556, + serialized_end=7342, ) @@ -2419,8 +2494,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7497, - serialized_end=7672, + serialized_start=7529, + serialized_end=7704, ) _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST = _descriptor.Descriptor( @@ -2455,8 +2530,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7313, - serialized_end=7683, + serialized_start=7345, + serialized_end=7715, ) @@ -2494,8 +2569,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7820, - serialized_end=7880, + serialized_start=7852, + serialized_end=7912, ) _GETIDENTITIESBALANCESREQUEST = _descriptor.Descriptor( @@ -2530,8 +2605,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7686, - serialized_end=7891, + serialized_start=7718, + serialized_end=7923, ) @@ -2556,7 +2631,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -2574,8 +2649,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8322, - serialized_end=8394, + serialized_start=8354, + serialized_end=8430, ) _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITIESBALANCES = _descriptor.Descriptor( @@ -2605,8 +2680,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8397, - serialized_end=8540, + serialized_start=8433, + serialized_end=8576, ) _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0 = _descriptor.Descriptor( @@ -2655,8 +2730,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8032, - serialized_end=8550, + serialized_start=8064, + serialized_end=8586, ) _GETIDENTITIESBALANCESRESPONSE = _descriptor.Descriptor( @@ -2691,8 +2766,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7894, - serialized_end=8561, + serialized_start=7926, + serialized_end=8597, ) @@ -2752,8 +2827,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9081, - serialized_end=9422, + serialized_start=9468, + serialized_end=9809, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST = _descriptor.Descriptor( @@ -2791,8 +2866,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9425, - serialized_end=9634, + serialized_start=9812, + serialized_end=10021, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST = _descriptor.Descriptor( @@ -2822,8 +2897,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9636, - serialized_end=9674, + serialized_start=10023, + serialized_end=10061, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST_CONTESTEDRESOURCEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -2881,8 +2956,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9867, - serialized_end=10020, + serialized_start=10254, + serialized_end=10407, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST = _descriptor.Descriptor( @@ -2917,8 +2992,115 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=9677, - serialized_end=10036, + serialized_start=10064, + serialized_end=10423, +) + +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENBALANCEREQUEST = _descriptor.Descriptor( + name='IdentityTokenBalanceRequest', + full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.identity_id', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10425, + serialized_end=10493, +) + +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENINFOREQUEST = _descriptor.Descriptor( + name='IdentityTokenInfoRequest', + full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.identity_id', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10495, + serialized_end=10560, +) + +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_TOKENSTATUSREQUEST = _descriptor.Descriptor( + name='TokenStatusRequest', + full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=10562, + serialized_end=10600, ) _GETPROOFSREQUEST_GETPROOFSREQUESTV0 = _descriptor.Descriptor( @@ -2957,10 +3139,31 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_token_balances', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identity_token_balances', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_token_infos', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.identity_token_infos', index=5, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='token_statuses', full_name='org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.token_statuses', index=6, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], - nested_types=[_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST, ], + nested_types=[_GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENBALANCEREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENINFOREQUEST, _GETPROOFSREQUEST_GETPROOFSREQUESTV0_TOKENSTATUSREQUEST, ], enum_types=[ ], serialized_options=None, @@ -2969,8 +3172,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8663, - serialized_end=10036, + serialized_start=8699, + serialized_end=10600, ) _GETPROOFSREQUEST = _descriptor.Descriptor( @@ -3005,8 +3208,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=8564, - serialized_end=10047, + serialized_start=8600, + serialized_end=10611, ) @@ -3049,8 +3252,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10152, - serialized_end=10297, + serialized_start=10716, + serialized_end=10861, ) _GETPROOFSRESPONSE = _descriptor.Descriptor( @@ -3085,8 +3288,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10050, - serialized_end=10308, + serialized_start=10614, + serialized_end=10872, ) @@ -3124,8 +3327,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10427, - serialized_end=10480, + serialized_start=10991, + serialized_end=11044, ) _GETDATACONTRACTREQUEST = _descriptor.Descriptor( @@ -3160,8 +3363,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10311, - serialized_end=10491, + serialized_start=10875, + serialized_end=11055, ) @@ -3211,8 +3414,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10614, - serialized_end=10790, + serialized_start=11178, + serialized_end=11354, ) _GETDATACONTRACTRESPONSE = _descriptor.Descriptor( @@ -3247,8 +3450,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10494, - serialized_end=10801, + serialized_start=11058, + serialized_end=11365, ) @@ -3286,8 +3489,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10923, - serialized_end=10978, + serialized_start=11487, + serialized_end=11542, ) _GETDATACONTRACTSREQUEST = _descriptor.Descriptor( @@ -3322,8 +3525,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10804, - serialized_end=10989, + serialized_start=11368, + serialized_end=11553, ) @@ -3361,8 +3564,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11114, - serialized_end=11205, + serialized_start=11678, + serialized_end=11769, ) _GETDATACONTRACTSRESPONSE_DATACONTRACTS = _descriptor.Descriptor( @@ -3392,8 +3595,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11207, - serialized_end=11324, + serialized_start=11771, + serialized_end=11888, ) _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0 = _descriptor.Descriptor( @@ -3442,8 +3645,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11327, - serialized_end=11572, + serialized_start=11891, + serialized_end=12136, ) _GETDATACONTRACTSRESPONSE = _descriptor.Descriptor( @@ -3478,8 +3681,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=10992, - serialized_end=11583, + serialized_start=11556, + serialized_end=12147, ) @@ -3518,7 +3721,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='prove', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prove', index=4, number=5, type=8, cpp_type=7, label=1, @@ -3538,8 +3741,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=11724, - serialized_end=11896, + serialized_start=12288, + serialized_end=12464, ) _GETDATACONTRACTHISTORYREQUEST = _descriptor.Descriptor( @@ -3574,8 +3777,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11586, - serialized_end=11907, + serialized_start=12150, + serialized_end=12475, ) @@ -3593,7 +3796,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='value', full_name='org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.value', index=1, number=2, type=12, cpp_type=9, label=1, @@ -3613,8 +3816,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12347, - serialized_end=12402, + serialized_start=12915, + serialized_end=12974, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY = _descriptor.Descriptor( @@ -3644,8 +3847,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=12405, - serialized_end=12575, + serialized_start=12977, + serialized_end=13147, ) _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0 = _descriptor.Descriptor( @@ -3694,8 +3897,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12051, - serialized_end=12585, + serialized_start=12619, + serialized_end=13157, ) _GETDATACONTRACTHISTORYRESPONSE = _descriptor.Descriptor( @@ -3730,8 +3933,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=11910, - serialized_end=12596, + serialized_start=12478, + serialized_end=13168, ) @@ -3816,8 +4019,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12707, - serialized_end=12894, + serialized_start=13279, + serialized_end=13466, ) _GETDOCUMENTSREQUEST = _descriptor.Descriptor( @@ -3852,8 +4055,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12599, - serialized_end=12905, + serialized_start=13171, + serialized_end=13477, ) @@ -3884,8 +4087,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13262, - serialized_end=13292, + serialized_start=13834, + serialized_end=13864, ) _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -3934,8 +4137,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13019, - serialized_end=13302, + serialized_start=13591, + serialized_end=13874, ) _GETDOCUMENTSRESPONSE = _descriptor.Descriptor( @@ -3970,8 +4173,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=12908, - serialized_end=13313, + serialized_start=13480, + serialized_end=13885, ) @@ -4009,8 +4212,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=13465, - serialized_end=13542, + serialized_start=14037, + serialized_end=14114, ) _GETIDENTITYBYPUBLICKEYHASHREQUEST = _descriptor.Descriptor( @@ -4045,8 +4248,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13316, - serialized_end=13553, + serialized_start=13888, + serialized_end=14125, ) @@ -4096,8 +4299,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13709, - serialized_end=13891, + serialized_start=14281, + serialized_end=14463, ) _GETIDENTITYBYPUBLICKEYHASHRESPONSE = _descriptor.Descriptor( @@ -4132,8 +4335,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13556, - serialized_end=13902, + serialized_start=14128, + serialized_end=14474, ) @@ -4171,8 +4374,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14060, - serialized_end=14145, + serialized_start=14632, + serialized_end=14717, ) _WAITFORSTATETRANSITIONRESULTREQUEST = _descriptor.Descriptor( @@ -4207,8 +4410,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=13905, - serialized_end=14156, + serialized_start=14477, + serialized_end=14728, ) @@ -4258,8 +4461,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14318, - serialized_end=14557, + serialized_start=14890, + serialized_end=15129, ) _WAITFORSTATETRANSITIONRESULTRESPONSE = _descriptor.Descriptor( @@ -4294,8 +4497,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14159, - serialized_end=14568, + serialized_start=14731, + serialized_end=15140, ) @@ -4333,8 +4536,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14696, - serialized_end=14756, + serialized_start=15268, + serialized_end=15328, ) _GETCONSENSUSPARAMSREQUEST = _descriptor.Descriptor( @@ -4369,8 +4572,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14571, - serialized_end=14767, + serialized_start=15143, + serialized_end=15339, ) @@ -4415,8 +4618,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14898, - serialized_end=14978, + serialized_start=15470, + serialized_end=15550, ) _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE = _descriptor.Descriptor( @@ -4460,8 +4663,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=14980, - serialized_end=15078, + serialized_start=15552, + serialized_end=15650, ) _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0 = _descriptor.Descriptor( @@ -4498,8 +4701,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15081, - serialized_end=15299, + serialized_start=15653, + serialized_end=15871, ) _GETCONSENSUSPARAMSRESPONSE = _descriptor.Descriptor( @@ -4534,8 +4737,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=14770, - serialized_end=15310, + serialized_start=15342, + serialized_end=15882, ) @@ -4566,8 +4769,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=15474, - serialized_end=15530, + serialized_start=16046, + serialized_end=16102, ) _GETPROTOCOLVERSIONUPGRADESTATEREQUEST = _descriptor.Descriptor( @@ -4602,8 +4805,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15313, - serialized_end=15541, + serialized_start=15885, + serialized_end=16113, ) @@ -4634,8 +4837,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16006, - serialized_end=16156, + serialized_start=16578, + serialized_end=16728, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY = _descriptor.Descriptor( @@ -4672,8 +4875,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16158, - serialized_end=16216, + serialized_start=16730, + serialized_end=16788, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0 = _descriptor.Descriptor( @@ -4722,8 +4925,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15709, - serialized_end=16226, + serialized_start=16281, + serialized_end=16798, ) _GETPROTOCOLVERSIONUPGRADESTATERESPONSE = _descriptor.Descriptor( @@ -4758,8 +4961,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=15544, - serialized_end=16237, + serialized_start=16116, + serialized_end=16809, ) @@ -4804,8 +5007,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16417, - serialized_end=16520, + serialized_start=16989, + serialized_end=17092, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST = _descriptor.Descriptor( @@ -4840,8 +5043,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16240, - serialized_end=16531, + serialized_start=16812, + serialized_end=17103, ) @@ -4872,8 +5075,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17034, - serialized_end=17209, + serialized_start=17606, + serialized_end=17781, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL = _descriptor.Descriptor( @@ -4910,8 +5113,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17211, - serialized_end=17264, + serialized_start=17783, + serialized_end=17836, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -4960,8 +5163,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16715, - serialized_end=17274, + serialized_start=17287, + serialized_end=17846, ) _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE = _descriptor.Descriptor( @@ -4996,8 +5199,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=16534, - serialized_end=17285, + serialized_start=17106, + serialized_end=17857, ) @@ -5049,8 +5252,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17398, - serialized_end=17522, + serialized_start=17970, + serialized_end=18094, ) _GETEPOCHSINFOREQUEST = _descriptor.Descriptor( @@ -5085,8 +5288,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17288, - serialized_end=17533, + serialized_start=17860, + serialized_end=18105, ) @@ -5117,8 +5320,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=17894, - serialized_end=18011, + serialized_start=18466, + serialized_end=18583, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO = _descriptor.Descriptor( @@ -5142,7 +5345,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='first_core_block_height', full_name='org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.first_core_block_height', index=2, number=3, type=13, cpp_type=3, label=1, @@ -5156,7 +5359,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='fee_multiplier', full_name='org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.fee_multiplier', index=4, number=5, type=1, cpp_type=5, label=1, @@ -5183,8 +5386,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18014, - serialized_end=18172, + serialized_start=18586, + serialized_end=18752, ) _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0 = _descriptor.Descriptor( @@ -5233,8 +5436,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17650, - serialized_end=18182, + serialized_start=18222, + serialized_end=18762, ) _GETEPOCHSINFORESPONSE = _descriptor.Descriptor( @@ -5269,8 +5472,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=17536, - serialized_end=18193, + serialized_start=18108, + serialized_end=18773, ) @@ -5308,8 +5511,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=18688, - serialized_end=18757, + serialized_start=19268, + serialized_end=19337, ) _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0 = _descriptor.Descriptor( @@ -5405,8 +5608,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18331, - serialized_end=18791, + serialized_start=18911, + serialized_end=19371, ) _GETCONTESTEDRESOURCESREQUEST = _descriptor.Descriptor( @@ -5441,8 +5644,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18196, - serialized_end=18802, + serialized_start=18776, + serialized_end=19382, ) @@ -5473,8 +5676,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19244, - serialized_end=19304, + serialized_start=19824, + serialized_end=19884, ) _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0 = _descriptor.Descriptor( @@ -5523,8 +5726,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18943, - serialized_end=19314, + serialized_start=19523, + serialized_end=19894, ) _GETCONTESTEDRESOURCESRESPONSE = _descriptor.Descriptor( @@ -5559,8 +5762,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=18805, - serialized_end=19325, + serialized_start=19385, + serialized_end=19905, ) @@ -5578,7 +5781,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='start_time_included', full_name='org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.start_time_included', index=1, number=2, type=8, cpp_type=7, label=1, @@ -5598,8 +5801,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19838, - serialized_end=19907, + serialized_start=20418, + serialized_end=20491, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO = _descriptor.Descriptor( @@ -5616,7 +5819,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='end_time_included', full_name='org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.end_time_included', index=1, number=2, type=8, cpp_type=7, label=1, @@ -5636,8 +5839,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=19909, - serialized_end=19972, + serialized_start=20493, + serialized_end=20560, ) _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0 = _descriptor.Descriptor( @@ -5722,8 +5925,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19463, - serialized_end=20031, + serialized_start=20043, + serialized_end=20619, ) _GETVOTEPOLLSBYENDDATEREQUEST = _descriptor.Descriptor( @@ -5758,8 +5961,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=19328, - serialized_end=20042, + serialized_start=19908, + serialized_end=20630, ) @@ -5777,7 +5980,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='serialized_vote_polls', full_name='org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serialized_vote_polls', index=1, number=2, type=12, cpp_type=9, label=3, @@ -5797,8 +6000,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20491, - serialized_end=20573, + serialized_start=21079, + serialized_end=21165, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMPS = _descriptor.Descriptor( @@ -5835,8 +6038,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=20576, - serialized_end=20791, + serialized_start=21168, + serialized_end=21383, ) _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0 = _descriptor.Descriptor( @@ -5885,8 +6088,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20183, - serialized_end=20801, + serialized_start=20771, + serialized_end=21393, ) _GETVOTEPOLLSBYENDDATERESPONSE = _descriptor.Descriptor( @@ -5921,8 +6124,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20045, - serialized_end=20812, + serialized_start=20633, + serialized_end=21404, ) @@ -5960,8 +6163,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=21501, - serialized_end=21585, + serialized_start=22093, + serialized_end=22177, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0 = _descriptor.Descriptor( @@ -6058,8 +6261,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20974, - serialized_end=21699, + serialized_start=21566, + serialized_end=22291, ) _GETCONTESTEDRESOURCEVOTESTATEREQUEST = _descriptor.Descriptor( @@ -6094,8 +6297,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=20815, - serialized_end=21710, + serialized_start=21407, + serialized_end=22302, ) @@ -6127,7 +6330,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='finished_at_core_block_height', full_name='org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.finished_at_core_block_height', index=3, number=4, type=13, cpp_type=3, label=1, @@ -6141,7 +6344,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='finished_at_epoch', full_name='org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.finished_at_epoch', index=5, number=6, type=13, cpp_type=3, label=1, @@ -6167,8 +6370,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22210, - serialized_end=22676, + serialized_start=22802, + serialized_end=23276, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTESTEDRESOURCECONTENDERS = _descriptor.Descriptor( @@ -6234,8 +6437,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=22679, - serialized_end=23131, + serialized_start=23279, + serialized_end=23731, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTENDER = _descriptor.Descriptor( @@ -6289,8 +6492,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23133, - serialized_end=23240, + serialized_start=23733, + serialized_end=23840, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0 = _descriptor.Descriptor( @@ -6339,8 +6542,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21875, - serialized_end=23250, + serialized_start=22467, + serialized_end=23850, ) _GETCONTESTEDRESOURCEVOTESTATERESPONSE = _descriptor.Descriptor( @@ -6375,8 +6578,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=21713, - serialized_end=23261, + serialized_start=22305, + serialized_end=23861, ) @@ -6414,8 +6617,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=21501, - serialized_end=21585, + serialized_start=22093, + serialized_end=22177, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0 = _descriptor.Descriptor( @@ -6511,8 +6714,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23448, - serialized_end=23978, + serialized_start=24048, + serialized_end=24578, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST = _descriptor.Descriptor( @@ -6547,8 +6750,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23264, - serialized_end=23989, + serialized_start=23864, + serialized_end=24589, ) @@ -6586,8 +6789,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=24529, - serialized_end=24596, + serialized_start=25129, + serialized_end=25196, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0 = _descriptor.Descriptor( @@ -6636,8 +6839,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24179, - serialized_end=24606, + serialized_start=24779, + serialized_end=25206, ) _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE = _descriptor.Descriptor( @@ -6672,8 +6875,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=23992, - serialized_end=24617, + serialized_start=24592, + serialized_end=25217, ) @@ -6711,8 +6914,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=25166, - serialized_end=25263, + serialized_start=25766, + serialized_end=25863, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0 = _descriptor.Descriptor( @@ -6782,8 +6985,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24791, - serialized_end=25294, + serialized_start=25391, + serialized_end=25894, ) _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST = _descriptor.Descriptor( @@ -6818,8 +7021,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=24620, - serialized_end=25305, + serialized_start=25220, + serialized_end=25905, ) @@ -6857,8 +7060,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=25808, - serialized_end=26055, + serialized_start=26408, + serialized_end=26655, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE = _descriptor.Descriptor( @@ -6901,8 +7104,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26058, - serialized_end=26359, + serialized_start=26658, + serialized_end=26959, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTE = _descriptor.Descriptor( @@ -6953,8 +7156,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26362, - serialized_end=26639, + serialized_start=26962, + serialized_end=27239, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0 = _descriptor.Descriptor( @@ -7003,8 +7206,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25482, - serialized_end=26649, + serialized_start=26082, + serialized_end=27249, ) _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE = _descriptor.Descriptor( @@ -7039,8 +7242,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=25308, - serialized_end=26660, + serialized_start=25908, + serialized_end=27260, ) @@ -7078,8 +7281,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=26824, - serialized_end=26892, + serialized_start=27424, + serialized_end=27492, ) _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST = _descriptor.Descriptor( @@ -7114,8 +7317,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26663, - serialized_end=26903, + serialized_start=27263, + serialized_end=27503, ) @@ -7133,7 +7336,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='proof', full_name='org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, @@ -7165,8 +7368,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27071, - serialized_end=27256, + serialized_start=27671, + serialized_end=27860, ) _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE = _descriptor.Descriptor( @@ -7201,8 +7404,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=26906, - serialized_end=27267, + serialized_start=27506, + serialized_end=27871, ) @@ -7233,8 +7436,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27416, - serialized_end=27467, + serialized_start=28020, + serialized_end=28071, ) _GETTOTALCREDITSINPLATFORMREQUEST = _descriptor.Descriptor( @@ -7269,8 +7472,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27270, - serialized_end=27478, + serialized_start=27874, + serialized_end=28082, ) @@ -7288,7 +7491,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='proof', full_name='org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.proof', index=1, number=2, type=11, cpp_type=10, label=1, @@ -7320,8 +7523,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27631, - serialized_end=27811, + serialized_start=28235, + serialized_end=28419, ) _GETTOTALCREDITSINPLATFORMRESPONSE = _descriptor.Descriptor( @@ -7356,8 +7559,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27481, - serialized_end=27822, + serialized_start=28085, + serialized_end=28430, ) @@ -7402,8 +7605,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=27941, - serialized_end=28010, + serialized_start=28549, + serialized_end=28618, ) _GETPATHELEMENTSREQUEST = _descriptor.Descriptor( @@ -7438,8 +7641,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=27825, - serialized_end=28021, + serialized_start=28433, + serialized_end=28629, ) @@ -7470,8 +7673,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28394, - serialized_end=28422, + serialized_start=29002, + serialized_end=29030, ) _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0 = _descriptor.Descriptor( @@ -7520,8 +7723,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28144, - serialized_end=28432, + serialized_start=28752, + serialized_end=29040, ) _GETPATHELEMENTSRESPONSE = _descriptor.Descriptor( @@ -7556,8 +7759,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28024, - serialized_end=28443, + serialized_start=28632, + serialized_end=29051, ) @@ -7581,8 +7784,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28544, - serialized_end=28564, + serialized_start=29152, + serialized_end=29172, ) _GETSTATUSREQUEST = _descriptor.Descriptor( @@ -7617,8 +7820,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28446, - serialized_end=28575, + serialized_start=29054, + serialized_end=29183, ) @@ -7673,8 +7876,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29452, - serialized_end=29546, + serialized_start=30060, + serialized_end=30154, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_TENDERDASH = _descriptor.Descriptor( @@ -7711,8 +7914,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29779, - serialized_end=29819, + serialized_start=30387, + serialized_end=30427, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_DRIVE = _descriptor.Descriptor( @@ -7749,8 +7952,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29821, - serialized_end=29861, + serialized_start=30429, + serialized_end=30469, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL = _descriptor.Descriptor( @@ -7787,8 +7990,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29549, - serialized_end=29861, + serialized_start=30157, + serialized_end=30469, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION = _descriptor.Descriptor( @@ -7825,8 +8028,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=29239, - serialized_end=29861, + serialized_start=29847, + serialized_end=30469, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME = _descriptor.Descriptor( @@ -7843,21 +8046,21 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='block', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.block', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='genesis', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.genesis', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='epoch', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.epoch', index=3, number=4, type=13, cpp_type=3, label=1, @@ -7892,8 +8095,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29863, - serialized_end=29978, + serialized_start=30471, + serialized_end=30598, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NODE = _descriptor.Descriptor( @@ -7935,8 +8138,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=29980, - serialized_end=30040, + serialized_start=30600, + serialized_end=30660, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN = _descriptor.Descriptor( @@ -7974,7 +8177,7 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='earliest_block_hash', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.earliest_block_hash', index=4, number=5, type=12, cpp_type=9, label=1, @@ -7995,14 +8198,14 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='max_peer_block_height', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.max_peer_block_height', index=7, number=9, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='core_chain_locked_height', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.core_chain_locked_height', index=8, number=10, type=13, cpp_type=3, label=1, @@ -8027,8 +8230,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30043, - serialized_end=30338, + serialized_start=30663, + serialized_end=30970, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NETWORK = _descriptor.Descriptor( @@ -8072,8 +8275,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30340, - serialized_end=30407, + serialized_start=30972, + serialized_end=31039, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC = _descriptor.Descriptor( @@ -8090,14 +8293,14 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='remaining_time', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.remaining_time', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='total_snapshots', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.total_snapshots', index=2, number=3, type=13, cpp_type=3, label=1, @@ -8111,35 +8314,35 @@ has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='snapshot_height', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.snapshot_height', index=4, number=5, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='snapshot_chunks_count', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.snapshot_chunks_count', index=5, number=6, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='backfilled_blocks', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.backfilled_blocks', index=6, number=7, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( name='backfill_blocks_total', full_name='org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.backfill_blocks_total', index=7, number=8, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], @@ -8152,8 +8355,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30410, - serialized_end=30643, + serialized_start=31042, + serialized_end=31303, ) _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0 = _descriptor.Descriptor( @@ -8218,8 +8421,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=28680, - serialized_end=30643, + serialized_start=29288, + serialized_end=31303, ) _GETSTATUSRESPONSE = _descriptor.Descriptor( @@ -8254,8 +8457,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=28578, - serialized_end=30654, + serialized_start=29186, + serialized_end=31314, ) @@ -8279,8 +8482,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30791, - serialized_end=30823, + serialized_start=31451, + serialized_end=31483, ) _GETCURRENTQUORUMSINFOREQUEST = _descriptor.Descriptor( @@ -8315,8 +8518,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30657, - serialized_end=30834, + serialized_start=31317, + serialized_end=31494, ) @@ -8361,8 +8564,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30974, - serialized_end=31044, + serialized_start=31634, + serialized_end=31704, ) _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0 = _descriptor.Descriptor( @@ -8413,8 +8616,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31047, - serialized_end=31222, + serialized_start=31707, + serialized_end=31882, ) _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0 = _descriptor.Descriptor( @@ -8472,8 +8675,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=31225, - serialized_end=31499, + serialized_start=31885, + serialized_end=32159, ) _GETCURRENTQUORUMSINFORESPONSE = _descriptor.Descriptor( @@ -8508,78 +8711,3832 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=30837, - serialized_end=31510, + serialized_start=31497, + serialized_end=32170, ) -_GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST -_GETIDENTITYREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0 -_GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITYREQUEST.fields_by_name['v0']) -_GETIDENTITYREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYREQUEST.oneofs_by_name['version'] -_GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0.containing_type = _GETIDENTITYNONCEREQUEST -_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0 -_GETIDENTITYNONCEREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITYNONCEREQUEST.fields_by_name['v0']) -_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCEREQUEST.oneofs_by_name['version'] -_GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0.containing_type = _GETIDENTITYCONTRACTNONCEREQUEST -_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0 -_GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0']) -_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'] -_GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0.containing_type = _GETIDENTITYBALANCEREQUEST -_GETIDENTITYBALANCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0 -_GETIDENTITYBALANCEREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITYBALANCEREQUEST.fields_by_name['v0']) -_GETIDENTITYBALANCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYBALANCEREQUEST.oneofs_by_name['version'] -_GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0.containing_type = _GETIDENTITYBALANCEANDREVISIONREQUEST -_GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0 -_GETIDENTITYBALANCEANDREVISIONREQUEST.oneofs_by_name['version'].fields.append( - _GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0']) -_GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYBALANCEANDREVISIONREQUEST.oneofs_by_name['version'] -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.containing_type = _GETIDENTITYRESPONSE -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['identity']) -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['identity'].containing_oneof = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof']) -_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0 -_GETIDENTITYRESPONSE.oneofs_by_name['version'].fields.append( - _GETIDENTITYRESPONSE.fields_by_name['v0']) -_GETIDENTITYRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYRESPONSE.oneofs_by_name['version'] -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.containing_type = _GETIDENTITYNONCERESPONSE -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce']) -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof']) -_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0 -_GETIDENTITYNONCERESPONSE.oneofs_by_name['version'].fields.append( - _GETIDENTITYNONCERESPONSE.fields_by_name['v0']) -_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCERESPONSE.oneofs_by_name['version'] -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.containing_type = _GETIDENTITYCONTRACTNONCERESPONSE -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce']) -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( - _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof']) -_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] -_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0 -_GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'].fields.append( - _GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0']) -_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'] -_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF -_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA -_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.containing_type = _GETIDENTITYBALANCERESPONSE -_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.oneofs_by_name['result'].fields.append( + +_GETIDENTITYTOKENBALANCESREQUEST_GETIDENTITYTOKENBALANCESREQUESTV0 = _descriptor.Descriptor( + name='GetIdentityTokenBalancesRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='token_ids', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.token_ids', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=32316, + serialized_end=32406, +) + +_GETIDENTITYTOKENBALANCESREQUEST = _descriptor.Descriptor( + name='GetIdentityTokenBalancesRequest', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENBALANCESREQUEST_GETIDENTITYTOKENBALANCESREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=32173, + serialized_end=32417, +) + + +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY = _descriptor.Descriptor( + name='TokenBalanceEntry', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='balance', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.balance', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_balance', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry._balance', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=32856, + serialized_end=32927, +) + +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES = _descriptor.Descriptor( + name='TokenBalances', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_balances', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.token_balances', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=32930, + serialized_end=33084, +) + +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0 = _descriptor.Descriptor( + name='GetIdentityTokenBalancesResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_balances', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.token_balances', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY, _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=32567, + serialized_end=33094, +) + +_GETIDENTITYTOKENBALANCESRESPONSE = _descriptor.Descriptor( + name='GetIdentityTokenBalancesResponse', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=32420, + serialized_end=33105, +) + + +_GETIDENTITIESTOKENBALANCESREQUEST_GETIDENTITIESTOKENBALANCESREQUESTV0 = _descriptor.Descriptor( + name='GetIdentitiesTokenBalancesRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.identity_ids', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=33257, + serialized_end=33349, +) + +_GETIDENTITIESTOKENBALANCESREQUEST = _descriptor.Descriptor( + name='GetIdentitiesTokenBalancesRequest', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENBALANCESREQUEST_GETIDENTITIESTOKENBALANCESREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=33108, + serialized_end=33360, +) + + +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY = _descriptor.Descriptor( + name='IdentityTokenBalanceEntry', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='balance', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.balance', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_balance', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry._balance', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=33828, + serialized_end=33910, +) + +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES = _descriptor.Descriptor( + name='IdentityTokenBalances', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_token_balances', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.identity_token_balances', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=33913, + serialized_end=34096, +) + +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0 = _descriptor.Descriptor( + name='GetIdentitiesTokenBalancesResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_token_balances', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.identity_token_balances', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY, _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=33516, + serialized_end=34106, +) + +_GETIDENTITIESTOKENBALANCESRESPONSE = _descriptor.Descriptor( + name='GetIdentitiesTokenBalancesResponse', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=33363, + serialized_end=34117, +) + + +_GETIDENTITYTOKENINFOSREQUEST_GETIDENTITYTOKENINFOSREQUESTV0 = _descriptor.Descriptor( + name='GetIdentityTokenInfosRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='token_ids', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.token_ids', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=34254, + serialized_end=34341, +) + +_GETIDENTITYTOKENINFOSREQUEST = _descriptor.Descriptor( + name='GetIdentityTokenInfosRequest', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENINFOSREQUEST_GETIDENTITYTOKENINFOSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=34120, + serialized_end=34352, +) + + +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY = _descriptor.Descriptor( + name='TokenIdentityInfoEntry', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='frozen', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.frozen', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=34766, + serialized_end=34806, +) + +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY = _descriptor.Descriptor( + name='TokenInfoEntry', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='info', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.info', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_info', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry._info', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=34809, + serialized_end=34985, +) + +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS = _descriptor.Descriptor( + name='TokenInfos', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_infos', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.token_infos', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=34988, + serialized_end=35126, +) + +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 = _descriptor.Descriptor( + name='GetIdentityTokenInfosResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_infos', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.token_infos', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY, _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY, _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=34493, + serialized_end=35136, +) + +_GETIDENTITYTOKENINFOSRESPONSE = _descriptor.Descriptor( + name='GetIdentityTokenInfosResponse', + full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=34355, + serialized_end=35147, +) + + +_GETIDENTITIESTOKENINFOSREQUEST_GETIDENTITIESTOKENINFOSREQUESTV0 = _descriptor.Descriptor( + name='GetIdentitiesTokenInfosRequestV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='identity_ids', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.identity_ids', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=35290, + serialized_end=35379, +) + +_GETIDENTITIESTOKENINFOSREQUEST = _descriptor.Descriptor( + name='GetIdentitiesTokenInfosRequest', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENINFOSREQUEST_GETIDENTITIESTOKENINFOSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=35150, + serialized_end=35390, +) + + +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY = _descriptor.Descriptor( + name='TokenIdentityInfoEntry', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='frozen', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.frozen', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=34766, + serialized_end=34806, +) + +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY = _descriptor.Descriptor( + name='TokenInfoEntry', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_id', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.identity_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='info', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.info', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_info', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry._info', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=35877, + serialized_end=36060, +) + +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS = _descriptor.Descriptor( + name='IdentityTokenInfos', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_infos', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.token_infos', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=36063, + serialized_end=36214, +) + +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 = _descriptor.Descriptor( + name='GetIdentitiesTokenInfosResponseV0', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='identity_token_infos', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.identity_token_infos', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY, _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY, _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=35537, + serialized_end=36224, +) + +_GETIDENTITIESTOKENINFOSRESPONSE = _descriptor.Descriptor( + name='GetIdentitiesTokenInfosResponse', + full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=35393, + serialized_end=36235, +) + + +_GETTOKENSTATUSESREQUEST_GETTOKENSTATUSESREQUESTV0 = _descriptor.Descriptor( + name='GetTokenStatusesRequestV0', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_ids', full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.token_ids', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prove', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=36357, + serialized_end=36418, +) + +_GETTOKENSTATUSESREQUEST = _descriptor.Descriptor( + name='GetTokenStatusesRequest', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENSTATUSESREQUEST_GETTOKENSTATUSESREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenStatusesRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=36238, + serialized_end=36429, +) + + +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY = _descriptor.Descriptor( + name='TokenStatusEntry', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='paused', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.paused', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_paused', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry._paused', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=36819, + serialized_end=36887, +) + +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES = _descriptor.Descriptor( + name='TokenStatuses', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_statuses', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.token_statuses', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=36890, + serialized_end=37026, +) + +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0 = _descriptor.Descriptor( + name='GetTokenStatusesResponseV0', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_statuses', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.token_statuses', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY, _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=36555, + serialized_end=37036, +) + +_GETTOKENSTATUSESRESPONSE = _descriptor.Descriptor( + name='GetTokenStatusesResponse', + full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenStatusesResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=36432, + serialized_end=37047, +) + + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO = _descriptor.Descriptor( + name='StartAtInfo', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start_time_ms', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.start_time_ms', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_recipient', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.start_recipient', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_recipient_included', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.start_recipient_included', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_start_recipient', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo._start_recipient', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_start_recipient_included', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo._start_recipient_included', + index=1, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=37480, + serialized_end=37634, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0 = _descriptor.Descriptor( + name='GetTokenPreProgrammedDistributionsRequestV0', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_at_info', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.start_at_info', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='limit', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.limit', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prove', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_start_at_info', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0._start_at_info', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_limit', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0._limit', + index=1, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=37224, + serialized_end=37662, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST = _descriptor.Descriptor( + name='GetTokenPreProgrammedDistributionsRequest', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=37050, + serialized_end=37673, +) + + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONENTRY = _descriptor.Descriptor( + name='TokenDistributionEntry', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='recipient_id', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.recipient_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='amount', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.amount', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=38184, + serialized_end=38246, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY = _descriptor.Descriptor( + name='TokenTimedDistributionEntry', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.timestamp', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='distributions', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.distributions', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=38249, + serialized_end=38461, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS = _descriptor.Descriptor( + name='TokenDistributions', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_distributions', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.token_distributions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=38464, + serialized_end=38659, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 = _descriptor.Descriptor( + name='GetTokenPreProgrammedDistributionsResponseV0', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_distributions', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.token_distributions', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONENTRY, _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY, _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=37854, + serialized_end=38669, +) + +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE = _descriptor.Descriptor( + name='GetTokenPreProgrammedDistributionsResponse', + full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=37676, + serialized_end=38680, +) + + +_GETTOKENTOTALSUPPLYREQUEST_GETTOKENTOTALSUPPLYREQUESTV0 = _descriptor.Descriptor( + name='GetTokenTotalSupplyRequestV0', + full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prove', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=38811, + serialized_end=38874, +) + +_GETTOKENTOTALSUPPLYREQUEST = _descriptor.Descriptor( + name='GetTokenTotalSupplyRequest', + full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENTOTALSUPPLYREQUEST_GETTOKENTOTALSUPPLYREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=38683, + serialized_end=38885, +) + + +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0_TOKENTOTALSUPPLYENTRY = _descriptor.Descriptor( + name='TokenTotalSupplyEntry', + full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_id', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.token_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='total_aggregated_amount_in_user_accounts', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.total_aggregated_amount_in_user_accounts', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='total_system_amount', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.total_system_amount', index=2, + number=3, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=39306, + serialized_end=39426, +) + +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0 = _descriptor.Descriptor( + name='GetTokenTotalSupplyResponseV0', + full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_total_supply', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.token_total_supply', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0_TOKENTOTALSUPPLYENTRY, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=39020, + serialized_end=39436, +) + +_GETTOKENTOTALSUPPLYRESPONSE = _descriptor.Descriptor( + name='GetTokenTotalSupplyResponse', + full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=38888, + serialized_end=39447, +) + + +_GETGROUPINFOREQUEST_GETGROUPINFOREQUESTV0 = _descriptor.Descriptor( + name='GetGroupInfoRequestV0', + full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.group_contract_position', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prove', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=39557, + serialized_end=39649, +) + +_GETGROUPINFOREQUEST = _descriptor.Descriptor( + name='GetGroupInfoRequest', + full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFOREQUEST_GETGROUPINFOREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupInfoRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=39450, + serialized_end=39660, +) + + +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPMEMBERENTRY = _descriptor.Descriptor( + name='GroupMemberEntry', + full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='member_id', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.member_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='power', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.power', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=40018, + serialized_end=40070, +) + +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY = _descriptor.Descriptor( + name='GroupInfoEntry', + full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='members', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.members', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='group_required_power', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.group_required_power', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=40073, + serialized_end=40225, +) + +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO = _descriptor.Descriptor( + name='GroupInfo', + full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_info', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.group_info', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_group_info', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo._group_info', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=40228, + serialized_end=40366, +) + +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 = _descriptor.Descriptor( + name='GetGroupInfoResponseV0', + full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_info', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.group_info', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.metadata', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPMEMBERENTRY, _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY, _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=39774, + serialized_end=40376, +) + +_GETGROUPINFORESPONSE = _descriptor.Descriptor( + name='GetGroupInfoResponse', + full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupInfoResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=39663, + serialized_end=40387, +) + + +_GETGROUPINFOSREQUEST_STARTATGROUPCONTRACTPOSITION = _descriptor.Descriptor( + name='StartAtGroupContractPosition', + full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start_group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.start_group_contract_position', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_group_contract_position_included', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.start_group_contract_position_included', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=40500, + serialized_end=40617, +) + +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0 = _descriptor.Descriptor( + name='GetGroupInfosRequestV0', + full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_at_group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.start_at_group_contract_position', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='count', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.count', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prove', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_start_at_group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0._start_at_group_contract_position', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_count', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0._count', + index=1, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=40620, + serialized_end=40872, +) + +_GETGROUPINFOSREQUEST = _descriptor.Descriptor( + name='GetGroupInfosRequest', + full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFOSREQUEST_STARTATGROUPCONTRACTPOSITION, _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupInfosRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=40390, + serialized_end=40883, +) + + +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPMEMBERENTRY = _descriptor.Descriptor( + name='GroupMemberEntry', + full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='member_id', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.member_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='power', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.power', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=40018, + serialized_end=40070, +) + +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY = _descriptor.Descriptor( + name='GroupPositionInfoEntry', + full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.group_contract_position', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='members', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.members', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='group_required_power', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.group_required_power', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=41304, + serialized_end=41499, +) + +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS = _descriptor.Descriptor( + name='GroupInfos', + full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_infos', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.group_infos', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=41502, + serialized_end=41632, +) + +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 = _descriptor.Descriptor( + name='GetGroupInfosResponseV0', + full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_infos', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.group_infos', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.metadata', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPMEMBERENTRY, _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY, _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=41000, + serialized_end=41642, +) + +_GETGROUPINFOSRESPONSE = _descriptor.Descriptor( + name='GetGroupInfosResponse', + full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupInfosResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=40886, + serialized_end=41653, +) + + +_GETGROUPACTIONSREQUEST_STARTATACTIONID = _descriptor.Descriptor( + name='StartAtActionId', + full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start_action_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.start_action_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_action_id_included', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.start_action_id_included', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=41772, + serialized_end=41848, +) + +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0 = _descriptor.Descriptor( + name='GetGroupActionsRequestV0', + full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.group_contract_position', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.status', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start_at_action_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.start_at_action_id', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='count', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.count', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prove', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_start_at_action_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0._start_at_action_id', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_count', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0._count', + index=1, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=41851, + serialized_end=42179, +) + +_GETGROUPACTIONSREQUEST = _descriptor.Descriptor( + name='GetGroupActionsRequest', + full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSREQUEST_STARTATACTIONID, _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0, ], + enum_types=[ + _GETGROUPACTIONSREQUEST_ACTIONSTATUS, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupActionsRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=41656, + serialized_end=42230, +) + + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT = _descriptor.Descriptor( + name='MintEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='amount', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.amount', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='recipient_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.recipient_id', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.public_note', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42612, + serialized_end=42703, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT = _descriptor.Descriptor( + name='BurnEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='amount', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.amount', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42705, + serialized_end=42774, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT = _descriptor.Descriptor( + name='FreezeEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='frozen_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.frozen_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42776, + serialized_end=42850, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT = _descriptor.Descriptor( + name='UnfreezeEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='frozen_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.frozen_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42852, + serialized_end=42928, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT = _descriptor.Descriptor( + name='DestroyFrozenFundsEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='frozen_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.frozen_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='amount', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.amount', index=1, + number=2, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.public_note', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42930, + serialized_end=43032, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE = _descriptor.Descriptor( + name='SharedEncryptedNote', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='sender_key_index', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.sender_key_index', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='recipient_key_index', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.recipient_key_index', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='encrypted_data', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.encrypted_data', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=43034, + serialized_end=43134, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE = _descriptor.Descriptor( + name='PersonalEncryptedNote', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='root_encryption_key_index', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.root_encryption_key_index', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='derivation_encryption_key_index', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.derivation_encryption_key_index', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='encrypted_data', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.encrypted_data', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=43136, + serialized_end=43259, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT = _descriptor.Descriptor( + name='TransferEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='recipient_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.recipient_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='shared_encrypted_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.shared_encrypted_note', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='personal_encrypted_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.personal_encrypted_note', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='amount', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.amount', index=4, + number=5, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_shared_encrypted_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent._shared_encrypted_note', + index=1, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + _descriptor.OneofDescriptor( + name='_personal_encrypted_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent._personal_encrypted_note', + index=2, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=43262, + serialized_end=43685, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT = _descriptor.Descriptor( + name='EmergencyActionEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='action_type', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.action_type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=43688, + serialized_end=43921, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT = _descriptor.Descriptor( + name='TokenConfigUpdateEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_config_update_item', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.token_config_update_item', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.public_note', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='_public_note', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent._public_note', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=43923, + serialized_end=44023, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT = _descriptor.Descriptor( + name='GroupActionEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token_event', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.token_event', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='document_event', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.document_event', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='contract_event', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.contract_event', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='event_type', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.event_type', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=44026, + serialized_end=44406, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT = _descriptor.Descriptor( + name='DocumentEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='create', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.create', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='type', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.type', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=44409, + serialized_end=44548, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT = _descriptor.Descriptor( + name='DocumentCreateEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='created_document', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.created_document', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=44550, + serialized_end=44597, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT = _descriptor.Descriptor( + name='ContractUpdateEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='updated_contract', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.updated_contract', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=44599, + serialized_end=44646, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT = _descriptor.Descriptor( + name='ContractEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='update', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.update', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='type', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.type', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=44649, + serialized_end=44788, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT = _descriptor.Descriptor( + name='TokenEvent', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='mint', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.mint', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='burn', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.burn', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='freeze', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.freeze', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='unfreeze', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.unfreeze', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='destroy_frozen_funds', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.destroy_frozen_funds', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='transfer', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.transfer', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='emergency_action', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.emergency_action', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='token_config_update', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.token_config_update', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='type', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.type', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=44791, + serialized_end=45746, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY = _descriptor.Descriptor( + name='GroupActionEntry', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='action_id', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.action_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='event', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.event', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=45749, + serialized_end=45896, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS = _descriptor.Descriptor( + name='GroupActions', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_actions', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.group_actions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=45899, + serialized_end=46031, +) + +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 = _descriptor.Descriptor( + name='GetGroupActionsResponseV0', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_actions', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.group_actions', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY, _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42353, + serialized_end=46041, +) + +_GETGROUPACTIONSRESPONSE = _descriptor.Descriptor( + name='GetGroupActionsResponse', + full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupActionsResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=42233, + serialized_end=46052, +) + + +_GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0 = _descriptor.Descriptor( + name='GetGroupActionSignersRequestV0', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='contract_id', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.contract_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='group_contract_position', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.group_contract_position', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.status', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='action_id', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.action_id', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prove', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prove', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=46190, + serialized_end=46396, +) + +_GETGROUPACTIONSIGNERSREQUEST = _descriptor.Descriptor( + name='GetGroupActionSignersRequest', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0, ], + enum_types=[ + _GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersRequest.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=46055, + serialized_end=46447, +) + + +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNER = _descriptor.Descriptor( + name='GroupActionSigner', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='signer_id', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.signer_id', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='power', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.power', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=46879, + serialized_end=46932, +) + +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS = _descriptor.Descriptor( + name='GroupActionSigners', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='signers', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.signers', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=46935, + serialized_end=47080, +) + +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0 = _descriptor.Descriptor( + name='GetGroupActionSignersResponseV0', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='group_action_signers', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.group_action_signers', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='proof', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.proof', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.metadata', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNER, _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='result', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.result', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=46588, + serialized_end=47090, +) + +_GETGROUPACTIONSIGNERSRESPONSE = _descriptor.Descriptor( + name='GetGroupActionSignersResponse', + full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='v0', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.v0', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0, ], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='version', full_name='org.dash.platform.dapi.v0.GetGroupActionSignersResponse.version', + index=0, containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=46450, + serialized_end=47101, +) + +_GETIDENTITYREQUEST_GETIDENTITYREQUESTV0.containing_type = _GETIDENTITYREQUEST +_GETIDENTITYREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0 +_GETIDENTITYREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYREQUEST.fields_by_name['v0']) +_GETIDENTITYREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYREQUEST.oneofs_by_name['version'] +_GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0.containing_type = _GETIDENTITYNONCEREQUEST +_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0 +_GETIDENTITYNONCEREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYNONCEREQUEST.fields_by_name['v0']) +_GETIDENTITYNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCEREQUEST.oneofs_by_name['version'] +_GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0.containing_type = _GETIDENTITYCONTRACTNONCEREQUEST +_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0 +_GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0']) +_GETIDENTITYCONTRACTNONCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCEREQUEST.oneofs_by_name['version'] +_GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0.containing_type = _GETIDENTITYBALANCEREQUEST +_GETIDENTITYBALANCEREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0 +_GETIDENTITYBALANCEREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYBALANCEREQUEST.fields_by_name['v0']) +_GETIDENTITYBALANCEREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYBALANCEREQUEST.oneofs_by_name['version'] +_GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0.containing_type = _GETIDENTITYBALANCEANDREVISIONREQUEST +_GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0 +_GETIDENTITYBALANCEANDREVISIONREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0']) +_GETIDENTITYBALANCEANDREVISIONREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYBALANCEANDREVISIONREQUEST.oneofs_by_name['version'] +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.containing_type = _GETIDENTITYRESPONSE +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['identity']) +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['identity'].containing_oneof = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof']) +_GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0 +_GETIDENTITYRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYRESPONSE.fields_by_name['v0']) +_GETIDENTITYRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYRESPONSE.oneofs_by_name['version'] +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.containing_type = _GETIDENTITYNONCERESPONSE +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce']) +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof']) +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0 +_GETIDENTITYNONCERESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYNONCERESPONSE.fields_by_name['v0']) +_GETIDENTITYNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYNONCERESPONSE.oneofs_by_name['version'] +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.containing_type = _GETIDENTITYCONTRACTNONCERESPONSE +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce']) +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof']) +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0 +_GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0']) +_GETIDENTITYCONTRACTNONCERESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYCONTRACTNONCERESPONSE.oneofs_by_name['version'] +_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.containing_type = _GETIDENTITYBALANCERESPONSE +_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.oneofs_by_name['result'].fields.append( _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['balance']) _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['balance'].containing_oneof = _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.oneofs_by_name['result'] _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.oneofs_by_name['result'].fields.append( @@ -8755,10 +12712,16 @@ _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST.oneofs_by_name['request_type'].fields.append( _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST.fields_by_name['contested_resource_vote_status_request']) _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST.fields_by_name['contested_resource_vote_status_request'].containing_oneof = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST.oneofs_by_name['request_type'] +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENBALANCEREQUEST.containing_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENINFOREQUEST.containing_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 +_GETPROOFSREQUEST_GETPROOFSREQUESTV0_TOKENSTATUSREQUEST.containing_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 _GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['identities'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST _GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['contracts'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST _GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['documents'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST _GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['votes'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST +_GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['identity_token_balances'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENBALANCEREQUEST +_GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['identity_token_infos'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENINFOREQUEST +_GETPROOFSREQUEST_GETPROOFSREQUESTV0.fields_by_name['token_statuses'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0_TOKENSTATUSREQUEST _GETPROOFSREQUEST_GETPROOFSREQUESTV0.containing_type = _GETPROOFSREQUEST _GETPROOFSREQUEST.fields_by_name['v0'].message_type = _GETPROOFSREQUEST_GETPROOFSREQUESTV0 _GETPROOFSREQUEST.oneofs_by_name['version'].fields.append( @@ -9289,6 +13252,411 @@ _GETCURRENTQUORUMSINFORESPONSE.oneofs_by_name['version'].fields.append( _GETCURRENTQUORUMSINFORESPONSE.fields_by_name['v0']) _GETCURRENTQUORUMSINFORESPONSE.fields_by_name['v0'].containing_oneof = _GETCURRENTQUORUMSINFORESPONSE.oneofs_by_name['version'] +_GETIDENTITYTOKENBALANCESREQUEST_GETIDENTITYTOKENBALANCESREQUESTV0.containing_type = _GETIDENTITYTOKENBALANCESREQUEST +_GETIDENTITYTOKENBALANCESREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYTOKENBALANCESREQUEST_GETIDENTITYTOKENBALANCESREQUESTV0 +_GETIDENTITYTOKENBALANCESREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYTOKENBALANCESREQUEST.fields_by_name['v0']) +_GETIDENTITYTOKENBALANCESREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYTOKENBALANCESREQUEST.oneofs_by_name['version'] +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY.containing_type = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0 +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY.oneofs_by_name['_balance'].fields.append( + _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY.fields_by_name['balance']) +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY.fields_by_name['balance'].containing_oneof = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY.oneofs_by_name['_balance'] +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES.fields_by_name['token_balances'].message_type = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES.containing_type = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0 +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['token_balances'].message_type = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.containing_type = _GETIDENTITYTOKENBALANCESRESPONSE +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['token_balances']) +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['token_balances'].containing_oneof = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['proof']) +_GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYTOKENBALANCESRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0 +_GETIDENTITYTOKENBALANCESRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYTOKENBALANCESRESPONSE.fields_by_name['v0']) +_GETIDENTITYTOKENBALANCESRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYTOKENBALANCESRESPONSE.oneofs_by_name['version'] +_GETIDENTITIESTOKENBALANCESREQUEST_GETIDENTITIESTOKENBALANCESREQUESTV0.containing_type = _GETIDENTITIESTOKENBALANCESREQUEST +_GETIDENTITIESTOKENBALANCESREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESTOKENBALANCESREQUEST_GETIDENTITIESTOKENBALANCESREQUESTV0 +_GETIDENTITIESTOKENBALANCESREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITIESTOKENBALANCESREQUEST.fields_by_name['v0']) +_GETIDENTITIESTOKENBALANCESREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITIESTOKENBALANCESREQUEST.oneofs_by_name['version'] +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY.containing_type = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0 +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY.oneofs_by_name['_balance'].fields.append( + _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY.fields_by_name['balance']) +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY.fields_by_name['balance'].containing_oneof = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY.oneofs_by_name['_balance'] +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES.fields_by_name['identity_token_balances'].message_type = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES.containing_type = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0 +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['identity_token_balances'].message_type = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.containing_type = _GETIDENTITIESTOKENBALANCESRESPONSE +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['identity_token_balances']) +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['identity_token_balances'].containing_oneof = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['proof']) +_GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESTOKENBALANCESRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0 +_GETIDENTITIESTOKENBALANCESRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITIESTOKENBALANCESRESPONSE.fields_by_name['v0']) +_GETIDENTITIESTOKENBALANCESRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESTOKENBALANCESRESPONSE.oneofs_by_name['version'] +_GETIDENTITYTOKENINFOSREQUEST_GETIDENTITYTOKENINFOSREQUESTV0.containing_type = _GETIDENTITYTOKENINFOSREQUEST +_GETIDENTITYTOKENINFOSREQUEST.fields_by_name['v0'].message_type = _GETIDENTITYTOKENINFOSREQUEST_GETIDENTITYTOKENINFOSREQUESTV0 +_GETIDENTITYTOKENINFOSREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITYTOKENINFOSREQUEST.fields_by_name['v0']) +_GETIDENTITYTOKENINFOSREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITYTOKENINFOSREQUEST.oneofs_by_name['version'] +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY.containing_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info'].message_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.containing_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.oneofs_by_name['_info'].fields.append( + _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info']) +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info'].containing_oneof = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY.oneofs_by_name['_info'] +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS.fields_by_name['token_infos'].message_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS.containing_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['token_infos'].message_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.containing_type = _GETIDENTITYTOKENINFOSRESPONSE +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['token_infos']) +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['token_infos'].containing_oneof = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['proof']) +_GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITYTOKENINFOSRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0 +_GETIDENTITYTOKENINFOSRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITYTOKENINFOSRESPONSE.fields_by_name['v0']) +_GETIDENTITYTOKENINFOSRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITYTOKENINFOSRESPONSE.oneofs_by_name['version'] +_GETIDENTITIESTOKENINFOSREQUEST_GETIDENTITIESTOKENINFOSREQUESTV0.containing_type = _GETIDENTITIESTOKENINFOSREQUEST +_GETIDENTITIESTOKENINFOSREQUEST.fields_by_name['v0'].message_type = _GETIDENTITIESTOKENINFOSREQUEST_GETIDENTITIESTOKENINFOSREQUESTV0 +_GETIDENTITIESTOKENINFOSREQUEST.oneofs_by_name['version'].fields.append( + _GETIDENTITIESTOKENINFOSREQUEST.fields_by_name['v0']) +_GETIDENTITIESTOKENINFOSREQUEST.fields_by_name['v0'].containing_oneof = _GETIDENTITIESTOKENINFOSREQUEST.oneofs_by_name['version'] +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY.containing_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info'].message_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.containing_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.oneofs_by_name['_info'].fields.append( + _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info']) +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.fields_by_name['info'].containing_oneof = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY.oneofs_by_name['_info'] +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS.fields_by_name['token_infos'].message_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS.containing_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['identity_token_infos'].message_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.containing_type = _GETIDENTITIESTOKENINFOSRESPONSE +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['identity_token_infos']) +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['identity_token_infos'].containing_oneof = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['proof']) +_GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0.oneofs_by_name['result'] +_GETIDENTITIESTOKENINFOSRESPONSE.fields_by_name['v0'].message_type = _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0 +_GETIDENTITIESTOKENINFOSRESPONSE.oneofs_by_name['version'].fields.append( + _GETIDENTITIESTOKENINFOSRESPONSE.fields_by_name['v0']) +_GETIDENTITIESTOKENINFOSRESPONSE.fields_by_name['v0'].containing_oneof = _GETIDENTITIESTOKENINFOSRESPONSE.oneofs_by_name['version'] +_GETTOKENSTATUSESREQUEST_GETTOKENSTATUSESREQUESTV0.containing_type = _GETTOKENSTATUSESREQUEST +_GETTOKENSTATUSESREQUEST.fields_by_name['v0'].message_type = _GETTOKENSTATUSESREQUEST_GETTOKENSTATUSESREQUESTV0 +_GETTOKENSTATUSESREQUEST.oneofs_by_name['version'].fields.append( + _GETTOKENSTATUSESREQUEST.fields_by_name['v0']) +_GETTOKENSTATUSESREQUEST.fields_by_name['v0'].containing_oneof = _GETTOKENSTATUSESREQUEST.oneofs_by_name['version'] +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY.containing_type = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0 +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY.oneofs_by_name['_paused'].fields.append( + _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY.fields_by_name['paused']) +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY.fields_by_name['paused'].containing_oneof = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY.oneofs_by_name['_paused'] +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES.fields_by_name['token_statuses'].message_type = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES.containing_type = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0 +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['token_statuses'].message_type = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.containing_type = _GETTOKENSTATUSESRESPONSE +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['token_statuses']) +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['token_statuses'].containing_oneof = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.oneofs_by_name['result'] +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['proof']) +_GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0.oneofs_by_name['result'] +_GETTOKENSTATUSESRESPONSE.fields_by_name['v0'].message_type = _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0 +_GETTOKENSTATUSESRESPONSE.oneofs_by_name['version'].fields.append( + _GETTOKENSTATUSESRESPONSE.fields_by_name['v0']) +_GETTOKENSTATUSESRESPONSE.fields_by_name['v0'].containing_oneof = _GETTOKENSTATUSESRESPONSE.oneofs_by_name['version'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.oneofs_by_name['_start_recipient'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.fields_by_name['start_recipient']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.fields_by_name['start_recipient'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.oneofs_by_name['_start_recipient'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.oneofs_by_name['_start_recipient_included'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.fields_by_name['start_recipient_included']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.fields_by_name['start_recipient_included'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO.oneofs_by_name['_start_recipient_included'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.fields_by_name['start_at_info'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.oneofs_by_name['_start_at_info'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.fields_by_name['start_at_info']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.fields_by_name['start_at_info'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.oneofs_by_name['_start_at_info'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.oneofs_by_name['_limit'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.fields_by_name['limit']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.fields_by_name['limit'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0.oneofs_by_name['_limit'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST.fields_by_name['v0'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST.oneofs_by_name['version'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST.fields_by_name['v0']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST.fields_by_name['v0'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST.oneofs_by_name['version'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONENTRY.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY.fields_by_name['distributions'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONENTRY +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS.fields_by_name['token_distributions'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['token_distributions'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.containing_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['token_distributions']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['token_distributions'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.oneofs_by_name['result'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['proof']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0.oneofs_by_name['result'] +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE.fields_by_name['v0'].message_type = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0 +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE.oneofs_by_name['version'].fields.append( + _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE.fields_by_name['v0']) +_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE.fields_by_name['v0'].containing_oneof = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE.oneofs_by_name['version'] +_GETTOKENTOTALSUPPLYREQUEST_GETTOKENTOTALSUPPLYREQUESTV0.containing_type = _GETTOKENTOTALSUPPLYREQUEST +_GETTOKENTOTALSUPPLYREQUEST.fields_by_name['v0'].message_type = _GETTOKENTOTALSUPPLYREQUEST_GETTOKENTOTALSUPPLYREQUESTV0 +_GETTOKENTOTALSUPPLYREQUEST.oneofs_by_name['version'].fields.append( + _GETTOKENTOTALSUPPLYREQUEST.fields_by_name['v0']) +_GETTOKENTOTALSUPPLYREQUEST.fields_by_name['v0'].containing_oneof = _GETTOKENTOTALSUPPLYREQUEST.oneofs_by_name['version'] +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0_TOKENTOTALSUPPLYENTRY.containing_type = _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0 +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['token_total_supply'].message_type = _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0_TOKENTOTALSUPPLYENTRY +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.containing_type = _GETTOKENTOTALSUPPLYRESPONSE +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['token_total_supply']) +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['token_total_supply'].containing_oneof = _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.oneofs_by_name['result'] +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['proof']) +_GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0.oneofs_by_name['result'] +_GETTOKENTOTALSUPPLYRESPONSE.fields_by_name['v0'].message_type = _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0 +_GETTOKENTOTALSUPPLYRESPONSE.oneofs_by_name['version'].fields.append( + _GETTOKENTOTALSUPPLYRESPONSE.fields_by_name['v0']) +_GETTOKENTOTALSUPPLYRESPONSE.fields_by_name['v0'].containing_oneof = _GETTOKENTOTALSUPPLYRESPONSE.oneofs_by_name['version'] +_GETGROUPINFOREQUEST_GETGROUPINFOREQUESTV0.containing_type = _GETGROUPINFOREQUEST +_GETGROUPINFOREQUEST.fields_by_name['v0'].message_type = _GETGROUPINFOREQUEST_GETGROUPINFOREQUESTV0 +_GETGROUPINFOREQUEST.oneofs_by_name['version'].fields.append( + _GETGROUPINFOREQUEST.fields_by_name['v0']) +_GETGROUPINFOREQUEST.fields_by_name['v0'].containing_oneof = _GETGROUPINFOREQUEST.oneofs_by_name['version'] +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPMEMBERENTRY.containing_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY.fields_by_name['members'].message_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPMEMBERENTRY +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY.containing_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.fields_by_name['group_info'].message_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.containing_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.oneofs_by_name['_group_info'].fields.append( + _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.fields_by_name['group_info']) +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.fields_by_name['group_info'].containing_oneof = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO.oneofs_by_name['_group_info'] +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['group_info'].message_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.containing_type = _GETGROUPINFORESPONSE +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['group_info']) +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['group_info'].containing_oneof = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.oneofs_by_name['result'] +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['proof']) +_GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.fields_by_name['proof'].containing_oneof = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0.oneofs_by_name['result'] +_GETGROUPINFORESPONSE.fields_by_name['v0'].message_type = _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0 +_GETGROUPINFORESPONSE.oneofs_by_name['version'].fields.append( + _GETGROUPINFORESPONSE.fields_by_name['v0']) +_GETGROUPINFORESPONSE.fields_by_name['v0'].containing_oneof = _GETGROUPINFORESPONSE.oneofs_by_name['version'] +_GETGROUPINFOSREQUEST_STARTATGROUPCONTRACTPOSITION.containing_type = _GETGROUPINFOSREQUEST +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.fields_by_name['start_at_group_contract_position'].message_type = _GETGROUPINFOSREQUEST_STARTATGROUPCONTRACTPOSITION +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.containing_type = _GETGROUPINFOSREQUEST +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.oneofs_by_name['_start_at_group_contract_position'].fields.append( + _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.fields_by_name['start_at_group_contract_position']) +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.fields_by_name['start_at_group_contract_position'].containing_oneof = _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.oneofs_by_name['_start_at_group_contract_position'] +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.oneofs_by_name['_count'].fields.append( + _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.fields_by_name['count']) +_GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.fields_by_name['count'].containing_oneof = _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0.oneofs_by_name['_count'] +_GETGROUPINFOSREQUEST.fields_by_name['v0'].message_type = _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0 +_GETGROUPINFOSREQUEST.oneofs_by_name['version'].fields.append( + _GETGROUPINFOSREQUEST.fields_by_name['v0']) +_GETGROUPINFOSREQUEST.fields_by_name['v0'].containing_oneof = _GETGROUPINFOSREQUEST.oneofs_by_name['version'] +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPMEMBERENTRY.containing_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY.fields_by_name['members'].message_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPMEMBERENTRY +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY.containing_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS.fields_by_name['group_infos'].message_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS.containing_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['group_infos'].message_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.containing_type = _GETGROUPINFOSRESPONSE +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['group_infos']) +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['group_infos'].containing_oneof = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['proof']) +_GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPINFOSRESPONSE.fields_by_name['v0'].message_type = _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0 +_GETGROUPINFOSRESPONSE.oneofs_by_name['version'].fields.append( + _GETGROUPINFOSRESPONSE.fields_by_name['v0']) +_GETGROUPINFOSRESPONSE.fields_by_name['v0'].containing_oneof = _GETGROUPINFOSRESPONSE.oneofs_by_name['version'] +_GETGROUPACTIONSREQUEST_STARTATACTIONID.containing_type = _GETGROUPACTIONSREQUEST +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['status'].enum_type = _GETGROUPACTIONSREQUEST_ACTIONSTATUS +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['start_at_action_id'].message_type = _GETGROUPACTIONSREQUEST_STARTATACTIONID +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.containing_type = _GETGROUPACTIONSREQUEST +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.oneofs_by_name['_start_at_action_id'].fields.append( + _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['start_at_action_id']) +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['start_at_action_id'].containing_oneof = _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.oneofs_by_name['_start_at_action_id'] +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.oneofs_by_name['_count'].fields.append( + _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['count']) +_GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.fields_by_name['count'].containing_oneof = _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0.oneofs_by_name['_count'] +_GETGROUPACTIONSREQUEST.fields_by_name['v0'].message_type = _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0 +_GETGROUPACTIONSREQUEST_ACTIONSTATUS.containing_type = _GETGROUPACTIONSREQUEST +_GETGROUPACTIONSREQUEST.oneofs_by_name['version'].fields.append( + _GETGROUPACTIONSREQUEST.fields_by_name['v0']) +_GETGROUPACTIONSREQUEST.fields_by_name['v0'].containing_oneof = _GETGROUPACTIONSREQUEST.oneofs_by_name['version'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['shared_encrypted_note'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['personal_encrypted_note'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_shared_encrypted_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['shared_encrypted_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['shared_encrypted_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_shared_encrypted_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_personal_encrypted_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['personal_encrypted_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.fields_by_name['personal_encrypted_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT.oneofs_by_name['_personal_encrypted_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.fields_by_name['action_type'].enum_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT_ACTIONTYPE.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT.oneofs_by_name['_public_note'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT.fields_by_name['public_note']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT.fields_by_name['public_note'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT.oneofs_by_name['_public_note'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['token_event'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['document_event'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['contract_event'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['token_event']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['token_event'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['document_event']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['document_event'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['contract_event']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.fields_by_name['contract_event'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT.oneofs_by_name['event_type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.fields_by_name['create'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.fields_by_name['create']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.fields_by_name['create'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.fields_by_name['update'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.fields_by_name['update']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.fields_by_name['update'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['mint'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['burn'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['freeze'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['unfreeze'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['destroy_frozen_funds'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['transfer'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['emergency_action'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['token_config_update'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['mint']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['mint'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['burn']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['burn'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['freeze']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['freeze'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['unfreeze']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['unfreeze'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['destroy_frozen_funds']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['destroy_frozen_funds'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['transfer']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['transfer'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['emergency_action']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['emergency_action'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['token_config_update']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.fields_by_name['token_config_update'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT.oneofs_by_name['type'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY.fields_by_name['event'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS.fields_by_name['group_actions'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS.containing_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['group_actions'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.containing_type = _GETGROUPACTIONSRESPONSE +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['group_actions']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['group_actions'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['proof']) +_GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPACTIONSRESPONSE.fields_by_name['v0'].message_type = _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0 +_GETGROUPACTIONSRESPONSE.oneofs_by_name['version'].fields.append( + _GETGROUPACTIONSRESPONSE.fields_by_name['v0']) +_GETGROUPACTIONSRESPONSE.fields_by_name['v0'].containing_oneof = _GETGROUPACTIONSRESPONSE.oneofs_by_name['version'] +_GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0.fields_by_name['status'].enum_type = _GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS +_GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0.containing_type = _GETGROUPACTIONSIGNERSREQUEST +_GETGROUPACTIONSIGNERSREQUEST.fields_by_name['v0'].message_type = _GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0 +_GETGROUPACTIONSIGNERSREQUEST_ACTIONSTATUS.containing_type = _GETGROUPACTIONSIGNERSREQUEST +_GETGROUPACTIONSIGNERSREQUEST.oneofs_by_name['version'].fields.append( + _GETGROUPACTIONSIGNERSREQUEST.fields_by_name['v0']) +_GETGROUPACTIONSIGNERSREQUEST.fields_by_name['v0'].containing_oneof = _GETGROUPACTIONSIGNERSREQUEST.oneofs_by_name['version'] +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNER.containing_type = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0 +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS.fields_by_name['signers'].message_type = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNER +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS.containing_type = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0 +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['group_action_signers'].message_type = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['proof'].message_type = _PROOF +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['metadata'].message_type = _RESPONSEMETADATA +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.containing_type = _GETGROUPACTIONSIGNERSRESPONSE +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['group_action_signers']) +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['group_action_signers'].containing_oneof = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.oneofs_by_name['result'].fields.append( + _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['proof']) +_GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.fields_by_name['proof'].containing_oneof = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0.oneofs_by_name['result'] +_GETGROUPACTIONSIGNERSRESPONSE.fields_by_name['v0'].message_type = _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0 +_GETGROUPACTIONSIGNERSRESPONSE.oneofs_by_name['version'].fields.append( + _GETGROUPACTIONSIGNERSRESPONSE.fields_by_name['v0']) +_GETGROUPACTIONSIGNERSRESPONSE.fields_by_name['v0'].containing_oneof = _GETGROUPACTIONSIGNERSRESPONSE.oneofs_by_name['version'] DESCRIPTOR.message_types_by_name['Proof'] = _PROOF DESCRIPTOR.message_types_by_name['ResponseMetadata'] = _RESPONSEMETADATA DESCRIPTOR.message_types_by_name['StateTransitionBroadcastError'] = _STATETRANSITIONBROADCASTERROR @@ -9360,1461 +13728,2230 @@ DESCRIPTOR.message_types_by_name['GetStatusResponse'] = _GETSTATUSRESPONSE DESCRIPTOR.message_types_by_name['GetCurrentQuorumsInfoRequest'] = _GETCURRENTQUORUMSINFOREQUEST DESCRIPTOR.message_types_by_name['GetCurrentQuorumsInfoResponse'] = _GETCURRENTQUORUMSINFORESPONSE +DESCRIPTOR.message_types_by_name['GetIdentityTokenBalancesRequest'] = _GETIDENTITYTOKENBALANCESREQUEST +DESCRIPTOR.message_types_by_name['GetIdentityTokenBalancesResponse'] = _GETIDENTITYTOKENBALANCESRESPONSE +DESCRIPTOR.message_types_by_name['GetIdentitiesTokenBalancesRequest'] = _GETIDENTITIESTOKENBALANCESREQUEST +DESCRIPTOR.message_types_by_name['GetIdentitiesTokenBalancesResponse'] = _GETIDENTITIESTOKENBALANCESRESPONSE +DESCRIPTOR.message_types_by_name['GetIdentityTokenInfosRequest'] = _GETIDENTITYTOKENINFOSREQUEST +DESCRIPTOR.message_types_by_name['GetIdentityTokenInfosResponse'] = _GETIDENTITYTOKENINFOSRESPONSE +DESCRIPTOR.message_types_by_name['GetIdentitiesTokenInfosRequest'] = _GETIDENTITIESTOKENINFOSREQUEST +DESCRIPTOR.message_types_by_name['GetIdentitiesTokenInfosResponse'] = _GETIDENTITIESTOKENINFOSRESPONSE +DESCRIPTOR.message_types_by_name['GetTokenStatusesRequest'] = _GETTOKENSTATUSESREQUEST +DESCRIPTOR.message_types_by_name['GetTokenStatusesResponse'] = _GETTOKENSTATUSESRESPONSE +DESCRIPTOR.message_types_by_name['GetTokenPreProgrammedDistributionsRequest'] = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST +DESCRIPTOR.message_types_by_name['GetTokenPreProgrammedDistributionsResponse'] = _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE +DESCRIPTOR.message_types_by_name['GetTokenTotalSupplyRequest'] = _GETTOKENTOTALSUPPLYREQUEST +DESCRIPTOR.message_types_by_name['GetTokenTotalSupplyResponse'] = _GETTOKENTOTALSUPPLYRESPONSE +DESCRIPTOR.message_types_by_name['GetGroupInfoRequest'] = _GETGROUPINFOREQUEST +DESCRIPTOR.message_types_by_name['GetGroupInfoResponse'] = _GETGROUPINFORESPONSE +DESCRIPTOR.message_types_by_name['GetGroupInfosRequest'] = _GETGROUPINFOSREQUEST +DESCRIPTOR.message_types_by_name['GetGroupInfosResponse'] = _GETGROUPINFOSRESPONSE +DESCRIPTOR.message_types_by_name['GetGroupActionsRequest'] = _GETGROUPACTIONSREQUEST +DESCRIPTOR.message_types_by_name['GetGroupActionsResponse'] = _GETGROUPACTIONSRESPONSE +DESCRIPTOR.message_types_by_name['GetGroupActionSignersRequest'] = _GETGROUPACTIONSIGNERSREQUEST +DESCRIPTOR.message_types_by_name['GetGroupActionSignersResponse'] = _GETGROUPACTIONSIGNERSRESPONSE DESCRIPTOR.enum_types_by_name['KeyPurpose'] = _KEYPURPOSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) -Proof = _reflection.GeneratedProtocolMessageType('Proof', (_message.Message,), { - 'DESCRIPTOR' : _PROOF, +Proof = _reflection.GeneratedProtocolMessageType('Proof', (_message.Message,), { + 'DESCRIPTOR' : _PROOF, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.Proof) + }) +_sym_db.RegisterMessage(Proof) + +ResponseMetadata = _reflection.GeneratedProtocolMessageType('ResponseMetadata', (_message.Message,), { + 'DESCRIPTOR' : _RESPONSEMETADATA, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.ResponseMetadata) + }) +_sym_db.RegisterMessage(ResponseMetadata) + +StateTransitionBroadcastError = _reflection.GeneratedProtocolMessageType('StateTransitionBroadcastError', (_message.Message,), { + 'DESCRIPTOR' : _STATETRANSITIONBROADCASTERROR, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.StateTransitionBroadcastError) + }) +_sym_db.RegisterMessage(StateTransitionBroadcastError) + +BroadcastStateTransitionRequest = _reflection.GeneratedProtocolMessageType('BroadcastStateTransitionRequest', (_message.Message,), { + 'DESCRIPTOR' : _BROADCASTSTATETRANSITIONREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.BroadcastStateTransitionRequest) + }) +_sym_db.RegisterMessage(BroadcastStateTransitionRequest) + +BroadcastStateTransitionResponse = _reflection.GeneratedProtocolMessageType('BroadcastStateTransitionResponse', (_message.Message,), { + 'DESCRIPTOR' : _BROADCASTSTATETRANSITIONRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.BroadcastStateTransitionResponse) + }) +_sym_db.RegisterMessage(BroadcastStateTransitionResponse) + +GetIdentityRequest = _reflection.GeneratedProtocolMessageType('GetIdentityRequest', (_message.Message,), { + + 'GetIdentityRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityRequest) + }) +_sym_db.RegisterMessage(GetIdentityRequest) +_sym_db.RegisterMessage(GetIdentityRequest.GetIdentityRequestV0) + +GetIdentityNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequest', (_message.Message,), { + + 'GetIdentityNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest) + }) +_sym_db.RegisterMessage(GetIdentityNonceRequest) +_sym_db.RegisterMessage(GetIdentityNonceRequest.GetIdentityNonceRequestV0) + +GetIdentityContractNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequest', (_message.Message,), { + + 'GetIdentityContractNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest) + }) +_sym_db.RegisterMessage(GetIdentityContractNonceRequest) +_sym_db.RegisterMessage(GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) + +GetIdentityBalanceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequest', (_message.Message,), { + + 'GetIdentityBalanceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYBALANCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceRequest) + }) +_sym_db.RegisterMessage(GetIdentityBalanceRequest) +_sym_db.RegisterMessage(GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) + +GetIdentityBalanceAndRevisionRequest = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionRequest', (_message.Message,), { + + 'GetIdentityBalanceAndRevisionRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest) + }) +_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionRequest) +_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) + +GetIdentityResponse = _reflection.GeneratedProtocolMessageType('GetIdentityResponse', (_message.Message,), { + + 'GetIdentityResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityResponse) + }) +_sym_db.RegisterMessage(GetIdentityResponse) +_sym_db.RegisterMessage(GetIdentityResponse.GetIdentityResponseV0) + +GetIdentityNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponse', (_message.Message,), { + + 'GetIdentityNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse) + }) +_sym_db.RegisterMessage(GetIdentityNonceResponse) +_sym_db.RegisterMessage(GetIdentityNonceResponse.GetIdentityNonceResponseV0) + +GetIdentityContractNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponse', (_message.Message,), { + + 'GetIdentityContractNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) + }) +_sym_db.RegisterMessage(GetIdentityContractNonceResponse) +_sym_db.RegisterMessage(GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) + +GetIdentityBalanceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponse', (_message.Message,), { + + 'GetIdentityBalanceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYBALANCERESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceResponse) + }) +_sym_db.RegisterMessage(GetIdentityBalanceResponse) +_sym_db.RegisterMessage(GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) + +GetIdentityBalanceAndRevisionResponse = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionResponse', (_message.Message,), { + + 'GetIdentityBalanceAndRevisionResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionResponseV0', (_message.Message,), { + + 'BalanceAndRevision' : _reflection.GeneratedProtocolMessageType('BalanceAndRevision', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0_BALANCEANDREVISION, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) + }) + , + 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse) + }) +_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse) +_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) +_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) + +KeyRequestType = _reflection.GeneratedProtocolMessageType('KeyRequestType', (_message.Message,), { + 'DESCRIPTOR' : _KEYREQUESTTYPE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.KeyRequestType) + }) +_sym_db.RegisterMessage(KeyRequestType) + +AllKeys = _reflection.GeneratedProtocolMessageType('AllKeys', (_message.Message,), { + 'DESCRIPTOR' : _ALLKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.AllKeys) + }) +_sym_db.RegisterMessage(AllKeys) + +SpecificKeys = _reflection.GeneratedProtocolMessageType('SpecificKeys', (_message.Message,), { + 'DESCRIPTOR' : _SPECIFICKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SpecificKeys) + }) +_sym_db.RegisterMessage(SpecificKeys) + +SearchKey = _reflection.GeneratedProtocolMessageType('SearchKey', (_message.Message,), { + + 'PurposeMapEntry' : _reflection.GeneratedProtocolMessageType('PurposeMapEntry', (_message.Message,), { + 'DESCRIPTOR' : _SEARCHKEY_PURPOSEMAPENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry) + }) + , + 'DESCRIPTOR' : _SEARCHKEY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SearchKey) + }) +_sym_db.RegisterMessage(SearchKey) +_sym_db.RegisterMessage(SearchKey.PurposeMapEntry) + +SecurityLevelMap = _reflection.GeneratedProtocolMessageType('SecurityLevelMap', (_message.Message,), { + + 'SecurityLevelMapEntry' : _reflection.GeneratedProtocolMessageType('SecurityLevelMapEntry', (_message.Message,), { + 'DESCRIPTOR' : _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry) + }) + , + 'DESCRIPTOR' : _SECURITYLEVELMAP, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SecurityLevelMap) + }) +_sym_db.RegisterMessage(SecurityLevelMap) +_sym_db.RegisterMessage(SecurityLevelMap.SecurityLevelMapEntry) + +GetIdentityKeysRequest = _reflection.GeneratedProtocolMessageType('GetIdentityKeysRequest', (_message.Message,), { + + 'GetIdentityKeysRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityKeysRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYKEYSREQUEST_GETIDENTITYKEYSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYKEYSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysRequest) + }) +_sym_db.RegisterMessage(GetIdentityKeysRequest) +_sym_db.RegisterMessage(GetIdentityKeysRequest.GetIdentityKeysRequestV0) + +GetIdentityKeysResponse = _reflection.GeneratedProtocolMessageType('GetIdentityKeysResponse', (_message.Message,), { + + 'GetIdentityKeysResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityKeysResponseV0', (_message.Message,), { + + 'Keys' : _reflection.GeneratedProtocolMessageType('Keys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0_KEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) + }) + , + 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse) + }) +_sym_db.RegisterMessage(GetIdentityKeysResponse) +_sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0) +_sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) + +GetIdentitiesContractKeysRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequest', (_message.Message,), { + + 'GetIdentitiesContractKeysRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest) + }) +_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest) +_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + +GetIdentitiesContractKeysResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponse', (_message.Message,), { + + 'GetIdentitiesContractKeysResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponseV0', (_message.Message,), { + + 'PurposeKeys' : _reflection.GeneratedProtocolMessageType('PurposeKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) + }) + , + + 'IdentityKeys' : _reflection.GeneratedProtocolMessageType('IdentityKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) + }) + , + + 'IdentitiesKeys' : _reflection.GeneratedProtocolMessageType('IdentitiesKeys', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse) + }) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) +_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) + +GetEvonodesProposedEpochBlocksByIdsRequest = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByIdsRequest', (_message.Message,), { + + 'GetEvonodesProposedEpochBlocksByIdsRequestV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByIdsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0) + }) + , + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.Proof) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest) }) -_sym_db.RegisterMessage(Proof) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByIdsRequest) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0) -ResponseMetadata = _reflection.GeneratedProtocolMessageType('ResponseMetadata', (_message.Message,), { - 'DESCRIPTOR' : _RESPONSEMETADATA, +GetEvonodesProposedEpochBlocksResponse = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksResponse', (_message.Message,), { + + 'GetEvonodesProposedEpochBlocksResponseV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksResponseV0', (_message.Message,), { + + 'EvonodeProposedBlocks' : _reflection.GeneratedProtocolMessageType('EvonodeProposedBlocks', (_message.Message,), { + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODEPROPOSEDBLOCKS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks) + }) + , + + 'EvonodesProposedBlocks' : _reflection.GeneratedProtocolMessageType('EvonodesProposedBlocks', (_message.Message,), { + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODESPROPOSEDBLOCKS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks) + }) + , + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0) + }) + , + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.ResponseMetadata) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse) }) -_sym_db.RegisterMessage(ResponseMetadata) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks) -StateTransitionBroadcastError = _reflection.GeneratedProtocolMessageType('StateTransitionBroadcastError', (_message.Message,), { - 'DESCRIPTOR' : _STATETRANSITIONBROADCASTERROR, +GetEvonodesProposedEpochBlocksByRangeRequest = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByRangeRequest', (_message.Message,), { + + 'GetEvonodesProposedEpochBlocksByRangeRequestV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByRangeRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0) + }) + , + 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.StateTransitionBroadcastError) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest) }) -_sym_db.RegisterMessage(StateTransitionBroadcastError) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByRangeRequest) +_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0) -BroadcastStateTransitionRequest = _reflection.GeneratedProtocolMessageType('BroadcastStateTransitionRequest', (_message.Message,), { - 'DESCRIPTOR' : _BROADCASTSTATETRANSITIONREQUEST, +GetIdentitiesBalancesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequest', (_message.Message,), { + + 'GetIdentitiesBalancesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.BroadcastStateTransitionRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest) }) -_sym_db.RegisterMessage(BroadcastStateTransitionRequest) +_sym_db.RegisterMessage(GetIdentitiesBalancesRequest) +_sym_db.RegisterMessage(GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) -BroadcastStateTransitionResponse = _reflection.GeneratedProtocolMessageType('BroadcastStateTransitionResponse', (_message.Message,), { - 'DESCRIPTOR' : _BROADCASTSTATETRANSITIONRESPONSE, +GetIdentitiesBalancesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesResponse', (_message.Message,), { + + 'GetIdentitiesBalancesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesResponseV0', (_message.Message,), { + + 'IdentityBalance' : _reflection.GeneratedProtocolMessageType('IdentityBalance', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITYBALANCE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance) + }) + , + + 'IdentitiesBalances' : _reflection.GeneratedProtocolMessageType('IdentitiesBalances', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITIESBALANCES, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.BroadcastStateTransitionResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse) }) -_sym_db.RegisterMessage(BroadcastStateTransitionResponse) +_sym_db.RegisterMessage(GetIdentitiesBalancesResponse) +_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0) +_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance) +_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances) -GetIdentityRequest = _reflection.GeneratedProtocolMessageType('GetIdentityRequest', (_message.Message,), { +GetProofsRequest = _reflection.GeneratedProtocolMessageType('GetProofsRequest', (_message.Message,), { - 'GetIdentityRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYREQUEST_GETIDENTITYREQUESTV0, + 'GetProofsRequestV0' : _reflection.GeneratedProtocolMessageType('GetProofsRequestV0', (_message.Message,), { + + 'DocumentRequest' : _reflection.GeneratedProtocolMessageType('DocumentRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest) + }) + , + + 'IdentityRequest' : _reflection.GeneratedProtocolMessageType('IdentityRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest) + }) + , + + 'ContractRequest' : _reflection.GeneratedProtocolMessageType('ContractRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest) + }) + , + + 'VoteStatusRequest' : _reflection.GeneratedProtocolMessageType('VoteStatusRequest', (_message.Message,), { + + 'ContestedResourceVoteStatusRequest' : _reflection.GeneratedProtocolMessageType('ContestedResourceVoteStatusRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST_CONTESTEDRESOURCEVOTESTATUSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest) + }) + , + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest) + }) + , + + 'IdentityTokenBalanceRequest' : _reflection.GeneratedProtocolMessageType('IdentityTokenBalanceRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENBALANCEREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest) + }) + , + + 'IdentityTokenInfoRequest' : _reflection.GeneratedProtocolMessageType('IdentityTokenInfoRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYTOKENINFOREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest) + }) + , + + 'TokenStatusRequest' : _reflection.GeneratedProtocolMessageType('TokenStatusRequest', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_TOKENSTATUSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest) + }) + , + 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYREQUEST, + 'DESCRIPTOR' : _GETPROOFSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest) }) -_sym_db.RegisterMessage(GetIdentityRequest) -_sym_db.RegisterMessage(GetIdentityRequest.GetIdentityRequestV0) +_sym_db.RegisterMessage(GetProofsRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.DocumentRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.IdentityRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.ContractRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.VoteStatusRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest) +_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.TokenStatusRequest) -GetIdentityNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequest', (_message.Message,), { +GetProofsResponse = _reflection.GeneratedProtocolMessageType('GetProofsResponse', (_message.Message,), { - 'GetIdentityNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST_GETIDENTITYNONCEREQUESTV0, + 'GetProofsResponseV0' : _reflection.GeneratedProtocolMessageType('GetProofsResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPROOFSRESPONSE_GETPROOFSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYNONCEREQUEST, + 'DESCRIPTOR' : _GETPROOFSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsResponse) }) -_sym_db.RegisterMessage(GetIdentityNonceRequest) -_sym_db.RegisterMessage(GetIdentityNonceRequest.GetIdentityNonceRequestV0) +_sym_db.RegisterMessage(GetProofsResponse) +_sym_db.RegisterMessage(GetProofsResponse.GetProofsResponseV0) -GetIdentityContractNonceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequest', (_message.Message,), { +GetDataContractRequest = _reflection.GeneratedProtocolMessageType('GetDataContractRequest', (_message.Message,), { - 'GetIdentityContractNonceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST_GETIDENTITYCONTRACTNONCEREQUESTV0, + 'GetDataContractRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTREQUEST_GETDATACONTRACTREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCEREQUEST, + 'DESCRIPTOR' : _GETDATACONTRACTREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractRequest) }) -_sym_db.RegisterMessage(GetIdentityContractNonceRequest) -_sym_db.RegisterMessage(GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0) +_sym_db.RegisterMessage(GetDataContractRequest) +_sym_db.RegisterMessage(GetDataContractRequest.GetDataContractRequestV0) -GetIdentityBalanceRequest = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequest', (_message.Message,), { +GetDataContractResponse = _reflection.GeneratedProtocolMessageType('GetDataContractResponse', (_message.Message,), { - 'GetIdentityBalanceRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBALANCEREQUEST_GETIDENTITYBALANCEREQUESTV0, + 'GetDataContractResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTRESPONSE_GETDATACONTRACTRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBALANCEREQUEST, + 'DESCRIPTOR' : _GETDATACONTRACTRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractResponse) }) -_sym_db.RegisterMessage(GetIdentityBalanceRequest) -_sym_db.RegisterMessage(GetIdentityBalanceRequest.GetIdentityBalanceRequestV0) +_sym_db.RegisterMessage(GetDataContractResponse) +_sym_db.RegisterMessage(GetDataContractResponse.GetDataContractResponseV0) -GetIdentityBalanceAndRevisionRequest = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionRequest', (_message.Message,), { +GetDataContractsRequest = _reflection.GeneratedProtocolMessageType('GetDataContractsRequest', (_message.Message,), { - 'GetIdentityBalanceAndRevisionRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONREQUEST_GETIDENTITYBALANCEANDREVISIONREQUESTV0, + 'GetDataContractsRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTSREQUEST_GETDATACONTRACTSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONREQUEST, + 'DESCRIPTOR' : _GETDATACONTRACTSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsRequest) }) -_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionRequest) -_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0) +_sym_db.RegisterMessage(GetDataContractsRequest) +_sym_db.RegisterMessage(GetDataContractsRequest.GetDataContractsRequestV0) -GetIdentityResponse = _reflection.GeneratedProtocolMessageType('GetIdentityResponse', (_message.Message,), { +GetDataContractsResponse = _reflection.GeneratedProtocolMessageType('GetDataContractsResponse', (_message.Message,), { + + 'DataContractEntry' : _reflection.GeneratedProtocolMessageType('DataContractEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_DATACONTRACTENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry) + }) + , + + 'DataContracts' : _reflection.GeneratedProtocolMessageType('DataContracts', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_DATACONTRACTS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts) + }) + , - 'GetIdentityResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYRESPONSE_GETIDENTITYRESPONSEV0, + 'GetDataContractsResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractsResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYRESPONSE, + 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse) }) -_sym_db.RegisterMessage(GetIdentityResponse) -_sym_db.RegisterMessage(GetIdentityResponse.GetIdentityResponseV0) +_sym_db.RegisterMessage(GetDataContractsResponse) +_sym_db.RegisterMessage(GetDataContractsResponse.DataContractEntry) +_sym_db.RegisterMessage(GetDataContractsResponse.DataContracts) +_sym_db.RegisterMessage(GetDataContractsResponse.GetDataContractsResponseV0) -GetIdentityNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponse', (_message.Message,), { +GetDataContractHistoryRequest = _reflection.GeneratedProtocolMessageType('GetDataContractHistoryRequest', (_message.Message,), { - 'GetIdentityNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityNonceResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0, + 'GetDataContractHistoryRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractHistoryRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYREQUEST_GETDATACONTRACTHISTORYREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYNONCERESPONSE, + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityNonceResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryRequest) }) -_sym_db.RegisterMessage(GetIdentityNonceResponse) -_sym_db.RegisterMessage(GetIdentityNonceResponse.GetIdentityNonceResponseV0) +_sym_db.RegisterMessage(GetDataContractHistoryRequest) +_sym_db.RegisterMessage(GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) -GetIdentityContractNonceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponse', (_message.Message,), { +GetDataContractHistoryResponse = _reflection.GeneratedProtocolMessageType('GetDataContractHistoryResponse', (_message.Message,), { - 'GetIdentityContractNonceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityContractNonceResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0, + 'GetDataContractHistoryResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractHistoryResponseV0', (_message.Message,), { + + 'DataContractHistoryEntry' : _reflection.GeneratedProtocolMessageType('DataContractHistoryEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORYENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) + }) + , + + 'DataContractHistory' : _reflection.GeneratedProtocolMessageType('DataContractHistory', (_message.Message,), { + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) + }) + , + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYCONTRACTNONCERESPONSE, + 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityContractNonceResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse) }) -_sym_db.RegisterMessage(GetIdentityContractNonceResponse) -_sym_db.RegisterMessage(GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0) +_sym_db.RegisterMessage(GetDataContractHistoryResponse) +_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) +_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) +_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) -GetIdentityBalanceResponse = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponse', (_message.Message,), { +GetDocumentsRequest = _reflection.GeneratedProtocolMessageType('GetDocumentsRequest', (_message.Message,), { - 'GetIdentityBalanceResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0, + 'GetDocumentsRequestV0' : _reflection.GeneratedProtocolMessageType('GetDocumentsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBALANCERESPONSE, + 'DESCRIPTOR' : _GETDOCUMENTSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsRequest) }) -_sym_db.RegisterMessage(GetIdentityBalanceResponse) -_sym_db.RegisterMessage(GetIdentityBalanceResponse.GetIdentityBalanceResponseV0) +_sym_db.RegisterMessage(GetDocumentsRequest) +_sym_db.RegisterMessage(GetDocumentsRequest.GetDocumentsRequestV0) -GetIdentityBalanceAndRevisionResponse = _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionResponse', (_message.Message,), { +GetDocumentsResponse = _reflection.GeneratedProtocolMessageType('GetDocumentsResponse', (_message.Message,), { - 'GetIdentityBalanceAndRevisionResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityBalanceAndRevisionResponseV0', (_message.Message,), { + 'GetDocumentsResponseV0' : _reflection.GeneratedProtocolMessageType('GetDocumentsResponseV0', (_message.Message,), { - 'BalanceAndRevision' : _reflection.GeneratedProtocolMessageType('BalanceAndRevision', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0_BALANCEANDREVISION, + 'Documents' : _reflection.GeneratedProtocolMessageType('Documents', (_message.Message,), { + 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents) }) , - 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0, + 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBALANCEANDREVISIONRESPONSE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse) - }) -_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse) -_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0) -_sym_db.RegisterMessage(GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision) - -KeyRequestType = _reflection.GeneratedProtocolMessageType('KeyRequestType', (_message.Message,), { - 'DESCRIPTOR' : _KEYREQUESTTYPE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.KeyRequestType) - }) -_sym_db.RegisterMessage(KeyRequestType) - -AllKeys = _reflection.GeneratedProtocolMessageType('AllKeys', (_message.Message,), { - 'DESCRIPTOR' : _ALLKEYS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.AllKeys) - }) -_sym_db.RegisterMessage(AllKeys) - -SpecificKeys = _reflection.GeneratedProtocolMessageType('SpecificKeys', (_message.Message,), { - 'DESCRIPTOR' : _SPECIFICKEYS, + 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SpecificKeys) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse) }) -_sym_db.RegisterMessage(SpecificKeys) +_sym_db.RegisterMessage(GetDocumentsResponse) +_sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0) +_sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0.Documents) -SearchKey = _reflection.GeneratedProtocolMessageType('SearchKey', (_message.Message,), { +GetIdentityByPublicKeyHashRequest = _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequest', (_message.Message,), { - 'PurposeMapEntry' : _reflection.GeneratedProtocolMessageType('PurposeMapEntry', (_message.Message,), { - 'DESCRIPTOR' : _SEARCHKEY_PURPOSEMAPENTRY, + 'GetIdentityByPublicKeyHashRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHREQUEST_GETIDENTITYBYPUBLICKEYHASHREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SearchKey.PurposeMapEntry) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0) }) , - 'DESCRIPTOR' : _SEARCHKEY, + 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SearchKey) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest) }) -_sym_db.RegisterMessage(SearchKey) -_sym_db.RegisterMessage(SearchKey.PurposeMapEntry) +_sym_db.RegisterMessage(GetIdentityByPublicKeyHashRequest) +_sym_db.RegisterMessage(GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0) -SecurityLevelMap = _reflection.GeneratedProtocolMessageType('SecurityLevelMap', (_message.Message,), { +GetIdentityByPublicKeyHashResponse = _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashResponse', (_message.Message,), { - 'SecurityLevelMapEntry' : _reflection.GeneratedProtocolMessageType('SecurityLevelMapEntry', (_message.Message,), { - 'DESCRIPTOR' : _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY, + 'GetIdentityByPublicKeyHashResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHRESPONSE_GETIDENTITYBYPUBLICKEYHASHRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SecurityLevelMap.SecurityLevelMapEntry) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0) }) , - 'DESCRIPTOR' : _SECURITYLEVELMAP, + 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.SecurityLevelMap) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse) }) -_sym_db.RegisterMessage(SecurityLevelMap) -_sym_db.RegisterMessage(SecurityLevelMap.SecurityLevelMapEntry) +_sym_db.RegisterMessage(GetIdentityByPublicKeyHashResponse) +_sym_db.RegisterMessage(GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0) -GetIdentityKeysRequest = _reflection.GeneratedProtocolMessageType('GetIdentityKeysRequest', (_message.Message,), { +WaitForStateTransitionResultRequest = _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultRequest', (_message.Message,), { - 'GetIdentityKeysRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityKeysRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYKEYSREQUEST_GETIDENTITYKEYSREQUESTV0, + 'WaitForStateTransitionResultRequestV0' : _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTREQUEST_WAITFORSTATETRANSITIONRESULTREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYKEYSREQUEST, + 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest) }) -_sym_db.RegisterMessage(GetIdentityKeysRequest) -_sym_db.RegisterMessage(GetIdentityKeysRequest.GetIdentityKeysRequestV0) - -GetIdentityKeysResponse = _reflection.GeneratedProtocolMessageType('GetIdentityKeysResponse', (_message.Message,), { +_sym_db.RegisterMessage(WaitForStateTransitionResultRequest) +_sym_db.RegisterMessage(WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0) - 'GetIdentityKeysResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityKeysResponseV0', (_message.Message,), { +WaitForStateTransitionResultResponse = _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultResponse', (_message.Message,), { - 'Keys' : _reflection.GeneratedProtocolMessageType('Keys', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0_KEYS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) - }) - , - 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE_GETIDENTITYKEYSRESPONSEV0, + 'WaitForStateTransitionResultResponseV0' : _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTRESPONSE_WAITFORSTATETRANSITIONRESULTRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYKEYSRESPONSE, + 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityKeysResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse) }) -_sym_db.RegisterMessage(GetIdentityKeysResponse) -_sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0) -_sym_db.RegisterMessage(GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys) +_sym_db.RegisterMessage(WaitForStateTransitionResultResponse) +_sym_db.RegisterMessage(WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0) -GetIdentitiesContractKeysRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequest', (_message.Message,), { +GetConsensusParamsRequest = _reflection.GeneratedProtocolMessageType('GetConsensusParamsRequest', (_message.Message,), { - 'GetIdentitiesContractKeysRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST_GETIDENTITIESCONTRACTKEYSREQUESTV0, + 'GetConsensusParamsRequestV0' : _reflection.GeneratedProtocolMessageType('GetConsensusParamsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCONSENSUSPARAMSREQUEST_GETCONSENSUSPARAMSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSREQUEST, + 'DESCRIPTOR' : _GETCONSENSUSPARAMSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsRequest) }) -_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest) -_sym_db.RegisterMessage(GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0) - -GetIdentitiesContractKeysResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponse', (_message.Message,), { +_sym_db.RegisterMessage(GetConsensusParamsRequest) +_sym_db.RegisterMessage(GetConsensusParamsRequest.GetConsensusParamsRequestV0) - 'GetIdentitiesContractKeysResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesContractKeysResponseV0', (_message.Message,), { +GetConsensusParamsResponse = _reflection.GeneratedProtocolMessageType('GetConsensusParamsResponse', (_message.Message,), { - 'PurposeKeys' : _reflection.GeneratedProtocolMessageType('PurposeKeys', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_PURPOSEKEYS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) - }) - , + 'ConsensusParamsBlock' : _reflection.GeneratedProtocolMessageType('ConsensusParamsBlock', (_message.Message,), { + 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSBLOCK, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock) + }) + , - 'IdentityKeys' : _reflection.GeneratedProtocolMessageType('IdentityKeys', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITYKEYS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) - }) - , + 'ConsensusParamsEvidence' : _reflection.GeneratedProtocolMessageType('ConsensusParamsEvidence', (_message.Message,), { + 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence) + }) + , - 'IdentitiesKeys' : _reflection.GeneratedProtocolMessageType('IdentitiesKeys', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0_IDENTITIESKEYS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) - }) - , - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE_GETIDENTITIESCONTRACTKEYSRESPONSEV0, + 'GetConsensusParamsResponseV0' : _reflection.GeneratedProtocolMessageType('GetConsensusParamsResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITIESCONTRACTKEYSRESPONSE, + 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse) }) -_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse) -_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0) -_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys) -_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys) -_sym_db.RegisterMessage(GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys) +_sym_db.RegisterMessage(GetConsensusParamsResponse) +_sym_db.RegisterMessage(GetConsensusParamsResponse.ConsensusParamsBlock) +_sym_db.RegisterMessage(GetConsensusParamsResponse.ConsensusParamsEvidence) +_sym_db.RegisterMessage(GetConsensusParamsResponse.GetConsensusParamsResponseV0) -GetEvonodesProposedEpochBlocksByIdsRequest = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByIdsRequest', (_message.Message,), { +GetProtocolVersionUpgradeStateRequest = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateRequest', (_message.Message,), { - 'GetEvonodesProposedEpochBlocksByIdsRequestV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByIdsRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUESTV0, + 'GetProtocolVersionUpgradeStateRequestV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATEREQUEST_GETPROTOCOLVERSIONUPGRADESTATEREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0) }) , - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYIDSREQUEST, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATEREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest) }) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByIdsRequest) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateRequest) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0) -GetEvonodesProposedEpochBlocksResponse = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksResponse', (_message.Message,), { +GetProtocolVersionUpgradeStateResponse = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateResponse', (_message.Message,), { - 'GetEvonodesProposedEpochBlocksResponseV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksResponseV0', (_message.Message,), { + 'GetProtocolVersionUpgradeStateResponseV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateResponseV0', (_message.Message,), { - 'EvonodeProposedBlocks' : _reflection.GeneratedProtocolMessageType('EvonodeProposedBlocks', (_message.Message,), { - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODEPROPOSEDBLOCKS, + 'Versions' : _reflection.GeneratedProtocolMessageType('Versions', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions) }) , - 'EvonodesProposedBlocks' : _reflection.GeneratedProtocolMessageType('EvonodesProposedBlocks', (_message.Message,), { - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODESPROPOSEDBLOCKS, + 'VersionEntry' : _reflection.GeneratedProtocolMessageType('VersionEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry) }) , - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0) - }) - , - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse) - }) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks) - -GetEvonodesProposedEpochBlocksByRangeRequest = _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByRangeRequest', (_message.Message,), { - - 'GetEvonodesProposedEpochBlocksByRangeRequestV0' : _reflection.GeneratedProtocolMessageType('GetEvonodesProposedEpochBlocksByRangeRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST_GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUESTV0, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0) }) , - 'DESCRIPTOR' : _GETEVONODESPROPOSEDEPOCHBLOCKSBYRANGEREQUEST, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse) }) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByRangeRequest) -_sym_db.RegisterMessage(GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry) -GetIdentitiesBalancesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequest', (_message.Message,), { +GetProtocolVersionUpgradeVoteStatusRequest = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusRequest', (_message.Message,), { - 'GetIdentitiesBalancesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST_GETIDENTITIESBALANCESREQUESTV0, + 'GetProtocolVersionUpgradeVoteStatusRequestV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST_GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITIESBALANCESREQUEST, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest) }) -_sym_db.RegisterMessage(GetIdentitiesBalancesRequest) -_sym_db.RegisterMessage(GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusRequest) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0) -GetIdentitiesBalancesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesResponse', (_message.Message,), { +GetProtocolVersionUpgradeVoteStatusResponse = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusResponse', (_message.Message,), { - 'GetIdentitiesBalancesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesBalancesResponseV0', (_message.Message,), { + 'GetProtocolVersionUpgradeVoteStatusResponseV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusResponseV0', (_message.Message,), { - 'IdentityBalance' : _reflection.GeneratedProtocolMessageType('IdentityBalance', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITYBALANCE, + 'VersionSignals' : _reflection.GeneratedProtocolMessageType('VersionSignals', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNALS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals) }) , - 'IdentitiesBalances' : _reflection.GeneratedProtocolMessageType('IdentitiesBalances', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITIESBALANCES, + 'VersionSignal' : _reflection.GeneratedProtocolMessageType('VersionSignal', (_message.Message,), { + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal) }) , - 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITIESBALANCESRESPONSE, + 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse) }) -_sym_db.RegisterMessage(GetIdentitiesBalancesResponse) -_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0) -_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance) -_sym_db.RegisterMessage(GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals) +_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal) -GetProofsRequest = _reflection.GeneratedProtocolMessageType('GetProofsRequest', (_message.Message,), { +GetEpochsInfoRequest = _reflection.GeneratedProtocolMessageType('GetEpochsInfoRequest', (_message.Message,), { - 'GetProofsRequestV0' : _reflection.GeneratedProtocolMessageType('GetProofsRequestV0', (_message.Message,), { + 'GetEpochsInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetEpochsInfoRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETEPOCHSINFOREQUEST_GETEPOCHSINFOREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0) + }) + , + 'DESCRIPTOR' : _GETEPOCHSINFOREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoRequest) + }) +_sym_db.RegisterMessage(GetEpochsInfoRequest) +_sym_db.RegisterMessage(GetEpochsInfoRequest.GetEpochsInfoRequestV0) - 'DocumentRequest' : _reflection.GeneratedProtocolMessageType('DocumentRequest', (_message.Message,), { - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_DOCUMENTREQUEST, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest) - }) - , +GetEpochsInfoResponse = _reflection.GeneratedProtocolMessageType('GetEpochsInfoResponse', (_message.Message,), { - 'IdentityRequest' : _reflection.GeneratedProtocolMessageType('IdentityRequest', (_message.Message,), { - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_IDENTITYREQUEST, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest) - }) - , + 'GetEpochsInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetEpochsInfoResponseV0', (_message.Message,), { - 'ContractRequest' : _reflection.GeneratedProtocolMessageType('ContractRequest', (_message.Message,), { - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_CONTRACTREQUEST, + 'EpochInfos' : _reflection.GeneratedProtocolMessageType('EpochInfos', (_message.Message,), { + 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFOS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) }) , - 'VoteStatusRequest' : _reflection.GeneratedProtocolMessageType('VoteStatusRequest', (_message.Message,), { - - 'ContestedResourceVoteStatusRequest' : _reflection.GeneratedProtocolMessageType('ContestedResourceVoteStatusRequest', (_message.Message,), { - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST_CONTESTEDRESOURCEVOTESTATUSREQUEST, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest) - }) - , - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0_VOTESTATUSREQUEST, + 'EpochInfo' : _reflection.GeneratedProtocolMessageType('EpochInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) }) , - 'DESCRIPTOR' : _GETPROOFSREQUEST_GETPROOFSREQUESTV0, + 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0) }) , - 'DESCRIPTOR' : _GETPROOFSREQUEST, + 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse) }) -_sym_db.RegisterMessage(GetProofsRequest) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.DocumentRequest) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.IdentityRequest) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.ContractRequest) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.VoteStatusRequest) -_sym_db.RegisterMessage(GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest) +_sym_db.RegisterMessage(GetEpochsInfoResponse) +_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0) +_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) +_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) -GetProofsResponse = _reflection.GeneratedProtocolMessageType('GetProofsResponse', (_message.Message,), { +GetContestedResourcesRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourcesRequest', (_message.Message,), { - 'GetProofsResponseV0' : _reflection.GeneratedProtocolMessageType('GetProofsResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPROOFSRESPONSE_GETPROOFSRESPONSEV0, + 'GetContestedResourcesRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourcesRequestV0', (_message.Message,), { + + 'StartAtValueInfo' : _reflection.GeneratedProtocolMessageType('StartAtValueInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0_STARTATVALUEINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0) }) , - 'DESCRIPTOR' : _GETPROOFSRESPONSE, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProofsResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest) }) -_sym_db.RegisterMessage(GetProofsResponse) -_sym_db.RegisterMessage(GetProofsResponse.GetProofsResponseV0) +_sym_db.RegisterMessage(GetContestedResourcesRequest) +_sym_db.RegisterMessage(GetContestedResourcesRequest.GetContestedResourcesRequestV0) +_sym_db.RegisterMessage(GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo) -GetDataContractRequest = _reflection.GeneratedProtocolMessageType('GetDataContractRequest', (_message.Message,), { +GetContestedResourcesResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourcesResponse', (_message.Message,), { - 'GetDataContractRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTREQUEST_GETDATACONTRACTREQUESTV0, + 'GetContestedResourcesResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourcesResponseV0', (_message.Message,), { + + 'ContestedResourceValues' : _reflection.GeneratedProtocolMessageType('ContestedResourceValues', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0_CONTESTEDRESOURCEVALUES, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTREQUEST, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse) }) -_sym_db.RegisterMessage(GetDataContractRequest) -_sym_db.RegisterMessage(GetDataContractRequest.GetDataContractRequestV0) +_sym_db.RegisterMessage(GetContestedResourcesResponse) +_sym_db.RegisterMessage(GetContestedResourcesResponse.GetContestedResourcesResponseV0) +_sym_db.RegisterMessage(GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues) -GetDataContractResponse = _reflection.GeneratedProtocolMessageType('GetDataContractResponse', (_message.Message,), { +GetVotePollsByEndDateRequest = _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateRequest', (_message.Message,), { - 'GetDataContractResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTRESPONSE_GETDATACONTRACTRESPONSEV0, + 'GetVotePollsByEndDateRequestV0' : _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateRequestV0', (_message.Message,), { + + 'StartAtTimeInfo' : _reflection.GeneratedProtocolMessageType('StartAtTimeInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_STARTATTIMEINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo) + }) + , + + 'EndAtTimeInfo' : _reflection.GeneratedProtocolMessageType('EndAtTimeInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo) + }) + , + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTRESPONSE, + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest) }) -_sym_db.RegisterMessage(GetDataContractResponse) -_sym_db.RegisterMessage(GetDataContractResponse.GetDataContractResponseV0) +_sym_db.RegisterMessage(GetVotePollsByEndDateRequest) +_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0) +_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo) +_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo) -GetDataContractsRequest = _reflection.GeneratedProtocolMessageType('GetDataContractsRequest', (_message.Message,), { +GetVotePollsByEndDateResponse = _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateResponse', (_message.Message,), { - 'GetDataContractsRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractsRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTSREQUEST_GETDATACONTRACTSREQUESTV0, + 'GetVotePollsByEndDateResponseV0' : _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateResponseV0', (_message.Message,), { + + 'SerializedVotePollsByTimestamp' : _reflection.GeneratedProtocolMessageType('SerializedVotePollsByTimestamp', (_message.Message,), { + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMP, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp) + }) + , + + 'SerializedVotePollsByTimestamps' : _reflection.GeneratedProtocolMessageType('SerializedVotePollsByTimestamps', (_message.Message,), { + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMPS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps) + }) + , + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTSREQUEST, + 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse) }) -_sym_db.RegisterMessage(GetDataContractsRequest) -_sym_db.RegisterMessage(GetDataContractsRequest.GetDataContractsRequestV0) - -GetDataContractsResponse = _reflection.GeneratedProtocolMessageType('GetDataContractsResponse', (_message.Message,), { +_sym_db.RegisterMessage(GetVotePollsByEndDateResponse) +_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0) +_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp) +_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps) - 'DataContractEntry' : _reflection.GeneratedProtocolMessageType('DataContractEntry', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_DATACONTRACTENTRY, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry) - }) - , +GetContestedResourceVoteStateRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateRequest', (_message.Message,), { - 'DataContracts' : _reflection.GeneratedProtocolMessageType('DataContracts', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_DATACONTRACTS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts) - }) - , + 'GetContestedResourceVoteStateRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateRequestV0', (_message.Message,), { - 'GetDataContractsResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractsResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE_GETDATACONTRACTSRESPONSEV0, + 'StartAtIdentifierInfo' : _reflection.GeneratedProtocolMessageType('StartAtIdentifierInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0_STARTATIDENTIFIERINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTSRESPONSE, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractsResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest) }) -_sym_db.RegisterMessage(GetDataContractsResponse) -_sym_db.RegisterMessage(GetDataContractsResponse.DataContractEntry) -_sym_db.RegisterMessage(GetDataContractsResponse.DataContracts) -_sym_db.RegisterMessage(GetDataContractsResponse.GetDataContractsResponseV0) +_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest) +_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0) +_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo) -GetDataContractHistoryRequest = _reflection.GeneratedProtocolMessageType('GetDataContractHistoryRequest', (_message.Message,), { +GetContestedResourceVoteStateResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateResponse', (_message.Message,), { - 'GetDataContractHistoryRequestV0' : _reflection.GeneratedProtocolMessageType('GetDataContractHistoryRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYREQUEST_GETDATACONTRACTHISTORYREQUESTV0, + 'GetContestedResourceVoteStateResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateResponseV0', (_message.Message,), { + + 'FinishedVoteInfo' : _reflection.GeneratedProtocolMessageType('FinishedVoteInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo) + }) + , + + 'ContestedResourceContenders' : _reflection.GeneratedProtocolMessageType('ContestedResourceContenders', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTESTEDRESOURCECONTENDERS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders) + }) + , + + 'Contender' : _reflection.GeneratedProtocolMessageType('Contender', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTENDER, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYREQUEST, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse) }) -_sym_db.RegisterMessage(GetDataContractHistoryRequest) -_sym_db.RegisterMessage(GetDataContractHistoryRequest.GetDataContractHistoryRequestV0) - -GetDataContractHistoryResponse = _reflection.GeneratedProtocolMessageType('GetDataContractHistoryResponse', (_message.Message,), { +_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse) +_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0) +_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo) +_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders) +_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender) - 'GetDataContractHistoryResponseV0' : _reflection.GeneratedProtocolMessageType('GetDataContractHistoryResponseV0', (_message.Message,), { +GetContestedResourceVotersForIdentityRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityRequest', (_message.Message,), { - 'DataContractHistoryEntry' : _reflection.GeneratedProtocolMessageType('DataContractHistoryEntry', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORYENTRY, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) - }) - , + 'GetContestedResourceVotersForIdentityRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityRequestV0', (_message.Message,), { - 'DataContractHistory' : _reflection.GeneratedProtocolMessageType('DataContractHistory', (_message.Message,), { - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORY, + 'StartAtIdentifierInfo' : _reflection.GeneratedProtocolMessageType('StartAtIdentifierInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0_STARTATIDENTIFIERINFO, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo) }) , - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0) }) , - 'DESCRIPTOR' : _GETDATACONTRACTHISTORYRESPONSE, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDataContractHistoryResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest) }) -_sym_db.RegisterMessage(GetDataContractHistoryResponse) -_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0) -_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry) -_sym_db.RegisterMessage(GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo) -GetDocumentsRequest = _reflection.GeneratedProtocolMessageType('GetDocumentsRequest', (_message.Message,), { +GetContestedResourceVotersForIdentityResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityResponse', (_message.Message,), { - 'GetDocumentsRequestV0' : _reflection.GeneratedProtocolMessageType('GetDocumentsRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETDOCUMENTSREQUEST_GETDOCUMENTSREQUESTV0, + 'GetContestedResourceVotersForIdentityResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityResponseV0', (_message.Message,), { + + 'ContestedResourceVoters' : _reflection.GeneratedProtocolMessageType('ContestedResourceVoters', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0_CONTESTEDRESOURCEVOTERS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0) }) , - 'DESCRIPTOR' : _GETDOCUMENTSREQUEST, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse) }) -_sym_db.RegisterMessage(GetDocumentsRequest) -_sym_db.RegisterMessage(GetDocumentsRequest.GetDocumentsRequestV0) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0) +_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters) -GetDocumentsResponse = _reflection.GeneratedProtocolMessageType('GetDocumentsResponse', (_message.Message,), { +GetContestedResourceIdentityVotesRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesRequest', (_message.Message,), { - 'GetDocumentsResponseV0' : _reflection.GeneratedProtocolMessageType('GetDocumentsResponseV0', (_message.Message,), { + 'GetContestedResourceIdentityVotesRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesRequestV0', (_message.Message,), { - 'Documents' : _reflection.GeneratedProtocolMessageType('Documents', (_message.Message,), { - 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0_DOCUMENTS, + 'StartAtVotePollIdInfo' : _reflection.GeneratedProtocolMessageType('StartAtVotePollIdInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0_STARTATVOTEPOLLIDINFO, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo) }) , - 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE_GETDOCUMENTSRESPONSEV0, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0) }) , - 'DESCRIPTOR' : _GETDOCUMENTSRESPONSE, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetDocumentsResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest) }) -_sym_db.RegisterMessage(GetDocumentsResponse) -_sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0) -_sym_db.RegisterMessage(GetDocumentsResponse.GetDocumentsResponseV0.Documents) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo) -GetIdentityByPublicKeyHashRequest = _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequest', (_message.Message,), { +GetContestedResourceIdentityVotesResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesResponse', (_message.Message,), { - 'GetIdentityByPublicKeyHashRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHREQUEST_GETIDENTITYBYPUBLICKEYHASHREQUESTV0, + 'GetContestedResourceIdentityVotesResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesResponseV0', (_message.Message,), { + + 'ContestedResourceIdentityVotes' : _reflection.GeneratedProtocolMessageType('ContestedResourceIdentityVotes', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTES, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes) + }) + , + + 'ResourceVoteChoice' : _reflection.GeneratedProtocolMessageType('ResourceVoteChoice', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice) + }) + , + + 'ContestedResourceIdentityVote' : _reflection.GeneratedProtocolMessageType('ContestedResourceIdentityVote', (_message.Message,), { + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote) + }) + , + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHREQUEST, + 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse) }) -_sym_db.RegisterMessage(GetIdentityByPublicKeyHashRequest) -_sym_db.RegisterMessage(GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice) +_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote) -GetIdentityByPublicKeyHashResponse = _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashResponse', (_message.Message,), { +GetPrefundedSpecializedBalanceRequest = _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceRequest', (_message.Message,), { - 'GetIdentityByPublicKeyHashResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityByPublicKeyHashResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHRESPONSE_GETIDENTITYBYPUBLICKEYHASHRESPONSEV0, + 'GetPrefundedSpecializedBalanceRequestV0' : _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST_GETPREFUNDEDSPECIALIZEDBALANCEREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0) }) , - 'DESCRIPTOR' : _GETIDENTITYBYPUBLICKEYHASHRESPONSE, + 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest) }) -_sym_db.RegisterMessage(GetIdentityByPublicKeyHashResponse) -_sym_db.RegisterMessage(GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0) +_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceRequest) +_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0) -WaitForStateTransitionResultRequest = _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultRequest', (_message.Message,), { +GetPrefundedSpecializedBalanceResponse = _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceResponse', (_message.Message,), { - 'WaitForStateTransitionResultRequestV0' : _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTREQUEST_WAITFORSTATETRANSITIONRESULTREQUESTV0, + 'GetPrefundedSpecializedBalanceResponseV0' : _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE_GETPREFUNDEDSPECIALIZEDBALANCERESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0) }) , - 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTREQUEST, + 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse) }) -_sym_db.RegisterMessage(WaitForStateTransitionResultRequest) -_sym_db.RegisterMessage(WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0) +_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceResponse) +_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0) -WaitForStateTransitionResultResponse = _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultResponse', (_message.Message,), { +GetTotalCreditsInPlatformRequest = _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformRequest', (_message.Message,), { - 'WaitForStateTransitionResultResponseV0' : _reflection.GeneratedProtocolMessageType('WaitForStateTransitionResultResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTRESPONSE_WAITFORSTATETRANSITIONRESULTRESPONSEV0, + 'GetTotalCreditsInPlatformRequestV0' : _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMREQUEST_GETTOTALCREDITSINPLATFORMREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0) }) , - 'DESCRIPTOR' : _WAITFORSTATETRANSITIONRESULTRESPONSE, + 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest) }) -_sym_db.RegisterMessage(WaitForStateTransitionResultResponse) -_sym_db.RegisterMessage(WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0) +_sym_db.RegisterMessage(GetTotalCreditsInPlatformRequest) +_sym_db.RegisterMessage(GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0) -GetConsensusParamsRequest = _reflection.GeneratedProtocolMessageType('GetConsensusParamsRequest', (_message.Message,), { +GetTotalCreditsInPlatformResponse = _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformResponse', (_message.Message,), { - 'GetConsensusParamsRequestV0' : _reflection.GeneratedProtocolMessageType('GetConsensusParamsRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCONSENSUSPARAMSREQUEST_GETCONSENSUSPARAMSREQUESTV0, + 'GetTotalCreditsInPlatformResponseV0' : _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMRESPONSE_GETTOTALCREDITSINPLATFORMRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0) }) , - 'DESCRIPTOR' : _GETCONSENSUSPARAMSREQUEST, + 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse) }) -_sym_db.RegisterMessage(GetConsensusParamsRequest) -_sym_db.RegisterMessage(GetConsensusParamsRequest.GetConsensusParamsRequestV0) +_sym_db.RegisterMessage(GetTotalCreditsInPlatformResponse) +_sym_db.RegisterMessage(GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0) -GetConsensusParamsResponse = _reflection.GeneratedProtocolMessageType('GetConsensusParamsResponse', (_message.Message,), { +GetPathElementsRequest = _reflection.GeneratedProtocolMessageType('GetPathElementsRequest', (_message.Message,), { - 'ConsensusParamsBlock' : _reflection.GeneratedProtocolMessageType('ConsensusParamsBlock', (_message.Message,), { - 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSBLOCK, + 'GetPathElementsRequestV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) }) , + 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest) + }) +_sym_db.RegisterMessage(GetPathElementsRequest) +_sym_db.RegisterMessage(GetPathElementsRequest.GetPathElementsRequestV0) - 'ConsensusParamsEvidence' : _reflection.GeneratedProtocolMessageType('ConsensusParamsEvidence', (_message.Message,), { - 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_CONSENSUSPARAMSEVIDENCE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence) - }) - , +GetPathElementsResponse = _reflection.GeneratedProtocolMessageType('GetPathElementsResponse', (_message.Message,), { - 'GetConsensusParamsResponseV0' : _reflection.GeneratedProtocolMessageType('GetConsensusParamsResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE_GETCONSENSUSPARAMSRESPONSEV0, + 'GetPathElementsResponseV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsResponseV0', (_message.Message,), { + + 'Elements' : _reflection.GeneratedProtocolMessageType('Elements', (_message.Message,), { + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + }) + , + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) }) , - 'DESCRIPTOR' : _GETCONSENSUSPARAMSRESPONSE, + 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetConsensusParamsResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse) }) -_sym_db.RegisterMessage(GetConsensusParamsResponse) -_sym_db.RegisterMessage(GetConsensusParamsResponse.ConsensusParamsBlock) -_sym_db.RegisterMessage(GetConsensusParamsResponse.ConsensusParamsEvidence) -_sym_db.RegisterMessage(GetConsensusParamsResponse.GetConsensusParamsResponseV0) +_sym_db.RegisterMessage(GetPathElementsResponse) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0) +_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0.Elements) -GetProtocolVersionUpgradeStateRequest = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateRequest', (_message.Message,), { +GetStatusRequest = _reflection.GeneratedProtocolMessageType('GetStatusRequest', (_message.Message,), { - 'GetProtocolVersionUpgradeStateRequestV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATEREQUEST_GETPROTOCOLVERSIONUPGRADESTATEREQUESTV0, + 'GetStatusRequestV0' : _reflection.GeneratedProtocolMessageType('GetStatusRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSREQUEST_GETSTATUSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0) }) , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATEREQUEST, + 'DESCRIPTOR' : _GETSTATUSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusRequest) }) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateRequest) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0) +_sym_db.RegisterMessage(GetStatusRequest) +_sym_db.RegisterMessage(GetStatusRequest.GetStatusRequestV0) -GetProtocolVersionUpgradeStateResponse = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateResponse', (_message.Message,), { +GetStatusResponse = _reflection.GeneratedProtocolMessageType('GetStatusResponse', (_message.Message,), { - 'GetProtocolVersionUpgradeStateResponseV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeStateResponseV0', (_message.Message,), { + 'GetStatusResponseV0' : _reflection.GeneratedProtocolMessageType('GetStatusResponseV0', (_message.Message,), { - 'Versions' : _reflection.GeneratedProtocolMessageType('Versions', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONS, + 'Version' : _reflection.GeneratedProtocolMessageType('Version', (_message.Message,), { + + 'Software' : _reflection.GeneratedProtocolMessageType('Software', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_SOFTWARE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software) + }) + , + + 'Protocol' : _reflection.GeneratedProtocolMessageType('Protocol', (_message.Message,), { + + 'Tenderdash' : _reflection.GeneratedProtocolMessageType('Tenderdash', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_TENDERDASH, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash) + }) + , + + 'Drive' : _reflection.GeneratedProtocolMessageType('Drive', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_DRIVE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive) + }) + , + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol) + }) + , + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version) }) , - 'VersionEntry' : _reflection.GeneratedProtocolMessageType('VersionEntry', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0_VERSIONENTRY, + 'Time' : _reflection.GeneratedProtocolMessageType('Time', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time) }) , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE_GETPROTOCOLVERSIONUPGRADESTATERESPONSEV0, + + 'Node' : _reflection.GeneratedProtocolMessageType('Node', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NODE, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node) + }) + , + + 'Chain' : _reflection.GeneratedProtocolMessageType('Chain', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain) + }) + , + + 'Network' : _reflection.GeneratedProtocolMessageType('Network', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NETWORK, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network) + }) + , + + 'StateSync' : _reflection.GeneratedProtocolMessageType('StateSync', (_message.Message,), { + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync) + }) + , + 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0) }) , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADESTATERESPONSE, + 'DESCRIPTOR' : _GETSTATUSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse) }) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry) +_sym_db.RegisterMessage(GetStatusResponse) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Software) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Time) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Node) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Chain) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Network) +_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.StateSync) -GetProtocolVersionUpgradeVoteStatusRequest = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusRequest', (_message.Message,), { +GetCurrentQuorumsInfoRequest = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequest', (_message.Message,), { - 'GetProtocolVersionUpgradeVoteStatusRequestV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST_GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUESTV0, + 'GetCurrentQuorumsInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) }) , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSREQUEST, + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest) }) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusRequest) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) -GetProtocolVersionUpgradeVoteStatusResponse = _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusResponse', (_message.Message,), { +GetCurrentQuorumsInfoResponse = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponse', (_message.Message,), { - 'GetProtocolVersionUpgradeVoteStatusResponseV0' : _reflection.GeneratedProtocolMessageType('GetProtocolVersionUpgradeVoteStatusResponseV0', (_message.Message,), { + 'ValidatorV0' : _reflection.GeneratedProtocolMessageType('ValidatorV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0) + }) + , - 'VersionSignals' : _reflection.GeneratedProtocolMessageType('VersionSignals', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNALS, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals) - }) - , + 'ValidatorSetV0' : _reflection.GeneratedProtocolMessageType('ValidatorSetV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0) + }) + , - 'VersionSignal' : _reflection.GeneratedProtocolMessageType('VersionSignal', (_message.Message,), { - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0_VERSIONSIGNAL, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal) - }) - , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE_GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSEV0, + 'GetCurrentQuorumsInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponseV0', (_message.Message,), { + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) }) , - 'DESCRIPTOR' : _GETPROTOCOLVERSIONUPGRADEVOTESTATUSRESPONSE, + 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse) }) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals) -_sym_db.RegisterMessage(GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorV0) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorSetV0) +_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) -GetEpochsInfoRequest = _reflection.GeneratedProtocolMessageType('GetEpochsInfoRequest', (_message.Message,), { +GetIdentityTokenBalancesRequest = _reflection.GeneratedProtocolMessageType('GetIdentityTokenBalancesRequest', (_message.Message,), { - 'GetEpochsInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetEpochsInfoRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETEPOCHSINFOREQUEST_GETEPOCHSINFOREQUESTV0, + 'GetIdentityTokenBalancesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityTokenBalancesRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESREQUEST_GETIDENTITYTOKENBALANCESREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0) }) , - 'DESCRIPTOR' : _GETEPOCHSINFOREQUEST, + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest) }) -_sym_db.RegisterMessage(GetEpochsInfoRequest) -_sym_db.RegisterMessage(GetEpochsInfoRequest.GetEpochsInfoRequestV0) +_sym_db.RegisterMessage(GetIdentityTokenBalancesRequest) +_sym_db.RegisterMessage(GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0) -GetEpochsInfoResponse = _reflection.GeneratedProtocolMessageType('GetEpochsInfoResponse', (_message.Message,), { +GetIdentityTokenBalancesResponse = _reflection.GeneratedProtocolMessageType('GetIdentityTokenBalancesResponse', (_message.Message,), { - 'GetEpochsInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetEpochsInfoResponseV0', (_message.Message,), { + 'GetIdentityTokenBalancesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityTokenBalancesResponseV0', (_message.Message,), { - 'EpochInfos' : _reflection.GeneratedProtocolMessageType('EpochInfos', (_message.Message,), { - 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFOS, + 'TokenBalanceEntry' : _reflection.GeneratedProtocolMessageType('TokenBalanceEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCEENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry) }) , - 'EpochInfo' : _reflection.GeneratedProtocolMessageType('EpochInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO, + 'TokenBalances' : _reflection.GeneratedProtocolMessageType('TokenBalances', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0_TOKENBALANCES, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances) }) , - 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0, + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESRESPONSE_GETIDENTITYTOKENBALANCESRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0) }) , - 'DESCRIPTOR' : _GETEPOCHSINFORESPONSE, + 'DESCRIPTOR' : _GETIDENTITYTOKENBALANCESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetEpochsInfoResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse) }) -_sym_db.RegisterMessage(GetEpochsInfoResponse) -_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0) -_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos) -_sym_db.RegisterMessage(GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo) - -GetContestedResourcesRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourcesRequest', (_message.Message,), { +_sym_db.RegisterMessage(GetIdentityTokenBalancesResponse) +_sym_db.RegisterMessage(GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0) +_sym_db.RegisterMessage(GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry) +_sym_db.RegisterMessage(GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances) - 'GetContestedResourcesRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourcesRequestV0', (_message.Message,), { +GetIdentitiesTokenBalancesRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenBalancesRequest', (_message.Message,), { - 'StartAtValueInfo' : _reflection.GeneratedProtocolMessageType('StartAtValueInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0_STARTATVALUEINFO, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo) - }) - , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST_GETCONTESTEDRESOURCESREQUESTV0, + 'GetIdentitiesTokenBalancesRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenBalancesRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESREQUEST_GETIDENTITIESTOKENBALANCESREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESREQUEST, + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest) }) -_sym_db.RegisterMessage(GetContestedResourcesRequest) -_sym_db.RegisterMessage(GetContestedResourcesRequest.GetContestedResourcesRequestV0) -_sym_db.RegisterMessage(GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo) +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesRequest) +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0) -GetContestedResourcesResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourcesResponse', (_message.Message,), { +GetIdentitiesTokenBalancesResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenBalancesResponse', (_message.Message,), { - 'GetContestedResourcesResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourcesResponseV0', (_message.Message,), { + 'GetIdentitiesTokenBalancesResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenBalancesResponseV0', (_message.Message,), { - 'ContestedResourceValues' : _reflection.GeneratedProtocolMessageType('ContestedResourceValues', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0_CONTESTEDRESOURCEVALUES, + 'IdentityTokenBalanceEntry' : _reflection.GeneratedProtocolMessageType('IdentityTokenBalanceEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCEENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE_GETCONTESTEDRESOURCESRESPONSEV0, + + 'IdentityTokenBalances' : _reflection.GeneratedProtocolMessageType('IdentityTokenBalances', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0_IDENTITYTOKENBALANCES, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances) + }) + , + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESRESPONSE_GETIDENTITIESTOKENBALANCESRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCESRESPONSE, + 'DESCRIPTOR' : _GETIDENTITIESTOKENBALANCESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourcesResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse) }) -_sym_db.RegisterMessage(GetContestedResourcesResponse) -_sym_db.RegisterMessage(GetContestedResourcesResponse.GetContestedResourcesResponseV0) -_sym_db.RegisterMessage(GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues) - -GetVotePollsByEndDateRequest = _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateRequest', (_message.Message,), { - - 'GetVotePollsByEndDateRequestV0' : _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateRequestV0', (_message.Message,), { +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesResponse) +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0) +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry) +_sym_db.RegisterMessage(GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances) - 'StartAtTimeInfo' : _reflection.GeneratedProtocolMessageType('StartAtTimeInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_STARTATTIMEINFO, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo) - }) - , +GetIdentityTokenInfosRequest = _reflection.GeneratedProtocolMessageType('GetIdentityTokenInfosRequest', (_message.Message,), { - 'EndAtTimeInfo' : _reflection.GeneratedProtocolMessageType('EndAtTimeInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo) - }) - , - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0, + 'GetIdentityTokenInfosRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentityTokenInfosRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSREQUEST_GETIDENTITYTOKENINFOSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0) }) , - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATEREQUEST, + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest) }) -_sym_db.RegisterMessage(GetVotePollsByEndDateRequest) -_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0) -_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo) -_sym_db.RegisterMessage(GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo) +_sym_db.RegisterMessage(GetIdentityTokenInfosRequest) +_sym_db.RegisterMessage(GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0) -GetVotePollsByEndDateResponse = _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateResponse', (_message.Message,), { +GetIdentityTokenInfosResponse = _reflection.GeneratedProtocolMessageType('GetIdentityTokenInfosResponse', (_message.Message,), { - 'GetVotePollsByEndDateResponseV0' : _reflection.GeneratedProtocolMessageType('GetVotePollsByEndDateResponseV0', (_message.Message,), { + 'GetIdentityTokenInfosResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentityTokenInfosResponseV0', (_message.Message,), { - 'SerializedVotePollsByTimestamp' : _reflection.GeneratedProtocolMessageType('SerializedVotePollsByTimestamp', (_message.Message,), { - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMP, + 'TokenIdentityInfoEntry' : _reflection.GeneratedProtocolMessageType('TokenIdentityInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry) }) , - 'SerializedVotePollsByTimestamps' : _reflection.GeneratedProtocolMessageType('SerializedVotePollsByTimestamps', (_message.Message,), { - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMPS, + 'TokenInfoEntry' : _reflection.GeneratedProtocolMessageType('TokenInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry) }) , - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0, + + 'TokenInfos' : _reflection.GeneratedProtocolMessageType('TokenInfos', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0_TOKENINFOS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos) + }) + , + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSRESPONSE_GETIDENTITYTOKENINFOSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0) }) , - 'DESCRIPTOR' : _GETVOTEPOLLSBYENDDATERESPONSE, + 'DESCRIPTOR' : _GETIDENTITYTOKENINFOSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse) }) -_sym_db.RegisterMessage(GetVotePollsByEndDateResponse) -_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0) -_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp) -_sym_db.RegisterMessage(GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps) - -GetContestedResourceVoteStateRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateRequest', (_message.Message,), { +_sym_db.RegisterMessage(GetIdentityTokenInfosResponse) +_sym_db.RegisterMessage(GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0) +_sym_db.RegisterMessage(GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry) +_sym_db.RegisterMessage(GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry) +_sym_db.RegisterMessage(GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos) - 'GetContestedResourceVoteStateRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateRequestV0', (_message.Message,), { +GetIdentitiesTokenInfosRequest = _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenInfosRequest', (_message.Message,), { - 'StartAtIdentifierInfo' : _reflection.GeneratedProtocolMessageType('StartAtIdentifierInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0_STARTATIDENTIFIERINFO, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo) - }) - , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST_GETCONTESTEDRESOURCEVOTESTATEREQUESTV0, + 'GetIdentitiesTokenInfosRequestV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenInfosRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSREQUEST_GETIDENTITIESTOKENINFOSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATEREQUEST, + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest) }) -_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest) -_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0) -_sym_db.RegisterMessage(GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosRequest) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0) -GetContestedResourceVoteStateResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateResponse', (_message.Message,), { +GetIdentitiesTokenInfosResponse = _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenInfosResponse', (_message.Message,), { - 'GetContestedResourceVoteStateResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVoteStateResponseV0', (_message.Message,), { + 'GetIdentitiesTokenInfosResponseV0' : _reflection.GeneratedProtocolMessageType('GetIdentitiesTokenInfosResponseV0', (_message.Message,), { - 'FinishedVoteInfo' : _reflection.GeneratedProtocolMessageType('FinishedVoteInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO, + 'TokenIdentityInfoEntry' : _reflection.GeneratedProtocolMessageType('TokenIdentityInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENIDENTITYINFOENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry) }) , - 'ContestedResourceContenders' : _reflection.GeneratedProtocolMessageType('ContestedResourceContenders', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTESTEDRESOURCECONTENDERS, + 'TokenInfoEntry' : _reflection.GeneratedProtocolMessageType('TokenInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_TOKENINFOENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry) }) , - 'Contender' : _reflection.GeneratedProtocolMessageType('Contender', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_CONTENDER, + 'IdentityTokenInfos' : _reflection.GeneratedProtocolMessageType('IdentityTokenInfos', (_message.Message,), { + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0_IDENTITYTOKENINFOS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0, + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSRESPONSE_GETIDENTITIESTOKENINFOSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTESTATERESPONSE, + 'DESCRIPTOR' : _GETIDENTITIESTOKENINFOSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse) }) -_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse) -_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0) -_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo) -_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders) -_sym_db.RegisterMessage(GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender) - -GetContestedResourceVotersForIdentityRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityRequest', (_message.Message,), { +_sym_db.RegisterMessage(GetIdentitiesTokenInfosResponse) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry) +_sym_db.RegisterMessage(GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos) - 'GetContestedResourceVotersForIdentityRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityRequestV0', (_message.Message,), { +GetTokenStatusesRequest = _reflection.GeneratedProtocolMessageType('GetTokenStatusesRequest', (_message.Message,), { - 'StartAtIdentifierInfo' : _reflection.GeneratedProtocolMessageType('StartAtIdentifierInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0_STARTATIDENTIFIERINFO, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo) - }) - , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST_GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUESTV0, + 'GetTokenStatusesRequestV0' : _reflection.GeneratedProtocolMessageType('GetTokenStatusesRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENSTATUSESREQUEST_GETTOKENSTATUSESREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYREQUEST, + 'DESCRIPTOR' : _GETTOKENSTATUSESREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesRequest) }) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo) +_sym_db.RegisterMessage(GetTokenStatusesRequest) +_sym_db.RegisterMessage(GetTokenStatusesRequest.GetTokenStatusesRequestV0) -GetContestedResourceVotersForIdentityResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityResponse', (_message.Message,), { +GetTokenStatusesResponse = _reflection.GeneratedProtocolMessageType('GetTokenStatusesResponse', (_message.Message,), { - 'GetContestedResourceVotersForIdentityResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceVotersForIdentityResponseV0', (_message.Message,), { + 'GetTokenStatusesResponseV0' : _reflection.GeneratedProtocolMessageType('GetTokenStatusesResponseV0', (_message.Message,), { - 'ContestedResourceVoters' : _reflection.GeneratedProtocolMessageType('ContestedResourceVoters', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0_CONTESTEDRESOURCEVOTERS, + 'TokenStatusEntry' : _reflection.GeneratedProtocolMessageType('TokenStatusEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE_GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSEV0, + + 'TokenStatuses' : _reflection.GeneratedProtocolMessageType('TokenStatuses', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0_TOKENSTATUSES, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses) + }) + , + 'DESCRIPTOR' : _GETTOKENSTATUSESRESPONSE_GETTOKENSTATUSESRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEVOTERSFORIDENTITYRESPONSE, + 'DESCRIPTOR' : _GETTOKENSTATUSESRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenStatusesResponse) }) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0) -_sym_db.RegisterMessage(GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters) +_sym_db.RegisterMessage(GetTokenStatusesResponse) +_sym_db.RegisterMessage(GetTokenStatusesResponse.GetTokenStatusesResponseV0) +_sym_db.RegisterMessage(GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry) +_sym_db.RegisterMessage(GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses) -GetContestedResourceIdentityVotesRequest = _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesRequest', (_message.Message,), { +GetTokenPreProgrammedDistributionsRequest = _reflection.GeneratedProtocolMessageType('GetTokenPreProgrammedDistributionsRequest', (_message.Message,), { - 'GetContestedResourceIdentityVotesRequestV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesRequestV0', (_message.Message,), { + 'GetTokenPreProgrammedDistributionsRequestV0' : _reflection.GeneratedProtocolMessageType('GetTokenPreProgrammedDistributionsRequestV0', (_message.Message,), { - 'StartAtVotePollIdInfo' : _reflection.GeneratedProtocolMessageType('StartAtVotePollIdInfo', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0_STARTATVOTEPOLLIDINFO, + 'StartAtInfo' : _reflection.GeneratedProtocolMessageType('StartAtInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0_STARTATINFO, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST_GETCONTESTEDRESOURCEIDENTITYVOTESREQUESTV0, + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESREQUEST, + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest) }) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsRequest) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo) -GetContestedResourceIdentityVotesResponse = _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesResponse', (_message.Message,), { +GetTokenPreProgrammedDistributionsResponse = _reflection.GeneratedProtocolMessageType('GetTokenPreProgrammedDistributionsResponse', (_message.Message,), { - 'GetContestedResourceIdentityVotesResponseV0' : _reflection.GeneratedProtocolMessageType('GetContestedResourceIdentityVotesResponseV0', (_message.Message,), { + 'GetTokenPreProgrammedDistributionsResponseV0' : _reflection.GeneratedProtocolMessageType('GetTokenPreProgrammedDistributionsResponseV0', (_message.Message,), { - 'ContestedResourceIdentityVotes' : _reflection.GeneratedProtocolMessageType('ContestedResourceIdentityVotes', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTES, + 'TokenDistributionEntry' : _reflection.GeneratedProtocolMessageType('TokenDistributionEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry) }) , - 'ResourceVoteChoice' : _reflection.GeneratedProtocolMessageType('ResourceVoteChoice', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_RESOURCEVOTECHOICE, + 'TokenTimedDistributionEntry' : _reflection.GeneratedProtocolMessageType('TokenTimedDistributionEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENTIMEDDISTRIBUTIONENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry) }) , - 'ContestedResourceIdentityVote' : _reflection.GeneratedProtocolMessageType('ContestedResourceIdentityVote', (_message.Message,), { - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0_CONTESTEDRESOURCEIDENTITYVOTE, + 'TokenDistributions' : _reflection.GeneratedProtocolMessageType('TokenDistributions', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0_TOKENDISTRIBUTIONS, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE_GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSEV0, + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0) }) , - 'DESCRIPTOR' : _GETCONTESTEDRESOURCEIDENTITYVOTESRESPONSE, + 'DESCRIPTOR' : _GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse) }) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice) -_sym_db.RegisterMessage(GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsResponse) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry) +_sym_db.RegisterMessage(GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions) -GetPrefundedSpecializedBalanceRequest = _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceRequest', (_message.Message,), { +GetTokenTotalSupplyRequest = _reflection.GeneratedProtocolMessageType('GetTokenTotalSupplyRequest', (_message.Message,), { - 'GetPrefundedSpecializedBalanceRequestV0' : _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST_GETPREFUNDEDSPECIALIZEDBALANCEREQUESTV0, + 'GetTokenTotalSupplyRequestV0' : _reflection.GeneratedProtocolMessageType('GetTokenTotalSupplyRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENTOTALSUPPLYREQUEST_GETTOKENTOTALSUPPLYREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0) }) , - 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCEREQUEST, + 'DESCRIPTOR' : _GETTOKENTOTALSUPPLYREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest) }) -_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceRequest) -_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0) +_sym_db.RegisterMessage(GetTokenTotalSupplyRequest) +_sym_db.RegisterMessage(GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0) -GetPrefundedSpecializedBalanceResponse = _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceResponse', (_message.Message,), { +GetTokenTotalSupplyResponse = _reflection.GeneratedProtocolMessageType('GetTokenTotalSupplyResponse', (_message.Message,), { - 'GetPrefundedSpecializedBalanceResponseV0' : _reflection.GeneratedProtocolMessageType('GetPrefundedSpecializedBalanceResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE_GETPREFUNDEDSPECIALIZEDBALANCERESPONSEV0, + 'GetTokenTotalSupplyResponseV0' : _reflection.GeneratedProtocolMessageType('GetTokenTotalSupplyResponseV0', (_message.Message,), { + + 'TokenTotalSupplyEntry' : _reflection.GeneratedProtocolMessageType('TokenTotalSupplyEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0_TOKENTOTALSUPPLYENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry) + }) + , + 'DESCRIPTOR' : _GETTOKENTOTALSUPPLYRESPONSE_GETTOKENTOTALSUPPLYRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0) }) , - 'DESCRIPTOR' : _GETPREFUNDEDSPECIALIZEDBALANCERESPONSE, + 'DESCRIPTOR' : _GETTOKENTOTALSUPPLYRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse) }) -_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceResponse) -_sym_db.RegisterMessage(GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0) +_sym_db.RegisterMessage(GetTokenTotalSupplyResponse) +_sym_db.RegisterMessage(GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0) +_sym_db.RegisterMessage(GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry) -GetTotalCreditsInPlatformRequest = _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformRequest', (_message.Message,), { +GetGroupInfoRequest = _reflection.GeneratedProtocolMessageType('GetGroupInfoRequest', (_message.Message,), { - 'GetTotalCreditsInPlatformRequestV0' : _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMREQUEST_GETTOTALCREDITSINPLATFORMREQUESTV0, + 'GetGroupInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetGroupInfoRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOREQUEST_GETGROUPINFOREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0) + }) + , + 'DESCRIPTOR' : _GETGROUPINFOREQUEST, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoRequest) + }) +_sym_db.RegisterMessage(GetGroupInfoRequest) +_sym_db.RegisterMessage(GetGroupInfoRequest.GetGroupInfoRequestV0) + +GetGroupInfoResponse = _reflection.GeneratedProtocolMessageType('GetGroupInfoResponse', (_message.Message,), { + + 'GetGroupInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetGroupInfoResponseV0', (_message.Message,), { + + 'GroupMemberEntry' : _reflection.GeneratedProtocolMessageType('GroupMemberEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPMEMBERENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry) + }) + , + + 'GroupInfoEntry' : _reflection.GeneratedProtocolMessageType('GroupInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFOENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry) + }) + , + + 'GroupInfo' : _reflection.GeneratedProtocolMessageType('GroupInfo', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0_GROUPINFO, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo) + }) + , + 'DESCRIPTOR' : _GETGROUPINFORESPONSE_GETGROUPINFORESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0) }) , - 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMREQUEST, + 'DESCRIPTOR' : _GETGROUPINFORESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfoResponse) }) -_sym_db.RegisterMessage(GetTotalCreditsInPlatformRequest) -_sym_db.RegisterMessage(GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0) +_sym_db.RegisterMessage(GetGroupInfoResponse) +_sym_db.RegisterMessage(GetGroupInfoResponse.GetGroupInfoResponseV0) +_sym_db.RegisterMessage(GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry) +_sym_db.RegisterMessage(GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry) +_sym_db.RegisterMessage(GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo) -GetTotalCreditsInPlatformResponse = _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformResponse', (_message.Message,), { +GetGroupInfosRequest = _reflection.GeneratedProtocolMessageType('GetGroupInfosRequest', (_message.Message,), { - 'GetTotalCreditsInPlatformResponseV0' : _reflection.GeneratedProtocolMessageType('GetTotalCreditsInPlatformResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMRESPONSE_GETTOTALCREDITSINPLATFORMRESPONSEV0, + 'StartAtGroupContractPosition' : _reflection.GeneratedProtocolMessageType('StartAtGroupContractPosition', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOSREQUEST_STARTATGROUPCONTRACTPOSITION, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition) }) , - 'DESCRIPTOR' : _GETTOTALCREDITSINPLATFORMRESPONSE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse) - }) -_sym_db.RegisterMessage(GetTotalCreditsInPlatformResponse) -_sym_db.RegisterMessage(GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0) -GetPathElementsRequest = _reflection.GeneratedProtocolMessageType('GetPathElementsRequest', (_message.Message,), { - - 'GetPathElementsRequestV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST_GETPATHELEMENTSREQUESTV0, + 'GetGroupInfosRequestV0' : _reflection.GeneratedProtocolMessageType('GetGroupInfosRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOSREQUEST_GETGROUPINFOSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0) }) , - 'DESCRIPTOR' : _GETPATHELEMENTSREQUEST, + 'DESCRIPTOR' : _GETGROUPINFOSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosRequest) }) -_sym_db.RegisterMessage(GetPathElementsRequest) -_sym_db.RegisterMessage(GetPathElementsRequest.GetPathElementsRequestV0) +_sym_db.RegisterMessage(GetGroupInfosRequest) +_sym_db.RegisterMessage(GetGroupInfosRequest.StartAtGroupContractPosition) +_sym_db.RegisterMessage(GetGroupInfosRequest.GetGroupInfosRequestV0) -GetPathElementsResponse = _reflection.GeneratedProtocolMessageType('GetPathElementsResponse', (_message.Message,), { +GetGroupInfosResponse = _reflection.GeneratedProtocolMessageType('GetGroupInfosResponse', (_message.Message,), { - 'GetPathElementsResponseV0' : _reflection.GeneratedProtocolMessageType('GetPathElementsResponseV0', (_message.Message,), { + 'GetGroupInfosResponseV0' : _reflection.GeneratedProtocolMessageType('GetGroupInfosResponseV0', (_message.Message,), { - 'Elements' : _reflection.GeneratedProtocolMessageType('Elements', (_message.Message,), { - 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0_ELEMENTS, + 'GroupMemberEntry' : _reflection.GeneratedProtocolMessageType('GroupMemberEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPMEMBERENTRY, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry) }) , - 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE_GETPATHELEMENTSRESPONSEV0, + + 'GroupPositionInfoEntry' : _reflection.GeneratedProtocolMessageType('GroupPositionInfoEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPPOSITIONINFOENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry) + }) + , + + 'GroupInfos' : _reflection.GeneratedProtocolMessageType('GroupInfos', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0_GROUPINFOS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos) + }) + , + 'DESCRIPTOR' : _GETGROUPINFOSRESPONSE_GETGROUPINFOSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0) }) , - 'DESCRIPTOR' : _GETPATHELEMENTSRESPONSE, + 'DESCRIPTOR' : _GETGROUPINFOSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetPathElementsResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupInfosResponse) }) -_sym_db.RegisterMessage(GetPathElementsResponse) -_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0) -_sym_db.RegisterMessage(GetPathElementsResponse.GetPathElementsResponseV0.Elements) +_sym_db.RegisterMessage(GetGroupInfosResponse) +_sym_db.RegisterMessage(GetGroupInfosResponse.GetGroupInfosResponseV0) +_sym_db.RegisterMessage(GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry) +_sym_db.RegisterMessage(GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry) +_sym_db.RegisterMessage(GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos) -GetStatusRequest = _reflection.GeneratedProtocolMessageType('GetStatusRequest', (_message.Message,), { +GetGroupActionsRequest = _reflection.GeneratedProtocolMessageType('GetGroupActionsRequest', (_message.Message,), { - 'GetStatusRequestV0' : _reflection.GeneratedProtocolMessageType('GetStatusRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSREQUEST_GETSTATUSREQUESTV0, + 'StartAtActionId' : _reflection.GeneratedProtocolMessageType('StartAtActionId', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSREQUEST_STARTATACTIONID, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId) }) , - 'DESCRIPTOR' : _GETSTATUSREQUEST, + + 'GetGroupActionsRequestV0' : _reflection.GeneratedProtocolMessageType('GetGroupActionsRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSREQUEST_GETGROUPACTIONSREQUESTV0, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0) + }) + , + 'DESCRIPTOR' : _GETGROUPACTIONSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsRequest) }) -_sym_db.RegisterMessage(GetStatusRequest) -_sym_db.RegisterMessage(GetStatusRequest.GetStatusRequestV0) +_sym_db.RegisterMessage(GetGroupActionsRequest) +_sym_db.RegisterMessage(GetGroupActionsRequest.StartAtActionId) +_sym_db.RegisterMessage(GetGroupActionsRequest.GetGroupActionsRequestV0) -GetStatusResponse = _reflection.GeneratedProtocolMessageType('GetStatusResponse', (_message.Message,), { +GetGroupActionsResponse = _reflection.GeneratedProtocolMessageType('GetGroupActionsResponse', (_message.Message,), { - 'GetStatusResponseV0' : _reflection.GeneratedProtocolMessageType('GetStatusResponseV0', (_message.Message,), { + 'GetGroupActionsResponseV0' : _reflection.GeneratedProtocolMessageType('GetGroupActionsResponseV0', (_message.Message,), { - 'Version' : _reflection.GeneratedProtocolMessageType('Version', (_message.Message,), { + 'MintEvent' : _reflection.GeneratedProtocolMessageType('MintEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_MINTEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent) + }) + , - 'Software' : _reflection.GeneratedProtocolMessageType('Software', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_SOFTWARE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software) - }) - , + 'BurnEvent' : _reflection.GeneratedProtocolMessageType('BurnEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_BURNEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent) + }) + , - 'Protocol' : _reflection.GeneratedProtocolMessageType('Protocol', (_message.Message,), { + 'FreezeEvent' : _reflection.GeneratedProtocolMessageType('FreezeEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_FREEZEEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent) + }) + , - 'Tenderdash' : _reflection.GeneratedProtocolMessageType('Tenderdash', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_TENDERDASH, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash) - }) - , + 'UnfreezeEvent' : _reflection.GeneratedProtocolMessageType('UnfreezeEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_UNFREEZEEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent) + }) + , - 'Drive' : _reflection.GeneratedProtocolMessageType('Drive', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL_DRIVE, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive) - }) - , - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION_PROTOCOL, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol) - }) - , - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_VERSION, + 'DestroyFrozenFundsEvent' : _reflection.GeneratedProtocolMessageType('DestroyFrozenFundsEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DESTROYFROZENFUNDSEVENT, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent) }) , - 'Time' : _reflection.GeneratedProtocolMessageType('Time', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME, + 'SharedEncryptedNote' : _reflection.GeneratedProtocolMessageType('SharedEncryptedNote', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_SHAREDENCRYPTEDNOTE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote) }) , - 'Node' : _reflection.GeneratedProtocolMessageType('Node', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NODE, + 'PersonalEncryptedNote' : _reflection.GeneratedProtocolMessageType('PersonalEncryptedNote', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_PERSONALENCRYPTEDNOTE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote) }) , - 'Chain' : _reflection.GeneratedProtocolMessageType('Chain', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN, + 'TransferEvent' : _reflection.GeneratedProtocolMessageType('TransferEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TRANSFEREVENT, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent) }) , - 'Network' : _reflection.GeneratedProtocolMessageType('Network', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_NETWORK, + 'EmergencyActionEvent' : _reflection.GeneratedProtocolMessageType('EmergencyActionEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_EMERGENCYACTIONEVENT, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent) }) , - 'StateSync' : _reflection.GeneratedProtocolMessageType('StateSync', (_message.Message,), { - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC, + 'TokenConfigUpdateEvent' : _reflection.GeneratedProtocolMessageType('TokenConfigUpdateEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENCONFIGUPDATEEVENT, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent) }) , - 'DESCRIPTOR' : _GETSTATUSRESPONSE_GETSTATUSRESPONSEV0, + + 'GroupActionEvent' : _reflection.GeneratedProtocolMessageType('GroupActionEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent) + }) + , + + 'DocumentEvent' : _reflection.GeneratedProtocolMessageType('DocumentEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent) + }) + , + + 'DocumentCreateEvent' : _reflection.GeneratedProtocolMessageType('DocumentCreateEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_DOCUMENTCREATEEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent) + }) + , + + 'ContractUpdateEvent' : _reflection.GeneratedProtocolMessageType('ContractUpdateEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTUPDATEEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent) + }) + , + + 'ContractEvent' : _reflection.GeneratedProtocolMessageType('ContractEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_CONTRACTEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent) + }) + , + + 'TokenEvent' : _reflection.GeneratedProtocolMessageType('TokenEvent', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_TOKENEVENT, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent) + }) + , + + 'GroupActionEntry' : _reflection.GeneratedProtocolMessageType('GroupActionEntry', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONENTRY, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry) + }) + , + + 'GroupActions' : _reflection.GeneratedProtocolMessageType('GroupActions', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0_GROUPACTIONS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions) + }) + , + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE_GETGROUPACTIONSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0) }) , - 'DESCRIPTOR' : _GETSTATUSRESPONSE, + 'DESCRIPTOR' : _GETGROUPACTIONSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetStatusResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionsResponse) }) -_sym_db.RegisterMessage(GetStatusResponse) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Software) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Time) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Node) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Chain) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.Network) -_sym_db.RegisterMessage(GetStatusResponse.GetStatusResponseV0.StateSync) - -GetCurrentQuorumsInfoRequest = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequest', (_message.Message,), { - - 'GetCurrentQuorumsInfoRequestV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoRequestV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST_GETCURRENTQUORUMSINFOREQUESTV0, +_sym_db.RegisterMessage(GetGroupActionsResponse) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry) +_sym_db.RegisterMessage(GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions) + +GetGroupActionSignersRequest = _reflection.GeneratedProtocolMessageType('GetGroupActionSignersRequest', (_message.Message,), { + + 'GetGroupActionSignersRequestV0' : _reflection.GeneratedProtocolMessageType('GetGroupActionSignersRequestV0', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSREQUEST_GETGROUPACTIONSIGNERSREQUESTV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0) }) , - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFOREQUEST, + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSREQUEST, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersRequest) }) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0) +_sym_db.RegisterMessage(GetGroupActionSignersRequest) +_sym_db.RegisterMessage(GetGroupActionSignersRequest.GetGroupActionSignersRequestV0) -GetCurrentQuorumsInfoResponse = _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponse', (_message.Message,), { +GetGroupActionSignersResponse = _reflection.GeneratedProtocolMessageType('GetGroupActionSignersResponse', (_message.Message,), { - 'ValidatorV0' : _reflection.GeneratedProtocolMessageType('ValidatorV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0) - }) - , + 'GetGroupActionSignersResponseV0' : _reflection.GeneratedProtocolMessageType('GetGroupActionSignersResponseV0', (_message.Message,), { - 'ValidatorSetV0' : _reflection.GeneratedProtocolMessageType('ValidatorSetV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_VALIDATORSETV0, - '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0) - }) - , + 'GroupActionSigner' : _reflection.GeneratedProtocolMessageType('GroupActionSigner', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNER, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner) + }) + , - 'GetCurrentQuorumsInfoResponseV0' : _reflection.GeneratedProtocolMessageType('GetCurrentQuorumsInfoResponseV0', (_message.Message,), { - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE_GETCURRENTQUORUMSINFORESPONSEV0, + 'GroupActionSigners' : _reflection.GeneratedProtocolMessageType('GroupActionSigners', (_message.Message,), { + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0_GROUPACTIONSIGNERS, + '__module__' : 'platform_pb2' + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners) + }) + , + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSRESPONSE_GETGROUPACTIONSIGNERSRESPONSEV0, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0) }) , - 'DESCRIPTOR' : _GETCURRENTQUORUMSINFORESPONSE, + 'DESCRIPTOR' : _GETGROUPACTIONSIGNERSRESPONSE, '__module__' : 'platform_pb2' - # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse) + # @@protoc_insertion_point(class_scope:org.dash.platform.dapi.v0.GetGroupActionSignersResponse) }) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorV0) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.ValidatorSetV0) -_sym_db.RegisterMessage(GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0) - - +_sym_db.RegisterMessage(GetGroupActionSignersResponse) +_sym_db.RegisterMessage(GetGroupActionSignersResponse.GetGroupActionSignersResponseV0) +_sym_db.RegisterMessage(GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner) +_sym_db.RegisterMessage(GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners) + + +_RESPONSEMETADATA.fields_by_name['height']._options = None +_RESPONSEMETADATA.fields_by_name['time_ms']._options = None +_GETIDENTITYNONCERESPONSE_GETIDENTITYNONCERESPONSEV0.fields_by_name['identity_nonce']._options = None +_GETIDENTITYCONTRACTNONCERESPONSE_GETIDENTITYCONTRACTNONCERESPONSEV0.fields_by_name['identity_contract_nonce']._options = None +_GETIDENTITYBALANCERESPONSE_GETIDENTITYBALANCERESPONSEV0.fields_by_name['balance']._options = None +_GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0_BALANCEANDREVISION.fields_by_name['balance']._options = None +_GETIDENTITYBALANCEANDREVISIONRESPONSE_GETIDENTITYBALANCEANDREVISIONRESPONSEV0_BALANCEANDREVISION.fields_by_name['revision']._options = None _SEARCHKEY_PURPOSEMAPENTRY._options = None _SECURITYLEVELMAP_SECURITYLEVELMAPENTRY._options = None +_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSE_GETEVONODESPROPOSEDEPOCHBLOCKSRESPONSEV0_EVONODEPROPOSEDBLOCKS.fields_by_name['count']._options = None +_GETIDENTITIESBALANCESRESPONSE_GETIDENTITIESBALANCESRESPONSEV0_IDENTITYBALANCE.fields_by_name['balance']._options = None +_GETDATACONTRACTHISTORYREQUEST_GETDATACONTRACTHISTORYREQUESTV0.fields_by_name['start_at_ms']._options = None +_GETDATACONTRACTHISTORYRESPONSE_GETDATACONTRACTHISTORYRESPONSEV0_DATACONTRACTHISTORYENTRY.fields_by_name['date']._options = None +_GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO.fields_by_name['first_block_height']._options = None +_GETEPOCHSINFORESPONSE_GETEPOCHSINFORESPONSEV0_EPOCHINFO.fields_by_name['start_time']._options = None +_GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_STARTATTIMEINFO.fields_by_name['start_time_ms']._options = None +_GETVOTEPOLLSBYENDDATEREQUEST_GETVOTEPOLLSBYENDDATEREQUESTV0_ENDATTIMEINFO.fields_by_name['end_time_ms']._options = None +_GETVOTEPOLLSBYENDDATERESPONSE_GETVOTEPOLLSBYENDDATERESPONSEV0_SERIALIZEDVOTEPOLLSBYTIMESTAMP.fields_by_name['timestamp']._options = None +_GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO.fields_by_name['finished_at_block_height']._options = None +_GETCONTESTEDRESOURCEVOTESTATERESPONSE_GETCONTESTEDRESOURCEVOTESTATERESPONSEV0_FINISHEDVOTEINFO.fields_by_name['finished_at_block_time_ms']._options = None +_GETPREFUNDEDSPECIALIZEDBALANCERESPONSE_GETPREFUNDEDSPECIALIZEDBALANCERESPONSEV0.fields_by_name['balance']._options = None +_GETTOTALCREDITSINPLATFORMRESPONSE_GETTOTALCREDITSINPLATFORMRESPONSEV0.fields_by_name['credits']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME.fields_by_name['local']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME.fields_by_name['block']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_TIME.fields_by_name['genesis']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN.fields_by_name['latest_block_height']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN.fields_by_name['earliest_block_height']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_CHAIN.fields_by_name['max_peer_block_height']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['total_synced_time']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['remaining_time']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['chunk_process_avg_time']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['snapshot_height']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['snapshot_chunks_count']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['backfilled_blocks']._options = None +_GETSTATUSRESPONSE_GETSTATUSRESPONSEV0_STATESYNC.fields_by_name['backfill_blocks_total']._options = None _PLATFORM = _descriptor.ServiceDescriptor( name='Platform', @@ -10823,8 +15960,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=31605, - serialized_end=36249, + serialized_start=47196, + serialized_end=53366, methods=[ _descriptor.MethodDescriptor( name='broadcastStateTransition', @@ -11146,6 +16283,116 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='getIdentityTokenBalances', + full_name='org.dash.platform.dapi.v0.Platform.getIdentityTokenBalances', + index=32, + containing_service=None, + input_type=_GETIDENTITYTOKENBALANCESREQUEST, + output_type=_GETIDENTITYTOKENBALANCESRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getIdentitiesTokenBalances', + full_name='org.dash.platform.dapi.v0.Platform.getIdentitiesTokenBalances', + index=33, + containing_service=None, + input_type=_GETIDENTITIESTOKENBALANCESREQUEST, + output_type=_GETIDENTITIESTOKENBALANCESRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getIdentityTokenInfos', + full_name='org.dash.platform.dapi.v0.Platform.getIdentityTokenInfos', + index=34, + containing_service=None, + input_type=_GETIDENTITYTOKENINFOSREQUEST, + output_type=_GETIDENTITYTOKENINFOSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getIdentitiesTokenInfos', + full_name='org.dash.platform.dapi.v0.Platform.getIdentitiesTokenInfos', + index=35, + containing_service=None, + input_type=_GETIDENTITIESTOKENINFOSREQUEST, + output_type=_GETIDENTITIESTOKENINFOSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getTokenStatuses', + full_name='org.dash.platform.dapi.v0.Platform.getTokenStatuses', + index=36, + containing_service=None, + input_type=_GETTOKENSTATUSESREQUEST, + output_type=_GETTOKENSTATUSESRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getTokenPreProgrammedDistributions', + full_name='org.dash.platform.dapi.v0.Platform.getTokenPreProgrammedDistributions', + index=37, + containing_service=None, + input_type=_GETTOKENPREPROGRAMMEDDISTRIBUTIONSREQUEST, + output_type=_GETTOKENPREPROGRAMMEDDISTRIBUTIONSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getTokenTotalSupply', + full_name='org.dash.platform.dapi.v0.Platform.getTokenTotalSupply', + index=38, + containing_service=None, + input_type=_GETTOKENTOTALSUPPLYREQUEST, + output_type=_GETTOKENTOTALSUPPLYRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getGroupInfo', + full_name='org.dash.platform.dapi.v0.Platform.getGroupInfo', + index=39, + containing_service=None, + input_type=_GETGROUPINFOREQUEST, + output_type=_GETGROUPINFORESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getGroupInfos', + full_name='org.dash.platform.dapi.v0.Platform.getGroupInfos', + index=40, + containing_service=None, + input_type=_GETGROUPINFOSREQUEST, + output_type=_GETGROUPINFOSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getGroupActions', + full_name='org.dash.platform.dapi.v0.Platform.getGroupActions', + index=41, + containing_service=None, + input_type=_GETGROUPACTIONSREQUEST, + output_type=_GETGROUPACTIONSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name='getGroupActionSigners', + full_name='org.dash.platform.dapi.v0.Platform.getGroupActionSigners', + index=42, + containing_service=None, + input_type=_GETGROUPACTIONSIGNERSREQUEST, + output_type=_GETGROUPACTIONSIGNERSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), ]) _sym_db.RegisterServiceDescriptor(_PLATFORM) diff --git a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py index b8c38478693..7b730ee7d22 100644 --- a/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py +++ b/packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py @@ -174,6 +174,61 @@ def __init__(self, channel): request_serializer=platform__pb2.GetCurrentQuorumsInfoRequest.SerializeToString, response_deserializer=platform__pb2.GetCurrentQuorumsInfoResponse.FromString, ) + self.getIdentityTokenBalances = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentityTokenBalances', + request_serializer=platform__pb2.GetIdentityTokenBalancesRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentityTokenBalancesResponse.FromString, + ) + self.getIdentitiesTokenBalances = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentitiesTokenBalances', + request_serializer=platform__pb2.GetIdentitiesTokenBalancesRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentitiesTokenBalancesResponse.FromString, + ) + self.getIdentityTokenInfos = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentityTokenInfos', + request_serializer=platform__pb2.GetIdentityTokenInfosRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentityTokenInfosResponse.FromString, + ) + self.getIdentitiesTokenInfos = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getIdentitiesTokenInfos', + request_serializer=platform__pb2.GetIdentitiesTokenInfosRequest.SerializeToString, + response_deserializer=platform__pb2.GetIdentitiesTokenInfosResponse.FromString, + ) + self.getTokenStatuses = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getTokenStatuses', + request_serializer=platform__pb2.GetTokenStatusesRequest.SerializeToString, + response_deserializer=platform__pb2.GetTokenStatusesResponse.FromString, + ) + self.getTokenPreProgrammedDistributions = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getTokenPreProgrammedDistributions', + request_serializer=platform__pb2.GetTokenPreProgrammedDistributionsRequest.SerializeToString, + response_deserializer=platform__pb2.GetTokenPreProgrammedDistributionsResponse.FromString, + ) + self.getTokenTotalSupply = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getTokenTotalSupply', + request_serializer=platform__pb2.GetTokenTotalSupplyRequest.SerializeToString, + response_deserializer=platform__pb2.GetTokenTotalSupplyResponse.FromString, + ) + self.getGroupInfo = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getGroupInfo', + request_serializer=platform__pb2.GetGroupInfoRequest.SerializeToString, + response_deserializer=platform__pb2.GetGroupInfoResponse.FromString, + ) + self.getGroupInfos = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getGroupInfos', + request_serializer=platform__pb2.GetGroupInfosRequest.SerializeToString, + response_deserializer=platform__pb2.GetGroupInfosResponse.FromString, + ) + self.getGroupActions = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getGroupActions', + request_serializer=platform__pb2.GetGroupActionsRequest.SerializeToString, + response_deserializer=platform__pb2.GetGroupActionsResponse.FromString, + ) + self.getGroupActionSigners = channel.unary_unary( + '/org.dash.platform.dapi.v0.Platform/getGroupActionSigners', + request_serializer=platform__pb2.GetGroupActionSignersRequest.SerializeToString, + response_deserializer=platform__pb2.GetGroupActionSignersResponse.FromString, + ) class PlatformServicer(object): @@ -376,6 +431,72 @@ def getCurrentQuorumsInfo(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def getIdentityTokenBalances(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getIdentitiesTokenBalances(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getIdentityTokenInfos(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getIdentitiesTokenInfos(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getTokenStatuses(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getTokenPreProgrammedDistributions(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getTokenTotalSupply(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getGroupInfo(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getGroupInfos(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getGroupActions(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def getGroupActionSigners(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_PlatformServicer_to_server(servicer, server): rpc_method_handlers = { @@ -539,6 +660,61 @@ def add_PlatformServicer_to_server(servicer, server): request_deserializer=platform__pb2.GetCurrentQuorumsInfoRequest.FromString, response_serializer=platform__pb2.GetCurrentQuorumsInfoResponse.SerializeToString, ), + 'getIdentityTokenBalances': grpc.unary_unary_rpc_method_handler( + servicer.getIdentityTokenBalances, + request_deserializer=platform__pb2.GetIdentityTokenBalancesRequest.FromString, + response_serializer=platform__pb2.GetIdentityTokenBalancesResponse.SerializeToString, + ), + 'getIdentitiesTokenBalances': grpc.unary_unary_rpc_method_handler( + servicer.getIdentitiesTokenBalances, + request_deserializer=platform__pb2.GetIdentitiesTokenBalancesRequest.FromString, + response_serializer=platform__pb2.GetIdentitiesTokenBalancesResponse.SerializeToString, + ), + 'getIdentityTokenInfos': grpc.unary_unary_rpc_method_handler( + servicer.getIdentityTokenInfos, + request_deserializer=platform__pb2.GetIdentityTokenInfosRequest.FromString, + response_serializer=platform__pb2.GetIdentityTokenInfosResponse.SerializeToString, + ), + 'getIdentitiesTokenInfos': grpc.unary_unary_rpc_method_handler( + servicer.getIdentitiesTokenInfos, + request_deserializer=platform__pb2.GetIdentitiesTokenInfosRequest.FromString, + response_serializer=platform__pb2.GetIdentitiesTokenInfosResponse.SerializeToString, + ), + 'getTokenStatuses': grpc.unary_unary_rpc_method_handler( + servicer.getTokenStatuses, + request_deserializer=platform__pb2.GetTokenStatusesRequest.FromString, + response_serializer=platform__pb2.GetTokenStatusesResponse.SerializeToString, + ), + 'getTokenPreProgrammedDistributions': grpc.unary_unary_rpc_method_handler( + servicer.getTokenPreProgrammedDistributions, + request_deserializer=platform__pb2.GetTokenPreProgrammedDistributionsRequest.FromString, + response_serializer=platform__pb2.GetTokenPreProgrammedDistributionsResponse.SerializeToString, + ), + 'getTokenTotalSupply': grpc.unary_unary_rpc_method_handler( + servicer.getTokenTotalSupply, + request_deserializer=platform__pb2.GetTokenTotalSupplyRequest.FromString, + response_serializer=platform__pb2.GetTokenTotalSupplyResponse.SerializeToString, + ), + 'getGroupInfo': grpc.unary_unary_rpc_method_handler( + servicer.getGroupInfo, + request_deserializer=platform__pb2.GetGroupInfoRequest.FromString, + response_serializer=platform__pb2.GetGroupInfoResponse.SerializeToString, + ), + 'getGroupInfos': grpc.unary_unary_rpc_method_handler( + servicer.getGroupInfos, + request_deserializer=platform__pb2.GetGroupInfosRequest.FromString, + response_serializer=platform__pb2.GetGroupInfosResponse.SerializeToString, + ), + 'getGroupActions': grpc.unary_unary_rpc_method_handler( + servicer.getGroupActions, + request_deserializer=platform__pb2.GetGroupActionsRequest.FromString, + response_serializer=platform__pb2.GetGroupActionsResponse.SerializeToString, + ), + 'getGroupActionSigners': grpc.unary_unary_rpc_method_handler( + servicer.getGroupActionSigners, + request_deserializer=platform__pb2.GetGroupActionSignersRequest.FromString, + response_serializer=platform__pb2.GetGroupActionSignersResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'org.dash.platform.dapi.v0.Platform', rpc_method_handlers) @@ -1092,3 +1268,190 @@ def getCurrentQuorumsInfo(request, platform__pb2.GetCurrentQuorumsInfoResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getIdentityTokenBalances(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityTokenBalances', + platform__pb2.GetIdentityTokenBalancesRequest.SerializeToString, + platform__pb2.GetIdentityTokenBalancesResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getIdentitiesTokenBalances(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentitiesTokenBalances', + platform__pb2.GetIdentitiesTokenBalancesRequest.SerializeToString, + platform__pb2.GetIdentitiesTokenBalancesResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getIdentityTokenInfos(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentityTokenInfos', + platform__pb2.GetIdentityTokenInfosRequest.SerializeToString, + platform__pb2.GetIdentityTokenInfosResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getIdentitiesTokenInfos(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getIdentitiesTokenInfos', + platform__pb2.GetIdentitiesTokenInfosRequest.SerializeToString, + platform__pb2.GetIdentitiesTokenInfosResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getTokenStatuses(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getTokenStatuses', + platform__pb2.GetTokenStatusesRequest.SerializeToString, + platform__pb2.GetTokenStatusesResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getTokenPreProgrammedDistributions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getTokenPreProgrammedDistributions', + platform__pb2.GetTokenPreProgrammedDistributionsRequest.SerializeToString, + platform__pb2.GetTokenPreProgrammedDistributionsResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getTokenTotalSupply(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getTokenTotalSupply', + platform__pb2.GetTokenTotalSupplyRequest.SerializeToString, + platform__pb2.GetTokenTotalSupplyResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getGroupInfo(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getGroupInfo', + platform__pb2.GetGroupInfoRequest.SerializeToString, + platform__pb2.GetGroupInfoResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getGroupInfos(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getGroupInfos', + platform__pb2.GetGroupInfosRequest.SerializeToString, + platform__pb2.GetGroupInfosResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getGroupActions(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getGroupActions', + platform__pb2.GetGroupActionsRequest.SerializeToString, + platform__pb2.GetGroupActionsResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def getGroupActionSigners(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/org.dash.platform.dapi.v0.Platform/getGroupActionSigners', + platform__pb2.GetGroupActionSignersRequest.SerializeToString, + platform__pb2.GetGroupActionSignersResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts index e9028523b99..623e82aeb11 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts @@ -55,8 +55,8 @@ export namespace Proof { } export class ResponseMetadata extends jspb.Message { - getHeight(): number; - setHeight(value: number): void; + getHeight(): string; + setHeight(value: string): void; getCoreChainLockedHeight(): number; setCoreChainLockedHeight(value: number): void; @@ -64,8 +64,8 @@ export class ResponseMetadata extends jspb.Message { getEpoch(): number; setEpoch(value: number): void; - getTimeMs(): number; - setTimeMs(value: number): void; + getTimeMs(): string; + setTimeMs(value: string): void; getProtocolVersion(): number; setProtocolVersion(value: number): void; @@ -85,10 +85,10 @@ export class ResponseMetadata extends jspb.Message { export namespace ResponseMetadata { export type AsObject = { - height: number, + height: string, coreChainLockedHeight: number, epoch: number, - timeMs: number, + timeMs: string, protocolVersion: number, chainId: string, } @@ -534,8 +534,8 @@ export namespace GetIdentityNonceResponse { export class GetIdentityNonceResponseV0 extends jspb.Message { hasIdentityNonce(): boolean; clearIdentityNonce(): void; - getIdentityNonce(): number; - setIdentityNonce(value: number): void; + getIdentityNonce(): string; + setIdentityNonce(value: string): void; hasProof(): boolean; clearProof(): void; @@ -560,7 +560,7 @@ export namespace GetIdentityNonceResponse { export namespace GetIdentityNonceResponseV0 { export type AsObject = { - identityNonce: number, + identityNonce: string, proof?: Proof.AsObject, metadata?: ResponseMetadata.AsObject, } @@ -603,8 +603,8 @@ export namespace GetIdentityContractNonceResponse { export class GetIdentityContractNonceResponseV0 extends jspb.Message { hasIdentityContractNonce(): boolean; clearIdentityContractNonce(): void; - getIdentityContractNonce(): number; - setIdentityContractNonce(value: number): void; + getIdentityContractNonce(): string; + setIdentityContractNonce(value: string): void; hasProof(): boolean; clearProof(): void; @@ -629,7 +629,7 @@ export namespace GetIdentityContractNonceResponse { export namespace GetIdentityContractNonceResponseV0 { export type AsObject = { - identityContractNonce: number, + identityContractNonce: string, proof?: Proof.AsObject, metadata?: ResponseMetadata.AsObject, } @@ -672,8 +672,8 @@ export namespace GetIdentityBalanceResponse { export class GetIdentityBalanceResponseV0 extends jspb.Message { hasBalance(): boolean; clearBalance(): void; - getBalance(): number; - setBalance(value: number): void; + getBalance(): string; + setBalance(value: string): void; hasProof(): boolean; clearProof(): void; @@ -698,7 +698,7 @@ export namespace GetIdentityBalanceResponse { export namespace GetIdentityBalanceResponseV0 { export type AsObject = { - balance: number, + balance: string, proof?: Proof.AsObject, metadata?: ResponseMetadata.AsObject, } @@ -773,11 +773,11 @@ export namespace GetIdentityBalanceAndRevisionResponse { } export class BalanceAndRevision extends jspb.Message { - getBalance(): number; - setBalance(value: number): void; + getBalance(): string; + setBalance(value: string): void; - getRevision(): number; - setRevision(value: number): void; + getRevision(): string; + setRevision(value: string): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): BalanceAndRevision.AsObject; @@ -791,8 +791,8 @@ export namespace GetIdentityBalanceAndRevisionResponse { export namespace BalanceAndRevision { export type AsObject = { - balance: number, - revision: number, + balance: string, + revision: string, } } @@ -1444,8 +1444,8 @@ export namespace GetEvonodesProposedEpochBlocksResponse { getProTxHash_asB64(): string; setProTxHash(value: Uint8Array | string): void; - getCount(): number; - setCount(value: number): void; + getCount(): string; + setCount(value: string): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): EvonodeProposedBlocks.AsObject; @@ -1460,7 +1460,7 @@ export namespace GetEvonodesProposedEpochBlocksResponse { export namespace EvonodeProposedBlocks { export type AsObject = { proTxHash: Uint8Array | string, - count: number, + count: string, } } @@ -1702,8 +1702,8 @@ export namespace GetIdentitiesBalancesResponse { hasBalance(): boolean; clearBalance(): void; - getBalance(): number; - setBalance(value: number): void; + getBalance(): string; + setBalance(value: string): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): IdentityBalance.AsObject; @@ -1718,7 +1718,7 @@ export namespace GetIdentitiesBalancesResponse { export namespace IdentityBalance { export type AsObject = { identityId: Uint8Array | string, - balance: number, + balance: string, } } @@ -1800,6 +1800,21 @@ export namespace GetProofsRequest { setVotesList(value: Array<GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>): void; addVotes(value?: GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, index?: number): GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; + clearIdentityTokenBalancesList(): void; + getIdentityTokenBalancesList(): Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>; + setIdentityTokenBalancesList(value: Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>): void; + addIdentityTokenBalances(value?: GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, index?: number): GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest; + + clearIdentityTokenInfosList(): void; + getIdentityTokenInfosList(): Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>; + setIdentityTokenInfosList(value: Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>): void; + addIdentityTokenInfos(value?: GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, index?: number): GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest; + + clearTokenStatusesList(): void; + getTokenStatusesList(): Array<GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>; + setTokenStatusesList(value: Array<GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>): void; + addTokenStatuses(value?: GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, index?: number): GetProofsRequest.GetProofsRequestV0.TokenStatusRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): GetProofsRequestV0.AsObject; static toObject(includeInstance: boolean, msg: GetProofsRequestV0): GetProofsRequestV0.AsObject; @@ -1816,6 +1831,9 @@ export namespace GetProofsRequest { contractsList: Array<GetProofsRequest.GetProofsRequestV0.ContractRequest.AsObject>, documentsList: Array<GetProofsRequest.GetProofsRequestV0.DocumentRequest.AsObject>, votesList: Array<GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.AsObject>, + identityTokenBalancesList: Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.AsObject>, + identityTokenInfosList: Array<GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.AsObject>, + tokenStatusesList: Array<GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.AsObject>, } export class DocumentRequest extends jspb.Message { @@ -1994,6 +2012,84 @@ export namespace GetProofsRequest { CONTESTED_RESOURCE_VOTE_STATUS_REQUEST = 1, } } + + export class IdentityTokenBalanceRequest extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityTokenBalanceRequest.AsObject; + static toObject(includeInstance: boolean, msg: IdentityTokenBalanceRequest): IdentityTokenBalanceRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IdentityTokenBalanceRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityTokenBalanceRequest; + static deserializeBinaryFromReader(message: IdentityTokenBalanceRequest, reader: jspb.BinaryReader): IdentityTokenBalanceRequest; + } + + export namespace IdentityTokenBalanceRequest { + export type AsObject = { + tokenId: Uint8Array | string, + identityId: Uint8Array | string, + } + } + + export class IdentityTokenInfoRequest extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityTokenInfoRequest.AsObject; + static toObject(includeInstance: boolean, msg: IdentityTokenInfoRequest): IdentityTokenInfoRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IdentityTokenInfoRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityTokenInfoRequest; + static deserializeBinaryFromReader(message: IdentityTokenInfoRequest, reader: jspb.BinaryReader): IdentityTokenInfoRequest; + } + + export namespace IdentityTokenInfoRequest { + export type AsObject = { + tokenId: Uint8Array | string, + identityId: Uint8Array | string, + } + } + + export class TokenStatusRequest extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenStatusRequest.AsObject; + static toObject(includeInstance: boolean, msg: TokenStatusRequest): TokenStatusRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenStatusRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenStatusRequest; + static deserializeBinaryFromReader(message: TokenStatusRequest, reader: jspb.BinaryReader): TokenStatusRequest; + } + + export namespace TokenStatusRequest { + export type AsObject = { + tokenId: Uint8Array | string, + } + } } export enum VersionCase { @@ -2402,8 +2498,8 @@ export namespace GetDataContractHistoryRequest { getOffset(): google_protobuf_wrappers_pb.UInt32Value | undefined; setOffset(value?: google_protobuf_wrappers_pb.UInt32Value): void; - getStartAtMs(): number; - setStartAtMs(value: number): void; + getStartAtMs(): string; + setStartAtMs(value: string): void; getProve(): boolean; setProve(value: boolean): void; @@ -2423,7 +2519,7 @@ export namespace GetDataContractHistoryRequest { id: Uint8Array | string, limit?: google_protobuf_wrappers_pb.UInt32Value.AsObject, offset?: google_protobuf_wrappers_pb.UInt32Value.AsObject, - startAtMs: number, + startAtMs: string, prove: boolean, } } @@ -2491,8 +2587,8 @@ export namespace GetDataContractHistoryResponse { } export class DataContractHistoryEntry extends jspb.Message { - getDate(): number; - setDate(value: number): void; + getDate(): string; + setDate(value: string): void; getValue(): Uint8Array | string; getValue_asU8(): Uint8Array; @@ -2511,7 +2607,7 @@ export namespace GetDataContractHistoryResponse { export namespace DataContractHistoryEntry { export type AsObject = { - date: number, + date: string, value: Uint8Array | string, } } @@ -3635,14 +3731,14 @@ export namespace GetEpochsInfoResponse { getNumber(): number; setNumber(value: number): void; - getFirstBlockHeight(): number; - setFirstBlockHeight(value: number): void; + getFirstBlockHeight(): string; + setFirstBlockHeight(value: string): void; getFirstCoreBlockHeight(): number; setFirstCoreBlockHeight(value: number): void; - getStartTime(): number; - setStartTime(value: number): void; + getStartTime(): string; + setStartTime(value: string): void; getFeeMultiplier(): number; setFeeMultiplier(value: number): void; @@ -3663,9 +3759,9 @@ export namespace GetEpochsInfoResponse { export namespace EpochInfo { export type AsObject = { number: number, - firstBlockHeight: number, + firstBlockHeight: string, firstCoreBlockHeight: number, - startTime: number, + startTime: string, feeMultiplier: number, protocolVersion: number, } @@ -3967,8 +4063,8 @@ export namespace GetVotePollsByEndDateRequest { } export class StartAtTimeInfo extends jspb.Message { - getStartTimeMs(): number; - setStartTimeMs(value: number): void; + getStartTimeMs(): string; + setStartTimeMs(value: string): void; getStartTimeIncluded(): boolean; setStartTimeIncluded(value: boolean): void; @@ -3985,14 +4081,14 @@ export namespace GetVotePollsByEndDateRequest { export namespace StartAtTimeInfo { export type AsObject = { - startTimeMs: number, + startTimeMs: string, startTimeIncluded: boolean, } } export class EndAtTimeInfo extends jspb.Message { - getEndTimeMs(): number; - setEndTimeMs(value: number): void; + getEndTimeMs(): string; + setEndTimeMs(value: string): void; getEndTimeIncluded(): boolean; setEndTimeIncluded(value: boolean): void; @@ -4009,7 +4105,7 @@ export namespace GetVotePollsByEndDateRequest { export namespace EndAtTimeInfo { export type AsObject = { - endTimeMs: number, + endTimeMs: string, endTimeIncluded: boolean, } } @@ -4078,8 +4174,8 @@ export namespace GetVotePollsByEndDateResponse { } export class SerializedVotePollsByTimestamp extends jspb.Message { - getTimestamp(): number; - setTimestamp(value: number): void; + getTimestamp(): string; + setTimestamp(value: string): void; clearSerializedVotePollsList(): void; getSerializedVotePollsList(): Array<Uint8Array | string>; @@ -4100,7 +4196,7 @@ export namespace GetVotePollsByEndDateResponse { export namespace SerializedVotePollsByTimestamp { export type AsObject = { - timestamp: number, + timestamp: string, serializedVotePollsList: Array<Uint8Array | string>, } } @@ -4335,14 +4431,14 @@ export namespace GetContestedResourceVoteStateResponse { getWonByIdentityId_asB64(): string; setWonByIdentityId(value: Uint8Array | string): void; - getFinishedAtBlockHeight(): number; - setFinishedAtBlockHeight(value: number): void; + getFinishedAtBlockHeight(): string; + setFinishedAtBlockHeight(value: string): void; getFinishedAtCoreBlockHeight(): number; setFinishedAtCoreBlockHeight(value: number): void; - getFinishedAtBlockTimeMs(): number; - setFinishedAtBlockTimeMs(value: number): void; + getFinishedAtBlockTimeMs(): string; + setFinishedAtBlockTimeMs(value: string): void; getFinishedAtEpoch(): number; setFinishedAtEpoch(value: number): void; @@ -4361,9 +4457,9 @@ export namespace GetContestedResourceVoteStateResponse { export type AsObject = { finishedVoteOutcome: GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcomeMap[keyof GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcomeMap], wonByIdentityId: Uint8Array | string, - finishedAtBlockHeight: number, + finishedAtBlockHeight: string, finishedAtCoreBlockHeight: number, - finishedAtBlockTimeMs: number, + finishedAtBlockTimeMs: string, finishedAtEpoch: number, } @@ -5032,8 +5128,8 @@ export namespace GetPrefundedSpecializedBalanceResponse { export class GetPrefundedSpecializedBalanceResponseV0 extends jspb.Message { hasBalance(): boolean; clearBalance(): void; - getBalance(): number; - setBalance(value: number): void; + getBalance(): string; + setBalance(value: string): void; hasProof(): boolean; clearProof(): void; @@ -5058,7 +5154,7 @@ export namespace GetPrefundedSpecializedBalanceResponse { export namespace GetPrefundedSpecializedBalanceResponseV0 { export type AsObject = { - balance: number, + balance: string, proof?: Proof.AsObject, metadata?: ResponseMetadata.AsObject, } @@ -5149,8 +5245,8 @@ export namespace GetTotalCreditsInPlatformResponse { export class GetTotalCreditsInPlatformResponseV0 extends jspb.Message { hasCredits(): boolean; clearCredits(): void; - getCredits(): number; - setCredits(value: number): void; + getCredits(): string; + setCredits(value: string): void; hasProof(): boolean; clearProof(): void; @@ -5175,7 +5271,7 @@ export namespace GetTotalCreditsInPlatformResponse { export namespace GetTotalCreditsInPlatformResponseV0 { export type AsObject = { - credits: number, + credits: string, proof?: Proof.AsObject, metadata?: ResponseMetadata.AsObject, } @@ -5604,18 +5700,18 @@ export namespace GetStatusResponse { } export class Time extends jspb.Message { - getLocal(): number; - setLocal(value: number): void; + getLocal(): string; + setLocal(value: string): void; hasBlock(): boolean; clearBlock(): void; - getBlock(): number; - setBlock(value: number): void; + getBlock(): string; + setBlock(value: string): void; hasGenesis(): boolean; clearGenesis(): void; - getGenesis(): number; - setGenesis(value: number): void; + getGenesis(): string; + setGenesis(value: string): void; hasEpoch(): boolean; clearEpoch(): void; @@ -5634,9 +5730,9 @@ export namespace GetStatusResponse { export namespace Time { export type AsObject = { - local: number, - block: number, - genesis: number, + local: string, + block: string, + genesis: string, epoch: number, } } @@ -5685,8 +5781,8 @@ export namespace GetStatusResponse { getLatestAppHash_asB64(): string; setLatestAppHash(value: Uint8Array | string): void; - getLatestBlockHeight(): number; - setLatestBlockHeight(value: number): void; + getLatestBlockHeight(): string; + setLatestBlockHeight(value: string): void; getEarliestBlockHash(): Uint8Array | string; getEarliestBlockHash_asU8(): Uint8Array; @@ -5698,11 +5794,11 @@ export namespace GetStatusResponse { getEarliestAppHash_asB64(): string; setEarliestAppHash(value: Uint8Array | string): void; - getEarliestBlockHeight(): number; - setEarliestBlockHeight(value: number): void; + getEarliestBlockHeight(): string; + setEarliestBlockHeight(value: string): void; - getMaxPeerBlockHeight(): number; - setMaxPeerBlockHeight(value: number): void; + getMaxPeerBlockHeight(): string; + setMaxPeerBlockHeight(value: string): void; hasCoreChainLockedHeight(): boolean; clearCoreChainLockedHeight(): void; @@ -5724,11 +5820,11 @@ export namespace GetStatusResponse { catchingUp: boolean, latestBlockHash: Uint8Array | string, latestAppHash: Uint8Array | string, - latestBlockHeight: number, + latestBlockHeight: string, earliestBlockHash: Uint8Array | string, earliestAppHash: Uint8Array | string, - earliestBlockHeight: number, - maxPeerBlockHeight: number, + earliestBlockHeight: string, + maxPeerBlockHeight: string, coreChainLockedHeight: number, } } @@ -5762,29 +5858,29 @@ export namespace GetStatusResponse { } export class StateSync extends jspb.Message { - getTotalSyncedTime(): number; - setTotalSyncedTime(value: number): void; + getTotalSyncedTime(): string; + setTotalSyncedTime(value: string): void; - getRemainingTime(): number; - setRemainingTime(value: number): void; + getRemainingTime(): string; + setRemainingTime(value: string): void; getTotalSnapshots(): number; setTotalSnapshots(value: number): void; - getChunkProcessAvgTime(): number; - setChunkProcessAvgTime(value: number): void; + getChunkProcessAvgTime(): string; + setChunkProcessAvgTime(value: string): void; - getSnapshotHeight(): number; - setSnapshotHeight(value: number): void; + getSnapshotHeight(): string; + setSnapshotHeight(value: string): void; - getSnapshotChunksCount(): number; - setSnapshotChunksCount(value: number): void; + getSnapshotChunksCount(): string; + setSnapshotChunksCount(value: string): void; - getBackfilledBlocks(): number; - setBackfilledBlocks(value: number): void; + getBackfilledBlocks(): string; + setBackfilledBlocks(value: string): void; - getBackfillBlocksTotal(): number; - setBackfillBlocksTotal(value: number): void; + getBackfillBlocksTotal(): string; + setBackfillBlocksTotal(value: string): void; serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): StateSync.AsObject; @@ -5798,14 +5894,14 @@ export namespace GetStatusResponse { export namespace StateSync { export type AsObject = { - totalSyncedTime: number, - remainingTime: number, + totalSyncedTime: string, + remainingTime: string, totalSnapshots: number, - chunkProcessAvgTime: number, - snapshotHeight: number, - snapshotChunksCount: number, - backfilledBlocks: number, - backfillBlocksTotal: number, + chunkProcessAvgTime: string, + snapshotHeight: string, + snapshotChunksCount: string, + backfilledBlocks: string, + backfillBlocksTotal: string, } } } @@ -6004,6 +6100,2727 @@ export namespace GetCurrentQuorumsInfoResponse { } } +export class GetIdentityTokenBalancesRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 | undefined; + setV0(value?: GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0): void; + + getVersionCase(): GetIdentityTokenBalancesRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenBalancesRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenBalancesRequest): GetIdentityTokenBalancesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenBalancesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenBalancesRequest; + static deserializeBinaryFromReader(message: GetIdentityTokenBalancesRequest, reader: jspb.BinaryReader): GetIdentityTokenBalancesRequest; +} + +export namespace GetIdentityTokenBalancesRequest { + export type AsObject = { + v0?: GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.AsObject, + } + + export class GetIdentityTokenBalancesRequestV0 extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + clearTokenIdsList(): void; + getTokenIdsList(): Array<Uint8Array | string>; + getTokenIdsList_asU8(): Array<Uint8Array>; + getTokenIdsList_asB64(): Array<string>; + setTokenIdsList(value: Array<Uint8Array | string>): void; + addTokenIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenBalancesRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenBalancesRequestV0): GetIdentityTokenBalancesRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenBalancesRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenBalancesRequestV0; + static deserializeBinaryFromReader(message: GetIdentityTokenBalancesRequestV0, reader: jspb.BinaryReader): GetIdentityTokenBalancesRequestV0; + } + + export namespace GetIdentityTokenBalancesRequestV0 { + export type AsObject = { + identityId: Uint8Array | string, + tokenIdsList: Array<Uint8Array | string>, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentityTokenBalancesResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 | undefined; + setV0(value?: GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0): void; + + getVersionCase(): GetIdentityTokenBalancesResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenBalancesResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenBalancesResponse): GetIdentityTokenBalancesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenBalancesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenBalancesResponse; + static deserializeBinaryFromReader(message: GetIdentityTokenBalancesResponse, reader: jspb.BinaryReader): GetIdentityTokenBalancesResponse; +} + +export namespace GetIdentityTokenBalancesResponse { + export type AsObject = { + v0?: GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.AsObject, + } + + export class GetIdentityTokenBalancesResponseV0 extends jspb.Message { + hasTokenBalances(): boolean; + clearTokenBalances(): void; + getTokenBalances(): GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances | undefined; + setTokenBalances(value?: GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentityTokenBalancesResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenBalancesResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenBalancesResponseV0): GetIdentityTokenBalancesResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenBalancesResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenBalancesResponseV0; + static deserializeBinaryFromReader(message: GetIdentityTokenBalancesResponseV0, reader: jspb.BinaryReader): GetIdentityTokenBalancesResponseV0; + } + + export namespace GetIdentityTokenBalancesResponseV0 { + export type AsObject = { + tokenBalances?: GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenBalanceEntry extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + hasBalance(): boolean; + clearBalance(): void; + getBalance(): number; + setBalance(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenBalanceEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenBalanceEntry): TokenBalanceEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenBalanceEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenBalanceEntry; + static deserializeBinaryFromReader(message: TokenBalanceEntry, reader: jspb.BinaryReader): TokenBalanceEntry; + } + + export namespace TokenBalanceEntry { + export type AsObject = { + tokenId: Uint8Array | string, + balance: number, + } + } + + export class TokenBalances extends jspb.Message { + clearTokenBalancesList(): void; + getTokenBalancesList(): Array<GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>; + setTokenBalancesList(value: Array<GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>): void; + addTokenBalances(value?: GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, index?: number): GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenBalances.AsObject; + static toObject(includeInstance: boolean, msg: TokenBalances): TokenBalances.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenBalances, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenBalances; + static deserializeBinaryFromReader(message: TokenBalances, reader: jspb.BinaryReader): TokenBalances; + } + + export namespace TokenBalances { + export type AsObject = { + tokenBalancesList: Array<GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + TOKEN_BALANCES = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentitiesTokenBalancesRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 | undefined; + setV0(value?: GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0): void; + + getVersionCase(): GetIdentitiesTokenBalancesRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenBalancesRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenBalancesRequest): GetIdentitiesTokenBalancesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenBalancesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenBalancesRequest; + static deserializeBinaryFromReader(message: GetIdentitiesTokenBalancesRequest, reader: jspb.BinaryReader): GetIdentitiesTokenBalancesRequest; +} + +export namespace GetIdentitiesTokenBalancesRequest { + export type AsObject = { + v0?: GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.AsObject, + } + + export class GetIdentitiesTokenBalancesRequestV0 extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + clearIdentityIdsList(): void; + getIdentityIdsList(): Array<Uint8Array | string>; + getIdentityIdsList_asU8(): Array<Uint8Array>; + getIdentityIdsList_asB64(): Array<string>; + setIdentityIdsList(value: Array<Uint8Array | string>): void; + addIdentityIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenBalancesRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenBalancesRequestV0): GetIdentitiesTokenBalancesRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenBalancesRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenBalancesRequestV0; + static deserializeBinaryFromReader(message: GetIdentitiesTokenBalancesRequestV0, reader: jspb.BinaryReader): GetIdentitiesTokenBalancesRequestV0; + } + + export namespace GetIdentitiesTokenBalancesRequestV0 { + export type AsObject = { + tokenId: Uint8Array | string, + identityIdsList: Array<Uint8Array | string>, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentitiesTokenBalancesResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 | undefined; + setV0(value?: GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0): void; + + getVersionCase(): GetIdentitiesTokenBalancesResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenBalancesResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenBalancesResponse): GetIdentitiesTokenBalancesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenBalancesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenBalancesResponse; + static deserializeBinaryFromReader(message: GetIdentitiesTokenBalancesResponse, reader: jspb.BinaryReader): GetIdentitiesTokenBalancesResponse; +} + +export namespace GetIdentitiesTokenBalancesResponse { + export type AsObject = { + v0?: GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.AsObject, + } + + export class GetIdentitiesTokenBalancesResponseV0 extends jspb.Message { + hasIdentityTokenBalances(): boolean; + clearIdentityTokenBalances(): void; + getIdentityTokenBalances(): GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances | undefined; + setIdentityTokenBalances(value?: GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentitiesTokenBalancesResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenBalancesResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenBalancesResponseV0): GetIdentitiesTokenBalancesResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenBalancesResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenBalancesResponseV0; + static deserializeBinaryFromReader(message: GetIdentitiesTokenBalancesResponseV0, reader: jspb.BinaryReader): GetIdentitiesTokenBalancesResponseV0; + } + + export namespace GetIdentitiesTokenBalancesResponseV0 { + export type AsObject = { + identityTokenBalances?: GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class IdentityTokenBalanceEntry extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + hasBalance(): boolean; + clearBalance(): void; + getBalance(): number; + setBalance(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityTokenBalanceEntry.AsObject; + static toObject(includeInstance: boolean, msg: IdentityTokenBalanceEntry): IdentityTokenBalanceEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IdentityTokenBalanceEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityTokenBalanceEntry; + static deserializeBinaryFromReader(message: IdentityTokenBalanceEntry, reader: jspb.BinaryReader): IdentityTokenBalanceEntry; + } + + export namespace IdentityTokenBalanceEntry { + export type AsObject = { + identityId: Uint8Array | string, + balance: number, + } + } + + export class IdentityTokenBalances extends jspb.Message { + clearIdentityTokenBalancesList(): void; + getIdentityTokenBalancesList(): Array<GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>; + setIdentityTokenBalancesList(value: Array<GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>): void; + addIdentityTokenBalances(value?: GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, index?: number): GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityTokenBalances.AsObject; + static toObject(includeInstance: boolean, msg: IdentityTokenBalances): IdentityTokenBalances.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IdentityTokenBalances, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityTokenBalances; + static deserializeBinaryFromReader(message: IdentityTokenBalances, reader: jspb.BinaryReader): IdentityTokenBalances; + } + + export namespace IdentityTokenBalances { + export type AsObject = { + identityTokenBalancesList: Array<GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + IDENTITY_TOKEN_BALANCES = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentityTokenInfosRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 | undefined; + setV0(value?: GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0): void; + + getVersionCase(): GetIdentityTokenInfosRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenInfosRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenInfosRequest): GetIdentityTokenInfosRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenInfosRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenInfosRequest; + static deserializeBinaryFromReader(message: GetIdentityTokenInfosRequest, reader: jspb.BinaryReader): GetIdentityTokenInfosRequest; +} + +export namespace GetIdentityTokenInfosRequest { + export type AsObject = { + v0?: GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.AsObject, + } + + export class GetIdentityTokenInfosRequestV0 extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + clearTokenIdsList(): void; + getTokenIdsList(): Array<Uint8Array | string>; + getTokenIdsList_asU8(): Array<Uint8Array>; + getTokenIdsList_asB64(): Array<string>; + setTokenIdsList(value: Array<Uint8Array | string>): void; + addTokenIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenInfosRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenInfosRequestV0): GetIdentityTokenInfosRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenInfosRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenInfosRequestV0; + static deserializeBinaryFromReader(message: GetIdentityTokenInfosRequestV0, reader: jspb.BinaryReader): GetIdentityTokenInfosRequestV0; + } + + export namespace GetIdentityTokenInfosRequestV0 { + export type AsObject = { + identityId: Uint8Array | string, + tokenIdsList: Array<Uint8Array | string>, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentityTokenInfosResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 | undefined; + setV0(value?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0): void; + + getVersionCase(): GetIdentityTokenInfosResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenInfosResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenInfosResponse): GetIdentityTokenInfosResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenInfosResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenInfosResponse; + static deserializeBinaryFromReader(message: GetIdentityTokenInfosResponse, reader: jspb.BinaryReader): GetIdentityTokenInfosResponse; +} + +export namespace GetIdentityTokenInfosResponse { + export type AsObject = { + v0?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.AsObject, + } + + export class GetIdentityTokenInfosResponseV0 extends jspb.Message { + hasTokenInfos(): boolean; + clearTokenInfos(): void; + getTokenInfos(): GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos | undefined; + setTokenInfos(value?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentityTokenInfosResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentityTokenInfosResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentityTokenInfosResponseV0): GetIdentityTokenInfosResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentityTokenInfosResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentityTokenInfosResponseV0; + static deserializeBinaryFromReader(message: GetIdentityTokenInfosResponseV0, reader: jspb.BinaryReader): GetIdentityTokenInfosResponseV0; + } + + export namespace GetIdentityTokenInfosResponseV0 { + export type AsObject = { + tokenInfos?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenIdentityInfoEntry extends jspb.Message { + getFrozen(): boolean; + setFrozen(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenIdentityInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenIdentityInfoEntry): TokenIdentityInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenIdentityInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenIdentityInfoEntry; + static deserializeBinaryFromReader(message: TokenIdentityInfoEntry, reader: jspb.BinaryReader): TokenIdentityInfoEntry; + } + + export namespace TokenIdentityInfoEntry { + export type AsObject = { + frozen: boolean, + } + } + + export class TokenInfoEntry extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + hasInfo(): boolean; + clearInfo(): void; + getInfo(): GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry | undefined; + setInfo(value?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenInfoEntry): TokenInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenInfoEntry; + static deserializeBinaryFromReader(message: TokenInfoEntry, reader: jspb.BinaryReader): TokenInfoEntry; + } + + export namespace TokenInfoEntry { + export type AsObject = { + tokenId: Uint8Array | string, + info?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.AsObject, + } + } + + export class TokenInfos extends jspb.Message { + clearTokenInfosList(): void; + getTokenInfosList(): Array<GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>; + setTokenInfosList(value: Array<GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>): void; + addTokenInfos(value?: GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, index?: number): GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenInfos.AsObject; + static toObject(includeInstance: boolean, msg: TokenInfos): TokenInfos.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenInfos, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenInfos; + static deserializeBinaryFromReader(message: TokenInfos, reader: jspb.BinaryReader): TokenInfos; + } + + export namespace TokenInfos { + export type AsObject = { + tokenInfosList: Array<GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + TOKEN_INFOS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentitiesTokenInfosRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 | undefined; + setV0(value?: GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0): void; + + getVersionCase(): GetIdentitiesTokenInfosRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenInfosRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenInfosRequest): GetIdentitiesTokenInfosRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenInfosRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenInfosRequest; + static deserializeBinaryFromReader(message: GetIdentitiesTokenInfosRequest, reader: jspb.BinaryReader): GetIdentitiesTokenInfosRequest; +} + +export namespace GetIdentitiesTokenInfosRequest { + export type AsObject = { + v0?: GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.AsObject, + } + + export class GetIdentitiesTokenInfosRequestV0 extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + clearIdentityIdsList(): void; + getIdentityIdsList(): Array<Uint8Array | string>; + getIdentityIdsList_asU8(): Array<Uint8Array>; + getIdentityIdsList_asB64(): Array<string>; + setIdentityIdsList(value: Array<Uint8Array | string>): void; + addIdentityIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenInfosRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenInfosRequestV0): GetIdentitiesTokenInfosRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenInfosRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenInfosRequestV0; + static deserializeBinaryFromReader(message: GetIdentitiesTokenInfosRequestV0, reader: jspb.BinaryReader): GetIdentitiesTokenInfosRequestV0; + } + + export namespace GetIdentitiesTokenInfosRequestV0 { + export type AsObject = { + tokenId: Uint8Array | string, + identityIdsList: Array<Uint8Array | string>, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetIdentitiesTokenInfosResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 | undefined; + setV0(value?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0): void; + + getVersionCase(): GetIdentitiesTokenInfosResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenInfosResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenInfosResponse): GetIdentitiesTokenInfosResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenInfosResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenInfosResponse; + static deserializeBinaryFromReader(message: GetIdentitiesTokenInfosResponse, reader: jspb.BinaryReader): GetIdentitiesTokenInfosResponse; +} + +export namespace GetIdentitiesTokenInfosResponse { + export type AsObject = { + v0?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.AsObject, + } + + export class GetIdentitiesTokenInfosResponseV0 extends jspb.Message { + hasIdentityTokenInfos(): boolean; + clearIdentityTokenInfos(): void; + getIdentityTokenInfos(): GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos | undefined; + setIdentityTokenInfos(value?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetIdentitiesTokenInfosResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetIdentitiesTokenInfosResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetIdentitiesTokenInfosResponseV0): GetIdentitiesTokenInfosResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetIdentitiesTokenInfosResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetIdentitiesTokenInfosResponseV0; + static deserializeBinaryFromReader(message: GetIdentitiesTokenInfosResponseV0, reader: jspb.BinaryReader): GetIdentitiesTokenInfosResponseV0; + } + + export namespace GetIdentitiesTokenInfosResponseV0 { + export type AsObject = { + identityTokenInfos?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenIdentityInfoEntry extends jspb.Message { + getFrozen(): boolean; + setFrozen(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenIdentityInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenIdentityInfoEntry): TokenIdentityInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenIdentityInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenIdentityInfoEntry; + static deserializeBinaryFromReader(message: TokenIdentityInfoEntry, reader: jspb.BinaryReader): TokenIdentityInfoEntry; + } + + export namespace TokenIdentityInfoEntry { + export type AsObject = { + frozen: boolean, + } + } + + export class TokenInfoEntry extends jspb.Message { + getIdentityId(): Uint8Array | string; + getIdentityId_asU8(): Uint8Array; + getIdentityId_asB64(): string; + setIdentityId(value: Uint8Array | string): void; + + hasInfo(): boolean; + clearInfo(): void; + getInfo(): GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry | undefined; + setInfo(value?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenInfoEntry): TokenInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenInfoEntry; + static deserializeBinaryFromReader(message: TokenInfoEntry, reader: jspb.BinaryReader): TokenInfoEntry; + } + + export namespace TokenInfoEntry { + export type AsObject = { + identityId: Uint8Array | string, + info?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.AsObject, + } + } + + export class IdentityTokenInfos extends jspb.Message { + clearTokenInfosList(): void; + getTokenInfosList(): Array<GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>; + setTokenInfosList(value: Array<GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>): void; + addTokenInfos(value?: GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, index?: number): GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): IdentityTokenInfos.AsObject; + static toObject(includeInstance: boolean, msg: IdentityTokenInfos): IdentityTokenInfos.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: IdentityTokenInfos, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): IdentityTokenInfos; + static deserializeBinaryFromReader(message: IdentityTokenInfos, reader: jspb.BinaryReader): IdentityTokenInfos; + } + + export namespace IdentityTokenInfos { + export type AsObject = { + tokenInfosList: Array<GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + IDENTITY_TOKEN_INFOS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenStatusesRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenStatusesRequest.GetTokenStatusesRequestV0 | undefined; + setV0(value?: GetTokenStatusesRequest.GetTokenStatusesRequestV0): void; + + getVersionCase(): GetTokenStatusesRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenStatusesRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenStatusesRequest): GetTokenStatusesRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenStatusesRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenStatusesRequest; + static deserializeBinaryFromReader(message: GetTokenStatusesRequest, reader: jspb.BinaryReader): GetTokenStatusesRequest; +} + +export namespace GetTokenStatusesRequest { + export type AsObject = { + v0?: GetTokenStatusesRequest.GetTokenStatusesRequestV0.AsObject, + } + + export class GetTokenStatusesRequestV0 extends jspb.Message { + clearTokenIdsList(): void; + getTokenIdsList(): Array<Uint8Array | string>; + getTokenIdsList_asU8(): Array<Uint8Array>; + getTokenIdsList_asB64(): Array<string>; + setTokenIdsList(value: Array<Uint8Array | string>): void; + addTokenIds(value: Uint8Array | string, index?: number): Uint8Array | string; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenStatusesRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenStatusesRequestV0): GetTokenStatusesRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenStatusesRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenStatusesRequestV0; + static deserializeBinaryFromReader(message: GetTokenStatusesRequestV0, reader: jspb.BinaryReader): GetTokenStatusesRequestV0; + } + + export namespace GetTokenStatusesRequestV0 { + export type AsObject = { + tokenIdsList: Array<Uint8Array | string>, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenStatusesResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenStatusesResponse.GetTokenStatusesResponseV0 | undefined; + setV0(value?: GetTokenStatusesResponse.GetTokenStatusesResponseV0): void; + + getVersionCase(): GetTokenStatusesResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenStatusesResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenStatusesResponse): GetTokenStatusesResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenStatusesResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenStatusesResponse; + static deserializeBinaryFromReader(message: GetTokenStatusesResponse, reader: jspb.BinaryReader): GetTokenStatusesResponse; +} + +export namespace GetTokenStatusesResponse { + export type AsObject = { + v0?: GetTokenStatusesResponse.GetTokenStatusesResponseV0.AsObject, + } + + export class GetTokenStatusesResponseV0 extends jspb.Message { + hasTokenStatuses(): boolean; + clearTokenStatuses(): void; + getTokenStatuses(): GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses | undefined; + setTokenStatuses(value?: GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetTokenStatusesResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenStatusesResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenStatusesResponseV0): GetTokenStatusesResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenStatusesResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenStatusesResponseV0; + static deserializeBinaryFromReader(message: GetTokenStatusesResponseV0, reader: jspb.BinaryReader): GetTokenStatusesResponseV0; + } + + export namespace GetTokenStatusesResponseV0 { + export type AsObject = { + tokenStatuses?: GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenStatusEntry extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + hasPaused(): boolean; + clearPaused(): void; + getPaused(): boolean; + setPaused(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenStatusEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenStatusEntry): TokenStatusEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenStatusEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenStatusEntry; + static deserializeBinaryFromReader(message: TokenStatusEntry, reader: jspb.BinaryReader): TokenStatusEntry; + } + + export namespace TokenStatusEntry { + export type AsObject = { + tokenId: Uint8Array | string, + paused: boolean, + } + } + + export class TokenStatuses extends jspb.Message { + clearTokenStatusesList(): void; + getTokenStatusesList(): Array<GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>; + setTokenStatusesList(value: Array<GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>): void; + addTokenStatuses(value?: GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, index?: number): GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenStatuses.AsObject; + static toObject(includeInstance: boolean, msg: TokenStatuses): TokenStatuses.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenStatuses, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenStatuses; + static deserializeBinaryFromReader(message: TokenStatuses, reader: jspb.BinaryReader): TokenStatuses; + } + + export namespace TokenStatuses { + export type AsObject = { + tokenStatusesList: Array<GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + TOKEN_STATUSES = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenPreProgrammedDistributionsRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 | undefined; + setV0(value?: GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0): void; + + getVersionCase(): GetTokenPreProgrammedDistributionsRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenPreProgrammedDistributionsRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenPreProgrammedDistributionsRequest): GetTokenPreProgrammedDistributionsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenPreProgrammedDistributionsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenPreProgrammedDistributionsRequest; + static deserializeBinaryFromReader(message: GetTokenPreProgrammedDistributionsRequest, reader: jspb.BinaryReader): GetTokenPreProgrammedDistributionsRequest; +} + +export namespace GetTokenPreProgrammedDistributionsRequest { + export type AsObject = { + v0?: GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.AsObject, + } + + export class GetTokenPreProgrammedDistributionsRequestV0 extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + hasStartAtInfo(): boolean; + clearStartAtInfo(): void; + getStartAtInfo(): GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo | undefined; + setStartAtInfo(value?: GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo): void; + + hasLimit(): boolean; + clearLimit(): void; + getLimit(): number; + setLimit(value: number): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenPreProgrammedDistributionsRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenPreProgrammedDistributionsRequestV0): GetTokenPreProgrammedDistributionsRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenPreProgrammedDistributionsRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenPreProgrammedDistributionsRequestV0; + static deserializeBinaryFromReader(message: GetTokenPreProgrammedDistributionsRequestV0, reader: jspb.BinaryReader): GetTokenPreProgrammedDistributionsRequestV0; + } + + export namespace GetTokenPreProgrammedDistributionsRequestV0 { + export type AsObject = { + tokenId: Uint8Array | string, + startAtInfo?: GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.AsObject, + limit: number, + prove: boolean, + } + + export class StartAtInfo extends jspb.Message { + getStartTimeMs(): number; + setStartTimeMs(value: number): void; + + hasStartRecipient(): boolean; + clearStartRecipient(): void; + getStartRecipient(): Uint8Array | string; + getStartRecipient_asU8(): Uint8Array; + getStartRecipient_asB64(): string; + setStartRecipient(value: Uint8Array | string): void; + + hasStartRecipientIncluded(): boolean; + clearStartRecipientIncluded(): void; + getStartRecipientIncluded(): boolean; + setStartRecipientIncluded(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): StartAtInfo.AsObject; + static toObject(includeInstance: boolean, msg: StartAtInfo): StartAtInfo.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: StartAtInfo, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): StartAtInfo; + static deserializeBinaryFromReader(message: StartAtInfo, reader: jspb.BinaryReader): StartAtInfo; + } + + export namespace StartAtInfo { + export type AsObject = { + startTimeMs: number, + startRecipient: Uint8Array | string, + startRecipientIncluded: boolean, + } + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenPreProgrammedDistributionsResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 | undefined; + setV0(value?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0): void; + + getVersionCase(): GetTokenPreProgrammedDistributionsResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenPreProgrammedDistributionsResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenPreProgrammedDistributionsResponse): GetTokenPreProgrammedDistributionsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenPreProgrammedDistributionsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenPreProgrammedDistributionsResponse; + static deserializeBinaryFromReader(message: GetTokenPreProgrammedDistributionsResponse, reader: jspb.BinaryReader): GetTokenPreProgrammedDistributionsResponse; +} + +export namespace GetTokenPreProgrammedDistributionsResponse { + export type AsObject = { + v0?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.AsObject, + } + + export class GetTokenPreProgrammedDistributionsResponseV0 extends jspb.Message { + hasTokenDistributions(): boolean; + clearTokenDistributions(): void; + getTokenDistributions(): GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions | undefined; + setTokenDistributions(value?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetTokenPreProgrammedDistributionsResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenPreProgrammedDistributionsResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenPreProgrammedDistributionsResponseV0): GetTokenPreProgrammedDistributionsResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenPreProgrammedDistributionsResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenPreProgrammedDistributionsResponseV0; + static deserializeBinaryFromReader(message: GetTokenPreProgrammedDistributionsResponseV0, reader: jspb.BinaryReader): GetTokenPreProgrammedDistributionsResponseV0; + } + + export namespace GetTokenPreProgrammedDistributionsResponseV0 { + export type AsObject = { + tokenDistributions?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenDistributionEntry extends jspb.Message { + getRecipientId(): Uint8Array | string; + getRecipientId_asU8(): Uint8Array; + getRecipientId_asB64(): string; + setRecipientId(value: Uint8Array | string): void; + + getAmount(): number; + setAmount(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenDistributionEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenDistributionEntry): TokenDistributionEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenDistributionEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenDistributionEntry; + static deserializeBinaryFromReader(message: TokenDistributionEntry, reader: jspb.BinaryReader): TokenDistributionEntry; + } + + export namespace TokenDistributionEntry { + export type AsObject = { + recipientId: Uint8Array | string, + amount: number, + } + } + + export class TokenTimedDistributionEntry extends jspb.Message { + getTimestamp(): number; + setTimestamp(value: number): void; + + clearDistributionsList(): void; + getDistributionsList(): Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>; + setDistributionsList(value: Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>): void; + addDistributions(value?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, index?: number): GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenTimedDistributionEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenTimedDistributionEntry): TokenTimedDistributionEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenTimedDistributionEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenTimedDistributionEntry; + static deserializeBinaryFromReader(message: TokenTimedDistributionEntry, reader: jspb.BinaryReader): TokenTimedDistributionEntry; + } + + export namespace TokenTimedDistributionEntry { + export type AsObject = { + timestamp: number, + distributionsList: Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.AsObject>, + } + } + + export class TokenDistributions extends jspb.Message { + clearTokenDistributionsList(): void; + getTokenDistributionsList(): Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>; + setTokenDistributionsList(value: Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>): void; + addTokenDistributions(value?: GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, index?: number): GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenDistributions.AsObject; + static toObject(includeInstance: boolean, msg: TokenDistributions): TokenDistributions.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenDistributions, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenDistributions; + static deserializeBinaryFromReader(message: TokenDistributions, reader: jspb.BinaryReader): TokenDistributions; + } + + export namespace TokenDistributions { + export type AsObject = { + tokenDistributionsList: Array<GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + TOKEN_DISTRIBUTIONS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenTotalSupplyRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 | undefined; + setV0(value?: GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0): void; + + getVersionCase(): GetTokenTotalSupplyRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenTotalSupplyRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenTotalSupplyRequest): GetTokenTotalSupplyRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenTotalSupplyRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenTotalSupplyRequest; + static deserializeBinaryFromReader(message: GetTokenTotalSupplyRequest, reader: jspb.BinaryReader): GetTokenTotalSupplyRequest; +} + +export namespace GetTokenTotalSupplyRequest { + export type AsObject = { + v0?: GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.AsObject, + } + + export class GetTokenTotalSupplyRequestV0 extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenTotalSupplyRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenTotalSupplyRequestV0): GetTokenTotalSupplyRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenTotalSupplyRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenTotalSupplyRequestV0; + static deserializeBinaryFromReader(message: GetTokenTotalSupplyRequestV0, reader: jspb.BinaryReader): GetTokenTotalSupplyRequestV0; + } + + export namespace GetTokenTotalSupplyRequestV0 { + export type AsObject = { + tokenId: Uint8Array | string, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetTokenTotalSupplyResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 | undefined; + setV0(value?: GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0): void; + + getVersionCase(): GetTokenTotalSupplyResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenTotalSupplyResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenTotalSupplyResponse): GetTokenTotalSupplyResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenTotalSupplyResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenTotalSupplyResponse; + static deserializeBinaryFromReader(message: GetTokenTotalSupplyResponse, reader: jspb.BinaryReader): GetTokenTotalSupplyResponse; +} + +export namespace GetTokenTotalSupplyResponse { + export type AsObject = { + v0?: GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.AsObject, + } + + export class GetTokenTotalSupplyResponseV0 extends jspb.Message { + hasTokenTotalSupply(): boolean; + clearTokenTotalSupply(): void; + getTokenTotalSupply(): GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry | undefined; + setTokenTotalSupply(value?: GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetTokenTotalSupplyResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetTokenTotalSupplyResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetTokenTotalSupplyResponseV0): GetTokenTotalSupplyResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetTokenTotalSupplyResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetTokenTotalSupplyResponseV0; + static deserializeBinaryFromReader(message: GetTokenTotalSupplyResponseV0, reader: jspb.BinaryReader): GetTokenTotalSupplyResponseV0; + } + + export namespace GetTokenTotalSupplyResponseV0 { + export type AsObject = { + tokenTotalSupply?: GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class TokenTotalSupplyEntry extends jspb.Message { + getTokenId(): Uint8Array | string; + getTokenId_asU8(): Uint8Array; + getTokenId_asB64(): string; + setTokenId(value: Uint8Array | string): void; + + getTotalAggregatedAmountInUserAccounts(): number; + setTotalAggregatedAmountInUserAccounts(value: number): void; + + getTotalSystemAmount(): number; + setTotalSystemAmount(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenTotalSupplyEntry.AsObject; + static toObject(includeInstance: boolean, msg: TokenTotalSupplyEntry): TokenTotalSupplyEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenTotalSupplyEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenTotalSupplyEntry; + static deserializeBinaryFromReader(message: TokenTotalSupplyEntry, reader: jspb.BinaryReader): TokenTotalSupplyEntry; + } + + export namespace TokenTotalSupplyEntry { + export type AsObject = { + tokenId: Uint8Array | string, + totalAggregatedAmountInUserAccounts: number, + totalSystemAmount: number, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + TOKEN_TOTAL_SUPPLY = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupInfoRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupInfoRequest.GetGroupInfoRequestV0 | undefined; + setV0(value?: GetGroupInfoRequest.GetGroupInfoRequestV0): void; + + getVersionCase(): GetGroupInfoRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfoRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfoRequest): GetGroupInfoRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfoRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfoRequest; + static deserializeBinaryFromReader(message: GetGroupInfoRequest, reader: jspb.BinaryReader): GetGroupInfoRequest; +} + +export namespace GetGroupInfoRequest { + export type AsObject = { + v0?: GetGroupInfoRequest.GetGroupInfoRequestV0.AsObject, + } + + export class GetGroupInfoRequestV0 extends jspb.Message { + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + getGroupContractPosition(): number; + setGroupContractPosition(value: number): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfoRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfoRequestV0): GetGroupInfoRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfoRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfoRequestV0; + static deserializeBinaryFromReader(message: GetGroupInfoRequestV0, reader: jspb.BinaryReader): GetGroupInfoRequestV0; + } + + export namespace GetGroupInfoRequestV0 { + export type AsObject = { + contractId: Uint8Array | string, + groupContractPosition: number, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupInfoResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupInfoResponse.GetGroupInfoResponseV0 | undefined; + setV0(value?: GetGroupInfoResponse.GetGroupInfoResponseV0): void; + + getVersionCase(): GetGroupInfoResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfoResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfoResponse): GetGroupInfoResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfoResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfoResponse; + static deserializeBinaryFromReader(message: GetGroupInfoResponse, reader: jspb.BinaryReader): GetGroupInfoResponse; +} + +export namespace GetGroupInfoResponse { + export type AsObject = { + v0?: GetGroupInfoResponse.GetGroupInfoResponseV0.AsObject, + } + + export class GetGroupInfoResponseV0 extends jspb.Message { + hasGroupInfo(): boolean; + clearGroupInfo(): void; + getGroupInfo(): GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo | undefined; + setGroupInfo(value?: GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetGroupInfoResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfoResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfoResponseV0): GetGroupInfoResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfoResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfoResponseV0; + static deserializeBinaryFromReader(message: GetGroupInfoResponseV0, reader: jspb.BinaryReader): GetGroupInfoResponseV0; + } + + export namespace GetGroupInfoResponseV0 { + export type AsObject = { + groupInfo?: GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class GroupMemberEntry extends jspb.Message { + getMemberId(): Uint8Array | string; + getMemberId_asU8(): Uint8Array; + getMemberId_asB64(): string; + setMemberId(value: Uint8Array | string): void; + + getPower(): number; + setPower(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupMemberEntry.AsObject; + static toObject(includeInstance: boolean, msg: GroupMemberEntry): GroupMemberEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupMemberEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupMemberEntry; + static deserializeBinaryFromReader(message: GroupMemberEntry, reader: jspb.BinaryReader): GroupMemberEntry; + } + + export namespace GroupMemberEntry { + export type AsObject = { + memberId: Uint8Array | string, + power: number, + } + } + + export class GroupInfoEntry extends jspb.Message { + clearMembersList(): void; + getMembersList(): Array<GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>; + setMembersList(value: Array<GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>): void; + addMembers(value?: GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, index?: number): GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry; + + getGroupRequiredPower(): number; + setGroupRequiredPower(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: GroupInfoEntry): GroupInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupInfoEntry; + static deserializeBinaryFromReader(message: GroupInfoEntry, reader: jspb.BinaryReader): GroupInfoEntry; + } + + export namespace GroupInfoEntry { + export type AsObject = { + membersList: Array<GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.AsObject>, + groupRequiredPower: number, + } + } + + export class GroupInfo extends jspb.Message { + hasGroupInfo(): boolean; + clearGroupInfo(): void; + getGroupInfo(): GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry | undefined; + setGroupInfo(value?: GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupInfo.AsObject; + static toObject(includeInstance: boolean, msg: GroupInfo): GroupInfo.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupInfo, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupInfo; + static deserializeBinaryFromReader(message: GroupInfo, reader: jspb.BinaryReader): GroupInfo; + } + + export namespace GroupInfo { + export type AsObject = { + groupInfo?: GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.AsObject, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + GROUP_INFO = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupInfosRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupInfosRequest.GetGroupInfosRequestV0 | undefined; + setV0(value?: GetGroupInfosRequest.GetGroupInfosRequestV0): void; + + getVersionCase(): GetGroupInfosRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfosRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfosRequest): GetGroupInfosRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfosRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfosRequest; + static deserializeBinaryFromReader(message: GetGroupInfosRequest, reader: jspb.BinaryReader): GetGroupInfosRequest; +} + +export namespace GetGroupInfosRequest { + export type AsObject = { + v0?: GetGroupInfosRequest.GetGroupInfosRequestV0.AsObject, + } + + export class StartAtGroupContractPosition extends jspb.Message { + getStartGroupContractPosition(): number; + setStartGroupContractPosition(value: number): void; + + getStartGroupContractPositionIncluded(): boolean; + setStartGroupContractPositionIncluded(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): StartAtGroupContractPosition.AsObject; + static toObject(includeInstance: boolean, msg: StartAtGroupContractPosition): StartAtGroupContractPosition.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: StartAtGroupContractPosition, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): StartAtGroupContractPosition; + static deserializeBinaryFromReader(message: StartAtGroupContractPosition, reader: jspb.BinaryReader): StartAtGroupContractPosition; + } + + export namespace StartAtGroupContractPosition { + export type AsObject = { + startGroupContractPosition: number, + startGroupContractPositionIncluded: boolean, + } + } + + export class GetGroupInfosRequestV0 extends jspb.Message { + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + hasStartAtGroupContractPosition(): boolean; + clearStartAtGroupContractPosition(): void; + getStartAtGroupContractPosition(): GetGroupInfosRequest.StartAtGroupContractPosition | undefined; + setStartAtGroupContractPosition(value?: GetGroupInfosRequest.StartAtGroupContractPosition): void; + + hasCount(): boolean; + clearCount(): void; + getCount(): number; + setCount(value: number): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfosRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfosRequestV0): GetGroupInfosRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfosRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfosRequestV0; + static deserializeBinaryFromReader(message: GetGroupInfosRequestV0, reader: jspb.BinaryReader): GetGroupInfosRequestV0; + } + + export namespace GetGroupInfosRequestV0 { + export type AsObject = { + contractId: Uint8Array | string, + startAtGroupContractPosition?: GetGroupInfosRequest.StartAtGroupContractPosition.AsObject, + count: number, + prove: boolean, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupInfosResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupInfosResponse.GetGroupInfosResponseV0 | undefined; + setV0(value?: GetGroupInfosResponse.GetGroupInfosResponseV0): void; + + getVersionCase(): GetGroupInfosResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfosResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfosResponse): GetGroupInfosResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfosResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfosResponse; + static deserializeBinaryFromReader(message: GetGroupInfosResponse, reader: jspb.BinaryReader): GetGroupInfosResponse; +} + +export namespace GetGroupInfosResponse { + export type AsObject = { + v0?: GetGroupInfosResponse.GetGroupInfosResponseV0.AsObject, + } + + export class GetGroupInfosResponseV0 extends jspb.Message { + hasGroupInfos(): boolean; + clearGroupInfos(): void; + getGroupInfos(): GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos | undefined; + setGroupInfos(value?: GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetGroupInfosResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupInfosResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupInfosResponseV0): GetGroupInfosResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupInfosResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupInfosResponseV0; + static deserializeBinaryFromReader(message: GetGroupInfosResponseV0, reader: jspb.BinaryReader): GetGroupInfosResponseV0; + } + + export namespace GetGroupInfosResponseV0 { + export type AsObject = { + groupInfos?: GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class GroupMemberEntry extends jspb.Message { + getMemberId(): Uint8Array | string; + getMemberId_asU8(): Uint8Array; + getMemberId_asB64(): string; + setMemberId(value: Uint8Array | string): void; + + getPower(): number; + setPower(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupMemberEntry.AsObject; + static toObject(includeInstance: boolean, msg: GroupMemberEntry): GroupMemberEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupMemberEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupMemberEntry; + static deserializeBinaryFromReader(message: GroupMemberEntry, reader: jspb.BinaryReader): GroupMemberEntry; + } + + export namespace GroupMemberEntry { + export type AsObject = { + memberId: Uint8Array | string, + power: number, + } + } + + export class GroupPositionInfoEntry extends jspb.Message { + getGroupContractPosition(): number; + setGroupContractPosition(value: number): void; + + clearMembersList(): void; + getMembersList(): Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>; + setMembersList(value: Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>): void; + addMembers(value?: GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, index?: number): GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry; + + getGroupRequiredPower(): number; + setGroupRequiredPower(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupPositionInfoEntry.AsObject; + static toObject(includeInstance: boolean, msg: GroupPositionInfoEntry): GroupPositionInfoEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupPositionInfoEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupPositionInfoEntry; + static deserializeBinaryFromReader(message: GroupPositionInfoEntry, reader: jspb.BinaryReader): GroupPositionInfoEntry; + } + + export namespace GroupPositionInfoEntry { + export type AsObject = { + groupContractPosition: number, + membersList: Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.AsObject>, + groupRequiredPower: number, + } + } + + export class GroupInfos extends jspb.Message { + clearGroupInfosList(): void; + getGroupInfosList(): Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>; + setGroupInfosList(value: Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>): void; + addGroupInfos(value?: GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, index?: number): GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupInfos.AsObject; + static toObject(includeInstance: boolean, msg: GroupInfos): GroupInfos.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupInfos, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupInfos; + static deserializeBinaryFromReader(message: GroupInfos, reader: jspb.BinaryReader): GroupInfos; + } + + export namespace GroupInfos { + export type AsObject = { + groupInfosList: Array<GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + GROUP_INFOS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupActionsRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupActionsRequest.GetGroupActionsRequestV0 | undefined; + setV0(value?: GetGroupActionsRequest.GetGroupActionsRequestV0): void; + + getVersionCase(): GetGroupActionsRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionsRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionsRequest): GetGroupActionsRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionsRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionsRequest; + static deserializeBinaryFromReader(message: GetGroupActionsRequest, reader: jspb.BinaryReader): GetGroupActionsRequest; +} + +export namespace GetGroupActionsRequest { + export type AsObject = { + v0?: GetGroupActionsRequest.GetGroupActionsRequestV0.AsObject, + } + + export class StartAtActionId extends jspb.Message { + getStartActionId(): Uint8Array | string; + getStartActionId_asU8(): Uint8Array; + getStartActionId_asB64(): string; + setStartActionId(value: Uint8Array | string): void; + + getStartActionIdIncluded(): boolean; + setStartActionIdIncluded(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): StartAtActionId.AsObject; + static toObject(includeInstance: boolean, msg: StartAtActionId): StartAtActionId.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: StartAtActionId, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): StartAtActionId; + static deserializeBinaryFromReader(message: StartAtActionId, reader: jspb.BinaryReader): StartAtActionId; + } + + export namespace StartAtActionId { + export type AsObject = { + startActionId: Uint8Array | string, + startActionIdIncluded: boolean, + } + } + + export class GetGroupActionsRequestV0 extends jspb.Message { + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + getGroupContractPosition(): number; + setGroupContractPosition(value: number): void; + + getStatus(): GetGroupActionsRequest.ActionStatusMap[keyof GetGroupActionsRequest.ActionStatusMap]; + setStatus(value: GetGroupActionsRequest.ActionStatusMap[keyof GetGroupActionsRequest.ActionStatusMap]): void; + + hasStartAtActionId(): boolean; + clearStartAtActionId(): void; + getStartAtActionId(): GetGroupActionsRequest.StartAtActionId | undefined; + setStartAtActionId(value?: GetGroupActionsRequest.StartAtActionId): void; + + hasCount(): boolean; + clearCount(): void; + getCount(): number; + setCount(value: number): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionsRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionsRequestV0): GetGroupActionsRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionsRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionsRequestV0; + static deserializeBinaryFromReader(message: GetGroupActionsRequestV0, reader: jspb.BinaryReader): GetGroupActionsRequestV0; + } + + export namespace GetGroupActionsRequestV0 { + export type AsObject = { + contractId: Uint8Array | string, + groupContractPosition: number, + status: GetGroupActionsRequest.ActionStatusMap[keyof GetGroupActionsRequest.ActionStatusMap], + startAtActionId?: GetGroupActionsRequest.StartAtActionId.AsObject, + count: number, + prove: boolean, + } + } + + export interface ActionStatusMap { + ACTIVE: 0; + CLOSED: 1; + } + + export const ActionStatus: ActionStatusMap; + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupActionsResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupActionsResponse.GetGroupActionsResponseV0 | undefined; + setV0(value?: GetGroupActionsResponse.GetGroupActionsResponseV0): void; + + getVersionCase(): GetGroupActionsResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionsResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionsResponse): GetGroupActionsResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionsResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionsResponse; + static deserializeBinaryFromReader(message: GetGroupActionsResponse, reader: jspb.BinaryReader): GetGroupActionsResponse; +} + +export namespace GetGroupActionsResponse { + export type AsObject = { + v0?: GetGroupActionsResponse.GetGroupActionsResponseV0.AsObject, + } + + export class GetGroupActionsResponseV0 extends jspb.Message { + hasGroupActions(): boolean; + clearGroupActions(): void; + getGroupActions(): GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions | undefined; + setGroupActions(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetGroupActionsResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionsResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionsResponseV0): GetGroupActionsResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionsResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionsResponseV0; + static deserializeBinaryFromReader(message: GetGroupActionsResponseV0, reader: jspb.BinaryReader): GetGroupActionsResponseV0; + } + + export namespace GetGroupActionsResponseV0 { + export type AsObject = { + groupActions?: GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class MintEvent extends jspb.Message { + getAmount(): number; + setAmount(value: number): void; + + getRecipientId(): Uint8Array | string; + getRecipientId_asU8(): Uint8Array; + getRecipientId_asB64(): string; + setRecipientId(value: Uint8Array | string): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): MintEvent.AsObject; + static toObject(includeInstance: boolean, msg: MintEvent): MintEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: MintEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): MintEvent; + static deserializeBinaryFromReader(message: MintEvent, reader: jspb.BinaryReader): MintEvent; + } + + export namespace MintEvent { + export type AsObject = { + amount: number, + recipientId: Uint8Array | string, + publicNote: string, + } + } + + export class BurnEvent extends jspb.Message { + getAmount(): number; + setAmount(value: number): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BurnEvent.AsObject; + static toObject(includeInstance: boolean, msg: BurnEvent): BurnEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: BurnEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BurnEvent; + static deserializeBinaryFromReader(message: BurnEvent, reader: jspb.BinaryReader): BurnEvent; + } + + export namespace BurnEvent { + export type AsObject = { + amount: number, + publicNote: string, + } + } + + export class FreezeEvent extends jspb.Message { + getFrozenId(): Uint8Array | string; + getFrozenId_asU8(): Uint8Array; + getFrozenId_asB64(): string; + setFrozenId(value: Uint8Array | string): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): FreezeEvent.AsObject; + static toObject(includeInstance: boolean, msg: FreezeEvent): FreezeEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: FreezeEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): FreezeEvent; + static deserializeBinaryFromReader(message: FreezeEvent, reader: jspb.BinaryReader): FreezeEvent; + } + + export namespace FreezeEvent { + export type AsObject = { + frozenId: Uint8Array | string, + publicNote: string, + } + } + + export class UnfreezeEvent extends jspb.Message { + getFrozenId(): Uint8Array | string; + getFrozenId_asU8(): Uint8Array; + getFrozenId_asB64(): string; + setFrozenId(value: Uint8Array | string): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): UnfreezeEvent.AsObject; + static toObject(includeInstance: boolean, msg: UnfreezeEvent): UnfreezeEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: UnfreezeEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): UnfreezeEvent; + static deserializeBinaryFromReader(message: UnfreezeEvent, reader: jspb.BinaryReader): UnfreezeEvent; + } + + export namespace UnfreezeEvent { + export type AsObject = { + frozenId: Uint8Array | string, + publicNote: string, + } + } + + export class DestroyFrozenFundsEvent extends jspb.Message { + getFrozenId(): Uint8Array | string; + getFrozenId_asU8(): Uint8Array; + getFrozenId_asB64(): string; + setFrozenId(value: Uint8Array | string): void; + + getAmount(): number; + setAmount(value: number): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DestroyFrozenFundsEvent.AsObject; + static toObject(includeInstance: boolean, msg: DestroyFrozenFundsEvent): DestroyFrozenFundsEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DestroyFrozenFundsEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DestroyFrozenFundsEvent; + static deserializeBinaryFromReader(message: DestroyFrozenFundsEvent, reader: jspb.BinaryReader): DestroyFrozenFundsEvent; + } + + export namespace DestroyFrozenFundsEvent { + export type AsObject = { + frozenId: Uint8Array | string, + amount: number, + publicNote: string, + } + } + + export class SharedEncryptedNote extends jspb.Message { + getSenderKeyIndex(): number; + setSenderKeyIndex(value: number): void; + + getRecipientKeyIndex(): number; + setRecipientKeyIndex(value: number): void; + + getEncryptedData(): Uint8Array | string; + getEncryptedData_asU8(): Uint8Array; + getEncryptedData_asB64(): string; + setEncryptedData(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): SharedEncryptedNote.AsObject; + static toObject(includeInstance: boolean, msg: SharedEncryptedNote): SharedEncryptedNote.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: SharedEncryptedNote, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): SharedEncryptedNote; + static deserializeBinaryFromReader(message: SharedEncryptedNote, reader: jspb.BinaryReader): SharedEncryptedNote; + } + + export namespace SharedEncryptedNote { + export type AsObject = { + senderKeyIndex: number, + recipientKeyIndex: number, + encryptedData: Uint8Array | string, + } + } + + export class PersonalEncryptedNote extends jspb.Message { + getRootEncryptionKeyIndex(): number; + setRootEncryptionKeyIndex(value: number): void; + + getDerivationEncryptionKeyIndex(): number; + setDerivationEncryptionKeyIndex(value: number): void; + + getEncryptedData(): Uint8Array | string; + getEncryptedData_asU8(): Uint8Array; + getEncryptedData_asB64(): string; + setEncryptedData(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): PersonalEncryptedNote.AsObject; + static toObject(includeInstance: boolean, msg: PersonalEncryptedNote): PersonalEncryptedNote.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: PersonalEncryptedNote, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): PersonalEncryptedNote; + static deserializeBinaryFromReader(message: PersonalEncryptedNote, reader: jspb.BinaryReader): PersonalEncryptedNote; + } + + export namespace PersonalEncryptedNote { + export type AsObject = { + rootEncryptionKeyIndex: number, + derivationEncryptionKeyIndex: number, + encryptedData: Uint8Array | string, + } + } + + export class TransferEvent extends jspb.Message { + getRecipientId(): Uint8Array | string; + getRecipientId_asU8(): Uint8Array; + getRecipientId_asB64(): string; + setRecipientId(value: Uint8Array | string): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + hasSharedEncryptedNote(): boolean; + clearSharedEncryptedNote(): void; + getSharedEncryptedNote(): GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote | undefined; + setSharedEncryptedNote(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote): void; + + hasPersonalEncryptedNote(): boolean; + clearPersonalEncryptedNote(): void; + getPersonalEncryptedNote(): GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote | undefined; + setPersonalEncryptedNote(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote): void; + + getAmount(): number; + setAmount(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TransferEvent.AsObject; + static toObject(includeInstance: boolean, msg: TransferEvent): TransferEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TransferEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TransferEvent; + static deserializeBinaryFromReader(message: TransferEvent, reader: jspb.BinaryReader): TransferEvent; + } + + export namespace TransferEvent { + export type AsObject = { + recipientId: Uint8Array | string, + publicNote: string, + sharedEncryptedNote?: GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.AsObject, + personalEncryptedNote?: GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.AsObject, + amount: number, + } + } + + export class EmergencyActionEvent extends jspb.Message { + getActionType(): GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap[keyof GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap]; + setActionType(value: GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap[keyof GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap]): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): EmergencyActionEvent.AsObject; + static toObject(includeInstance: boolean, msg: EmergencyActionEvent): EmergencyActionEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: EmergencyActionEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): EmergencyActionEvent; + static deserializeBinaryFromReader(message: EmergencyActionEvent, reader: jspb.BinaryReader): EmergencyActionEvent; + } + + export namespace EmergencyActionEvent { + export type AsObject = { + actionType: GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap[keyof GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionTypeMap], + publicNote: string, + } + + export interface ActionTypeMap { + PAUSE: 0; + RESUME: 1; + } + + export const ActionType: ActionTypeMap; + } + + export class TokenConfigUpdateEvent extends jspb.Message { + getTokenConfigUpdateItem(): Uint8Array | string; + getTokenConfigUpdateItem_asU8(): Uint8Array; + getTokenConfigUpdateItem_asB64(): string; + setTokenConfigUpdateItem(value: Uint8Array | string): void; + + hasPublicNote(): boolean; + clearPublicNote(): void; + getPublicNote(): string; + setPublicNote(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenConfigUpdateEvent.AsObject; + static toObject(includeInstance: boolean, msg: TokenConfigUpdateEvent): TokenConfigUpdateEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenConfigUpdateEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenConfigUpdateEvent; + static deserializeBinaryFromReader(message: TokenConfigUpdateEvent, reader: jspb.BinaryReader): TokenConfigUpdateEvent; + } + + export namespace TokenConfigUpdateEvent { + export type AsObject = { + tokenConfigUpdateItem: Uint8Array | string, + publicNote: string, + } + } + + export class GroupActionEvent extends jspb.Message { + hasTokenEvent(): boolean; + clearTokenEvent(): void; + getTokenEvent(): GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent | undefined; + setTokenEvent(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent): void; + + hasDocumentEvent(): boolean; + clearDocumentEvent(): void; + getDocumentEvent(): GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent | undefined; + setDocumentEvent(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent): void; + + hasContractEvent(): boolean; + clearContractEvent(): void; + getContractEvent(): GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent | undefined; + setContractEvent(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent): void; + + getEventTypeCase(): GroupActionEvent.EventTypeCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupActionEvent.AsObject; + static toObject(includeInstance: boolean, msg: GroupActionEvent): GroupActionEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupActionEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupActionEvent; + static deserializeBinaryFromReader(message: GroupActionEvent, reader: jspb.BinaryReader): GroupActionEvent; + } + + export namespace GroupActionEvent { + export type AsObject = { + tokenEvent?: GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.AsObject, + documentEvent?: GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.AsObject, + contractEvent?: GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.AsObject, + } + + export enum EventTypeCase { + EVENT_TYPE_NOT_SET = 0, + TOKEN_EVENT = 1, + DOCUMENT_EVENT = 2, + CONTRACT_EVENT = 3, + } + } + + export class DocumentEvent extends jspb.Message { + hasCreate(): boolean; + clearCreate(): void; + getCreate(): GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent | undefined; + setCreate(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent): void; + + getTypeCase(): DocumentEvent.TypeCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DocumentEvent.AsObject; + static toObject(includeInstance: boolean, msg: DocumentEvent): DocumentEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DocumentEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DocumentEvent; + static deserializeBinaryFromReader(message: DocumentEvent, reader: jspb.BinaryReader): DocumentEvent; + } + + export namespace DocumentEvent { + export type AsObject = { + create?: GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.AsObject, + } + + export enum TypeCase { + TYPE_NOT_SET = 0, + CREATE = 1, + } + } + + export class DocumentCreateEvent extends jspb.Message { + getCreatedDocument(): Uint8Array | string; + getCreatedDocument_asU8(): Uint8Array; + getCreatedDocument_asB64(): string; + setCreatedDocument(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DocumentCreateEvent.AsObject; + static toObject(includeInstance: boolean, msg: DocumentCreateEvent): DocumentCreateEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: DocumentCreateEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DocumentCreateEvent; + static deserializeBinaryFromReader(message: DocumentCreateEvent, reader: jspb.BinaryReader): DocumentCreateEvent; + } + + export namespace DocumentCreateEvent { + export type AsObject = { + createdDocument: Uint8Array | string, + } + } + + export class ContractUpdateEvent extends jspb.Message { + getUpdatedContract(): Uint8Array | string; + getUpdatedContract_asU8(): Uint8Array; + getUpdatedContract_asB64(): string; + setUpdatedContract(value: Uint8Array | string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ContractUpdateEvent.AsObject; + static toObject(includeInstance: boolean, msg: ContractUpdateEvent): ContractUpdateEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ContractUpdateEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ContractUpdateEvent; + static deserializeBinaryFromReader(message: ContractUpdateEvent, reader: jspb.BinaryReader): ContractUpdateEvent; + } + + export namespace ContractUpdateEvent { + export type AsObject = { + updatedContract: Uint8Array | string, + } + } + + export class ContractEvent extends jspb.Message { + hasUpdate(): boolean; + clearUpdate(): void; + getUpdate(): GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent | undefined; + setUpdate(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent): void; + + getTypeCase(): ContractEvent.TypeCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): ContractEvent.AsObject; + static toObject(includeInstance: boolean, msg: ContractEvent): ContractEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: ContractEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): ContractEvent; + static deserializeBinaryFromReader(message: ContractEvent, reader: jspb.BinaryReader): ContractEvent; + } + + export namespace ContractEvent { + export type AsObject = { + update?: GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.AsObject, + } + + export enum TypeCase { + TYPE_NOT_SET = 0, + UPDATE = 1, + } + } + + export class TokenEvent extends jspb.Message { + hasMint(): boolean; + clearMint(): void; + getMint(): GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent | undefined; + setMint(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent): void; + + hasBurn(): boolean; + clearBurn(): void; + getBurn(): GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent | undefined; + setBurn(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent): void; + + hasFreeze(): boolean; + clearFreeze(): void; + getFreeze(): GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent | undefined; + setFreeze(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent): void; + + hasUnfreeze(): boolean; + clearUnfreeze(): void; + getUnfreeze(): GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent | undefined; + setUnfreeze(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent): void; + + hasDestroyFrozenFunds(): boolean; + clearDestroyFrozenFunds(): void; + getDestroyFrozenFunds(): GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent | undefined; + setDestroyFrozenFunds(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent): void; + + hasTransfer(): boolean; + clearTransfer(): void; + getTransfer(): GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent | undefined; + setTransfer(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent): void; + + hasEmergencyAction(): boolean; + clearEmergencyAction(): void; + getEmergencyAction(): GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent | undefined; + setEmergencyAction(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent): void; + + hasTokenConfigUpdate(): boolean; + clearTokenConfigUpdate(): void; + getTokenConfigUpdate(): GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent | undefined; + setTokenConfigUpdate(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent): void; + + getTypeCase(): TokenEvent.TypeCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): TokenEvent.AsObject; + static toObject(includeInstance: boolean, msg: TokenEvent): TokenEvent.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: TokenEvent, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): TokenEvent; + static deserializeBinaryFromReader(message: TokenEvent, reader: jspb.BinaryReader): TokenEvent; + } + + export namespace TokenEvent { + export type AsObject = { + mint?: GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.AsObject, + burn?: GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.AsObject, + freeze?: GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.AsObject, + unfreeze?: GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.AsObject, + destroyFrozenFunds?: GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.AsObject, + transfer?: GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.AsObject, + emergencyAction?: GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.AsObject, + tokenConfigUpdate?: GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.AsObject, + } + + export enum TypeCase { + TYPE_NOT_SET = 0, + MINT = 1, + BURN = 2, + FREEZE = 3, + UNFREEZE = 4, + DESTROY_FROZEN_FUNDS = 5, + TRANSFER = 6, + EMERGENCY_ACTION = 7, + TOKEN_CONFIG_UPDATE = 8, + } + } + + export class GroupActionEntry extends jspb.Message { + getActionId(): Uint8Array | string; + getActionId_asU8(): Uint8Array; + getActionId_asB64(): string; + setActionId(value: Uint8Array | string): void; + + hasEvent(): boolean; + clearEvent(): void; + getEvent(): GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent | undefined; + setEvent(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupActionEntry.AsObject; + static toObject(includeInstance: boolean, msg: GroupActionEntry): GroupActionEntry.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupActionEntry, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupActionEntry; + static deserializeBinaryFromReader(message: GroupActionEntry, reader: jspb.BinaryReader): GroupActionEntry; + } + + export namespace GroupActionEntry { + export type AsObject = { + actionId: Uint8Array | string, + event?: GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.AsObject, + } + } + + export class GroupActions extends jspb.Message { + clearGroupActionsList(): void; + getGroupActionsList(): Array<GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>; + setGroupActionsList(value: Array<GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>): void; + addGroupActions(value?: GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, index?: number): GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupActions.AsObject; + static toObject(includeInstance: boolean, msg: GroupActions): GroupActions.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupActions, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupActions; + static deserializeBinaryFromReader(message: GroupActions, reader: jspb.BinaryReader): GroupActions; + } + + export namespace GroupActions { + export type AsObject = { + groupActionsList: Array<GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + GROUP_ACTIONS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupActionSignersRequest extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 | undefined; + setV0(value?: GetGroupActionSignersRequest.GetGroupActionSignersRequestV0): void; + + getVersionCase(): GetGroupActionSignersRequest.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionSignersRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionSignersRequest): GetGroupActionSignersRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionSignersRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionSignersRequest; + static deserializeBinaryFromReader(message: GetGroupActionSignersRequest, reader: jspb.BinaryReader): GetGroupActionSignersRequest; +} + +export namespace GetGroupActionSignersRequest { + export type AsObject = { + v0?: GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.AsObject, + } + + export class GetGroupActionSignersRequestV0 extends jspb.Message { + getContractId(): Uint8Array | string; + getContractId_asU8(): Uint8Array; + getContractId_asB64(): string; + setContractId(value: Uint8Array | string): void; + + getGroupContractPosition(): number; + setGroupContractPosition(value: number): void; + + getStatus(): GetGroupActionSignersRequest.ActionStatusMap[keyof GetGroupActionSignersRequest.ActionStatusMap]; + setStatus(value: GetGroupActionSignersRequest.ActionStatusMap[keyof GetGroupActionSignersRequest.ActionStatusMap]): void; + + getActionId(): Uint8Array | string; + getActionId_asU8(): Uint8Array; + getActionId_asB64(): string; + setActionId(value: Uint8Array | string): void; + + getProve(): boolean; + setProve(value: boolean): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionSignersRequestV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionSignersRequestV0): GetGroupActionSignersRequestV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionSignersRequestV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionSignersRequestV0; + static deserializeBinaryFromReader(message: GetGroupActionSignersRequestV0, reader: jspb.BinaryReader): GetGroupActionSignersRequestV0; + } + + export namespace GetGroupActionSignersRequestV0 { + export type AsObject = { + contractId: Uint8Array | string, + groupContractPosition: number, + status: GetGroupActionSignersRequest.ActionStatusMap[keyof GetGroupActionSignersRequest.ActionStatusMap], + actionId: Uint8Array | string, + prove: boolean, + } + } + + export interface ActionStatusMap { + ACTIVE: 0; + CLOSED: 1; + } + + export const ActionStatus: ActionStatusMap; + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + +export class GetGroupActionSignersResponse extends jspb.Message { + hasV0(): boolean; + clearV0(): void; + getV0(): GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 | undefined; + setV0(value?: GetGroupActionSignersResponse.GetGroupActionSignersResponseV0): void; + + getVersionCase(): GetGroupActionSignersResponse.VersionCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionSignersResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionSignersResponse): GetGroupActionSignersResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionSignersResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionSignersResponse; + static deserializeBinaryFromReader(message: GetGroupActionSignersResponse, reader: jspb.BinaryReader): GetGroupActionSignersResponse; +} + +export namespace GetGroupActionSignersResponse { + export type AsObject = { + v0?: GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.AsObject, + } + + export class GetGroupActionSignersResponseV0 extends jspb.Message { + hasGroupActionSigners(): boolean; + clearGroupActionSigners(): void; + getGroupActionSigners(): GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners | undefined; + setGroupActionSigners(value?: GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners): void; + + hasProof(): boolean; + clearProof(): void; + getProof(): Proof | undefined; + setProof(value?: Proof): void; + + hasMetadata(): boolean; + clearMetadata(): void; + getMetadata(): ResponseMetadata | undefined; + setMetadata(value?: ResponseMetadata): void; + + getResultCase(): GetGroupActionSignersResponseV0.ResultCase; + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetGroupActionSignersResponseV0.AsObject; + static toObject(includeInstance: boolean, msg: GetGroupActionSignersResponseV0): GetGroupActionSignersResponseV0.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GetGroupActionSignersResponseV0, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetGroupActionSignersResponseV0; + static deserializeBinaryFromReader(message: GetGroupActionSignersResponseV0, reader: jspb.BinaryReader): GetGroupActionSignersResponseV0; + } + + export namespace GetGroupActionSignersResponseV0 { + export type AsObject = { + groupActionSigners?: GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.AsObject, + proof?: Proof.AsObject, + metadata?: ResponseMetadata.AsObject, + } + + export class GroupActionSigner extends jspb.Message { + getSignerId(): Uint8Array | string; + getSignerId_asU8(): Uint8Array; + getSignerId_asB64(): string; + setSignerId(value: Uint8Array | string): void; + + getPower(): number; + setPower(value: number): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupActionSigner.AsObject; + static toObject(includeInstance: boolean, msg: GroupActionSigner): GroupActionSigner.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupActionSigner, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupActionSigner; + static deserializeBinaryFromReader(message: GroupActionSigner, reader: jspb.BinaryReader): GroupActionSigner; + } + + export namespace GroupActionSigner { + export type AsObject = { + signerId: Uint8Array | string, + power: number, + } + } + + export class GroupActionSigners extends jspb.Message { + clearSignersList(): void; + getSignersList(): Array<GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>; + setSignersList(value: Array<GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>): void; + addSigners(value?: GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, index?: number): GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GroupActionSigners.AsObject; + static toObject(includeInstance: boolean, msg: GroupActionSigners): GroupActionSigners.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; + static serializeBinaryToWriter(message: GroupActionSigners, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GroupActionSigners; + static deserializeBinaryFromReader(message: GroupActionSigners, reader: jspb.BinaryReader): GroupActionSigners; + } + + export namespace GroupActionSigners { + export type AsObject = { + signersList: Array<GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.AsObject>, + } + } + + export enum ResultCase { + RESULT_NOT_SET = 0, + GROUP_ACTION_SIGNERS = 1, + PROOF = 2, + } + } + + export enum VersionCase { + VERSION_NOT_SET = 0, + V0 = 1, + } +} + export interface KeyPurposeMap { AUTHENTICATION: 0; ENCRYPTION: 1; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js index ca80ce2ad7f..36356ff116d 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb.js @@ -139,6 +139,69 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlock goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase', null, { proto }); @@ -158,6 +221,25 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResp goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase', null, { proto }); @@ -209,6 +291,25 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse', null, { goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase', null, { proto }); @@ -231,6 +332,9 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsReq goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase', null, { proto }); @@ -273,6 +377,34 @@ goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusRe goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry', null, { proto }); +goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0', null, { proto }); goog.exportSymbol('proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase', null, { proto }); @@ -1652,6 +1784,69 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -4256,385 +4451,20015 @@ if (goog.DEBUG && !COMPILED) { */ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0'; } - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.Proof.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest'; +} /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.toObject = function(includeInstance, msg) { - var f, obj = { - grovedbProof: msg.getGrovedbProof_asB64(), - quorumHash: msg.getQuorumHash_asB64(), - signature: msg.getSignature_asB64(), - round: jspb.Message.getFieldWithDefault(msg, 4, 0), - blockIdHash: msg.getBlockIdHash_asB64(), - quorumType: jspb.Message.getFieldWithDefault(msg, 6, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.repeatedFields_, null); }; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0'; } - - /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.Proof} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.Proof; - return proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse'; +} /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.Proof} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setGrovedbProof(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setQuorumHash(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setSignature(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setRound(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setBlockIdHash(value); - break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setQuorumType(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0'; +} /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry'; +} /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.Proof} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getGrovedbProof_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getQuorumHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getSignature_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getRound(); - if (f !== 0) { - writer.writeUint32( - 4, - f - ); - } - f = message.getBlockIdHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getQuorumType(); - if (f !== 0) { - writer.writeUint32( - 6, - f - ); - } +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances'; +} /** - * optional bytes grovedb_proof = 1; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest'; +} /** - * optional bytes grovedb_proof = 1; - * This is a type-conversion wrapper around `getGrovedbProof()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getGrovedbProof())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0'; +} /** - * optional bytes grovedb_proof = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getGrovedbProof()` - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getGrovedbProof())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse'; +} /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setGrovedbProof = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0'; +} /** - * optional bytes quorum_hash = 2; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry'; +} /** - * optional bytes quorum_hash = 2; - * This is a type-conversion wrapper around `getQuorumHash()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getQuorumHash())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances'; +} /** - * optional bytes quorum_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHash()` - * @return {!Uint8Array} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getQuorumHash())); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest'; +} /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.repeatedFields_, null); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0'; +} /** - * optional bytes signature = 3; - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse'; +} /** - * optional bytes signature = 3; - * This is a type-conversion wrapper around `getSignature()` - * @return {string} + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getSignature())); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_); }; - - +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0'; +} /** - * optional bytes signature = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSignature()` - * @return {!Uint8Array} - */ + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0 = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.repeatedFields_, null); +}; +goog.inherits(proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.displayName = 'proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.Proof.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.Proof.toObject = function(includeInstance, msg) { + var f, obj = { + grovedbProof: msg.getGrovedbProof_asB64(), + quorumHash: msg.getQuorumHash_asB64(), + signature: msg.getSignature_asB64(), + round: jspb.Message.getFieldWithDefault(msg, 4, 0), + blockIdHash: msg.getBlockIdHash_asB64(), + quorumType: jspb.Message.getFieldWithDefault(msg, 6, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.Proof.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.Proof; + return proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.Proof} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setGrovedbProof(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSignature(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setRound(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBlockIdHash(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setQuorumType(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.Proof} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGrovedbProof_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getSignature_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getRound(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } + f = message.getBlockIdHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } + f = message.getQuorumType(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } +}; + + +/** + * optional bytes grovedb_proof = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes grovedb_proof = 1; + * This is a type-conversion wrapper around `getGrovedbProof()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getGrovedbProof())); +}; + + +/** + * optional bytes grovedb_proof = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getGrovedbProof()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getGrovedbProof_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getGrovedbProof())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setGrovedbProof = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes quorum_hash = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes quorum_hash = 2; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); +}; + + +/** + * optional bytes quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes signature = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes signature = 3; + * This is a type-conversion wrapper around `getSignature()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSignature())); +}; + + +/** + * optional bytes signature = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSignature()` + * @return {!Uint8Array} + */ proto.org.dash.platform.dapi.v0.Proof.prototype.getSignature_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getSignature())); + this.getSignature())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setSignature = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 round = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getRound = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setRound = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional bytes block_id_hash = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes block_id_hash = 5; + * This is a type-conversion wrapper around `getBlockIdHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBlockIdHash())); +}; + + +/** + * optional bytes block_id_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBlockIdHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBlockIdHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setBlockIdHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + +/** + * optional uint32 quorum_type = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumType = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + */ +proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumType = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInstance, msg) { + var f, obj = { + height: jspb.Message.getFieldWithDefault(msg, 1, "0"), + coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + epoch: jspb.Message.getFieldWithDefault(msg, 3, 0), + timeMs: jspb.Message.getFieldWithDefault(msg, 4, "0"), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 5, 0), + chainId: jspb.Message.getFieldWithDefault(msg, 6, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + return proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setHeight(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreChainLockedHeight(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTimeMs(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setChainId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getCoreChainLockedHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getEpoch(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 5, + f + ); + } + f = message.getChainId(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } +}; + + +/** + * optional uint64 height = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional uint32 core_chain_locked_height = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getCoreChainLockedHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setCoreChainLockedHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional uint32 epoch = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setEpoch = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional uint64 time_ms = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); +}; + + +/** + * optional uint32 protocol_version = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + +/** + * optional string chain_id = 6; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getChainId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + */ +proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setChainId = function(value) { + return jspb.Message.setProto3StringField(this, 6, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = function(includeInstance, msg) { + var f, obj = { + code: jspb.Message.getFieldWithDefault(msg, 1, 0), + message: jspb.Message.getFieldWithDefault(msg, 2, ""), + data: msg.getData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; + return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCode(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMessage(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCode(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getMessage(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } +}; + + +/** + * optional uint32 code = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getCode = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setCode = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string message = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getMessage = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setMessage = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bytes data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes data = 3; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + */ +proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject = function(includeInstance, msg) { + var f, obj = { + stateTransition: msg.getStateTransition_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest; + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStateTransition(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStateTransition_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes state_transition = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes state_transition = 1; + * This is a type-conversion wrapper around `getStateTransition()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStateTransition())); +}; + + +/** + * optional bytes state_transition = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStateTransition()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStateTransition())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} returns this + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.setStateTransition = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse; + return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + contractId: msg.getContractId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetIdentityContractNonceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentity(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identity = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentity())); +}; + + +/** + * optional bytes identity = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentity()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentity())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityNonce: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setIdentityNonce(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_nonce = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_CONTRACT_NONCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setIdentityContractNonce(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 identity_contract_nonce = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityContractNonceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + BALANCE: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + BALANCE_AND_REVISION: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); + msg.setBalanceAndRevision(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalanceAndRevision(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { + var f, obj = { + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), + revision: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; + return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setRevision(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBalance(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getRevision(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional uint64 revision = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; + + +/** + * optional BalanceAndRevision balance_and_revision = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { + return this.setBalanceAndRevision(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { + REQUEST_NOT_SET: 0, + ALL_KEYS: 1, + SPECIFIC_KEYS: 2, + SEARCH_KEY: 3 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { + var f, obj = { + allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), + specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), + searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; + return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.AllKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); + msg.setAllKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); + msg.setSpecificKeys(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.SearchKey; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); + msg.setSearchKey(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAllKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter + ); + } + f = message.getSpecificKeys(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter + ); + } + f = message.getSearchKey(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + ); + } +}; + + +/** + * optional AllKeys all_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { + return this.setAllKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional SpecificKeys specific_keys = 2; + * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { + return this.setSpecificKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional SearchKey search_key = 3; + * @return {?proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this +*/ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { + return this.setSearchKey(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { + return jspb.Message.getField(this, 3) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { + var f, obj = { + + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.AllKeys; + return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + */ +proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { + var f, obj = { + keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; + return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addKeyIds(values[i]); + } + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeyIdsList(); + if (f.length > 0) { + writer.writePackedUint32( + 1, + f + ); + } +}; + + +/** + * repeated uint32 key_ids = 1; + * @return {!Array<number>} + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { + return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * @param {!Array<number>} value + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + */ +proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { + return this.setKeyIdsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { + var f, obj = { + purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SearchKey; + return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + */ +proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = msg.getPurposeMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); + }); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPurposeMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); + } +}; + + +/** + * map<uint32, SecurityLevelMap> purpose_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + proto.org.dash.platform.dapi.v0.SecurityLevelMap)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + */ +proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { + this.getPurposeMapMap().clear(); + return this;}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { + var f, obj = { + securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; + return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = msg.getSecurityLevelMapMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); + }); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSecurityLevelMapMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { + CURRENT_KEY_OF_KIND_REQUEST: 0, + ALL_KEYS_OF_KIND_REQUEST: 1 +}; + +/** + * map<uint32, KeyKindRequestType> security_level_map = 1; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} */ ( + jspb.Message.getMapField(this, 1, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this + */ +proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { + this.getSecurityLevelMapMap().clear(); + return this;}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); + msg.setRequestType(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 4: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 4, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional KeyRequestType request_type = 2; + * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { + return this.setRequestType(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional google.protobuf.UInt32Value limit = 3; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional google.protobuf.UInt32Value offset = 4; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentityKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + KEYS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); + msg.setKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { + var f, obj = { + keysBytesList: msg.getKeysBytesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; + return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKeysBytesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes keys_bytes = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes keys_bytes = 1; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); +}; + + +/** + * optional Keys keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { + return this.setKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesIdsList: msg.getIdentitiesIdsList_asB64(), + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), + purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIdentitiesIds(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 4: + var values = /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); + for (var i = 0; i < values.length; i++) { + msg.addPurposes(values[i]); + } + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } + f = message.getPurposesList(); + if (f.length > 0) { + writer.writePackedEnum( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * repeated bytes identities_ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes identities_ids = 1; + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentitiesIdsList())); +}; + + +/** + * repeated bytes identities_ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentitiesIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentitiesIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { + return this.setIdentitiesIdsList([]); +}; + + +/** + * optional bytes contract_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes contract_id = 2; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional string document_type_name = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * repeated KeyPurpose purposes = 4; + * @return {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { + return /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { + return this.setPurposesList([]); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetIdentitiesContractKeysRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES_KEYS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); + msg.setIdentitiesKeys(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesKeys(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { + var f, obj = { + purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), + keysBytesList: msg.getKeysBytesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); + msg.setPurpose(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeysBytes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPurpose(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getKeysBytesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } +}; + + +/** + * optional KeyPurpose purpose = 1; + * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * repeated bytes keys_bytes = 2; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes keys_bytes = 2; + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysBytesList())); +}; + + +/** + * repeated bytes keys_bytes = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getKeysBytesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysBytesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { + return this.setKeysBytesList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + keysList: jspb.Message.toObjectList(msg.getKeysList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); + msg.addKeys(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getKeysList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated PurposeKeys keys = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { + return this.setKeysList([]); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { + var f, obj = { + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; + return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); + msg.addEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityKeys entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; + + +/** + * optional IdentitiesKeys identities_keys = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { + return this.setIdentitiesKeys(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesContractKeysResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } +}; + + +/** + * optional uint32 epoch = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * repeated bytes ids = 2; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * repeated bytes ids = 2; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional GetEvonodesProposedEpochBlocksByIdsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + EVONODES_PROPOSED_BLOCK_COUNTS_INFO: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + evonodesProposedBlockCountsInfo: (f = msg.getEvonodesProposedBlockCountsInfo()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader); + msg.setEvonodesProposedBlockCountsInfo(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEvonodesProposedBlockCountsInfo(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject = function(includeInstance, msg) { + var f, obj = { + proTxHash: msg.getProTxHash_asB64(), + count: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setCount(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCount(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional bytes pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); +}; + + +/** + * optional bytes pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 count = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getCount = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setCount = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject = function(includeInstance, msg) { + var f, obj = { + evonodesProposedBlockCountsList: jspb.Message.toObjectList(msg.getEvonodesProposedBlockCountsList(), + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader); + msg.addEvonodesProposedBlockCounts(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEvonodesProposedBlockCountsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated EvonodeProposedBlocks evonodes_proposed_block_counts = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.getEvonodesProposedBlockCountsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.setEvonodesProposedBlockCountsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.addEvonodesProposedBlockCounts = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.clearEvonodesProposedBlockCountsList = function() { + return this.setEvonodesProposedBlockCountsList([]); +}; + + +/** + * optional EvonodesProposedBlocks evonodes_proposed_block_counts_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getEvonodesProposedBlockCountsInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setEvonodesProposedBlockCountsInfo = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearEvonodesProposedBlockCountsInfo = function() { + return this.setEvonodesProposedBlockCountsInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasEvonodesProposedBlockCountsInfo = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetEvonodesProposedEpochBlocksResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_ = [[3,4]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase = { + START_NOT_SET: 0, + START_AFTER: 3, + START_AT: 4 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), + limit: jspb.Message.getFieldWithDefault(msg, 2, 0), + startAfter: msg.getStartAfter_asB64(), + startAt: msg.getStartAt_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; + return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAfter(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAt(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {number} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint32( + 1, + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( + 2, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBytes( + 3, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeBytes( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional uint32 epoch = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 1, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 1, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional uint32 limit = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional bytes start_after = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes start_after = 3; + * This is a type-conversion wrapper around `getStartAfter()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAfter())); +}; + + +/** + * optional bytes start_after = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAfter()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAfter())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAfter = function(value) { + return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAfter = function() { + return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAfter = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bytes start_at = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes start_at = 4; + * This is a type-conversion wrapper around `getStartAt()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); +}; + + +/** + * optional bytes start_at = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAt()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetEvonodesProposedEpochBlocksByRangeRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetIdentitiesBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITIES_BALANCES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesBalances: (f = msg.getIdentitiesBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader); + msg.setIdentitiesBalances(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesBalances(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, "0") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64String( + 2, + f + ); + } +}; + + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 balance = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.hasBalance = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject = function(includeInstance, msg) { + var f, obj = { + entriesList: jspb.Message.toObjectList(msg.getEntriesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; + return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader); + msg.addEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated IdentityBalance entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.getEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.setEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.addEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.clearEntriesList = function() { + return this.setEntriesList([]); +}; + + +/** + * optional IdentitiesBalances identities_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getIdentitiesBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setIdentitiesBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearIdentitiesBalances = function() { + return this.setIdentitiesBalances(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasIdentitiesBalances = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentitiesBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3,4,5,6,7]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), + contractsList: jspb.Message.toObjectList(msg.getContractsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), + documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance), + votesList: jspb.Message.toObjectList(msg.getVotesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject, includeInstance), + identityTokenBalancesList: jspb.Message.toObjectList(msg.getIdentityTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject, includeInstance), + identityTokenInfosList: jspb.Message.toObjectList(msg.getIdentityTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject, includeInstance), + tokenStatusesList: jspb.Message.toObjectList(msg.getTokenStatusesList(), + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); + msg.addIdentities(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); + msg.addContracts(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); + msg.addDocuments(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader); + msg.addVotes(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader); + msg.addIdentityTokenBalances(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader); + msg.addIdentityTokenInfos(value); + break; + case 7: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader); + msg.addTokenStatuses(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentitiesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + ); + } + f = message.getContractsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + ); + } + f = message.getDocumentsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + ); + } + f = message.getVotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter + ); + } + f = message.getIdentityTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter + ); + } + f = message.getIdentityTokenInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter + ); + } + f = message.getTokenStatusesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 7, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + documentId: msg.getDocumentId_asB64(), + documentContestedStatus: jspb.Message.getFieldWithDefault(msg, 5, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentType(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDocumentTypeKeepsHistory(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocumentId(value); + break; + case 5: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (reader.readEnum()); + msg.setDocumentContestedStatus(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentType(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getDocumentTypeKeepsHistory(); + if (f) { + writer.writeBool( + 3, + f + ); + } + f = message.getDocumentId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getDocumentContestedStatus(); + if (f !== 0.0) { + writer.writeEnum( + 5, + f + ); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus = { + NOT_CONTESTED: 0, + MAYBE_CONTESTED: 1, + CONTESTED: 2 +}; + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional bool document_type_keeps_history = 3; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); +}; + + +/** + * optional bytes document_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes document_id = 4; + * This is a type-conversion wrapper around `getDocumentId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDocumentId())); +}; + + +/** + * optional bytes document_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDocumentId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDocumentId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional DocumentContestedStatus document_contested_status = 5; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentContestedStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentContestedStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { + var f, obj = { + identityId: msg.getIdentityId_asB64(), + requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); + msg.setRequestType(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getRequestType(); + if (f !== 0.0) { + writer.writeEnum( + 2, + f + ); + } +}; + + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { + FULL_IDENTITY: 0, + BALANCE: 1, + KEYS: 2, + REVISION: 3 +}; + +/** + * optional bytes identity_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional Type request_type = 2; + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { + return jspb.Message.setProto3EnumField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase = { + REQUEST_TYPE_NOT_SET: 0, + CONTESTED_RESOURCE_VOTE_STATUS_REQUEST: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getRequestTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contestedResourceVoteStatusRequest: (f = msg.getContestedResourceVoteStatusRequest()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader); + msg.setContestedResourceVoteStatusRequest(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContestedResourceVoteStatusRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.repeatedFields_ = [4]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + indexValuesList: msg.getIndexValuesList_asB64(), + voterIdentifier: msg.getVoterIdentifier_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIndexValues(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setVoterIdentifier(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f + ); + } + f = message.getVoterIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type_name = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string index_name = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * repeated bytes index_values = 4; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +}; + + +/** + * repeated bytes index_values = 4; + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIndexValuesList())); +}; + + +/** + * repeated bytes index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIndexValuesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.addIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.clearIndexValuesList = function() { + return this.setIndexValuesList([]); +}; + + +/** + * optional bytes voter_identifier = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes voter_identifier = 5; + * This is a type-conversion wrapper around `getVoterIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getVoterIdentifier())); +}; + + +/** + * optional bytes voter_identifier = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getVoterIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getVoterIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setVoterIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + +/** + * optional ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getContestedResourceVoteStatusRequest = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.setContestedResourceVoteStatusRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.clearContestedResourceVoteStatusRequest = function() { + return this.setContestedResourceVoteStatusRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.hasContestedResourceVoteStatusRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64(), + identityId: msg.getIdentityId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64(), + identityId: msg.getIdentityId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tokenId: msg.getTokenId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated IdentityRequest identities = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { + return this.setIdentitiesList([]); +}; + + +/** + * repeated ContractRequest contracts = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addContracts = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearContractsList = function() { + return this.setContractsList([]); +}; + + +/** + * repeated DocumentRequest documents = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getDocumentsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, 3)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setDocumentsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addDocuments = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * repeated VoteStatusRequest votes = 4; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getVotesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, 4)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setVotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 4, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addVotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearVotesList = function() { + return this.setVotesList([]); +}; + + +/** + * repeated IdentityTokenBalanceRequest identity_token_balances = 5; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentityTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, 5)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentityTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 5, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentityTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 5, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenBalanceRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentityTokenBalancesList = function() { + return this.setIdentityTokenBalancesList([]); +}; + + +/** + * repeated IdentityTokenInfoRequest identity_token_infos = 6; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentityTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, 6)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentityTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 6, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentityTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 6, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityTokenInfoRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentityTokenInfosList = function() { + return this.setIdentityTokenInfosList([]); +}; + + +/** + * repeated TokenStatusRequest token_statuses = 7; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getTokenStatusesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, 7)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setTokenStatusesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 7, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addTokenStatuses = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 7, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.TokenStatusRequest, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearTokenStatusesList = function() { + return this.setTokenStatusesList([]); +}; + + +/** + * optional GetProofsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse; + return proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + PROOF: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; + return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Proof proof = 1; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional ResponseMetadata metadata = 2; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional GetProofsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetDataContractRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACT: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContract: msg.getDataContract_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDataContract(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeBytes( + 1, + f + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes data_contract = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data_contract = 1; + * This is a type-conversion wrapper around `getDataContract()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDataContract())); +}; + + +/** + * optional bytes data_contract = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDataContract()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDataContract())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setDataContract = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearDataContract = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasDataContract = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + idsList: msg.getIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIds(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes ids = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes ids = 1; + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdsList())); +}; + + +/** + * repeated bytes ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdsList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.addIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.clearIdsList = function() { + return this.setIdsList([]); +}; + + +/** + * optional bool prove = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional GetDataContractsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject = function(includeInstance, msg) { + var f, obj = { + identifier: msg.getIdentifier_asB64(), + dataContract: (f = msg.getDataContract()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentifier(value); + break; + case 2: + var value = new google_protobuf_wrappers_pb.BytesValue; + reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); + msg.setDataContract(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDataContract(); + if (f != null) { + writer.writeMessage( + 2, + f, + google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + ); + } +}; + + +/** + * optional bytes identifier = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes identifier = 1; + * This is a type-conversion wrapper around `getIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentifier())); +}; + + +/** + * optional bytes identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.BytesValue data_contract = 2; + * @return {?proto.google.protobuf.BytesValue} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getDataContract = function() { + return /** @type{?proto.google.protobuf.BytesValue} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); +}; + + +/** + * @param {?proto.google.protobuf.BytesValue|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setDataContract = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.clearDataContract = function() { + return this.setDataContract(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.hasDataContract = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader); + msg.addDataContractEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated DataContractEntry data_contract_entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.getDataContractEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.setDataContractEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.addDataContractEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.clearDataContractEntriesList = function() { + return this.setDataContractEntriesList([]); +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACTS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContracts: (f = msg.getDataContracts()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader); + msg.setDataContracts(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContracts(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + +/** + * optional DataContracts data_contracts = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getDataContracts = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setDataContracts = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearDataContracts = function() { + return this.setDataContracts(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasDataContracts = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + id: msg.getId_asB64(), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + startAtMs: jspb.Message.getFieldWithDefault(msg, 4, "0"), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); + break; + case 2: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartAtMs(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getLimit(); + if (f != null) { + writer.writeMessage( + 2, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); + } + f = message.getStartAtMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } +}; + + +/** + * optional bytes id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); +}; + + +/** + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.UInt32Value limit = 2; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional google.protobuf.UInt32Value offset = 3; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional uint64 start_at_ms = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getStartAtMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setStartAtMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetDataContractHistoryRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter + ); + } +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DATA_CONTRACT_HISTORY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractHistory: (f = msg.getDataContractHistory()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader); + msg.setDataContractHistory(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractHistory(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setSignature = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(opt_includeInstance, this); }; /** - * optional uint32 round = 4; - * @return {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getRound = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject = function(includeInstance, msg) { + var f, obj = { + date: jspb.Message.getFieldWithDefault(msg, 1, "0"), + value: msg.getValue_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setRound = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes block_id_hash = 5; + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setDate(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setValue(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDate(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getValue_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional uint64 date = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getDate = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * optional bytes block_id_hash = 5; - * This is a type-conversion wrapper around `getBlockIdHash()` + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setDate = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; + + +/** + * optional bytes value = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes value = 2; + * This is a type-conversion wrapper around `getValue()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getBlockIdHash())); + this.getValue())); }; /** - * optional bytes block_id_hash = 5; + * optional bytes value = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getBlockIdHash()` + * This is a type-conversion wrapper around `getValue()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getBlockIdHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getBlockIdHash())); + this.getValue())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setBlockIdHash = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setValue = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; + /** - * optional uint32 quorum_type = 6; - * @return {number} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject = function(includeInstance, msg) { + var f, obj = { + dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; + return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader); + msg.addDataContractEntries(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDataContractEntriesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated DataContractHistoryEntry data_contract_entries = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.getDataContractEntriesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.setDataContractEntriesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.addDataContractEntries = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.clearDataContractEntriesList = function() { + return this.setDataContractEntriesList([]); +}; + + +/** + * optional DataContractHistory data_contract_history = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getDataContractHistory = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setDataContractHistory = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearDataContractHistory = function() { + return this.setDataContractHistory(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasDataContractHistory = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDataContractHistoryResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.getQuorumType = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.Proof} returns this + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.Proof.prototype.setQuorumType = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -4648,8 +24473,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject(opt_includeInstance, this); }; @@ -4658,18 +24483,13 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeInstance, msg) { var f, obj = { - height: jspb.Message.getFieldWithDefault(msg, 1, 0), - coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - epoch: jspb.Message.getFieldWithDefault(msg, 3, 0), - timeMs: jspb.Message.getFieldWithDefault(msg, 4, 0), - protocolVersion: jspb.Message.getFieldWithDefault(msg, 5, 0), - chainId: jspb.Message.getFieldWithDefault(msg, 6, "") + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -4683,23 +24503,23 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - return proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest; + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4707,28 +24527,9 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setHeight(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreChainLockedHeight(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTimeMs(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint32()); - msg.setProtocolVersion(value); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setChainId(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -4743,9 +24544,9 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -4753,168 +24554,52 @@ proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.ResponseMetadata} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getHeight(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getCoreChainLockedHeight(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getEpoch(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getTimeMs(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getProtocolVersion(); - if (f !== 0) { - writer.writeUint32( - 5, - f - ); - } - f = message.getChainId(); - if (f.length > 0) { - writer.writeString( - 6, - f + f, + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 height = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setHeight = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint32 core_chain_locked_height = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getCoreChainLockedHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setCoreChainLockedHeight = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 epoch = 3; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional uint64 time_ms = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional uint32 protocol_version = 5; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getProtocolVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); -}; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setProtocolVersion = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_ = [[6,7]]; /** - * optional string chain_id = 6; - * @return {string} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.getChainId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase = { + START_NOT_SET: 0, + START_AFTER: 6, + START_AT: 7 }; - /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.ResponseMetadata} returns this + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */ -proto.org.dash.platform.dapi.v0.ResponseMetadata.prototype.setChainId = function(value) { - return jspb.Message.setProto3StringField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -4928,8 +24613,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(opt_includeInstance, this); }; @@ -4938,15 +24623,20 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - code: jspb.Message.getFieldWithDefault(msg, 1, 0), - message: jspb.Message.getFieldWithDefault(msg, 2, ""), - data: msg.getData_asB64() + dataContractId: msg.getDataContractId_asB64(), + documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), + where: msg.getWhere_asB64(), + orderBy: msg.getOrderBy_asB64(), + limit: jspb.Message.getFieldWithDefault(msg, 5, 0), + startAfter: msg.getStartAfter_asB64(), + startAt: msg.getStartAt_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 8, false) }; if (includeInstance) { @@ -4960,23 +24650,23 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; - return proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -4984,16 +24674,36 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCode(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDataContractId(value); break; case 2: var value = /** @type {string} */ (reader.readString()); - msg.setMessage(value); + msg.setDocumentType(value); break; case 3: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setData(value); + msg.setWhere(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setOrderBy(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 6: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAfter(value); + break; + case 7: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartAt(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -5008,9 +24718,9 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5018,508 +24728,433 @@ proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getCode(); - if (f !== 0) { - writer.writeUint32( + f = message.getDataContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getMessage(); + f = message.getDocumentType(); if (f.length > 0) { writer.writeString( 2, f ); } - f = message.getData_asU8(); + f = message.getWhere_asU8(); if (f.length > 0) { writer.writeBytes( 3, f ); } + f = message.getOrderBy_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getLimit(); + if (f !== 0) { + writer.writeUint32( + 5, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 6)); + if (f != null) { + writer.writeBytes( + 6, + f + ); + } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeBytes( + 7, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 8, + f + ); + } }; /** - * optional uint32 code = 1; - * @return {number} + * optional bytes data_contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getCode = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * optional bytes data_contract_id = 1; + * This is a type-conversion wrapper around `getDataContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setCode = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getDataContractId())); }; /** - * optional string message = 2; + * optional bytes data_contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getDataContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getDataContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDataContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getMessage = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDocumentType = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setMessage = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDocumentType = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bytes data = 3; + * optional bytes where = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * optional bytes data = 3; - * This is a type-conversion wrapper around `getData()` + * optional bytes where = 3; + * This is a type-conversion wrapper around `getWhere()` * @return {string} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getData())); + this.getWhere())); }; /** - * optional bytes data = 3; + * optional bytes where = 3; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getData()` + * This is a type-conversion wrapper around `getWhere()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.getData_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getData())); + this.getWhere())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.prototype.setData = function(value) { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setWhere = function(value) { return jspb.Message.setProto3BytesField(this, 3, value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bytes order_by = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional bytes order_by = 4; + * This is a type-conversion wrapper around `getOrderBy()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.toObject = function(includeInstance, msg) { - var f, obj = { - stateTransition: msg.getStateTransition_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getOrderBy())); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + * optional bytes order_by = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getOrderBy()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest; - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getOrderBy())); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStateTransition(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setOrderBy = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * optional uint32 limit = 5; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStateTransition_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); }; /** - * optional bytes state_transition = 1; + * optional bytes start_after = 6; * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; /** - * optional bytes state_transition = 1; - * This is a type-conversion wrapper around `getStateTransition()` + * optional bytes start_after = 6; + * This is a type-conversion wrapper around `getStartAfter()` * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStateTransition())); + this.getStartAfter())); }; /** - * optional bytes state_transition = 1; + * optional bytes start_after = 6; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStateTransition()` + * This is a type-conversion wrapper around `getStartAfter()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.getStateTransition_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStateTransition())); + this.getStartAfter())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionRequest.prototype.setStateTransition = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAfter = function(value) { + return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAfter = function() { + return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.toObject = function(includeInstance, msg) { - var f, obj = { - - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAfter = function() { + return jspb.Message.getField(this, 6) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + * optional bytes start_at = 7; + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse; - return proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} + * optional bytes start_at = 7; + * This is a type-conversion wrapper around `getStartAt()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartAt())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes start_at = 7; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartAt()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartAt())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.BroadcastStateTransitionResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { + return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { + return jspb.Message.getField(this, 7) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} + * optional bool prove = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional GetDocumentsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter - ); - } -}; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); +}; @@ -5536,8 +25171,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); }; @@ -5546,14 +25181,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototyp * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -5567,23 +25201,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5591,12 +25225,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserial var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -5611,9 +25242,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.deserial * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5621,126 +25252,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototyp /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter ); } }; -/** - * optional bytes id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); -}; - - -/** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetIdentityRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityRequest.GetIdentityRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** * Oneof group definitions for this message. Each group defines the field @@ -5750,21 +25278,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityRequest.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + DOCUMENTS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); }; @@ -5782,8 +25311,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); }; @@ -5792,13 +25321,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(includeInstance, f) + documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -5812,23 +25343,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5836,9 +25367,19 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); + msg.setDocuments(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -5853,9 +25394,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5863,24 +25404,47 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getDocuments(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -5896,8 +25460,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); }; @@ -5906,14 +25470,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + documentsList: msg.getDocumentsList_asB64() }; if (includeInstance) { @@ -5927,23 +25490,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; + return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -5952,11 +25515,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + msg.addDocuments(value); break; default: reader.skipField(); @@ -5971,9 +25530,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -5981,113 +25540,218 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getDocumentsList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } }; /** - * optional bytes identity_id = 1; - * @return {string} + * repeated bytes documents = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * repeated bytes documents = 1; + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getDocumentsList())); }; /** - * optional bytes identity_id = 1; + * repeated bytes documents = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getDocumentsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getDocumentsList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * optional bool prove = 2; + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { + return this.setDocumentsList([]); +}; + + +/** + * optional Documents documents = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { + return this.setDocuments(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetIdentityNonceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.GetIdentityNonceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetDocumentsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6096,7 +25760,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6110,21 +25774,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceRequest.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0])); }; @@ -6142,8 +25806,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject(opt_includeInstance, this); }; @@ -6152,13 +25816,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.toObje * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6172,23 +25836,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.toObject = funct /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6196,8 +25860,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinar var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6213,9 +25877,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.deserializeBinar * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6223,18 +25887,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.serial /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter ); } }; @@ -6256,8 +25920,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(opt_includeInstance, this); }; @@ -6266,15 +25930,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - contractId: msg.getContractId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + publicKeyHash: msg.getPublicKeyHash_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -6288,23 +25951,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6313,13 +25976,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setPublicKeyHash(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -6336,9 +25995,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6346,30 +26005,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getPublicKeyHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } f = message.getProve(); if (f) { writer.writeBool( - 3, + 2, f ); } @@ -6377,131 +26029,89 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContr /** - * optional bytes identity_id = 1; + * optional bytes public_key_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes public_key_hash = 1; + * This is a type-conversion wrapper around `getPublicKeyHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getPublicKeyHash())); }; /** - * optional bytes identity_id = 1; + * optional bytes public_key_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getPublicKeyHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getPublicKeyHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setPublicKeyHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bytes contract_id = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes contract_id = 2; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; - - -/** - * optional bool prove = 3; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityContractNonceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} + * optional GetIdentityByPublicKeyHashRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.GetIdentityContractNonceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6510,7 +26120,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.clearV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6524,21 +26134,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceRequest.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0])); }; @@ -6556,8 +26166,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject(opt_includeInstance, this); }; @@ -6566,13 +26176,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.toObject = f * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6586,23 +26196,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.toObject = function(in /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6610,8 +26220,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6627,9 +26237,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.deserializeBinaryFromR * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6637,24 +26247,50 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.serializeBin /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -6670,8 +26306,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(opt_includeInstance, this); }; @@ -6680,14 +26316,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identity: msg.getIdentity_asB64(), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -6701,23 +26338,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6726,11 +26363,17 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentity(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -6745,9 +26388,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6755,113 +26398,196 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + if (f != null) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes id = 1; + * optional bytes identity = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes identity = 1; + * This is a type-conversion wrapper around `getIdentity()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getIdentity())); }; /** - * optional bytes id = 1; + * optional bytes identity = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getIdentity()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getIdentity())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setIdentity = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); }; /** - * optional bool prove = 2; + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearIdentity = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasIdentity = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetIdentityBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.GetIdentityBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityByPublicKeyHashResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -6870,7 +26596,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.clearV0 = fu * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -6884,21 +26610,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceRequest.prototype.hasV0 = func * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0])); }; @@ -6916,8 +26642,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject(opt_includeInstance, this); }; @@ -6926,13 +26652,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -6946,23 +26672,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -6970,8 +26696,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -6987,9 +26713,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -6997,18 +26723,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter ); } }; @@ -7030,8 +26756,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(opt_includeInstance, this); }; @@ -7040,13 +26766,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), + stateTransitionHash: msg.getStateTransitionHash_asB64(), prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; @@ -7061,23 +26787,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7086,7 +26812,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setStateTransitionHash(value); break; case 2: var value = /** @type {boolean} */ (reader.readBool()); @@ -7105,9 +26831,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7115,13 +26841,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getStateTransitionHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, @@ -7139,43 +26865,43 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity /** - * optional bytes id = 1; + * optional bytes state_transition_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes state_transition_hash = 1; + * This is a type-conversion wrapper around `getStateTransitionHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getStateTransitionHash())); }; /** - * optional bytes id = 1; + * optional bytes state_transition_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getStateTransitionHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getStateTransitionHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setStateTransitionHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -7184,44 +26910,44 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentity * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetIdentityBalanceAndRevisionRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} + * optional WaitForStateTransitionResultRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0, 1)); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.GetIdentityBalanceAndRevisionRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7230,7 +26956,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7244,21 +26970,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionRequest.prototype.h * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0])); }; @@ -7276,8 +27002,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject(opt_includeInstance, this); }; @@ -7286,13 +27012,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7306,23 +27032,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7330,8 +27056,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7347,9 +27073,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7357,18 +27083,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter ); } }; @@ -7383,22 +27109,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.serializeBinaryToWriter = fu * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase = { RESULT_NOT_SET: 0, - IDENTITY: 1, + ERROR: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0])); }; @@ -7416,8 +27142,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(opt_includeInstance, this); }; @@ -7426,13 +27152,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), + error: (f = msg.getError()) && proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -7448,23 +27174,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; + return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7472,8 +27198,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + var value = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader); + msg.setError(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -7498,9 +27225,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7508,17 +27235,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); + f = message.getError(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter ); } f = message.getProof(); @@ -7536,58 +27264,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.serial f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); - } -}; - - -/** - * optional bytes identity = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); + } }; /** - * optional bytes identity = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` - * @return {!Uint8Array} + * optional StateTransitionBroadcastError error = 1; + * @return {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getIdentity_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getError = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError, 1)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); + * @param {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setError = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearError = function() { + return this.setError(undefined); }; @@ -7595,7 +27300,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasIdentity = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasError = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7604,7 +27309,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -7612,18 +27317,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -7632,7 +27337,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -7641,7 +27346,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -7649,18 +27354,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -7669,35 +27374,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.protot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} + * optional WaitForStateTransitionResultResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0, 1)); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityResponse.GetIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -7706,7 +27411,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -7720,21 +27425,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityResponse.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0])); }; @@ -7752,8 +27457,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject(opt_includeInstance, this); }; @@ -7762,13 +27467,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -7782,23 +27487,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7806,8 +27511,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -7823,9 +27528,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7833,50 +27538,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_NONCE: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -7892,8 +27571,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(opt_includeInstance, this); }; @@ -7902,15 +27581,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + height: jspb.Message.getFieldWithDefault(msg, 1, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -7924,23 +27602,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -7948,18 +27626,12 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityNonce(value); + var value = /** @type {number} */ (reader.readInt32()); + msg.setHeight(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -7974,9 +27646,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -7984,99 +27656,90 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getHeight(); + if (f !== 0) { + writer.writeInt32( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getProve(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional uint64 identity_nonce = 1; + * optional int32 height = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getIdentityNonce = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getHeight = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setIdentityNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setHeight = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * optional bool prove = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearIdentityNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasIdentityNonce = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional GetConsensusParamsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -8084,110 +27747,340 @@ proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject = function(includeInstance, msg) { + var f, obj = { + maxBytes: jspb.Message.getFieldWithDefault(msg, 1, ""), + maxGas: jspb.Message.getFieldWithDefault(msg, 2, ""), + timeIotaMs: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxBytes(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxGas(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setTimeIotaMs(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMaxBytes(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getMaxGas(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getTimeIotaMs(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } }; /** - * Returns whether this field is set. - * @return {boolean} + * optional string max_bytes = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxBytes = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional GetIdentityNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxBytes = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.GetIdentityNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.oneofGroups_[0], value); + * optional string max_gas = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxGas = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxGas = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional string time_iota_ms = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityNonceResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getTimeIotaMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setTimeIotaMs = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0])); -}; + @@ -8204,8 +28097,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(opt_includeInstance, this); }; @@ -8214,13 +28107,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(includeInstance, f) + maxAgeNumBlocks: jspb.Message.getFieldWithDefault(msg, 1, ""), + maxAgeDuration: jspb.Message.getFieldWithDefault(msg, 2, ""), + maxBytes: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -8234,23 +28129,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8258,9 +28153,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {string} */ (reader.readString()); + msg.setMaxAgeNumBlocks(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxAgeDuration(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setMaxBytes(value); break; default: reader.skipField(); @@ -8275,9 +28177,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8285,52 +28187,93 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getMaxAgeNumBlocks(); + if (f.length > 0) { + writer.writeString( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter + f + ); + } + f = message.getMaxAgeDuration(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getMaxBytes(); + if (f.length > 0) { + writer.writeString( + 3, + f ); } }; +/** + * optional string max_age_num_blocks = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeNumBlocks = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeNumBlocks = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional string max_age_duration = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeDuration = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + /** - * @enum {number} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY_CONTRACT_NONCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeDuration = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} + * optional string max_bytes = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxBytes = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + */ +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxBytes = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -8344,8 +28287,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(opt_includeInstance, this); }; @@ -8354,15 +28297,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - identityContractNonce: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + block: (f = msg.getBlock()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(includeInstance, f), + evidence: (f = msg.getEvidence()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(includeInstance, f) }; if (includeInstance) { @@ -8376,23 +28318,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; + return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8400,18 +28342,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setIdentityContractNonce(value); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader); + msg.setBlock(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader); + msg.setEvidence(value); break; default: reader.skipField(); @@ -8426,9 +28364,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8436,99 +28374,56 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( - 1, - f - ); - } - f = message.getProof(); + f = message.getBlock(); if (f != null) { writer.writeMessage( - 2, + 1, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = message.getEvidence(); if (f != null) { writer.writeMessage( - 3, + 2, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter ); } }; /** - * optional uint64 identity_contract_nonce = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getIdentityContractNonce = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setIdentityContractNonce = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearIdentityContractNonce = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasIdentityContractNonce = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional ConsensusParamsBlock block = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getBlock = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setBlock = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearBlock = function() { + return this.setBlock(undefined); }; @@ -8536,36 +28431,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasBlock = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional ConsensusParamsEvidence evidence = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getEvidence = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setEvidence = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearEvidence = function() { + return this.setEvidence(undefined); }; @@ -8573,35 +28468,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityCont * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasEvidence = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional GetIdentityContractNonceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} + * optional GetConsensusParamsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.GetIdentityContractNonceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -8610,7 +28505,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -8624,21 +28519,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityContractNonceResponse.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0])); }; @@ -8656,8 +28551,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject(opt_includeInstance, this); }; @@ -8666,13 +28561,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -8686,23 +28581,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8710,8 +28605,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -8726,63 +28621,37 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.deserializeBinaryFrom /** * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter - ); - } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter + ); + } }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -8796,8 +28665,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(opt_includeInstance, this); }; @@ -8806,15 +28675,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) }; if (includeInstance) { @@ -8828,23 +28695,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -8852,18 +28719,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -8878,9 +28735,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -8888,172 +28745,64 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( + f = message.getProve(); + if (f) { + writer.writeBool( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - -/** - * optional uint64 balance = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasBalance = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); }; /** - * Returns whether this field is set. + * optional bool prove = 1; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; /** - * optional GetIdentityBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} + * optional GetProtocolVersionUpgradeStateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.GetIdentityBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -9062,7 +28811,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.clearV0 = f * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9076,21 +28825,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceResponse.prototype.hasV0 = fun * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0])); }; @@ -9108,8 +28857,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject(opt_includeInstance, this); }; @@ -9118,13 +28867,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9138,23 +28887,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9162,8 +28911,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -9179,9 +28928,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9189,18 +28938,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter ); } }; @@ -9215,22 +28964,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.serializeB * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase = { RESULT_NOT_SET: 0, - BALANCE_AND_REVISION: 1, + VERSIONS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0])); }; @@ -9248,8 +28997,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(opt_includeInstance, this); }; @@ -9258,13 +29007,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - balanceAndRevision: (f = msg.getBalanceAndRevision()) && proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(includeInstance, f), + versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -9280,23 +29029,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9304,9 +29053,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader); - msg.setBalanceAndRevision(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader); + msg.setVersions(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -9331,9 +29080,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9341,18 +29090,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalanceAndRevision(); + f = message.getVersions(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter ); } f = message.getProof(); @@ -9375,6 +29124,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -9390,8 +29146,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(opt_includeInstance, this); }; @@ -9400,14 +29156,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - revision: jspb.Message.getFieldWithDefault(msg, 2, 0) + versionsList: jspb.Message.toObjectList(msg.getVersionsList(), + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject, includeInstance) }; if (includeInstance) { @@ -9421,23 +29177,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision; - return proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9445,12 +29201,165 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader); + msg.addVersions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVersionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated VersionEntry versions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.getVersionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.setVersionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.addVersions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.clearVersionsList = function() { + return this.setVersionsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + versionNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), + voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setVersionNumber(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRevision(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVoteCount(value); break; default: reader.skipField(); @@ -9465,9 +29374,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9475,22 +29384,22 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBalance(); + f = message.getVersionNumber(); if (f !== 0) { - writer.writeUint64( + writer.writeUint32( 1, f ); } - f = message.getRevision(); + f = message.getVoteCount(); if (f !== 0) { - writer.writeUint64( + writer.writeUint32( 2, f ); @@ -9499,66 +29408,66 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** - * optional uint64 balance = 1; + * optional uint32 version_number = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getBalance = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVersionNumber = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setBalance = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVersionNumber = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional uint64 revision = 2; + * optional uint32 vote_count = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.getRevision = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVoteCount = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision.prototype.setRevision = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVoteCount = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional BalanceAndRevision balance_and_revision = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} + * optional Versions versions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getBalanceAndRevision = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getVersions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.BalanceAndRevision|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setBalanceAndRevision = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setVersions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearBalanceAndRevision = function() { - return this.setBalanceAndRevision(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearVersions = function() { + return this.setVersions(undefined); }; @@ -9566,7 +29475,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasBalanceAndRevision = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasVersions = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9575,7 +29484,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -9583,18 +29492,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -9603,7 +29512,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -9612,7 +29521,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -9620,18 +29529,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -9640,35 +29549,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentit * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityBalanceAndRevisionResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} + * optional GetProtocolVersionUpgradeStateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.GetIdentityBalanceAndRevisionResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -9677,7 +29586,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -9691,23 +29600,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityBalanceAndRevisionResponse.prototype. * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_ = [[1,2,3]]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase = { - REQUEST_NOT_SET: 0, - ALL_KEYS: 1, - SPECIFIC_KEYS: 2, - SEARCH_KEY: 3 +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getRequestCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.KeyRequestType.RequestCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0])); }; @@ -9725,8 +29632,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject(opt_includeInstance, this); }; @@ -9735,15 +29642,13 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.toObject = function(opt * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { - allKeys: (f = msg.getAllKeys()) && proto.org.dash.platform.dapi.v0.AllKeys.toObject(includeInstance, f), - specificKeys: (f = msg.getSpecificKeys()) && proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(includeInstance, f), - searchKey: (f = msg.getSearchKey()) && proto.org.dash.platform.dapi.v0.SearchKey.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -9757,23 +29662,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.toObject = function(includeInstan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.KeyRequestType; - return proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -9781,19 +29686,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.AllKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader); - msg.setAllKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.SpecificKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader); - msg.setSpecificKeys(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.SearchKey; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader); - msg.setSearchKey(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -9808,9 +29703,9 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader = fun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -9818,150 +29713,23 @@ proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.serializeBinary = funct /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.KeyRequestType} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getAllKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter - ); - } - f = message.getSpecificKeys(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter - ); - } - f = message.getSearchKey(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter ); } }; -/** - * optional AllKeys all_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.AllKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getAllKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.AllKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.AllKeys, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.AllKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setAllKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearAllKeys = function() { - return this.setAllKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasAllKeys = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional SpecificKeys specific_keys = 2; - * @return {?proto.org.dash.platform.dapi.v0.SpecificKeys} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSpecificKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SpecificKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SpecificKeys, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SpecificKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSpecificKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSpecificKeys = function() { - return this.setSpecificKeys(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSpecificKeys = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional SearchKey search_key = 3; - * @return {?proto.org.dash.platform.dapi.v0.SearchKey} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.getSearchKey = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.SearchKey} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.SearchKey, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.SearchKey|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this -*/ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.setSearchKey = function(value) { - return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.KeyRequestType.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.KeyRequestType} returns this - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.clearSearchKey = function() { - return this.setSearchKey(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.KeyRequestType.prototype.hasSearchKey = function() { - return jspb.Message.getField(this, 3) != null; -}; - - @@ -9978,8 +29746,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.AllKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(opt_includeInstance, this); }; @@ -9988,13 +29756,15 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.toObject = function(opt_includ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - + startProTxHash: msg.getStartProTxHash_asB64(), + count: jspb.Message.getFieldWithDefault(msg, 2, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -10008,29 +29778,41 @@ proto.org.dash.platform.dapi.v0.AllKeys.toObject = function(includeInstance, msg /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.AllKeys; - return proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.AllKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartProTxHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; default: reader.skipField(); break; @@ -10044,9 +29826,9 @@ proto.org.dash.platform.dapi.v0.AllKeys.deserializeBinaryFromReader = function(m * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10054,176 +29836,179 @@ proto.org.dash.platform.dapi.v0.AllKeys.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.AllKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.AllKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getStartProTxHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCount(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; +/** + * optional bytes start_pro_tx_hash = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bytes start_pro_tx_hash = 1; + * This is a type-conversion wrapper around `getStartProTxHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartProTxHash())); +}; +/** + * optional bytes start_pro_tx_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartProTxHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartProTxHash())); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SpecificKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setStartProTxHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional uint32 count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.toObject = function(includeInstance, msg) { - var f, obj = { - keyIdsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f - }; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SpecificKeys; - return proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); - for (var i = 0; i < values.length; i++) { - msg.addKeyIds(values[i]); - } - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional GetProtocolVersionUpgradeVoteStatusRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0], value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SpecificKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this */ -proto.org.dash.platform.dapi.v0.SpecificKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKeyIdsList(); - if (f.length > 0) { - writer.writePackedUint32( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * repeated uint32 key_ids = 1; - * @return {!Array<number>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.getKeyIdsList = function() { - return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * @param {!Array<number>} value - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.setKeyIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_ = [[1]]; /** - * @param {number} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.addKeyIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.SpecificKeys} returns this + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.SpecificKeys.prototype.clearKeyIdsList = function() { - return this.setKeyIdsList([]); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -10237,8 +30022,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SearchKey.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject(opt_includeInstance, this); }; @@ -10247,13 +30032,13 @@ proto.org.dash.platform.dapi.v0.SearchKey.prototype.toObject = function(opt_incl * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject = function(includeInstance, msg) { var f, obj = { - purposeMapMap: (f = msg.getPurposeMapMap()) ? f.toObject(includeInstance, proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject) : [] + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -10267,23 +30052,23 @@ proto.org.dash.platform.dapi.v0.SearchKey.toObject = function(includeInstance, m /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SearchKey; - return proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} */ -proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10291,10 +30076,9 @@ proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getPurposeMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader, 0, new proto.org.dash.platform.dapi.v0.SecurityLevelMap()); - }); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -10309,9 +30093,9 @@ proto.org.dash.platform.dapi.v0.SearchKey.deserializeBinaryFromReader = function * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10319,41 +30103,49 @@ proto.org.dash.platform.dapi.v0.SearchKey.prototype.serializeBinary = function() /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SearchKey} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SearchKey.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPurposeMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeMessage, proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter); + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter + ); } }; + /** - * map<uint32, SecurityLevelMap> purpose_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.getPurposeMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap>} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - proto.org.dash.platform.dapi.v0.SecurityLevelMap)); -}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_ = [[1,2]]; /** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SearchKey} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.SearchKey.prototype.clearPurposeMapMap = function() { - this.getPurposeMapMap().clear(); - return this;}; - +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VERSIONS: 1, + PROOF: 2 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0])); +}; @@ -10370,8 +30162,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(opt_includeInstance, this); }; @@ -10380,13 +30172,15 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - securityLevelMapMap: (f = msg.getSecurityLevelMapMap()) ? f.toObject(includeInstance, undefined) : [] + versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -10400,23 +30194,23 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.SecurityLevelMap; - return proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10424,10 +30218,19 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = msg.getSecurityLevelMapMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readUint32, jspb.BinaryReader.prototype.readEnum, null, 0, 0); - }); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader); + msg.setVersions(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -10442,9 +30245,9 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10452,74 +30255,46 @@ proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSecurityLevelMapMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(1, writer, jspb.BinaryWriter.prototype.writeUint32, jspb.BinaryWriter.prototype.writeEnum); + f = message.getVersions(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); } }; -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType = { - CURRENT_KEY_OF_KIND_REQUEST: 0, - ALL_KEYS_OF_KIND_REQUEST: 1 -}; - -/** - * map<uint32, KeyKindRequestType> security_level_map = 1; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.getSecurityLevelMapMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map<number,!proto.org.dash.platform.dapi.v0.SecurityLevelMap.KeyKindRequestType>} */ ( - jspb.Message.getMapField(this, 1, opt_noLazyCreate, - null)); -}; - - -/** - * Clears values from the map. The map will be non-null. - * @return {!proto.org.dash.platform.dapi.v0.SecurityLevelMap} returns this - */ -proto.org.dash.platform.dapi.v0.SecurityLevelMap.prototype.clearSecurityLevelMapMap = function() { - this.getSecurityLevelMapMap().clear(); - return this;}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.repeatedFields_ = [1]; @@ -10536,8 +30311,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(opt_includeInstance, this); }; @@ -10546,13 +30321,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(includeInstance, f) + versionSignalsList: jspb.Message.toObjectList(msg.getVersionSignalsList(), + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject, includeInstance) }; if (includeInstance) { @@ -10566,23 +30342,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10590,9 +30366,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader); + msg.addVersionSignals(value); break; default: reader.skipField(); @@ -10607,9 +30383,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10617,23 +30393,61 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getVersionSignalsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter ); } }; +/** + * repeated VersionSignal version_signals = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.getVersionSignalsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this +*/ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.setVersionSignalsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.addVersionSignals = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.clearVersionSignalsList = function() { + return this.setVersionSignalsList([]); +}; + + @@ -10650,8 +30464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject(opt_includeInstance, this); }; @@ -10660,17 +30474,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: (f = msg.getRequestType()) && proto.org.dash.platform.dapi.v0.KeyRequestType.toObject(includeInstance, f), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + proTxHash: msg.getProTxHash_asB64(), + version: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -10684,23 +30495,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; + return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -10709,26 +30520,11 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setProTxHash(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.KeyRequestType; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.KeyRequestType.deserializeBinaryFromReader); - msg.setRequestType(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 4: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVersion(value); break; default: reader.skipField(); @@ -10743,9 +30539,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -10753,47 +30549,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getProTxHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f != null) { - writer.writeMessage( + f = message.getVersion(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.KeyRequestType.serializeBinaryToWriter - ); - } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 4, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 5, f ); } @@ -10801,72 +30573,90 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. /** - * optional bytes identity_id = 1; + * optional bytes pro_tx_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getProTxHash())); }; /** - * optional bytes identity_id = 1; + * optional bytes pro_tx_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getProTxHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getProTxHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setProTxHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional KeyRequestType request_type = 2; - * @return {?proto.org.dash.platform.dapi.v0.KeyRequestType} + * optional uint32 version = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getRequestType = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.KeyRequestType} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.KeyRequestType, 2)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.KeyRequestType|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setVersion = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional VersionSignals versions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + */ +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getVersions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setRequestType = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setVersions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearRequestType = function() { - return this.setRequestType(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearVersions = function() { + return this.setVersions(undefined); }; @@ -10874,36 +30664,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasRequestType = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasVersions = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional google.protobuf.UInt32Value limit = 3; - * @return {?proto.google.protobuf.UInt32Value} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -10911,36 +30701,36 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional google.protobuf.UInt32Value offset = 4; - * @return {?proto.google.protobuf.UInt32Value} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 4)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -10948,53 +30738,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional bool prove = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentityKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} + * optional GetProtocolVersionUpgradeVoteStatusResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.GetIdentityKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -11003,7 +30775,7 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -11017,21 +30789,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysRequest.prototype.hasV0 = functio * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0])); }; @@ -11049,8 +30821,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject(opt_includeInstance, this); }; @@ -11059,13 +30831,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -11079,23 +30851,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11103,8 +30875,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -11120,9 +30892,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11130,50 +30902,24 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - KEYS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -11189,8 +30935,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(opt_includeInstance, this); }; @@ -11199,15 +30945,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - keys: (f = msg.getKeys()) && proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startEpoch: (f = msg.getStartEpoch()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 2, 0), + ascending: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -11221,23 +30968,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11245,19 +30992,21 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader); - msg.setKeys(value); + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setStartEpoch(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAscending(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -11272,9 +31021,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11282,392 +31031,486 @@ proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getKeys(); + f = message.getStartEpoch(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getCount(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( + f = message.getAscending(); + if (f) { + writer.writeBool( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 4, + f ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional google.protobuf.UInt32Value start_epoch = 1; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getStartEpoch = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 1)); +}; + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setStartEpoch = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.clearStartEpoch = function() { + return this.setStartEpoch(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.toObject = function(includeInstance, msg) { - var f, obj = { - keysBytesList: msg.getKeysBytesList_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.hasStartEpoch = function() { + return jspb.Message.getField(this, 1) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * optional uint32 count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys; - return proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeysBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional bool ascending = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getKeysBytesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * repeated bytes keys_bytes = 1; - * @return {!Array<string>} + * optional bool prove = 4; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * repeated bytes keys_bytes = 1; - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<string>} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysBytesList())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * repeated bytes keys_bytes = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<!Uint8Array>} + * optional GetEpochsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.getKeysBytesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysBytesList())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys.prototype.clearKeysBytesList = function() { - return this.setKeysBytesList([]); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0])); }; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Keys keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject(opt_includeInstance, this); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.Keys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearKeys = function() { - return this.setKeys(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.oneofGroups_[0], value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter + ); + } }; + /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_ = [[1,2]]; /** - * Returns whether this field is set. - * @return {boolean} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + EPOCHS: 1, + PROOF: 2 }; - /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0])); }; -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + epochs: (f = msg.getEpochs()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentityKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.GetIdentityKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader); + msg.setEpochs(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityKeysResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getEpochs(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.repeatedFields_ = [1]; @@ -11684,8 +31527,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(opt_includeInstance, this); }; @@ -11694,13 +31537,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(includeInstance, f) + epochInfosList: jspb.Message.toObjectList(msg.getEpochInfosList(), + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject, includeInstance) }; if (includeInstance) { @@ -11714,23 +31558,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11738,9 +31582,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader); + msg.addEpochInfos(value); break; default: reader.skipField(); @@ -11755,9 +31599,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11765,30 +31609,61 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getEpochInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter ); } }; +/** + * repeated EpochInfo epoch_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.getEpochInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, 1)); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.setEpochInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.repeatedFields_ = [1,4]; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.addEpochInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this + */ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.clearEpochInfosList = function() { + return this.setEpochInfosList([]); +}; + + @@ -11805,8 +31680,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject(opt_includeInstance, this); }; @@ -11815,17 +31690,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject = function(includeInstance, msg) { var f, obj = { - identitiesIdsList: msg.getIdentitiesIdsList_asB64(), - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 3, ""), - purposesList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f, - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + number: jspb.Message.getFieldWithDefault(msg, 1, 0), + firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, "0"), + firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), + startTime: jspb.Message.getFieldWithDefault(msg, 4, "0"), + feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), + protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -11839,23 +31715,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; + return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -11863,26 +31739,28 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIdentitiesIds(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setNumber(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFirstBlockHeight(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setFirstCoreBlockHeight(value); break; case 4: - var values = /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); - for (var i = 0; i < values.length; i++) { - msg.addPurposes(values[i]); - } + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartTime(value); break; case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readDouble()); + msg.setFeeMultiplier(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setProtocolVersion(value); break; default: reader.skipField(); @@ -11897,9 +31775,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -11907,269 +31785,227 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesCo /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = message.getNumber(); + if (f !== 0) { + writer.writeUint32( 1, f ); } - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getFirstBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 2, f ); } - f = /** @type {string} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeString( + f = message.getFirstCoreBlockHeight(); + if (f !== 0) { + writer.writeUint32( 3, f ); } - f = message.getPurposesList(); - if (f.length > 0) { - writer.writePackedEnum( + f = message.getStartTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 4, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getFeeMultiplier(); + if (f !== 0.0) { + writer.writeDouble( 5, f ); } + f = message.getProtocolVersion(); + if (f !== 0) { + writer.writeUint32( + 6, + f + ); + } }; /** - * repeated bytes identities_ids = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes identities_ids = 1; - * This is a type-conversion wrapper around `getIdentitiesIdsList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdentitiesIdsList())); -}; - - -/** - * repeated bytes identities_ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentitiesIdsList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getIdentitiesIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdentitiesIdsList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setIdentitiesIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional uint32 number = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addIdentitiesIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearIdentitiesIdsList = function() { - return this.setIdentitiesIdsList([]); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setNumber = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional bytes contract_id = 2; + * optional uint64 first_block_height = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * optional bytes contract_id = 2; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); }; /** - * optional bytes contract_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * optional uint32 first_core_block_height = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstCoreBlockHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstCoreBlockHeight = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * optional string document_type_name = 3; + * optional uint64 start_time = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getStartTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setStartTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional double fee_multiplier = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearDocumentTypeName = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFeeMultiplier = function() { + return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.hasDocumentTypeName = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFeeMultiplier = function(value) { + return jspb.Message.setProto3FloatField(this, 5, value); }; /** - * repeated KeyPurpose purposes = 4; - * @return {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} + * optional uint32 protocol_version = 6; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getPurposesList = function() { - return /** @type {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.KeyPurpose>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setPurposesList = function(value) { - return jspb.Message.setField(this, 4, value || []); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * optional EpochInfos epochs = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.addPurposes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getEpochs = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos, 1)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.clearPurposesList = function() { - return this.setPurposesList([]); + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setEpochs = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); }; /** - * optional bool prove = 5; - * @return {boolean} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearEpochs = function() { + return this.setEpochs(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasEpochs = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional GetIdentitiesContractKeysRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.GetIdentitiesContractKeysRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -12177,147 +32013,82 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0])); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} + * optional GetEpochsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -12330,22 +32101,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.serializeBinar * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES_KEYS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0])); }; @@ -12363,8 +32133,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject(opt_includeInstance, this); }; @@ -12373,15 +32143,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function(includeInstance, msg) { var f, obj = { - identitiesKeys: (f = msg.getIdentitiesKeys()) && proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -12395,23 +32163,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12419,19 +32187,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader); - msg.setIdentitiesKeys(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -12446,9 +32204,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12456,34 +32214,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesKeys(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter ); } }; @@ -12495,7 +32237,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.repeatedFields_ = [4,5]; @@ -12512,8 +32254,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(opt_includeInstance, this); }; @@ -12522,14 +32264,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - purpose: jspb.Message.getFieldWithDefault(msg, 1, 0), - keysBytesList: msg.getKeysBytesList_asB64() + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + startIndexValuesList: msg.getStartIndexValuesList_asB64(), + endIndexValuesList: msg.getEndIndexValuesList_asB64(), + startAtValueInfo: (f = msg.getStartAtValueInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 7, 0), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -12543,170 +32292,163 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (reader.readEnum()); - msg.setPurpose(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeysBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPurpose(); - if (f !== 0.0) { - writer.writeEnum( - 1, - f - ); - } - f = message.getKeysBytesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f - ); - } -}; - - -/** - * optional KeyPurpose purpose = 1; - * @return {!proto.org.dash.platform.dapi.v0.KeyPurpose} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getPurpose = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.KeyPurpose} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.KeyPurpose} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setPurpose = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); -}; - - -/** - * repeated bytes keys_bytes = 2; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); -}; - - -/** - * repeated bytes keys_bytes = 2; - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysBytesList())); -}; - - -/** - * repeated bytes keys_bytes = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysBytesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.getKeysBytesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysBytesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.setKeysBytesList = function(value) { - return jspb.Message.setField(this, 2, value || []); + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addStartIndexValues(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addEndIndexValues(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader); + msg.setStartAtValueInfo(value); + break; + case 7: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.addKeysBytes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.prototype.clearKeysBytesList = function() { - return this.setKeysBytesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getStartIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f + ); + } + f = message.getEndIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 5, + f + ); + } + f = message.getStartAtValueInfo(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeUint32( + 7, + f + ); + } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f + ); + } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.repeatedFields_ = [2]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -12722,8 +32464,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(opt_includeInstance, this); }; @@ -12732,15 +32474,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - keysList: jspb.Message.toObjectList(msg.getKeysList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.toObject, includeInstance) + startValue: msg.getStartValue_asB64(), + startValueIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -12754,23 +32495,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -12779,12 +32520,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setStartValue(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.deserializeBinaryFromReader); - msg.addKeys(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartValueIncluded(value); break; default: reader.skipField(); @@ -12799,9 +32539,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -12809,295 +32549,314 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getStartValue_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getKeysList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getStartValueIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity_id = 1; + * optional bytes start_value = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes start_value = 1; + * This is a type-conversion wrapper around `getStartValue()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getStartValue())); }; /** - * optional bytes identity_id = 1; + * optional bytes start_value = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getStartValue()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getStartValue())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValue = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * repeated PurposeKeys keys = 2; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} + * optional bool start_value_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.getKeysList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValueIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.setKeysList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValueIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.addKeys = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.PurposeKeys, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} returns this + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.prototype.clearKeysList = function() { - return this.setKeysList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional string document_type_name = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional string index_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.toObject = function(includeInstance, msg) { - var f, obj = { - entriesList: jspb.Message.toObjectList(msg.getEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * repeated bytes start_index_values = 4; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * repeated bytes start_index_values = 4; + * This is a type-conversion wrapper around `getStartIndexValuesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys; - return proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getStartIndexValuesList())); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * repeated bytes start_index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartIndexValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.deserializeBinaryFromReader); - msg.addEntries(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getStartIndexValuesList())); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addStartIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** - * repeated IdentityKeys entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.getEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartIndexValuesList = function() { + return this.setStartIndexValuesList([]); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.setEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * repeated bytes end_index_values = 5; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys=} opt_value + * repeated bytes end_index_values = 5; + * This is a type-conversion wrapper around `getEndIndexValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getEndIndexValuesList())); +}; + + +/** + * repeated bytes end_index_values = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEndIndexValuesList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getEndIndexValuesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setEndIndexValuesList = function(value) { + return jspb.Message.setField(this, 5, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.addEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentityKeys, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addEndIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 5, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys.prototype.clearEntriesList = function() { - return this.setEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearEndIndexValuesList = function() { + return this.setEndIndexValuesList([]); }; /** - * optional IdentitiesKeys identities_keys = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} + * optional StartAtValueInfo start_at_value_info = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getIdentitiesKeys = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartAtValueInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo, 6)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.IdentitiesKeys|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setIdentitiesKeys = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartAtValueInfo = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearIdentitiesKeys = function() { - return this.setIdentitiesKeys(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartAtValueInfo = function() { + return this.setStartAtValueInfo(undefined); }; @@ -13105,36 +32864,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasIdentitiesKeys = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasStartAtValueInfo = function() { + return jspb.Message.getField(this, 6) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional uint32 count = 7; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 7, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 7, undefined); }; @@ -13142,72 +32900,71 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesC * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bool order_ascending = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} returns this + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); }; /** - * optional GetIdentitiesContractKeysResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} + * optional GetContestedResourcesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.GetIdentitiesContractKeysResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -13216,7 +32973,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.clea * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -13230,21 +32987,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesContractKeysResponse.prototype.hasV * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0])); }; @@ -13262,8 +33019,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject(opt_includeInstance, this); }; @@ -13272,13 +33029,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -13292,23 +33049,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13316,8 +33073,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -13333,9 +33090,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13343,18 +33100,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter ); } }; @@ -13362,11 +33119,30 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.seria /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CONTESTED_RESOURCE_VALUES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0])); +}; @@ -13383,8 +33159,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(opt_includeInstance, this); }; @@ -13393,15 +33169,15 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + contestedResourceValues: (f = msg.getContestedResourceValues()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -13415,23 +33191,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13439,16 +33215,19 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader); + msg.setContestedResourceValues(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -13463,9 +33242,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13473,175 +33252,354 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEv /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getContestedResourceValues(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter ); } - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; + /** - * optional uint32 epoch = 1; - * @return {number} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject = function(includeInstance, msg) { + var f, obj = { + contestedResourceValuesList: msg.getContestedResourceValuesList_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 1, undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; + return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addContestedResourceValues(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated bytes ids = 2; + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContestedResourceValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } +}; + + +/** + * repeated bytes contested_resource_values = 1; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes ids = 2; - * This is a type-conversion wrapper around `getIdsList()` + * repeated bytes contested_resource_values = 1; + * This is a type-conversion wrapper around `getContestedResourceValuesList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); + this.getContestedResourceValuesList())); }; /** - * repeated bytes ids = 2; + * repeated bytes contested_resource_values = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` + * This is a type-conversion wrapper around `getContestedResourceValuesList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getIdsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); + this.getContestedResourceValuesList())); }; /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.setContestedResourceValuesList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.addContestedResourceValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.clearContestedResourceValuesList = function() { + return this.setContestedResourceValuesList([]); }; /** - * optional bool prove = 3; + * optional ContestedResourceValues contested_resource_values = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getContestedResourceValues = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setContestedResourceValues = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearContestedResourceValues = function() { + return this.setContestedResourceValues(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasContestedResourceValues = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} returns this + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional GetEvonodesProposedEpochBlocksByIdsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.GetEvonodesProposedEpochBlocksByIdsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetContestedResourcesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -13650,7 +33608,7 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -13664,21 +33622,21 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByIdsRequest.proto * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0])); }; @@ -13696,8 +33654,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject(opt_includeInstance, this); }; @@ -13706,13 +33664,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -13726,23 +33684,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13750,8 +33708,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -13767,9 +33725,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13777,50 +33735,24 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - EVONODES_PROPOSED_BLOCK_COUNTS_INFO: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -13836,8 +33768,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(opt_includeInstance, this); }; @@ -13846,15 +33778,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - evonodesProposedBlockCountsInfo: (f = msg.getEvonodesProposedBlockCountsInfo()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startTimeInfo: (f = msg.getStartTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(includeInstance, f), + endTimeInfo: (f = msg.getEndTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(includeInstance, f), + limit: jspb.Message.getFieldWithDefault(msg, 3, 0), + offset: jspb.Message.getFieldWithDefault(msg, 4, 0), + ascending: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -13868,23 +33803,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -13892,19 +33827,30 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader); - msg.setEvonodesProposedBlockCountsInfo(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader); + msg.setStartTimeInfo(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader); + msg.setEndTimeInfo(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setLimit(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setOffset(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAscending(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -13919,9 +33865,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -13929,34 +33875,54 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEvonodesProposedBlockCountsInfo(); + f = message.getStartTimeInfo(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter ); } - f = message.getProof(); + f = message.getEndTimeInfo(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = /** @type {number} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeUint32( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeUint32( + 4, + f + ); + } + f = message.getAscending(); + if (f) { + writer.writeBool( + 5, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f ); } }; @@ -13978,8 +33944,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(opt_includeInstance, this); }; @@ -13988,14 +33954,14 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - count: jspb.Message.getFieldWithDefault(msg, 2, 0) + startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, "0"), + startTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -14009,23 +33975,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14033,12 +33999,12 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setStartTimeMs(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setCount(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartTimeIncluded(value); break; default: reader.skipField(); @@ -14053,9 +34019,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14063,22 +34029,22 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getStartTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, f ); } - f = message.getCount(); - if (f !== 0) { - writer.writeUint64( + f = message.getStartTimeIncluded(); + if (f) { + writer.writeBool( 2, f ); @@ -14087,73 +34053,42 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** - * optional bytes pro_tx_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` + * optional uint64 start_time_ms = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional uint64 count = 2; - * @return {number} + * optional bool start_time_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -14169,8 +34104,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(opt_includeInstance, this); }; @@ -14179,14 +34114,14 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject = function(includeInstance, msg) { var f, obj = { - evonodesProposedBlockCountsList: jspb.Message.toObjectList(msg.getEvonodesProposedBlockCountsList(), - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.toObject, includeInstance) + endTimeMs: jspb.Message.getFieldWithDefault(msg, 1, "0"), + endTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -14200,23 +34135,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14224,9 +34159,12 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.deserializeBinaryFromReader); - msg.addEvonodesProposedBlockCounts(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setEndTimeMs(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setEndTimeIncluded(value); break; default: reader.skipField(); @@ -14241,9 +34179,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14251,86 +34189,90 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEvonodesProposedBlockCountsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getEndTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks.serializeBinaryToWriter + f + ); + } + f = message.getEndTimeIncluded(); + if (f) { + writer.writeBool( + 2, + f ); } }; /** - * repeated EvonodeProposedBlocks evonodes_proposed_block_counts = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} + * optional uint64 end_time_ms = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.getEvonodesProposedBlockCountsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks>} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.setEvonodesProposedBlockCountsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks} + * optional bool end_time_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.addEvonodesProposedBlockCounts = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodeProposedBlocks, opt_index); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks.prototype.clearEvonodesProposedBlockCountsList = function() { - return this.setEvonodesProposedBlockCountsList([]); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional EvonodesProposedBlocks evonodes_proposed_block_counts_info = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} + * optional StartAtTimeInfo start_time_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getEvonodesProposedBlockCountsInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getStartTimeInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.EvonodesProposedBlocks|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setEvonodesProposedBlockCountsInfo = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setStartTimeInfo = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearEvonodesProposedBlockCountsInfo = function() { - return this.setEvonodesProposedBlockCountsInfo(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearStartTimeInfo = function() { + return this.setStartTimeInfo(undefined); }; @@ -14338,36 +34280,36 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasEvonodesProposedBlockCountsInfo = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasStartTimeInfo = function() { return jspb.Message.getField(this, 1) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional EndAtTimeInfo end_time_info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getEndTimeInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setEndTimeInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearEndTimeInfo = function() { + return this.setEndTimeInfo(undefined); }; @@ -14375,72 +34317,143 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonod * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasEndTimeInfo = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional uint32 limit = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional uint32 offset = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getOffset = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setOffset = function(value) { + return jspb.Message.setField(this, 4, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearOffset = function() { + return jspb.Message.setField(this, 4, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasOffset = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional bool ascending = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); }; /** - * Returns whether this field is set. + * optional bool prove = 6; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); }; /** - * optional GetEvonodesProposedEpochBlocksResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.GetEvonodesProposedEpochBlocksResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + * optional GetVotePollsByEndDateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -14449,7 +34462,7 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -14463,21 +34476,21 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0])); }; @@ -14495,8 +34508,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject(opt_includeInstance, this); }; @@ -14505,13 +34518,13 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -14525,23 +34538,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14549,8 +34562,8 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.des var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -14566,9 +34579,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14576,18 +34589,18 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter ); } }; @@ -14602,22 +34615,22 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.ser * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_ = [[3,4]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase = { - START_NOT_SET: 0, - START_AFTER: 3, - START_AT: 4 +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VOTE_POLLS_BY_TIMESTAMPS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} + * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0])); }; @@ -14635,8 +34648,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(opt_includeInstance, this); }; @@ -14645,17 +34658,15 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epoch: jspb.Message.getFieldWithDefault(msg, 1, 0), - limit: jspb.Message.getFieldWithDefault(msg, 2, 0), - startAfter: msg.getStartAfter_asB64(), - startAt: msg.getStartAt_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + votePollsByTimestamps: (f = msg.getVotePollsByTimestamps()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -14669,23 +34680,23 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0; - return proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -14693,24 +34704,19 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader); + msg.setVotePollsByTimestamps(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAfter(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAt(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -14725,9 +34731,9 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -14735,322 +34741,256 @@ proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getVotePollsByTimestamps(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); + f = message.getProof(); if (f != null) { - writer.writeUint32( + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + f = message.getMetadata(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 3, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeBytes( - 4, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 5, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * optional uint32 epoch = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 1, value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 1, undefined); -}; - /** - * Returns whether this field is set. - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 1) != null; -}; - +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.repeatedFields_ = [2]; -/** - * optional uint32 limit = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject(opt_includeInstance, this); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearLimit = function() { - return jspb.Message.setField(this, 2, undefined); -}; - +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject = function(includeInstance, msg) { + var f, obj = { + timestamp: jspb.Message.getFieldWithDefault(msg, 1, "0"), + serializedVotePollsList: msg.getSerializedVotePollsList_asB64() + }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes start_after = 3; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes start_after = 3; - * This is a type-conversion wrapper around `getStartAfter()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTimestamp(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addSerializedVotePolls(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes start_after = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAfter()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAfter_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAfter = function(value) { - return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestamp(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 1, + f + ); + } + f = message.getSerializedVotePollsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this + * optional uint64 timestamp = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAfter = function() { - return jspb.Message.setOneofField(this, 3, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getTimestamp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAfter = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setTimestamp = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional bytes start_at = 4; - * @return {string} + * repeated bytes serialized_vote_polls = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional bytes start_at = 4; - * This is a type-conversion wrapper around `getStartAt()` - * @return {string} + * repeated bytes serialized_vote_polls = 2; + * This is a type-conversion wrapper around `getSerializedVotePollsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getSerializedVotePollsList())); }; /** - * optional bytes start_at = 4; + * repeated bytes serialized_vote_polls = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 4, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.oneofGroups_[0], undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 4) != null; -}; - - -/** - * optional bool prove = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); -}; - - -/** - * optional GetEvonodesProposedEpochBlocksByRangeRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.GetEvonodesProposedEpochBlocksByRangeRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest} returns this + * This is a type-conversion wrapper around `getSerializedVotePollsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getSerializedVotePollsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetEvonodesProposedEpochBlocksByRangeRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setSerializedVotePollsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.addSerializedVotePolls = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + /** - * @enum {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.clearSerializedVotePollsList = function() { + return this.setSerializedVotePollsList([]); }; + + /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.repeatedFields_ = [1]; @@ -15067,8 +35007,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(opt_includeInstance, this); }; @@ -15077,13 +35017,15 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(includeInstance, f) + votePollsByTimestampsList: jspb.Message.toObjectList(msg.getVotePollsByTimestampsList(), + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject, includeInstance), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -15097,23 +35039,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; + return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15121,9 +35063,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader); + msg.addVotePollsByTimestamps(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); break; default: reader.skipField(); @@ -15138,9 +35084,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15148,257 +35094,221 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getVotePollsByTimestampsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f ); } }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * repeated SerializedVotePollsByTimestamp vote_polls_by_timestamps = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getVotePollsByTimestampsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, 1)); +}; + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setVotePollsByTimestampsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.addVotePollsByTimestamps = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.clearVotePollsByTimestampsList = function() { + return this.setVotePollsByTimestampsList([]); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * optional bool finished_results = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional SerializedVotePollsByTimestamps vote_polls_by_timestamps = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getVotePollsByTimestamps = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps, 1)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setVotePollsByTimestamps = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes ids = 1; - * @return {!Array<string>} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearVotePollsByTimestamps = function() { + return this.setVotePollsByTimestamps(undefined); }; /** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasVotePollsByTimestamps = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<!Uint8Array>} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bool prove = 2; - * @return {boolean} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetIdentitiesBalancesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} + * optional GetVotePollsByEndDateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.GetIdentitiesBalancesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -15407,7 +35317,7 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -15421,21 +35331,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0])); }; @@ -15453,8 +35363,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject(opt_includeInstance, this); }; @@ -15463,13 +35373,13 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -15483,23 +35393,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15507,8 +35417,8 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -15524,9 +35434,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15534,18 +35444,18 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter ); } }; @@ -15553,30 +35463,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.serializeBinaryToW /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITIES_BALANCES: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.repeatedFields_ = [4]; @@ -15593,8 +35484,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(opt_includeInstance, this); }; @@ -15603,15 +35494,21 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identitiesBalances: (f = msg.getIdentitiesBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), + indexValuesList: msg.getIndexValuesList_asB64(), + resultType: jspb.Message.getFieldWithDefault(msg, 5, 0), + allowIncludeLockedAndAbstainingVoteTally: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), + startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 8, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -15625,23 +35522,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15649,19 +35546,41 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader); - msg.setIdentitiesBalances(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readString()); + msg.setIndexName(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIndexValues(value); + break; + case 5: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (reader.readEnum()); + msg.setResultType(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setAllowIncludeLockedAndAbstainingVoteTally(value); + break; + case 7: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); + msg.setStartAtIdentifierInfo(value); + break; + case 8: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -15676,9 +35595,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15686,39 +35605,88 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesBalances(); - if (f != null) { - writer.writeMessage( + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getIndexName(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getIndexValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 4, + f ); } - f = message.getProof(); + f = message.getResultType(); + if (f !== 0.0) { + writer.writeEnum( + 5, + f + ); + } + f = message.getAllowIncludeLockedAndAbstainingVoteTally(); + if (f) { + writer.writeBool( + 6, + f + ); + } + f = message.getStartAtIdentifierInfo(); if (f != null) { writer.writeMessage( - 2, + 7, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter ); } - f = message.getMetadata(); + f = /** @type {number} */ (jspb.Message.getField(message, 8)); if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + writer.writeUint32( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType = { + DOCUMENTS: 0, + VOTE_TALLY: 1, + DOCUMENTS_AND_VOTE_TALLY: 2 +}; + @@ -15735,8 +35703,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); }; @@ -15745,14 +35713,14 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - balance: jspb.Message.getFieldWithDefault(msg, 2, 0) + startIdentifier: msg.getStartIdentifier_asB64(), + startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -15766,23 +35734,23 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -15791,11 +35759,11 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setStartIdentifier(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartIdentifierIncluded(value); break; default: reader.skipField(); @@ -15810,9 +35778,9 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -15820,22 +35788,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getStartIdentifier_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint64( + f = message.getStartIdentifierIncluded(); + if (f) { + writer.writeBool( 2, f ); @@ -15844,268 +35812,265 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan /** - * optional bytes identity_id = 1; + * optional bytes start_identifier = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes start_identifier = 1; + * This is a type-conversion wrapper around `getStartIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getStartIdentifier())); }; /** - * optional bytes identity_id = 1; + * optional bytes start_identifier = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getStartIdentifier()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getStartIdentifier())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setIdentityId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint64 balance = 2; - * @return {number} + * optional bool start_identifier_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.setBalance = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} returns this + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.clearBalance = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.prototype.hasBalance = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.repeatedFields_ = [1]; - +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional string document_type_name = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.toObject = function(includeInstance, msg) { - var f, obj = { - entriesList: jspb.Message.toObjectList(msg.getEntriesList(), - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.toObject, includeInstance) - }; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * optional string index_name = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances; - return proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.deserializeBinaryFromReader); - msg.addEntries(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexName = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * repeated bytes index_values = 4; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * repeated bytes index_values = 4; + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIndexValuesList())); }; /** - * repeated IdentityBalance entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} + * repeated bytes index_values = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIndexValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.getEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIndexValuesList())); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance>} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.setEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexValuesList = function(value) { + return jspb.Message.setField(this, 4, value || []); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance=} opt_value + * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.addEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentityBalance, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.addIndexValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances.prototype.clearEntriesList = function() { - return this.setEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearIndexValuesList = function() { + return this.setIndexValuesList([]); }; /** - * optional IdentitiesBalances identities_balances = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} + * optional ResultType result_type = 5; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getIdentitiesBalances = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getResultType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.IdentitiesBalances|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setResultType = function(value) { + return jspb.Message.setProto3EnumField(this, 5, value); +}; + + +/** + * optional bool allow_include_locked_and_abstaining_vote_tally = 6; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getAllowIncludeLockedAndAbstainingVoteTally = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setAllowIncludeLockedAndAbstainingVoteTally = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional StartAtIdentifierInfo start_at_identifier_info = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getStartAtIdentifierInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo, 7)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setIdentitiesBalances = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setStartAtIdentifierInfo = function(value) { + return jspb.Message.setWrapperField(this, 7, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearIdentitiesBalances = function() { - return this.setIdentitiesBalances(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearStartAtIdentifierInfo = function() { + return this.setStartAtIdentifierInfo(undefined); }; @@ -16113,36 +36078,35 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasIdentitiesBalances = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasStartAtIdentifierInfo = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional uint32 count = 8; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 8, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 8, undefined); }; @@ -16150,82 +36114,202 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalan * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 8) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); +}; + + +/** + * optional GetContestedResourceVoteStateRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentitiesBalancesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.GetIdentitiesBalancesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter + ); + } }; @@ -16238,21 +36322,22 @@ proto.org.dash.platform.dapi.v0.GetIdentitiesBalancesResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CONTESTED_RESOURCE_CONTENDERS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0])); }; @@ -16270,8 +36355,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(opt_includeInstance, this); }; @@ -16280,13 +36365,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(includeInstance, f) + contestedResourceContenders: (f = msg.getContestedResourceContenders()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -16300,23 +36387,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16324,9 +36411,19 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader); + msg.setContestedResourceContenders(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -16341,9 +36438,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16351,31 +36448,40 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getContestedResourceContenders(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.repeatedFields_ = [1,2,3,4]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -16391,8 +36497,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(opt_includeInstance, this); }; @@ -16401,20 +36507,18 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject = function(includeInstance, msg) { var f, obj = { - identitiesList: jspb.Message.toObjectList(msg.getIdentitiesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject, includeInstance), - contractsList: jspb.Message.toObjectList(msg.getContractsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject, includeInstance), - documentsList: jspb.Message.toObjectList(msg.getDocumentsList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject, includeInstance), - votesList: jspb.Message.toObjectList(msg.getVotesList(), - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject, includeInstance) + finishedVoteOutcome: jspb.Message.getFieldWithDefault(msg, 1, 0), + wonByIdentityId: msg.getWonByIdentityId_asB64(), + finishedAtBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, "0"), + finishedAtCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), + finishedAtBlockTimeMs: jspb.Message.getFieldWithDefault(msg, 5, "0"), + finishedAtEpoch: jspb.Message.getFieldWithDefault(msg, 6, 0) }; if (includeInstance) { @@ -16428,23 +36532,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16452,24 +36556,28 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader); - msg.addIdentities(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (reader.readEnum()); + msg.setFinishedVoteOutcome(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader); - msg.addContracts(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setWonByIdentityId(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader); - msg.addDocuments(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFinishedAtBlockHeight(value); break; case 4: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader); - msg.addVotes(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setFinishedAtCoreBlockHeight(value); + break; + case 5: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setFinishedAtBlockTimeMs(value); + break; + case 6: + var value = /** @type {number} */ (reader.readUint32()); + msg.setFinishedAtEpoch(value); break; default: reader.skipField(); @@ -16484,9 +36592,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16494,47 +36602,223 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentitiesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedVoteOutcome(); + if (f !== 0.0) { + writer.writeEnum( 1, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter + f ); } - f = message.getContractsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter + f ); } - f = message.getDocumentsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedAtBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 3, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter + f ); } - f = message.getVotesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getFinishedAtCoreBlockHeight(); + if (f !== 0) { + writer.writeUint32( 4, - f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter + f + ); + } + f = message.getFinishedAtBlockTimeMs(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 5, + f + ); + } + f = message.getFinishedAtEpoch(); + if (f !== 0) { + writer.writeUint32( + 6, + f ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome = { + TOWARDS_IDENTITY: 0, + LOCKED: 1, + NO_PREVIOUS_WINNER: 2 +}; + +/** + * optional FinishedVoteOutcome finished_vote_outcome = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedVoteOutcome = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedVoteOutcome = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * This is a type-conversion wrapper around `getWonByIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getWonByIdentityId())); +}; + + +/** + * optional bytes won_by_identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getWonByIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getWonByIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setWonByIdentityId = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.clearWonByIdentityId = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.hasWonByIdentityId = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional uint64 finished_at_block_height = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 3, value); +}; + + +/** + * optional uint32 finished_at_core_block_height = 4; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtCoreBlockHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtCoreBlockHeight = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional uint64 finished_at_block_time_ms = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockTimeMs = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockTimeMs = function(value) { + return jspb.Message.setProto3StringIntField(this, 5, value); +}; + + +/** + * optional uint32 finished_at_epoch = 6; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtEpoch = function(value) { + return jspb.Message.setProto3IntField(this, 6, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.repeatedFields_ = [1]; @@ -16551,8 +36835,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(opt_includeInstance, this); }; @@ -16561,17 +36845,17 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - documentTypeKeepsHistory: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - documentId: msg.getDocumentId_asB64(), - documentContestedStatus: jspb.Message.getFieldWithDefault(msg, 5, 0) + contendersList: jspb.Message.toObjectList(msg.getContendersList(), + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject, includeInstance), + abstainVoteTally: jspb.Message.getFieldWithDefault(msg, 2, 0), + lockVoteTally: jspb.Message.getFieldWithDefault(msg, 3, 0), + finishedVoteInfo: (f = msg.getFinishedVoteInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(includeInstance, f) }; if (includeInstance) { @@ -16585,23 +36869,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16609,24 +36893,22 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader); + msg.addContenders(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setAbstainVoteTally(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setDocumentTypeKeepsHistory(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setLockVoteTally(value); break; case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocumentId(value); - break; - case 5: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (reader.readEnum()); - msg.setDocumentContestedStatus(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader); + msg.setFinishedVoteInfo(value); break; default: reader.skipField(); @@ -16641,9 +36923,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16651,194 +36933,189 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getContendersList(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter ); } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( 2, f ); } - f = message.getDocumentTypeKeepsHistory(); - if (f) { - writer.writeBool( + f = /** @type {number} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeUint32( 3, f ); } - f = message.getDocumentId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getFinishedVoteInfo(); + if (f != null) { + writer.writeMessage( 4, - f - ); - } - f = message.getDocumentContestedStatus(); - if (f !== 0.0) { - writer.writeEnum( - 5, - f + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter ); } }; /** - * @enum {number} + * repeated Contender contenders = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus = { - NOT_CONTESTED: 0, - MAYBE_CONTESTED: 1, - CONTESTED: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getContendersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, 1)); }; + /** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setContendersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.addContenders = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, opt_index); }; /** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearContendersList = function() { + return this.setContendersList([]); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional uint32 abstain_vote_tally = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getAbstainVoteTally = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * optional string document_type = 2; - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setAbstainVoteTally = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearAbstainVoteTally = function() { + return jspb.Message.setField(this, 2, undefined); }; /** - * optional bool document_type_keeps_history = 3; + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentTypeKeepsHistory = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasAbstainVoteTally = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional uint32 lock_vote_tally = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentTypeKeepsHistory = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getLockVoteTally = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * optional bytes document_id = 4; - * @return {string} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setLockVoteTally = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * optional bytes document_id = 4; - * This is a type-conversion wrapper around `getDocumentId()` - * @return {string} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearLockVoteTally = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * optional bytes document_id = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentId()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocumentId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasLockVoteTally = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * optional FinishedVoteInfo finished_vote_info = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentId = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getFinishedVoteInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo, 4)); }; /** - * optional DocumentContestedStatus document_contested_status = 5; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setFinishedVoteInfo = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.getDocumentContestedStatus = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearFinishedVoteInfo = function() { + return this.setFinishedVoteInfo(undefined); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.DocumentContestedStatus} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest.prototype.setDocumentContestedStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasFinishedVoteInfo = function() { + return jspb.Message.getField(this, 4) != null; }; @@ -16858,8 +37135,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject(opt_includeInstance, this); }; @@ -16868,14 +37145,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - requestType: jspb.Message.getFieldWithDefault(msg, 2, 0) + identifier: msg.getIdentifier_asB64(), + voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0), + document: msg.getDocument_asB64() }; if (includeInstance) { @@ -16889,23 +37167,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -16914,11 +37192,15 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setIdentifier(value); break; case 2: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (reader.readEnum()); - msg.setRequestType(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setVoteCount(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setDocument(value); break; default: reader.skipField(); @@ -16933,9 +37215,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -16943,250 +37225,319 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getIdentifier_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getRequestType(); - if (f !== 0.0) { - writer.writeEnum( + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint32( 2, f ); } + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBytes( + 3, + f + ); + } }; /** - * @enum {number} + * optional bytes identifier = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type = { - FULL_IDENTITY: 0, - BALANCE: 1, - KEYS: 2, - REVISION: 3 +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; + /** - * optional bytes identity_id = 1; + * optional bytes identifier = 1; + * This is a type-conversion wrapper around `getIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentifier())); }; /** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` + * optional bytes identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 vote_count = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getVoteCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setVoteCount = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearVoteCount = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasVoteCount = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional bytes document = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes document = 3; + * This is a type-conversion wrapper around `getDocument()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); + this.getDocument())); }; /** - * optional bytes identity_id = 1; + * optional bytes document = 3; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` + * This is a type-conversion wrapper around `getDocument()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getIdentityId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); + this.getDocument())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setDocument = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * optional Type request_type = 2; - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.getRequestType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearDocument = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.Type} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest.prototype.setRequestType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasDocument = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional ContestedResourceContenders contested_resource_contenders = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getContestedResourceContenders = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders, 1)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setContestedResourceContenders = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +}; + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearContestedResourceContenders = function() { + return this.setContestedResourceContenders(undefined); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasContestedResourceContenders = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.toObject = function(includeInstance, msg) { - var f, obj = { - contractId: msg.getContractId_asB64() - }; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes contract_id = 1; - * @return {string} + * optional GetContestedResourceVoteStateResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0, 1)); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0], value); }; /** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; @@ -17199,21 +37550,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequ * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase = { - REQUEST_TYPE_NOT_SET: 0, - CONTESTED_RESOURCE_VOTE_STATUS_REQUEST: 1 +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getRequestTypeCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.RequestTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0])); }; @@ -17231,8 +37582,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject(opt_includeInstance, this); }; @@ -17241,13 +37592,13 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceVoteStatusRequest: (f = msg.getContestedResourceVoteStatusRequest()) && proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17261,23 +37612,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17285,9 +37636,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader); - msg.setContestedResourceVoteStatusRequest(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -17302,9 +37653,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17312,18 +37663,18 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceVoteStatusRequest(); + f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter ); } }; @@ -17335,7 +37686,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.repeatedFields_ = [4]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.repeatedFields_ = [4]; @@ -17352,8 +37703,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(opt_includeInstance, this); }; @@ -17362,17 +37713,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject = function(includeInstance, msg) { var f, obj = { contractId: msg.getContractId_asB64(), documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), indexValuesList: msg.getIndexValuesList_asB64(), - voterIdentifier: msg.getVoterIdentifier_asB64() + contestantId: msg.getContestantId_asB64(), + startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 7, 0), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) }; if (includeInstance) { @@ -17386,23 +37741,23 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17427,7 +37782,24 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe break; case 5: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setVoterIdentifier(value); + msg.setContestantId(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); + msg.setStartAtIdentifierInfo(value); + break; + case 7: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 8: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 9: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -17442,9 +37814,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -17452,11 +37824,11 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getContractId_asU8(); if (f.length > 0) { @@ -17486,13 +37858,226 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe f ); } - f = message.getVoterIdentifier_asU8(); + f = message.getContestantId_asU8(); if (f.length > 0) { writer.writeBytes( 5, f ); } + f = message.getStartAtIdentifierInfo(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 7)); + if (f != null) { + writer.writeUint32( + 7, + f + ); + } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 8, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 9, + f + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { + var f, obj = { + startIdentifier: msg.getStartIdentifier_asB64(), + startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartIdentifier(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartIdentifierIncluded(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStartIdentifier_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getStartIdentifierIncluded(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional bytes start_identifier = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes start_identifier = 1; + * This is a type-conversion wrapper around `getStartIdentifier()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartIdentifier())); +}; + + +/** + * optional bytes start_identifier = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartIdentifier()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartIdentifier())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bool start_identifier_included = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; @@ -17500,7 +38085,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional bytes contract_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; @@ -17510,7 +38095,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getContractId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getContractId())); }; @@ -17523,7 +38108,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getContractId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getContractId())); }; @@ -17531,9 +38116,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setContractId = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContractId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; @@ -17542,16 +38127,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional string document_type_name = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getDocumentTypeName = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getDocumentTypeName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setDocumentTypeName = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setDocumentTypeName = function(value) { return jspb.Message.setProto3StringField(this, 2, value); }; @@ -17560,16 +38145,16 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * optional string index_name = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexName = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexName = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexName = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexName = function(value) { return jspb.Message.setProto3StringField(this, 3, value); }; @@ -17578,7 +38163,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * repeated bytes index_values = 4; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList = function() { return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); }; @@ -17588,7 +38173,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getIndexValuesList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( this.getIndexValuesList())); }; @@ -17601,7 +38186,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe * This is a type-conversion wrapper around `getIndexValuesList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getIndexValuesList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( this.getIndexValuesList())); }; @@ -17609,9 +38194,9 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setIndexValuesList = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexValuesList = function(value) { return jspb.Message.setField(this, 4, value || []); }; @@ -17619,277 +38204,197 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRe /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.addIndexValues = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.addIndexValues = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 4, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.clearIndexValuesList = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearIndexValuesList = function() { return this.setIndexValuesList([]); }; /** - * optional bytes voter_identifier = 5; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); -}; - - -/** - * optional bytes voter_identifier = 5; - * This is a type-conversion wrapper around `getVoterIdentifier()` + * optional bytes contestant_id = 5; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getVoterIdentifier())); -}; - - -/** - * optional bytes voter_identifier = 5; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getVoterIdentifier()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.getVoterIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getVoterIdentifier())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest.prototype.setVoterIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); -}; - - -/** - * optional ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.getContestedResourceVoteStatusRequest = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.ContestedResourceVoteStatusRequest|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.setContestedResourceVoteStatusRequest = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.clearContestedResourceVoteStatusRequest = function() { - return this.setContestedResourceVoteStatusRequest(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest.prototype.hasContestedResourceVoteStatusRequest = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * repeated IdentityRequest identities = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} - */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getIdentitiesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setIdentitiesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes contestant_id = 5; + * This is a type-conversion wrapper around `getContestantId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContestantId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest} + * optional bytes contestant_id = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContestantId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addIdentities = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.IdentityRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContestantId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearIdentitiesList = function() { - return this.setIdentitiesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContestantId = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); }; /** - * repeated ContractRequest contracts = 2; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} + * optional StartAtIdentifierInfo start_at_identifier_info = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getContractsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getStartAtIdentifierInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo, 6)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setContractsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setStartAtIdentifierInfo = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addContracts = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.ContractRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearStartAtIdentifierInfo = function() { + return this.setStartAtIdentifierInfo(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearContractsList = function() { - return this.setContractsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasStartAtIdentifierInfo = function() { + return jspb.Message.getField(this, 6) != null; }; /** - * repeated DocumentRequest documents = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} + * optional uint32 count = 7; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getDocumentsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setDocumentsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 7, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addDocuments = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.DocumentRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 7, undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 7) != null; }; /** - * repeated VoteStatusRequest votes = 4; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} + * optional bool order_ascending = 8; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.getVotesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, 4)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.setVotesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 4, value); + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 8, value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest} + * optional bool prove = 9; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.addVotes = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 4, opt_value, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.VoteStatusRequest, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0.prototype.clearVotesList = function() { - return this.setVotesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 9, value); }; /** - * optional GetProofsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} + * optional GetContestedResourceVotersForIdentityRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsRequest.GetProofsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -17898,7 +38403,7 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -17912,21 +38417,21 @@ proto.org.dash.platform.dapi.v0.GetProofsRequest.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0])); }; @@ -17944,8 +38449,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject(opt_includeInstance, this); }; @@ -17954,13 +38459,13 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -17974,23 +38479,23 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse; - return proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -17998,8 +38503,8 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -18015,9 +38520,9 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18025,18 +38530,18 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter ); } }; @@ -18051,21 +38556,22 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.serializeBinaryToWriter = func * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase = { RESULT_NOT_SET: 0, - PROOF: 1 + CONTESTED_RESOURCE_VOTERS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0])); }; @@ -18083,8 +38589,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(opt_includeInstance, this); }; @@ -18093,12 +38599,13 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject = function(includeInstance, msg) { var f, obj = { + contestedResourceVoters: (f = msg.getContestedResourceVoters()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -18114,23 +38621,23 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0; - return proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18138,11 +38645,16 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader); + msg.setContestedResourceVoters(value); + break; + case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); msg.setProof(value); break; - case 2: + case 3: var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); msg.setMetadata(value); @@ -18160,9 +38672,9 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18170,24 +38682,32 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProof(); + f = message.getContestedResourceVoters(); if (f != null) { writer.writeMessage( 1, f, + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } f = message.getMetadata(); if (f != null) { writer.writeMessage( - 2, + 3, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); @@ -18195,30 +38715,277 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.serializeB }; + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject = function(includeInstance, msg) { + var f, obj = { + votersList: msg.getVotersList_asB64(), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; + return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addVoters(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVotersList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * repeated bytes voters = 1; + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +}; + + +/** + * repeated bytes voters = 1; + * This is a type-conversion wrapper around `getVotersList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getVotersList())); +}; + + +/** + * repeated bytes voters = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getVotersList()` + * @return {!Array<!Uint8Array>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getVotersList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setVotersList = function(value) { + return jspb.Message.setField(this, 1, value || []); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.addVoters = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.clearVotersList = function() { + return this.setVotersList([]); +}; + + +/** + * optional bool finished_results = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + +/** + * optional ContestedResourceVoters contested_resource_voters = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getContestedResourceVoters = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setContestedResourceVoters = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearContestedResourceVoters = function() { + return this.setContestedResourceVoters(undefined); +}; + + /** - * optional Proof proof = 1; + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasContestedResourceVoters = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 1)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -18227,35 +38994,35 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 2; + * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 2)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -18264,35 +39031,35 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetProofsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} + * optional GetContestedResourceVotersForIdentityResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProofsResponse.GetProofsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProofsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProofsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -18301,7 +39068,7 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -18315,21 +39082,21 @@ proto.org.dash.platform.dapi.v0.GetProofsResponse.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0])); }; @@ -18347,8 +39114,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject(opt_includeInstance, this); }; @@ -18357,13 +39124,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -18377,23 +39144,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18401,8 +39168,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -18418,9 +39185,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18428,18 +39195,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter ); } }; @@ -18461,8 +39228,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(opt_includeInstance, this); }; @@ -18471,14 +39238,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), + orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), + startAtVotePollIdInfo: (f = msg.getStartAtVotePollIdInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(includeInstance, f), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -18492,23 +39263,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18517,9 +39288,28 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setIdentityId(value); break; case 2: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setLimit(value); + break; + case 3: + var value = new google_protobuf_wrappers_pb.UInt32Value; + reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); + msg.setOffset(value); + break; + case 4: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setOrderAscending(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader); + msg.setStartAtVotePollIdInfo(value); + break; + case 6: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -18536,9 +39326,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18546,292 +39336,61 @@ proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getLimit(); + if (f != null) { + writer.writeMessage( 2, - f + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter ); } -}; - - -/** - * optional bytes id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); -}; - - -/** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetDataContractRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractRequest.GetDataContractRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; + f = message.getOffset(); + if (f != null) { + writer.writeMessage( + 3, + f, + google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter + ); } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } + f = message.getOrderAscending(); + if (f) { + writer.writeBool( + 4, + f + ); } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); + f = message.getStartAtVotePollIdInfo(); if (f != null) { writer.writeMessage( - 1, + 5, f, - proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DATA_CONTRACT: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -18847,8 +39406,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(opt_includeInstance, this); }; @@ -18857,15 +39416,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject = function(includeInstance, msg) { var f, obj = { - dataContract: msg.getDataContract_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startAtPollIdentifier: msg.getStartAtPollIdentifier_asB64(), + startPollIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -18879,23 +39437,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -18904,17 +39462,11 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDataContract(value); + msg.setStartAtPollIdentifier(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartPollIdentifierIncluded(value); break; default: reader.skipField(); @@ -18929,9 +39481,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -18939,123 +39491,156 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { + f = message.getStartAtPollIdentifier_asU8(); + if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getStartPollIdentifierIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes data_contract = 1; + * optional bytes start_at_poll_identifier = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes data_contract = 1; - * This is a type-conversion wrapper around `getDataContract()` + * optional bytes start_at_poll_identifier = 1; + * This is a type-conversion wrapper around `getStartAtPollIdentifier()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDataContract())); + this.getStartAtPollIdentifier())); }; /** - * optional bytes data_contract = 1; + * optional bytes start_at_poll_identifier = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDataContract()` + * This is a type-conversion wrapper around `getStartAtPollIdentifier()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getDataContract_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDataContract())); + this.getStartAtPollIdentifier())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setDataContract = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartAtPollIdentifier = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * optional bool start_poll_identifier_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearDataContract = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartPollIdentifierIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasDataContract = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartPollIdentifierIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); +}; + + +/** + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional google.protobuf.UInt32Value limit = 2; + * @return {?proto.google.protobuf.UInt32Value} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getLimit = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); +}; + + +/** + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearLimit = function() { + return this.setLimit(undefined); }; @@ -19063,36 +39648,36 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasLimit = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * optional google.protobuf.UInt32Value offset = 3; + * @return {?proto.google.protobuf.UInt32Value} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOffset = function() { + return /** @type{?proto.google.protobuf.UInt32Value} */ ( + jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @param {?proto.google.protobuf.UInt32Value|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOffset = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearOffset = function() { + return this.setOffset(undefined); }; @@ -19100,35 +39685,108 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasOffset = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDataContractResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} + * optional bool order_ascending = 4; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOrderAscending = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractResponse.GetDataContractResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOrderAscending = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); +}; + + +/** + * optional StartAtVotePollIdInfo start_at_vote_poll_id_info = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getStartAtVotePollIdInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setStartAtVotePollIdInfo = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearStartAtVotePollIdInfo = function() { + return this.setStartAtVotePollIdInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasStartAtVotePollIdInfo = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional bool prove = 6; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); +}; + + +/** + * optional GetContestedResourceIdentityVotesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -19137,7 +39795,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -19151,21 +39809,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractResponse.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0])); }; @@ -19183,8 +39841,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject(opt_includeInstance, this); }; @@ -19193,13 +39851,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -19213,23 +39871,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19237,8 +39895,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -19254,9 +39912,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19264,18 +39922,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter ); } }; @@ -19283,11 +39941,30 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.serializeBinaryToWriter /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + VOTES: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0])); +}; @@ -19304,8 +39981,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(opt_includeInstance, this); }; @@ -19314,14 +39991,15 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - idsList: msg.getIdsList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + votes: (f = msg.getVotes()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -19335,224 +40013,107 @@ proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIds(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getIdsList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); - } -}; - - -/** - * repeated bytes ids = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes ids = 1; - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIdsList())); -}; - - -/** - * repeated bytes ids = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdsList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getIdsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIdsList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setIdsList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.addIds = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.clearIdsList = function() { - return this.setIdsList([]); -}; - - -/** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetDataContractsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsRequest.GetDataContractsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsRequest.oneofGroups_[0], value); + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader); + msg.setVotes(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVotes(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.repeatedFields_ = [1]; @@ -19569,8 +40130,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(opt_includeInstance, this); }; @@ -19579,13 +40140,15 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.toObject = fu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(includeInstance, f) + contestedResourceIdentityVotesList: jspb.Message.toObjectList(msg.getContestedResourceIdentityVotesList(), + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject, includeInstance), + finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -19599,23 +40162,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.toObject = function(inc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19623,9 +40186,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromRe var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader); + msg.addContestedResourceIdentityVotes(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFinishedResults(value); break; default: reader.skipField(); @@ -19640,9 +40207,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.deserializeBinaryFromRe * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19650,23 +40217,86 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.serializeBina /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getContestedResourceIdentityVotesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter + ); + } + f = message.getFinishedResults(); + if (f) { + writer.writeBool( + 2, + f ); } }; +/** + * repeated ContestedResourceIdentityVote contested_resource_identity_votes = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getContestedResourceIdentityVotesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setContestedResourceIdentityVotesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.addContestedResourceIdentityVotes = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.clearContestedResourceIdentityVotesList = function() { + return this.setContestedResourceIdentityVotesList([]); +}; + + +/** + * optional bool finished_results = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getFinishedResults = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setFinishedResults = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + @@ -19683,8 +40313,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(opt_includeInstance, this); }; @@ -19693,14 +40323,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject = function(includeInstance, msg) { var f, obj = { - identifier: msg.getIdentifier_asB64(), - dataContract: (f = msg.getDataContract()) && google_protobuf_wrappers_pb.BytesValue.toObject(includeInstance, f) + voteChoiceType: jspb.Message.getFieldWithDefault(msg, 1, 0), + identityId: msg.getIdentityId_asB64() }; if (includeInstance) { @@ -19714,23 +40344,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19738,13 +40368,12 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentifier(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (reader.readEnum()); + msg.setVoteChoiceType(value); break; case 2: - var value = new google_protobuf_wrappers_pb.BytesValue; - reader.readMessage(value,google_protobuf_wrappers_pb.BytesValue.deserializeBinaryFromReader); - msg.setDataContract(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; default: reader.skipField(); @@ -19759,9 +40388,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19769,97 +40398,104 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getVoteChoiceType(); + if (f !== 0.0) { + writer.writeEnum( 1, f ); } - f = message.getDataContract(); + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeBytes( 2, - f, - google_protobuf_wrappers_pb.BytesValue.serializeBinaryToWriter + f ); } }; /** - * optional bytes identifier = 1; - * @return {string} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType = { + TOWARDS_IDENTITY: 0, + ABSTAIN: 1, + LOCK: 2 +}; + +/** + * optional VoteChoiceType vote_choice_type = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getVoteChoiceType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * optional bytes identifier = 1; - * This is a type-conversion wrapper around `getIdentifier()` - * @return {string} + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentifier())); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setVoteChoiceType = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * optional bytes identifier = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentifier()` - * @return {!Uint8Array} + * optional bytes identity_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentifier())); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + * optional bytes identity_id = 2; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * optional google.protobuf.BytesValue data_contract = 2; - * @return {?proto.google.protobuf.BytesValue} + * optional bytes identity_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.getDataContract = function() { - return /** @type{?proto.google.protobuf.BytesValue} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.BytesValue, 2)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * @param {?proto.google.protobuf.BytesValue|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.setDataContract = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setIdentityId = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.clearDataContract = function() { - return this.setDataContract(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.clearIdentityId = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -19867,7 +40503,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.prototype.hasDataContract = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.hasIdentityId = function() { return jspb.Message.getField(this, 2) != null; }; @@ -19878,7 +40514,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.proto * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.repeatedFields_ = [3]; @@ -19895,8 +40531,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject(opt_includeInstance, this); }; @@ -19905,14 +40541,16 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject = function(includeInstance, msg) { var f, obj = { - dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.toObject, includeInstance) + contractId: msg.getContractId_asB64(), + documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), + serializedIndexStorageValuesList: msg.getSerializedIndexStorageValuesList_asB64(), + voteChoice: (f = msg.getVoteChoice()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(includeInstance, f) }; if (includeInstance) { @@ -19926,23 +40564,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; + return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -19950,9 +40588,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.deserializeBinaryFromReader); - msg.addDataContractEntries(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setDocumentTypeName(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addSerializedIndexStorageValues(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader); + msg.setVoteChoice(value); break; default: reader.skipField(); @@ -19967,9 +40617,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -19977,254 +40627,227 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} message + * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractEntriesList(); + f = message.getContractId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, + f + ); + } + f = message.getDocumentTypeName(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getSerializedIndexStorageValuesList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 3, + f + ); + } + f = message.getVoteChoice(); + if (f != null) { + writer.writeMessage( + 4, f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter ); } }; /** - * repeated DataContractEntry data_contract_entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.getDataContractEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.setDataContractEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry} + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.addDataContractEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContractEntry, opt_index); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.prototype.clearDataContractEntriesList = function() { - return this.setDataContractEntriesList([]); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string document_type_name = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getDocumentTypeName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setDocumentTypeName = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * repeated bytes serialized_index_storage_values = 3; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); +}; + + +/** + * repeated bytes serialized_index_storage_values = 3; + * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getSerializedIndexStorageValuesList())); +}; + /** - * @enum {number} + * repeated bytes serialized_index_storage_values = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - DATA_CONTRACTS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getSerializedIndexStorageValuesList())); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setSerializedIndexStorageValuesList = function(value) { + return jspb.Message.setField(this, 3, value || []); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.addSerializedIndexStorageValues = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 3, value, opt_index); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - dataContracts: (f = msg.getDataContracts()) && proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearSerializedIndexStorageValuesList = function() { + return this.setSerializedIndexStorageValuesList([]); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + * optional ResourceVoteChoice vote_choice = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getVoteChoice = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice, 4)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.deserializeBinaryFromReader); - msg.setDataContracts(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this +*/ +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setVoteChoice = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearVoteChoice = function() { + return this.setVoteChoice(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDataContracts(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.hasVoteChoice = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional DataContracts data_contracts = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} + * optional ContestedResourceIdentityVotes votes = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getDataContracts = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getVotes = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.DataContracts|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setDataContracts = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setVotes = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearDataContracts = function() { - return this.setDataContracts(undefined); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearVotes = function() { + return this.setVotes(undefined); }; @@ -20232,7 +40855,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasDataContracts = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasVotes = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20241,7 +40864,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -20249,18 +40872,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -20269,7 +40892,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -20278,7 +40901,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -20286,18 +40909,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -20306,35 +40929,35 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsRespons * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDataContractsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} + * optional GetContestedResourceIdentityVotesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractsResponse.GetDataContractsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -20343,7 +40966,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.clearV0 = fun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20357,21 +40980,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractsResponse.prototype.hasV0 = funct * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0])); }; @@ -20389,8 +41012,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject(opt_includeInstance, this); }; @@ -20399,13 +41022,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -20419,23 +41042,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20443,8 +41066,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -20460,9 +41083,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20470,18 +41093,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter ); } }; @@ -20503,8 +41126,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(opt_includeInstance, this); }; @@ -20513,17 +41136,14 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject = function(includeInstance, msg) { var f, obj = { id: msg.getId_asB64(), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - startAtMs: jspb.Message.getFieldWithDefault(msg, 4, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -20537,23 +41157,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20565,20 +41185,6 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis msg.setId(value); break; case 2: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartAtMs(value); - break; - case 5: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -20595,9 +41201,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20605,11 +41211,11 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getId_asU8(); if (f.length > 0) { @@ -20618,33 +41224,10 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis f ); } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getStartAtMs(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } f = message.getProve(); if (f) { writer.writeBool( - 5, + 2, f ); } @@ -20655,7 +41238,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * optional bytes id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; @@ -20665,7 +41248,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * This is a type-conversion wrapper around `getId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( this.getId())); }; @@ -20678,7 +41261,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis * This is a type-conversion wrapper around `getId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( this.getId())); }; @@ -20686,147 +41269,55 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHis /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional google.protobuf.UInt32Value limit = 2; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional google.protobuf.UInt32Value offset = 3; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional uint64 start_at_ms = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getStartAtMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setStartAtMs = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional bool prove = 5; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional GetDataContractHistoryRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} + * optional GetPrefundedSpecializedBalanceRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.GetDataContractHistoryRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -20835,7 +41326,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -20849,21 +41340,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryRequest.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0])); }; @@ -20881,8 +41372,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject(opt_includeInstance, this); }; @@ -20891,13 +41382,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.toObjec * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -20911,23 +41402,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.toObject = functi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -20935,8 +41426,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -20952,9 +41443,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.deserializeBinary * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -20962,18 +41453,18 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.seriali /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter ); } }; @@ -20988,22 +41479,22 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.serializeBinaryTo * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase = { RESULT_NOT_SET: 0, - DATA_CONTRACT_HISTORY: 1, + BALANCE: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0])); }; @@ -21021,8 +41512,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(opt_includeInstance, this); }; @@ -21031,13 +41522,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - dataContractHistory: (f = msg.getDataContractHistory()) && proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(includeInstance, f), + balance: jspb.Message.getFieldWithDefault(msg, 1, "0"), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -21053,23 +41544,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; + return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21077,9 +41568,8 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader); - msg.setDataContractHistory(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBalance(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -21104,9 +41594,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21114,18 +41604,17 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractHistory(); + f = /** @type {string} */ (jspb.Message.getField(message, 1)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter + f ); } f = message.getProof(); @@ -21147,197 +41636,178 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi }; +/** + * optional uint64 balance = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getBalance = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setBalance = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject = function(includeInstance, msg) { - var f, obj = { - date: jspb.Message.getFieldWithDefault(msg, 1, 0), - value: msg.getValue_asB64() - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearBalance = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], undefined); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasBalance = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setDate(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setValue(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDate(); - if (f !== 0) { - writer.writeUint64( - 1, - f - ); - } - f = message.getValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint64 date = 1; - * @return {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getDate = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setDate = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * optional bytes value = 2; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes value = 2; - * This is a type-conversion wrapper around `getValue()` - * @return {string} + * optional GetPrefundedSpecializedBalanceResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0, 1)); }; /** - * optional bytes value = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getValue()` - * @return {!Uint8Array} + * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.getValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getValue())); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.prototype.setValue = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0])); +}; @@ -21354,8 +41824,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject(opt_includeInstance, this); }; @@ -21364,14 +41834,13 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = function(includeInstance, msg) { var f, obj = { - dataContractEntriesList: jspb.Message.toObjectList(msg.getDataContractEntriesList(), - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -21385,23 +41854,23 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory; - return proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21409,9 +41878,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.deserializeBinaryFromReader); - msg.addDataContractEntries(value); + var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -21426,9 +41895,9 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21436,196 +41905,177 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractEntriesList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter ); } }; -/** - * repeated DataContractHistoryEntry data_contract_entries = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.getDataContractEntriesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.setDataContractEntriesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.addDataContractEntries = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistoryEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory.prototype.clearDataContractEntriesList = function() { - return this.setDataContractEntriesList([]); -}; - - -/** - * optional DataContractHistory data_contract_history = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getDataContractHistory = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.DataContractHistory|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setDataContractHistory = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); -}; - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearDataContractHistory = function() { - return this.setDataContractHistory(undefined); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Returns whether this field is set. - * @return {boolean} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasDataContractHistory = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(opt_includeInstance, this); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.oneofGroups_[0], value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getProve(); + if (f) { + writer.writeBool( + 1, + f + ); + } }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} returns this + * optional bool prove = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; /** - * optional GetDataContractHistoryResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} + * optional GetTotalCreditsInPlatformRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.GetDataContractHistoryResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -21634,7 +42084,7 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -21648,21 +42098,21 @@ proto.org.dash.platform.dapi.v0.GetDataContractHistoryResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0])); }; @@ -21680,8 +42130,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject(opt_includeInstance, this); }; @@ -21690,13 +42140,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.toObject = functio * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -21710,23 +42160,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.toObject = function(includeI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest; - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21734,8 +42184,8 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -21751,9 +42201,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21761,18 +42211,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter ); } }; @@ -21787,22 +42237,22 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.serializeBinaryToWriter = fu * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_ = [[6,7]]; +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase = { - START_NOT_SET: 0, - START_AFTER: 6, - START_AT: 7 +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + CREDITS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} + * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.StartCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0])); }; @@ -21820,8 +42270,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(opt_includeInstance, this); }; @@ -21830,20 +42280,15 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - dataContractId: msg.getDataContractId_asB64(), - documentType: jspb.Message.getFieldWithDefault(msg, 2, ""), - where: msg.getWhere_asB64(), - orderBy: msg.getOrderBy_asB64(), - limit: jspb.Message.getFieldWithDefault(msg, 5, 0), - startAfter: msg.getStartAfter_asB64(), - startAt: msg.getStartAt_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 8, false) + credits: jspb.Message.getFieldWithDefault(msg, 1, "0"), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -21857,23 +42302,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; + return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -21881,36 +42326,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDataContractId(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setCredits(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentType(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setWhere(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setOrderBy(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); - break; - case 6: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAfter(value); - break; - case 7: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAt(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -21925,9 +42352,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -21935,395 +42362,631 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDataContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = /** @type {string} */ (jspb.Message.getField(message, 1)); + if (f != null) { + writer.writeUint64String( 1, f ); } - f = message.getDocumentType(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getWhere_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getOrderBy_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } - f = message.getLimit(); - if (f !== 0) { - writer.writeUint32( - 5, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 6)); + f = message.getProof(); if (f != null) { - writer.writeBytes( - 6, - f + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 7)); + f = message.getMetadata(); if (f != null) { - writer.writeBytes( - 7, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 8, - f + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; /** - * optional bytes data_contract_id = 1; + * optional uint64 credits = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getCredits = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * optional bytes data_contract_id = 1; - * This is a type-conversion wrapper around `getDataContractId()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDataContractId())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setCredits = function(value) { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); }; /** - * optional bytes data_contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDataContractId()` - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDataContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDataContractId())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearCredits = function() { + return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDataContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasCredits = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional string document_type = 2; - * @return {string} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getDocumentType = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setDocumentType = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * optional bytes where = 3; - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional bytes where = 3; - * This is a type-conversion wrapper around `getWhere()` - * @return {string} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getWhere())); +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetTotalCreditsInPlatformResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes where = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getWhere()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getWhere_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getWhere())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setWhere = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + ); + } }; + /** - * optional bytes order_by = 4; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); }; /** - * optional bytes order_by = 4; - * This is a type-conversion wrapper around `getOrderBy()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getOrderBy())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + pathList: msg.getPathList_asB64(), + keysList: msg.getKeysList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes order_by = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getOrderBy()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getOrderBy_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getOrderBy())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setOrderBy = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addPath(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addKeys(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint32 limit = 5; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getPathList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 1, + f + ); + } + f = message.getKeysList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; /** - * optional bytes start_after = 6; - * @return {string} + * repeated bytes path = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes start_after = 6; - * This is a type-conversion wrapper around `getStartAfter()` - * @return {string} + * repeated bytes path = 1; + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getPathList())); }; /** - * optional bytes start_after = 6; + * repeated bytes path = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAfter()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getPathList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAfter_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAfter())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getPathList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAfter = function(value) { - return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAfter = function() { - return jspb.Message.setOneofField(this, 6, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAfter = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { + return this.setPathList([]); }; /** - * optional bytes start_at = 7; - * @return {string} + * repeated bytes keys = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "")); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional bytes start_at = 7; - * This is a type-conversion wrapper around `getStartAt()` - * @return {string} + * repeated bytes keys = 2; + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getKeysList())); }; /** - * optional bytes start_at = 7; + * repeated bytes keys = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAt()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getKeysList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getStartAt_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAt())); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getKeysList())); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setStartAt = function(value) { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.clearStartAt = function() { - return jspb.Message.setOneofField(this, 7, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.hasStartAt = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { + return this.setKeysList([]); }; /** - * optional bool prove = 8; + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetDocumentsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} + * optional GetPathElementsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsRequest.GetDocumentsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -22332,7 +42995,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.clearV0 = function * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22346,21 +43009,21 @@ proto.org.dash.platform.dapi.v0.GetDocumentsRequest.prototype.hasV0 = function() * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); }; @@ -22378,8 +43041,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); }; @@ -22388,13 +43051,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -22408,23 +43071,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22432,8 +43095,8 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -22449,9 +43112,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22459,18 +43122,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter ); } }; @@ -22485,22 +43148,22 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.serializeBinaryToWriter = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { RESULT_NOT_SET: 0, - DOCUMENTS: 1, + ELEMENTS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); }; @@ -22518,8 +43181,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); }; @@ -22528,13 +43191,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - documents: (f = msg.getDocuments()) && proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(includeInstance, f), + elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -22550,23 +43213,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22574,9 +43237,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader); - msg.setDocuments(value); + var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); + msg.setElements(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -22601,9 +43264,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22611,18 +43274,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDocuments(); + f = message.getElements(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter ); } f = message.getProof(); @@ -22650,7 +43313,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.seri * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; @@ -22667,8 +43330,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); }; @@ -22677,13 +43340,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { var f, obj = { - documentsList: msg.getDocumentsList_asB64() + elementsList: msg.getElementsList_asB64() }; if (includeInstance) { @@ -22697,23 +43360,23 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents; - return proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; + return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -22722,7 +43385,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addDocuments(value); + msg.addElements(value); break; default: reader.skipField(); @@ -22737,9 +43400,9 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -22747,13 +43410,13 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} message + * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDocumentsList_asU8(); + f = message.getElementsList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( 1, @@ -22764,43 +43427,43 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** - * repeated bytes documents = 1; + * repeated bytes elements = 1; * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * repeated bytes documents = 1; - * This is a type-conversion wrapper around `getDocumentsList()` + * repeated bytes elements = 1; + * This is a type-conversion wrapper around `getElementsList()` * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getDocumentsList())); + this.getElementsList())); }; /** - * repeated bytes documents = 1; + * repeated bytes elements = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocumentsList()` + * This is a type-conversion wrapper around `getElementsList()` * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.getDocumentsList_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getDocumentsList())); + this.getElementsList())); }; /** * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.setDocumentsList = function(value) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { return jspb.Message.setField(this, 1, value || []); }; @@ -22808,47 +43471,47 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Docu /** * @param {!(string|Uint8Array)} value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.addDocuments = function(value, opt_index) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents.prototype.clearDocumentsList = function() { - return this.setDocumentsList([]); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { + return this.setElementsList([]); }; /** - * optional Documents documents = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} + * optional Elements elements = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getDocuments = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.Documents|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setDocuments = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearDocuments = function() { - return this.setDocuments(undefined); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { + return this.setElements(undefined); }; @@ -22856,7 +43519,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasDocuments = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22865,7 +43528,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -22873,18 +43536,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -22893,7 +43556,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -22902,7 +43565,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -22910,18 +43573,18 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -22930,35 +43593,35 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetDocumentsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} + * optional GetPathElementsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetDocumentsResponse.GetDocumentsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetDocumentsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetDocumentsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -22967,7 +43630,7 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -22981,21 +43644,21 @@ proto.org.dash.platform.dapi.v0.GetDocumentsResponse.prototype.hasV0 = function( * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0])); }; @@ -23013,8 +43676,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); }; @@ -23023,13 +43686,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.toOb * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -23043,23 +43706,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.toObject = fun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; + return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23067,8 +43730,8 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBin var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -23084,9 +43747,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.deserializeBin * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23094,18 +43757,18 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.seri /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter ); } }; @@ -23127,8 +43790,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(opt_includeInstance, this); }; @@ -23137,14 +43800,13 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - publicKeyHash: msg.getPublicKeyHash_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + }; if (includeInstance) { @@ -23158,37 +43820,29 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; + return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setPublicKeyHash(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; default: reader.skipField(); break; @@ -23202,9 +43856,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23212,152 +43866,376 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByP /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPublicKeyHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, - f - ); +}; + + +/** + * optional GetStatusRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; } + return obj; }; +} /** - * optional bytes public_key_hash = 1; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); }; /** - * optional bytes public_key_hash = 1; - * This is a type-conversion wrapper around `getPublicKeyHash()` - * @return {string} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getPublicKeyHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional bytes public_key_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPublicKeyHash()` + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getPublicKeyHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getPublicKeyHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setPublicKeyHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter + ); + } }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bool prove = 2; - * @return {boolean} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(opt_includeInstance, this); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(includeInstance, f), + node: (f = msg.getNode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(includeInstance, f), + chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(includeInstance, f), + network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(includeInstance, f), + stateSync: (f = msg.getStateSync()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(includeInstance, f), + time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetIdentityByPublicKeyHashRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.GetIdentityByPublicKeyHashRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader); + msg.setVersion(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader); + msg.setNode(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader); + msg.setChain(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader); + msg.setNetwork(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader); + msg.setStateSync(value); + break; + case 6: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader); + msg.setTime(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getVersion(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter + ); + } + f = message.getNode(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter + ); + } + f = message.getChain(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter + ); + } + f = message.getNetwork(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter + ); + } + f = message.getStateSync(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter + ); + } + f = message.getTime(); + if (f != null) { + writer.writeMessage( + 6, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter + ); + } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -23373,8 +44251,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(opt_includeInstance, this); }; @@ -23383,13 +44261,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.toO * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(includeInstance, f) + software: (f = msg.getSoftware()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(includeInstance, f), + protocol: (f = msg.getProtocol()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(includeInstance, f) }; if (includeInstance) { @@ -23403,23 +44282,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.toObject = fu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23427,9 +44306,14 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBi var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader); + msg.setSoftware(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader); + msg.setProtocol(value); break; default: reader.skipField(); @@ -23444,9 +44328,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.deserializeBi * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23454,50 +44338,32 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.ser /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getSoftware(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter + ); + } + f = message.getProtocol(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter ); } }; -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - IDENTITY: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0])); -}; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -23513,8 +44379,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(opt_includeInstance, this); }; @@ -23523,15 +44389,15 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject = function(includeInstance, msg) { var f, obj = { - identity: msg.getIdentity_asB64(), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + dapi: jspb.Message.getFieldWithDefault(msg, 1, ""), + drive: jspb.Message.getFieldWithDefault(msg, 2, ""), + tenderdash: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -23545,23 +44411,23 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0; - return proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23569,18 +44435,16 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentity(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDapi(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readString()); + msg.setDrive(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readString()); + msg.setTenderdash(value); break; default: reader.skipField(); @@ -23595,9 +44459,9 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -23605,86 +44469,78 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeBytes( + f = message.getDapi(); + if (f.length > 0) { + writer.writeString( 1, f ); } - f = message.getProof(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeString( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; /** - * optional bytes identity = 1; + * optional string dapi = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDapi = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identity = 1; - * This is a type-conversion wrapper around `getIdentity()` - * @return {string} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDapi = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * optional bytes identity = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentity()` - * @return {!Uint8Array} + * optional string drive = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getIdentity_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentity())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDrive = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setIdentity = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDrive = function(value) { + return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearIdentity = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearDrive = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -23692,36 +44548,35 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasIdentity = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasDrive = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional string tenderdash = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getTenderdash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.oneofGroups_[0], value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setTenderdash = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearTenderdash = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -23729,110 +44584,139 @@ proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityBy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasTenderdash = function() { + return jspb.Message.getField(this, 3) != null; }; -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject = function(includeInstance, msg) { + var f, obj = { + tenderdash: (f = msg.getTenderdash()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(includeInstance, f), + drive: (f = msg.getDrive()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(includeInstance, f) + }; -/** - * optional GetIdentityByPublicKeyHashResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0, 1)); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {?proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.GetIdentityByPublicKeyHashResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader(msg, reader); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader); + msg.setTenderdash(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader); + msg.setDrive(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetIdentityByPublicKeyHashResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_ = [[1]]; - /** - * @enum {number} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTenderdash(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter + ); + } + f = message.getDrive(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter + ); + } }; -/** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0])); -}; + @@ -23849,8 +44733,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(opt_includeInstance, this); }; @@ -23859,13 +44743,14 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(includeInstance, f) + p2p: jspb.Message.getFieldWithDefault(msg, 1, 0), + block: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -23879,23 +44764,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -23903,9 +44788,12 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeB var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setP2p(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlock(value); break; default: reader.skipField(); @@ -23920,30 +44808,72 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getP2p(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getBlock(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } +}; + + +/** + * optional uint32 p2p = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getP2p = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setP2p = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 block = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getBlock = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setBlock = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; @@ -23963,8 +44893,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(opt_includeInstance, this); }; @@ -23973,14 +44903,14 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject = function(includeInstance, msg) { var f, obj = { - stateTransitionHash: msg.getStateTransitionHash_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + latest: jspb.Message.getFieldWithDefault(msg, 3, 0), + current: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -23994,36 +44924,36 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStateTransitionHash(value); + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setLatest(value); break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCurrent(value); break; default: reader.skipField(); @@ -24038,9 +44968,9 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24048,23 +44978,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStateTransitionHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, + f = message.getLatest(); + if (f !== 0) { + writer.writeUint32( + 3, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( - 2, + f = message.getCurrent(); + if (f !== 0) { + writer.writeUint32( + 4, f ); } @@ -24072,90 +45002,66 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForState /** - * optional bytes state_transition_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes state_transition_hash = 1; - * This is a type-conversion wrapper around `getStateTransitionHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStateTransitionHash())); -}; - - -/** - * optional bytes state_transition_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStateTransitionHash()` - * @return {!Uint8Array} + * optional uint32 latest = 3; + * @return {number} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getStateTransitionHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStateTransitionHash())); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getLatest = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setStateTransitionHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setLatest = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * optional bool prove = 2; - * @return {boolean} + * optional uint32 current = 4; + * @return {number} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getCurrent = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setCurrent = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); }; /** - * optional WaitForStateTransitionResultRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} + * optional Tenderdash tenderdash = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getTenderdash = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.WaitForStateTransitionResultRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setTenderdash = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearTenderdash = function() { + return this.setTenderdash(undefined); }; @@ -24163,179 +45069,125 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.cl * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasTenderdash = function() { return jspb.Message.getField(this, 1) != null; }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional Drive drive = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getDrive = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive, 2)); +}; + /** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setDrive = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; + /** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearDrive = function() { + return this.setDrive(undefined); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasDrive = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Software software = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getSoftware = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setSoftware = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearSoftware = function() { + return this.setSoftware(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasSoftware = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional Protocol protocol = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getProtocol = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol, 2)); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_ = [[1,2]]; + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setProtocol = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + /** - * @enum {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - ERROR: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearProtocol = function() { + return this.setProtocol(undefined); }; + /** - * @return {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasProtocol = function() { + return jspb.Message.getField(this, 2) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -24349,8 +45201,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(opt_includeInstance, this); }; @@ -24359,15 +45211,16 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject = function(includeInstance, msg) { var f, obj = { - error: (f = msg.getError()) && proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + local: jspb.Message.getFieldWithDefault(msg, 1, "0"), + block: jspb.Message.getFieldWithDefault(msg, 2, "0"), + genesis: jspb.Message.getFieldWithDefault(msg, 3, "0"), + epoch: jspb.Message.getFieldWithDefault(msg, 4, 0) }; if (includeInstance) { @@ -24381,23 +45234,23 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0; - return proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -24405,19 +45258,20 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.deserializeBinaryFromReader); - msg.setError(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setLocal(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBlock(value); break; case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setGenesis(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setEpoch(value); break; default: reader.skipField(); @@ -24432,9 +45286,9 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24442,175 +45296,85 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStat /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getError(); - if (f != null) { - writer.writeMessage( + f = message.getLocal(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError.serializeBinaryToWriter + f ); } - f = message.getProof(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + f ); } - f = message.getMetadata(); + f = /** @type {string} */ (jspb.Message.getField(message, 3)); if (f != null) { - writer.writeMessage( + writer.writeUint64String( 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 4)); + if (f != null) { + writer.writeUint32( + 4, + f ); } }; /** - * optional StateTransitionBroadcastError error = 1; - * @return {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getError = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.StateTransitionBroadcastError|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setError = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearError = function() { - return this.setError(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasError = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} returns this + * optional uint64 local = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getLocal = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setLocal = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); }; /** - * optional WaitForStateTransitionResultResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} + * optional uint64 block = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getBlock = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.WaitForStateTransitionResultResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.oneofGroups_[0], value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setBlock = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearBlock = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -24618,147 +45382,80 @@ proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.WaitForStateTransitionResultResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasBlock = function() { + return jspb.Message.getField(this, 2) != null; }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_ = [[1]]; - /** - * @enum {number} + * optional uint64 genesis = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getGenesis = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "0")); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setGenesis = function(value) { + return jspb.Message.setField(this, 3, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearGenesis = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasGenesis = function() { + return jspb.Message.getField(this, 3) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} + * optional uint32 epoch = 4; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getEpoch = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setEpoch = function(value) { + return jspb.Message.setField(this, 4, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearEpoch = function() { + return jspb.Message.setField(this, 4, undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasEpoch = function() { + return jspb.Message.getField(this, 4) != null; }; @@ -24778,8 +45475,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(opt_includeInstance, this); }; @@ -24788,14 +45485,14 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject = function(includeInstance, msg) { var f, obj = { - height: jspb.Message.getFieldWithDefault(msg, 1, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + id: msg.getId_asB64(), + proTxHash: msg.getProTxHash_asB64() }; if (includeInstance) { @@ -24809,23 +45506,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -24833,12 +45530,12 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readInt32()); - msg.setHeight(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setProTxHash(value); break; default: reader.skipField(); @@ -24853,9 +45550,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -24863,22 +45560,22 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getHeight(); - if (f !== 0) { - writer.writeInt32( + f = message.getId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, f ); @@ -24887,106 +45584,110 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequ /** - * optional int32 height = 1; - * @return {number} + * optional bytes id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this + * optional bytes id = 1; + * This is a type-conversion wrapper around `getId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setHeight = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getId())); }; /** - * optional bool prove = 2; - * @return {boolean} + * optional bytes id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getId())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional GetConsensusParamsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} + * optional bytes pro_tx_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.GetConsensusParamsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.oneofGroups_[0], value); + * optional bytes pro_tx_hash = 2; + * This is a type-conversion wrapper around `getProTxHash()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getProTxHash())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest} returns this + * optional bytes pro_tx_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getProTxHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getProTxHash())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setProTxHash = function(value) { + return jspb.Message.setField(this, 2, value); }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_ = [[1]]; - /** - * @enum {number} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.clearProTxHash = function() { + return jspb.Message.setField(this, 2, undefined); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.hasProTxHash = function() { + return jspb.Message.getField(this, 2) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -25000,8 +45701,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(opt_includeInstance, this); }; @@ -25010,13 +45711,21 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.toObject = * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(includeInstance, f) + catchingUp: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), + latestBlockHash: msg.getLatestBlockHash_asB64(), + latestAppHash: msg.getLatestAppHash_asB64(), + latestBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, "0"), + earliestBlockHash: msg.getEarliestBlockHash_asB64(), + earliestAppHash: msg.getEarliestAppHash_asB64(), + earliestBlockHeight: jspb.Message.getFieldWithDefault(msg, 7, "0"), + maxPeerBlockHeight: jspb.Message.getFieldWithDefault(msg, 9, "0"), + coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 10, 0) }; if (includeInstance) { @@ -25030,23 +45739,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.toObject = function(i /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25054,9 +45763,40 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFrom var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setCatchingUp(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLatestBlockHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLatestAppHash(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setLatestBlockHeight(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEarliestBlockHash(value); + break; + case 6: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEarliestAppHash(value); + break; + case 7: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setEarliestBlockHeight(value); + break; + case 9: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setMaxPeerBlockHeight(value); + break; + case 10: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreChainLockedHeight(value); break; default: reader.skipField(); @@ -25071,9 +45811,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.deserializeBinaryFrom * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25081,400 +45821,351 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.serializeBi /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getCatchingUp(); + if (f) { + writer.writeBool( 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter + f + ); + } + f = message.getLatestBlockHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getLatestAppHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getLatestBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getEarliestBlockHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } + f = message.getEarliestAppHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 6, + f + ); + } + f = message.getEarliestBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 7, + f + ); + } + f = message.getMaxPeerBlockHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 9, + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 10)); + if (f != null) { + writer.writeUint32( + 10, + f ); } }; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bool catching_up = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCatchingUp = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject = function(includeInstance, msg) { - var f, obj = { - maxBytes: jspb.Message.getFieldWithDefault(msg, 1, ""), - maxGas: jspb.Message.getFieldWithDefault(msg, 2, ""), - timeIotaMs: jspb.Message.getFieldWithDefault(msg, 3, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCatchingUp = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + * optional bytes latest_block_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} + * optional bytes latest_block_hash = 2; + * This is a type-conversion wrapper around `getLatestBlockHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxBytes(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxGas(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setTimeIotaMs(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLatestBlockHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes latest_block_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLatestBlockHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLatestBlockHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMaxBytes(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getMaxGas(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getTimeIotaMs(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); }; /** - * optional string max_bytes = 1; + * optional bytes latest_app_hash = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxBytes = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * optional bytes latest_app_hash = 3; + * This is a type-conversion wrapper around `getLatestAppHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxBytes = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLatestAppHash())); }; /** - * optional string max_gas = 2; - * @return {string} + * optional bytes latest_app_hash = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLatestAppHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getMaxGas = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLatestAppHash())); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setMaxGas = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestAppHash = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); }; /** - * optional string time_iota_ms = 3; + * optional uint64 latest_block_height = 4; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.getTimeIotaMs = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.prototype.setTimeIotaMs = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; +/** + * optional bytes earliest_block_hash = 5; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional bytes earliest_block_hash = 5; + * This is a type-conversion wrapper around `getEarliestBlockHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEarliestBlockHash())); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional bytes earliest_block_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEarliestBlockHash()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject = function(includeInstance, msg) { - var f, obj = { - maxAgeNumBlocks: jspb.Message.getFieldWithDefault(msg, 1, ""), - maxAgeDuration: jspb.Message.getFieldWithDefault(msg, 2, ""), - maxBytes: jspb.Message.getFieldWithDefault(msg, 3, "") - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEarliestBlockHash())); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} + * optional bytes earliest_app_hash = 6; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} + * optional bytes earliest_app_hash = 6; + * This is a type-conversion wrapper around `getEarliestAppHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxAgeNumBlocks(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxAgeDuration(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setMaxBytes(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEarliestAppHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes earliest_app_hash = 6; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEarliestAppHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEarliestAppHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getMaxAgeNumBlocks(); - if (f.length > 0) { - writer.writeString( - 1, - f - ); - } - f = message.getMaxAgeDuration(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getMaxBytes(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestAppHash = function(value) { + return jspb.Message.setProto3BytesField(this, 6, value); }; /** - * optional string max_age_num_blocks = 1; + * optional uint64 earliest_block_height = 7; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeNumBlocks = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeNumBlocks = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 7, value); }; /** - * optional string max_age_duration = 2; + * optional uint64 max_peer_block_height = 9; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxAgeDuration = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getMaxPeerBlockHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 9, "0")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxAgeDuration = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setMaxPeerBlockHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 9, value); }; /** - * optional string max_bytes = 3; - * @return {string} + * optional uint32 core_chain_locked_height = 10; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.getMaxBytes = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCoreChainLockedHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.prototype.setMaxBytes = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCoreChainLockedHeight = function(value) { + return jspb.Message.setField(this, 10, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.clearCoreChainLockedHeight = function() { + return jspb.Message.setField(this, 10, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.hasCoreChainLockedHeight = function() { + return jspb.Message.getField(this, 10) != null; }; @@ -25494,8 +46185,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(opt_includeInstance, this); }; @@ -25504,14 +46195,15 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject = function(includeInstance, msg) { var f, obj = { - block: (f = msg.getBlock()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.toObject(includeInstance, f), - evidence: (f = msg.getEvidence()) && proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.toObject(includeInstance, f) + chainId: jspb.Message.getFieldWithDefault(msg, 1, ""), + peersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), + listening: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -25525,23 +46217,23 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0; - return proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25549,14 +46241,16 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.deserializeBinaryFromReader); - msg.setBlock(value); + var value = /** @type {string} */ (reader.readString()); + msg.setChainId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.deserializeBinaryFromReader); - msg.setEvidence(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPeersCount(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setListening(value); break; default: reader.skipField(); @@ -25571,9 +46265,9 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25581,170 +46275,93 @@ proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsRes /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getBlock(); - if (f != null) { - writer.writeMessage( + f = message.getChainId(); + if (f.length > 0) { + writer.writeString( 1, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock.serializeBinaryToWriter + f ); } - f = message.getEvidence(); - if (f != null) { - writer.writeMessage( + f = message.getPeersCount(); + if (f !== 0) { + writer.writeUint32( 2, - f, - proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence.serializeBinaryToWriter + f + ); + } + f = message.getListening(); + if (f) { + writer.writeBool( + 3, + f ); } }; -/** - * optional ConsensusParamsBlock block = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getBlock = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsBlock|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setBlock = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearBlock = function() { - return this.setBlock(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasBlock = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional ConsensusParamsEvidence evidence = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.getEvidence = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.ConsensusParamsEvidence|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.setEvidence = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.clearEvidence = function() { - return this.setEvidence(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0.prototype.hasEvidence = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional GetConsensusParamsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.GetConsensusParamsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.oneofGroups_[0], value); +/** + * optional string chain_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getChainId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setChainId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional uint32 peers_count = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetConsensusParamsResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getPeersCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setPeersCount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + /** - * @enum {number} + * optional bool listening = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getListening = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setListening = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -25758,8 +46375,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(opt_includeInstance, this); }; @@ -25768,13 +46385,20 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(includeInstance, f) + totalSyncedTime: jspb.Message.getFieldWithDefault(msg, 1, "0"), + remainingTime: jspb.Message.getFieldWithDefault(msg, 2, "0"), + totalSnapshots: jspb.Message.getFieldWithDefault(msg, 3, 0), + chunkProcessAvgTime: jspb.Message.getFieldWithDefault(msg, 4, "0"), + snapshotHeight: jspb.Message.getFieldWithDefault(msg, 5, "0"), + snapshotChunksCount: jspb.Message.getFieldWithDefault(msg, 6, "0"), + backfilledBlocks: jspb.Message.getFieldWithDefault(msg, 7, "0"), + backfillBlocksTotal: jspb.Message.getFieldWithDefault(msg, 8, "0") }; if (includeInstance) { @@ -25788,23 +46412,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; + return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -25812,9 +46436,36 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {string} */ (reader.readUint64String()); + msg.setTotalSyncedTime(value); + break; + case 2: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setRemainingTime(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setTotalSnapshots(value); + break; + case 4: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setChunkProcessAvgTime(value); + break; + case 5: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setSnapshotHeight(value); + break; + case 6: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setSnapshotChunksCount(value); + break; + case 7: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBackfilledBlocks(value); + break; + case 8: + var value = /** @type {string} */ (reader.readUint64String()); + msg.setBackfillBlocksTotal(value); break; default: reader.skipField(); @@ -25829,9 +46480,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -25839,178 +46490,240 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getTotalSyncedTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter + f + ); + } + f = message.getRemainingTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 2, + f + ); + } + f = message.getTotalSnapshots(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getChunkProcessAvgTime(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 4, + f + ); + } + f = message.getSnapshotHeight(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 5, + f + ); + } + f = message.getSnapshotChunksCount(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 6, + f + ); + } + f = message.getBackfilledBlocks(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 7, + f + ); + } + f = message.getBackfillBlocksTotal(); + if (parseInt(f, 10) !== 0) { + writer.writeUint64String( + 8, + f ); } }; +/** + * optional uint64 total_synced_time = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSyncedTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "0")); +}; + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSyncedTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 1, value); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional uint64 remaining_time = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getRemainingTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "0")); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setRemainingTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 2, value); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional uint32 total_snapshots = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSnapshots = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSnapshots = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * optional uint64 chunk_process_avg_time = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getChunkProcessAvgTime = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "0")); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setChunkProcessAvgTime = function(value) { + return jspb.Message.setProto3StringIntField(this, 4, value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional uint64 snapshot_height = 5; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getProve(); - if (f) { - writer.writeBool( - 1, - f - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotHeight = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "0")); }; /** - * optional bool prove = 1; - * @return {boolean} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotHeight = function(value) { + return jspb.Message.setProto3StringIntField(this, 5, value); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} returns this + * optional uint64 snapshot_chunks_count = 6; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotChunksCount = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "0")); }; /** - * optional GetProtocolVersionUpgradeStateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotChunksCount = function(value) { + return jspb.Message.setProto3StringIntField(this, 6, value); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.GetProtocolVersionUpgradeStateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this + * optional uint64 backfilled_blocks = 7; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfilledBlocks = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfilledBlocks = function(value) { + return jspb.Message.setProto3StringIntField(this, 7, value); +}; + + +/** + * optional uint64 backfill_blocks_total = 8; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfillBlocksTotal = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 8, "0")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfillBlocksTotal = function(value) { + return jspb.Message.setProto3StringIntField(this, 8, value); +}; + + +/** + * optional Version version = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getVersion = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setVersion = function(value) { + return jspb.Message.setWrapperField(this, 1, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearVersion = function() { + return this.setVersion(undefined); }; @@ -26018,325 +46731,258 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasVersion = function() { return jspb.Message.getField(this, 1) != null; }; +/** + * optional Node node = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNode = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node, 2)); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNode = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNode = function() { + return this.setNode(undefined); +}; + /** - * @enum {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNode = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} + * optional Chain chain = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getChain = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain, 3)); }; +/** + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setChain = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearChain = function() { + return this.setChain(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.toObject = function(includeInstance, msg) { - var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(includeInstance, f) - }; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasChain = function() { + return jspb.Message.getField(this, 3) != null; +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * optional Network network = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNetwork = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network, 4)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNetwork = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNetwork = function() { + return this.setNetwork(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader); - msg.setV0(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNetwork = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional StateSync state_sync = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + */ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getStateSync = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync, 5)); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setStateSync = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearStateSync = function() { + return this.setStateSync(undefined); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasStateSync = function() { + return jspb.Message.getField(this, 5) != null; +}; + /** - * @enum {number} + * optional Time time = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VERSIONS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getTime = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time, 6)); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0])); + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setTime = function(value) { + return jspb.Message.setWrapperField(this, 6, value); }; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearTime = function() { + return this.setTime(undefined); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasTime = function() { + return jspb.Message.getField(this, 6) != null; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} + * optional GetStatusResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0, 1)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader); - msg.setVersions(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0], value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersions(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +}; @@ -26353,8 +46999,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); }; @@ -26363,14 +47009,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - versionsList: jspb.Message.toObjectList(msg.getVersionsList(), - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject, includeInstance) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -26384,23 +47029,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -26408,9 +47053,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader); - msg.addVersions(value); + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -26425,9 +47070,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -26435,61 +47080,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersionsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * repeated VersionEntry versions = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.getVersionsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.setVersionsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.addVersions = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions.prototype.clearVersionsList = function() { - return this.setVersionsList([]); -}; - - @@ -26506,8 +47113,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); }; @@ -26516,14 +47123,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - versionNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), - voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; if (includeInstance) { @@ -26537,37 +47143,29 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { - case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVersionNumber(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVoteCount(value); - break; default: reader.skipField(); break; @@ -26579,212 +47177,51 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtoc /** * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersionNumber(); - if (f !== 0) { - writer.writeUint32( - 1, - f - ); - } - f = message.getVoteCount(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } -}; - - -/** - * optional uint32 version_number = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVersionNumber = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVersionNumber = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint32 vote_count = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.getVoteCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.VersionEntry.prototype.setVoteCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional Versions versions = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getVersions = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.Versions|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setVersions = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearVersions = function() { - return this.setVersions(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasVersions = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} returns this + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; }; /** - * optional GetProtocolVersionUpgradeStateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} + * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.GetProtocolVersionUpgradeStateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -26793,7 +47230,7 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -26807,21 +47244,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeStateResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); }; @@ -26839,8 +47276,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); }; @@ -26849,13 +47286,13 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -26869,23 +47306,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -26893,8 +47330,8 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -26910,9 +47347,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -26920,18 +47357,18 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter ); } }; @@ -26953,8 +47390,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); }; @@ -26963,15 +47400,15 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { var f, obj = { - startProTxHash: msg.getStartProTxHash_asB64(), - count: jspb.Message.getFieldWithDefault(msg, 2, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + proTxHash: msg.getProTxHash_asB64(), + nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), + isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -26985,23 +47422,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27010,15 +47447,15 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartProTxHash(value); + msg.setProTxHash(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); + var value = /** @type {string} */ (reader.readString()); + msg.setNodeIp(value); break; case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + msg.setIsBanned(value); break; default: reader.skipField(); @@ -27033,9 +47470,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27043,27 +47480,27 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartProTxHash_asU8(); + f = message.getProTxHash_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getCount(); - if (f !== 0) { - writer.writeUint32( + f = message.getNodeIp(); + if (f.length > 0) { + writer.writeString( 2, f ); } - f = message.getProve(); + f = message.getIsBanned(); if (f) { writer.writeBool( 3, @@ -27074,145 +47511,90 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetPr /** - * optional bytes start_pro_tx_hash = 1; + * optional bytes pro_tx_hash = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_pro_tx_hash = 1; - * This is a type-conversion wrapper around `getStartProTxHash()` + * optional bytes pro_tx_hash = 1; + * This is a type-conversion wrapper around `getProTxHash()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartProTxHash())); + this.getProTxHash())); }; /** - * optional bytes start_pro_tx_hash = 1; + * optional bytes pro_tx_hash = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartProTxHash()` + * This is a type-conversion wrapper around `getProTxHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getStartProTxHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartProTxHash())); + this.getProTxHash())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setStartProTxHash = function(value) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 2; - * @return {number} + * optional string node_ip = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); }; /** - * optional bool prove = 3; + * optional bool is_banned = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.getProve = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0.prototype.setProve = function(value) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { return jspb.Message.setProto3BooleanField(this, 3, value); }; -/** - * optional GetProtocolVersionUpgradeVoteStatusRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.GetProtocolVersionUpgradeVoteStatusRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest} returns this - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; @@ -27229,8 +47611,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); }; @@ -27239,13 +47621,17 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(includeInstance, f) + quorumHash: msg.getQuorumHash_asB64(), + coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), + thresholdPublicKey: msg.getThresholdPublicKey_asB64() }; if (includeInstance) { @@ -27259,23 +47645,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27283,9 +47669,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCoreHeight(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setThresholdPublicKey(value); break; default: reader.skipField(); @@ -27300,9 +47698,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27310,352 +47708,192 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, + f + ); + } + f = message.getCoreHeight(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter ); } -}; - - - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VERSIONS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - versions: (f = msg.getVersions()) && proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; + f = message.getThresholdPublicKey_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); } - return obj; }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional bytes quorum_hash = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional bytes quorum_hash = 1; + * This is a type-conversion wrapper around `getQuorumHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader); - msg.setVersions(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumHash())); }; /** - * Serializes the message to binary data (in protobuf wire format). + * optional bytes quorum_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumHash()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumHash())); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersions(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * optional uint32 core_height = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.toObject = function(includeInstance, msg) { - var f, obj = { - versionSignalsList: jspb.Message.toObjectList(msg.getVersionSignalsList(), - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + * repeated ValidatorV0 members = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} - */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader); - msg.addVersionSignals(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVersionSignalsList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { + return this.setMembersList([]); }; /** - * repeated VersionSignal version_signals = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} + * optional bytes threshold_public_key = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.getVersionSignalsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal>} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.setVersionSignalsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes threshold_public_key = 4; + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getThresholdPublicKey())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * optional bytes threshold_public_key = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getThresholdPublicKey()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.addVersionSignals = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal, opt_index); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getThresholdPublicKey())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals.prototype.clearVersionSignalsList = function() { - return this.setVersionSignalsList([]); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -27671,8 +47909,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); }; @@ -27681,14 +47919,18 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - version: jspb.Message.getFieldWithDefault(msg, 2, 0) + quorumHashesList: msg.getQuorumHashesList_asB64(), + currentQuorumHash: msg.getCurrentQuorumHash_asB64(), + validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), + lastBlockProposer: msg.getLastBlockProposer_asB64(), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -27702,23 +47944,23 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal; - return proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -27727,11 +47969,25 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + msg.addQuorumHashes(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVersion(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCurrentQuorumHash(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); + msg.addValidatorSets(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setLastBlockProposer(value); + break; + case 5: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -27746,9 +48002,9 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -27756,187 +48012,259 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} message + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); + f = message.getQuorumHashesList_asU8(); if (f.length > 0) { - writer.writeBytes( + writer.writeRepeatedBytes( 1, f ); } - f = message.getVersion(); - if (f !== 0) { - writer.writeUint32( + f = message.getCurrentQuorumHash_asU8(); + if (f.length > 0) { + writer.writeBytes( 2, f ); } + f = message.getValidatorSetsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter + ); + } + f = message.getLastBlockProposer_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 5, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; /** - * optional bytes pro_tx_hash = 1; - * @return {string} + * repeated bytes quorum_hashes = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} + * repeated bytes quorum_hashes = 1; + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getQuorumHashesList())); }; /** - * optional bytes pro_tx_hash = 1; + * repeated bytes quorum_hashes = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} + * This is a type-conversion wrapper around `getQuorumHashesList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getQuorumHashesList())); +}; + + +/** + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * optional uint32 version = 2; - * @return {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.getVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { + return this.setQuorumHashesList([]); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal} returns this + * optional bytes current_quorum_hash = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignal.prototype.setVersion = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * optional VersionSignals versions = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} + * optional bytes current_quorum_hash = 2; + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getVersions = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getCurrentQuorumHash())); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.VersionSignals|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * optional bytes current_quorum_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getCurrentQuorumHash()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getCurrentQuorumHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * repeated ValidatorSetV0 validator_sets = 3; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setVersions = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearVersions = function() { - return this.setVersions(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasVersions = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { + return this.setValidatorSetsList([]); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional bytes last_block_proposer = 4; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.oneofGroups_[0], value); + * optional bytes last_block_proposer = 4; + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getLastBlockProposer())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * optional bytes last_block_proposer = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getLastBlockProposer()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getLastBlockProposer())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); }; /** - * optional ResponseMetadata metadata = 3; + * optional ResponseMetadata metadata = 5; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 5, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -27945,35 +48273,35 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetP * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * optional GetProtocolVersionUpgradeVoteStatusResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} + * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.GetProtocolVersionUpgradeVoteStatusResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -27982,7 +48310,7 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -27996,21 +48324,21 @@ proto.org.dash.platform.dapi.v0.GetProtocolVersionUpgradeVoteStatusResponse.prot * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_[0])); }; @@ -28028,8 +48356,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.toObject(opt_includeInstance, this); }; @@ -28038,13 +48366,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.toObject = functi * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -28058,23 +48386,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.toObject = function(include /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28082,8 +48410,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -28099,9 +48427,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.deserializeBinaryFromReader * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28109,24 +48437,31 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.serializeBinary = /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter ); } }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.repeatedFields_ = [2]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28142,8 +48477,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject(opt_includeInstance, this); }; @@ -28152,16 +48487,15 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - startEpoch: (f = msg.getStartEpoch()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 2, 0), - ascending: jspb.Message.getBooleanFieldWithDefault(msg, 3, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + identityId: msg.getIdentityId_asB64(), + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -28175,23 +48509,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28199,19 +48533,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setStartEpoch(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addTokenIds(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAscending(value); - break; - case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -28228,9 +48557,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28238,38 +48567,30 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartEpoch(); - if (f != null) { - writer.writeMessage( + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getCount(); - if (f !== 0) { - writer.writeUint32( - 2, f ); } - f = message.getAscending(); - if (f) { - writer.writeBool( - 3, + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, f ); } f = message.getProve(); if (f) { writer.writeBool( - 4, + 3, f ); } @@ -28277,120 +48598,150 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.seri /** - * optional google.protobuf.UInt32Value start_epoch = 1; - * @return {?proto.google.protobuf.UInt32Value} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getStartEpoch = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setStartEpoch = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.clearStartEpoch = function() { - return this.setStartEpoch(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.hasStartEpoch = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 2; - * @return {number} + * repeated bytes token_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * repeated bytes token_ids = 2; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * optional bool ascending = 3; - * @return {boolean} + * repeated bytes token_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional bool prove = 4; + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); +}; + + +/** + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetEpochsInfoRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} + * optional GetIdentityTokenBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.GetEpochsInfoRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.GetIdentityTokenBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -28399,7 +48750,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.clearV0 = functio * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -28413,21 +48764,21 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoRequest.prototype.hasV0 = function( * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_[0])); }; @@ -28445,8 +48796,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.toObject(opt_includeInstance, this); }; @@ -28455,13 +48806,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.toObject = funct * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -28475,23 +48826,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.toObject = function(includ /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28499,8 +48850,8 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReade var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -28516,9 +48867,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.deserializeBinaryFromReade * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28526,18 +48877,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter ); } }; @@ -28552,22 +48903,22 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.serializeBinaryToWriter = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase = { RESULT_NOT_SET: 0, - EPOCHS: 1, + TOKEN_BALANCES: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0])); }; @@ -28585,8 +48936,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject(opt_includeInstance, this); }; @@ -28595,13 +48946,13 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - epochs: (f = msg.getEpochs()) && proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(includeInstance, f), + tokenBalances: (f = msg.getTokenBalances()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -28617,23 +48968,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28641,9 +48992,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader); - msg.setEpochs(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader); + msg.setTokenBalances(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -28668,9 +49019,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28678,18 +49029,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpochs(); + f = message.getTokenBalances(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter ); } f = message.getProof(); @@ -28712,13 +49063,6 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.se -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28734,8 +49078,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject(opt_includeInstance, this); }; @@ -28744,14 +49088,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject = function(includeInstance, msg) { var f, obj = { - epochInfosList: jspb.Message.toObjectList(msg.getEpochInfosList(), - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject, includeInstance) + tokenId: msg.getTokenId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -28765,23 +49109,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28789,9 +49133,12 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader); - msg.addEpochInfos(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; default: reader.skipField(); @@ -28806,9 +49153,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28816,62 +49163,115 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEpochInfosList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter + f + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64( + 2, + f ); } }; /** - * repeated EpochInfo epoch_infos = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.getEpochInfosList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo>} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this -*/ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.setEpochInfosList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.addEpochInfos = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos.prototype.clearEpochInfosList = function() { - return this.setEpochInfosList([]); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint64 balance = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.prototype.hasBalance = function() { + return jspb.Message.getField(this, 2) != null; }; +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -28887,8 +49287,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject(opt_includeInstance, this); }; @@ -28897,18 +49297,14 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.toObject = function(includeInstance, msg) { var f, obj = { - number: jspb.Message.getFieldWithDefault(msg, 1, 0), - firstBlockHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - firstCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), - startTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - feeMultiplier: jspb.Message.getFloatingPointFieldWithDefault(msg, 5, 0.0), - protocolVersion: jspb.Message.getFieldWithDefault(msg, 6, 0) + tokenBalancesList: jspb.Message.toObjectList(msg.getTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.toObject, includeInstance) }; if (includeInstance) { @@ -28922,23 +49318,23 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo; - return proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -28946,28 +49342,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint32()); - msg.setNumber(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFirstBlockHeight(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFirstCoreBlockHeight(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartTime(value); - break; - case 5: - var value = /** @type {number} */ (reader.readDouble()); - msg.setFeeMultiplier(value); - break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setProtocolVersion(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.deserializeBinaryFromReader); + msg.addTokenBalances(value); break; default: reader.skipField(); @@ -28982,9 +49359,9 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -28992,190 +49369,86 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.Ep /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getNumber(); - if (f !== 0) { - writer.writeUint32( + f = message.getTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getFirstBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 2, - f - ); - } - f = message.getFirstCoreBlockHeight(); - if (f !== 0) { - writer.writeUint32( - 3, - f - ); - } - f = message.getStartTime(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getFeeMultiplier(); - if (f !== 0.0) { - writer.writeDouble( - 5, - f - ); - } - f = message.getProtocolVersion(); - if (f !== 0) { - writer.writeUint32( - 6, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry.serializeBinaryToWriter ); } }; /** - * optional uint32 number = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getNumber = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setNumber = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional uint64 first_block_height = 2; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); -}; - - -/** - * optional uint32 first_core_block_height = 3; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFirstCoreBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFirstCoreBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); -}; - - -/** - * optional uint64 start_time = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getStartTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setStartTime = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); -}; - - -/** - * optional double fee_multiplier = 5; - * @return {number} + * repeated TokenBalanceEntry token_balances = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getFeeMultiplier = function() { - return /** @type {number} */ (jspb.Message.getFloatingPointFieldWithDefault(this, 5, 0.0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.getTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setFeeMultiplier = function(value) { - return jspb.Message.setProto3FloatField(this, 5, value); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.setTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * optional uint32 protocol_version = 6; - * @return {number} + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.getProtocolVersion = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.addTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalanceEntry, opt_index); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfo.prototype.setProtocolVersion = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances.prototype.clearTokenBalancesList = function() { + return this.setTokenBalancesList([]); }; /** - * optional EpochInfos epochs = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} + * optional TokenBalances token_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getEpochs = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getTokenBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.EpochInfos|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.TokenBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setEpochs = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setTokenBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearEpochs = function() { - return this.setEpochs(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearTokenBalances = function() { + return this.setTokenBalances(undefined); }; @@ -29183,7 +49456,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasEpochs = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasTokenBalances = function() { return jspb.Message.getField(this, 1) != null; }; @@ -29192,7 +49465,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -29200,18 +49473,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -29220,7 +49493,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -29229,7 +49502,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -29237,18 +49510,18 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -29257,35 +49530,35 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetEpochsInfoResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0, 1)); +/** + * optional GetIdentityTokenBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.GetEpochsInfoResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.GetIdentityTokenBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -29294,7 +49567,7 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.clearV0 = functi * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenBalancesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -29308,21 +49581,21 @@ proto.org.dash.platform.dapi.v0.GetEpochsInfoResponse.prototype.hasV0 = function * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_[0])); }; @@ -29340,8 +49613,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.toObject(opt_includeInstance, this); }; @@ -29350,13 +49623,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -29370,23 +49643,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -29394,8 +49667,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -29411,9 +49684,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -29421,18 +49694,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter ); } }; @@ -29444,7 +49717,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.serializeBinaryToWr * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.repeatedFields_ = [4,5]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.repeatedFields_ = [2]; @@ -29461,8 +49734,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject(opt_includeInstance, this); }; @@ -29471,21 +49744,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - startIndexValuesList: msg.getStartIndexValuesList_asB64(), - endIndexValuesList: msg.getEndIndexValuesList_asB64(), - startAtValueInfo: (f = msg.getStartAtValueInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 7, 0), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + tokenId: msg.getTokenId_asB64(), + identityIdsList: msg.getIdentityIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -29499,23 +49766,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -29524,38 +49791,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addStartIndexValues(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addEndIndexValues(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader); - msg.setStartAtValueInfo(value); - break; - case 7: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); + msg.addIdentityIds(value); break; - case 9: + case 3: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -29572,9 +49814,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -29582,197 +49824,30 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getStartIndexValuesList_asU8(); + f = message.getIdentityIdsList_asU8(); if (f.length > 0) { writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getEndIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 5, - f - ); - } - f = message.getStartAtValueInfo(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 7)); - if (f != null) { - writer.writeUint32( - 7, - f - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 8, + 2, f ); } f = message.getProve(); if (f) { writer.writeBool( - 9, - f - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.toObject = function(includeInstance, msg) { - var f, obj = { - startValue: msg.getStartValue_asB64(), - startValueIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartValue(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartValueIncluded(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartValue_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getStartValueIncluded(); - if (f) { - writer.writeBool( - 2, + 3, f ); } @@ -29780,398 +49855,150 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourc /** - * optional bytes start_value = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes start_value = 1; - * This is a type-conversion wrapper around `getStartValue()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartValue())); -}; - - -/** - * optional bytes start_value = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartValue()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValue_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartValue())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValue = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool start_value_included = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.getStartValueIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo.prototype.setStartValueIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type_name = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string index_name = 3; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - -/** - * repeated bytes start_index_values = 4; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); -}; - - -/** - * repeated bytes start_index_values = 4; - * This is a type-conversion wrapper around `getStartIndexValuesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getStartIndexValuesList())); -}; - - -/** - * repeated bytes start_index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIndexValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getStartIndexValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addStartIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartIndexValuesList = function() { - return this.setStartIndexValuesList([]); -}; - - -/** - * repeated bytes end_index_values = 5; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 5)); -}; - - -/** - * repeated bytes end_index_values = 5; - * This is a type-conversion wrapper around `getEndIndexValuesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getEndIndexValuesList())); -}; - - -/** - * repeated bytes end_index_values = 5; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEndIndexValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getEndIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getEndIndexValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setEndIndexValuesList = function(value) { - return jspb.Message.setField(this, 5, value || []); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.addEndIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 5, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearEndIndexValuesList = function() { - return this.setEndIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional StartAtValueInfo start_at_value_info = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getStartAtValueInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo, 6)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.StartAtValueInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setStartAtValueInfo = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearStartAtValueInfo = function() { - return this.setStartAtValueInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasStartAtValueInfo = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 count = 7; - * @return {number} + * repeated bytes identity_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * repeated bytes identity_ids = 2; + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentityIdsList())); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * repeated bytes identity_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 7, undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getIdentityIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentityIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setIdentityIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional bool order_ascending = 8; - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.addIdentityIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.clearIdentityIdsList = function() { + return this.setIdentityIdsList([]); }; /** - * optional bool prove = 9; + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetContestedResourcesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} + * optional GetIdentitiesTokenBalancesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.GetContestedResourcesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.GetIdentitiesTokenBalancesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -30180,7 +50007,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -30194,21 +50021,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_[0])); }; @@ -30226,8 +50053,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.toObject(opt_includeInstance, this); }; @@ -30236,13 +50063,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -30256,23 +50083,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30280,8 +50107,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -30297,9 +50124,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30307,18 +50134,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter ); } }; @@ -30333,22 +50160,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.serializeBinaryToW * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_VALUES: 1, + IDENTITY_TOKEN_BALANCES: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0])); }; @@ -30366,8 +50193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject(opt_includeInstance, this); }; @@ -30376,13 +50203,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceValues: (f = msg.getContestedResourceValues()) && proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(includeInstance, f), + identityTokenBalances: (f = msg.getIdentityTokenBalances()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -30398,23 +50225,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30422,9 +50249,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader); - msg.setContestedResourceValues(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader); + msg.setIdentityTokenBalances(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -30449,9 +50276,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30459,18 +50286,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceValues(); + f = message.getIdentityTokenBalances(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter ); } f = message.getProof(); @@ -30493,13 +50320,6 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -30515,8 +50335,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject(opt_includeInstance, this); }; @@ -30525,13 +50345,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceValuesList: msg.getContestedResourceValuesList_asB64() + identityId: msg.getIdentityId_asB64(), + balance: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -30545,23 +50366,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues; - return proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30570,7 +50391,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addContestedResourceValues(value); + msg.setIdentityId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint64()); + msg.setBalance(value); break; default: reader.skipField(); @@ -30585,9 +50410,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30595,145 +50420,95 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceValuesList_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } + f = /** @type {number} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeUint64( + 2, + f + ); + } }; /** - * repeated bytes contested_resource_values = 1; - * @return {!Array<string>} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes contested_resource_values = 1; - * This is a type-conversion wrapper around `getContestedResourceValuesList()` - * @return {!Array<string>} + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getContestedResourceValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * repeated bytes contested_resource_values = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContestedResourceValuesList()` - * @return {!Array<!Uint8Array>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.getContestedResourceValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getContestedResourceValuesList())); -}; - - -/** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.setContestedResourceValuesList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.addContestedResourceValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues.prototype.clearContestedResourceValuesList = function() { - return this.setContestedResourceValuesList([]); -}; - - -/** - * optional ContestedResourceValues contested_resource_values = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getContestedResourceValues = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.ContestedResourceValues|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setContestedResourceValues = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearContestedResourceValues = function() { - return this.setContestedResourceValues(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional uint64 balance = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasContestedResourceValues = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.getBalance = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.setBalance = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.clearBalance = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -30741,110 +50516,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResour * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.prototype.hasBalance = function() { return jspb.Message.getField(this, 2) != null; }; -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional GetContestedResourcesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.GetContestedResourcesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourcesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; -}; - - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.repeatedFields_ = [1]; @@ -30861,8 +50544,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject(opt_includeInstance, this); }; @@ -30871,13 +50554,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(includeInstance, f) + identityTokenBalancesList: jspb.Message.toObjectList(msg.getIdentityTokenBalancesList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.toObject, includeInstance) }; if (includeInstance) { @@ -30891,23 +50575,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -30915,9 +50599,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.deserializeBinaryFromReader); + msg.addIdentityTokenBalances(value); break; default: reader.skipField(); @@ -30932,9 +50616,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -30942,199 +50626,234 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getIdentityTokenBalancesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry.serializeBinaryToWriter ); } }; +/** + * repeated IdentityTokenBalanceEntry identity_token_balances = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.getIdentityTokenBalancesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.setIdentityTokenBalancesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.addIdentityTokenBalances = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalanceEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances.prototype.clearIdentityTokenBalancesList = function() { + return this.setIdentityTokenBalancesList([]); +}; + + +/** + * optional IdentityTokenBalances identity_token_balances = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getIdentityTokenBalances = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.IdentityTokenBalances|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setIdentityTokenBalances = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearIdentityTokenBalances = function() { + return this.setIdentityTokenBalances(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasIdentityTokenBalances = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional GetIdentitiesTokenBalancesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.toObject = function(includeInstance, msg) { - var f, obj = { - startTimeInfo: (f = msg.getStartTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(includeInstance, f), - endTimeInfo: (f = msg.getEndTimeInfo()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(includeInstance, f), - limit: jspb.Message.getFieldWithDefault(msg, 3, 0), - offset: jspb.Message.getFieldWithDefault(msg, 4, 0), - ascending: jspb.Message.getBooleanFieldWithDefault(msg, 5, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0, 1)); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader(msg, reader); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.GetIdentitiesTokenBalancesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.oneofGroups_[0], value); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader); - msg.setStartTimeInfo(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader); - msg.setEndTimeInfo(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLimit(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setOffset(value); - break; - case 5: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAscending(value); - break; - case 6: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenBalancesResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartTimeInfo(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter - ); - } - f = message.getEndTimeInfo(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint32( - 3, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeUint32( - 4, - f - ); - } - f = message.getAscending(); - if (f) { - writer.writeBool( - 5, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 6, - f - ); - } -}; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_[0])); +}; @@ -31151,8 +50870,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.toObject(opt_includeInstance, this); }; @@ -31161,14 +50880,13 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.toObject = function(includeInstance, msg) { var f, obj = { - startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), - startTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -31182,23 +50900,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31206,12 +50924,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setStartTimeMs(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartTimeIncluded(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -31226,9 +50941,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31236,65 +50951,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartTimeMs(); - if (f !== 0) { - writer.writeUint64( + f = message.getV0(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getStartTimeIncluded(); - if (f) { - writer.writeBool( - 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter ); } }; -/** - * optional uint64 start_time_ms = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); -}; - - -/** - * optional bool start_time_included = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.getStartTimeIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo.prototype.setStartTimeIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.repeatedFields_ = [2]; @@ -31311,8 +50991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject(opt_includeInstance, this); }; @@ -31321,14 +51001,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - endTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), - endTimeIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -31342,23 +51023,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31366,12 +51047,16 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setEndTimeMs(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setIdentityId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addTokenIds(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setEndTimeIncluded(value); + msg.setProve(value); break; default: reader.skipField(); @@ -31386,9 +51071,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31396,23 +51081,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getEndTimeMs(); - if (f !== 0) { - writer.writeUint64( + f = message.getIdentityId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, f ); } - f = message.getEndTimeIncluded(); + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -31420,139 +51112,151 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa /** - * optional uint64 end_time_ms = 1; - * @return {number} + * optional bytes identity_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getIdentityId())); }; /** - * optional bool end_time_included = 2; - * @return {boolean} + * optional bytes identity_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.getEndTimeIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getIdentityId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getIdentityId())); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo.prototype.setEndTimeIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setIdentityId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional StartAtTimeInfo start_time_info = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} + * repeated bytes token_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getStartTimeInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.StartAtTimeInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setStartTimeInfo = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * repeated bytes token_ids = 2; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * repeated bytes token_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearStartTimeInfo = function() { - return this.setStartTimeInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasStartTimeInfo = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional EndAtTimeInfo end_time_info = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getEndTimeInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.EndAtTimeInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setEndTimeInfo = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearEndTimeInfo = function() { - return this.setEndTimeInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasEndTimeInfo = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional uint32 limit = 3; - * @return {number} + * optional GetIdentityTokenInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getLimit = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setField(this, 3, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.GetIdentityTokenInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.oneofGroups_[0], value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearLimit = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -31560,117 +51264,147 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDa * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * optional uint32 offset = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getOffset = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); -}; - /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setField(this, 4, value); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_ = [[1]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.clearOffset = function() { - return jspb.Message.setField(this, 4, undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_[0])); }; -/** - * optional bool ascending = 5; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.toObject(opt_includeInstance, this); }; /** - * optional bool prove = 6; - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); -}; - +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject(includeInstance, f) + }; -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetVotePollsByEndDateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.GetVotePollsByEndDateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter + ); + } }; @@ -31683,21 +51417,22 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + TOKEN_INFOS: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0])); }; @@ -31715,8 +51450,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -31725,13 +51460,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(includeInstance, f) + tokenInfos: (f = msg.getTokenInfos()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -31745,23 +51482,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31769,9 +51506,19 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader); + msg.setTokenInfos(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -31786,9 +51533,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31796,52 +51543,172 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getTokenInfos(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(opt_includeInstance, this); +}; + /** - * @enum {number} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - VOTE_POLLS_BY_TIMESTAMPS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject = function(includeInstance, msg) { + var f, obj = { + frozen: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} + /** - * @return {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFrozen(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFrozen(); + if (f) { + writer.writeBool( + 1, + f + ); + } +}; + + +/** + * optional bool frozen = 1; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.getFrozen = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.setFrozen = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -31855,8 +51722,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject(opt_includeInstance, this); }; @@ -31865,15 +51732,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - votePollsByTimestamps: (f = msg.getVotePollsByTimestamps()) && proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + tokenId: msg.getTokenId_asB64(), + info: (f = msg.getInfo()) && proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -31887,23 +51753,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -31911,19 +51777,13 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader); - msg.setVotePollsByTimestamps(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader); + msg.setInfo(value); break; default: reader.skipField(); @@ -31938,9 +51798,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -31948,46 +51808,116 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotePollsByTimestamps(); - if (f != null) { - writer.writeMessage( + f = message.getTokenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter + f ); } - f = message.getProof(); + f = message.getInfo(); if (f != null) { writer.writeMessage( 2, f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter ); } }; +/** + * optional bytes token_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); +}; + + +/** + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional TokenIdentityInfoEntry info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.getInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenIdentityInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.clearInfo = function() { + return this.setInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; +}; + + /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.repeatedFields_ = [2]; +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.repeatedFields_ = [1]; @@ -32004,8 +51934,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject(opt_includeInstance, this); }; @@ -32014,14 +51944,14 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.toObject = function(includeInstance, msg) { var f, obj = { - timestamp: jspb.Message.getFieldWithDefault(msg, 1, 0), - serializedVotePollsList: msg.getSerializedVotePollsList_asB64() + tokenInfosList: jspb.Message.toObjectList(msg.getTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.toObject, includeInstance) }; if (includeInstance) { @@ -32035,23 +51965,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos; + return proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32059,12 +51989,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTimestamp(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addSerializedVotePolls(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader); + msg.addTokenInfos(value); break; default: reader.skipField(); @@ -32079,9 +52006,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32089,105 +52016,345 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTimestamp(); - if (f !== 0) { - writer.writeUint64( - 1, - f - ); - } - f = message.getSerializedVotePollsList_asU8(); + f = message.getTokenInfosList(); if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter ); } }; /** - * optional uint64 timestamp = 1; - * @return {number} + * repeated TokenInfoEntry token_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getTimestamp = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.getTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.setTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setTimestamp = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.addTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfoEntry, opt_index); }; /** - * repeated bytes serialized_vote_polls = 2; - * @return {!Array<string>} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos.prototype.clearTokenInfosList = function() { + return this.setTokenInfosList([]); }; /** - * repeated bytes serialized_vote_polls = 2; - * This is a type-conversion wrapper around `getSerializedVotePollsList()` - * @return {!Array<string>} + * optional TokenInfos token_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getTokenInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.TokenInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setTokenInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearTokenInfos = function() { + return this.setTokenInfos(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasTokenInfos = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional GetIdentityTokenInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.GetIdentityTokenInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.clearV0 = function() { + return this.setV0(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetIdentityTokenInfosResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getSerializedVotePollsList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * repeated bytes serialized_vote_polls = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSerializedVotePollsList()` - * @return {!Array<!Uint8Array>} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.getSerializedVotePollsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getSerializedVotePollsList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.setSerializedVotePollsList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.addSerializedVotePolls = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.prototype.clearSerializedVotePollsList = function() { - return this.setSerializedVotePollsList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter + ); + } }; @@ -32197,7 +52364,7 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.repeatedFields_ = [2]; @@ -32214,8 +52381,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject(opt_includeInstance, this); }; @@ -32224,15 +52391,15 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - votePollsByTimestampsList: jspb.Message.toObjectList(msg.getVotePollsByTimestampsList(), - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.toObject, includeInstance), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + tokenId: msg.getTokenId_asB64(), + identityIdsList: msg.getIdentityIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -32246,23 +52413,23 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps; - return proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32270,13 +52437,16 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.deserializeBinaryFromReader); - msg.addVotePollsByTimestamps(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.addIdentityIds(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + msg.setProve(value); break; default: reader.skipField(); @@ -32291,9 +52461,9 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32301,24 +52471,30 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotePollsByTimestampsList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp.serializeBinaryToWriter + f ); } - f = message.getFinishedResults(); + f = message.getIdentityIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( + 2, + f + ); + } + f = message.getProve(); if (f) { writer.writeBool( - 2, + 3, f ); } @@ -32326,196 +52502,150 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndD /** - * repeated SerializedVotePollsByTimestamp vote_polls_by_timestamps = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getVotePollsByTimestampsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp>} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setVotePollsByTimestampsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp} + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.addVotePollsByTimestamps = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamp, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.clearVotePollsByTimestampsList = function() { - return this.setVotePollsByTimestampsList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * optional bool finished_results = 2; - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} returns this + * repeated bytes identity_ids = 2; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); }; /** - * optional SerializedVotePollsByTimestamps vote_polls_by_timestamps = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} + * repeated bytes identity_ids = 2; + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getVotePollsByTimestamps = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.SerializedVotePollsByTimestamps|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setVotePollsByTimestamps = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getIdentityIdsList())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this + * repeated bytes identity_ids = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getIdentityIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearVotePollsByTimestamps = function() { - return this.setVotePollsByTimestamps(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getIdentityIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getIdentityIdsList())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasVotePollsByTimestamps = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setIdentityIdsList = function(value) { + return jspb.Message.setField(this, 2, value || []); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * @param {!(string|Uint8Array)} value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.addIdentityIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.clearIdentityIdsList = function() { + return this.setIdentityIdsList([]); }; /** - * Returns whether this field is set. + * optional bool prove = 3; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional GetVotePollsByEndDateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} + * optional GetIdentitiesTokenInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.GetVotePollsByEndDateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.GetIdentitiesTokenInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -32524,7 +52654,7 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -32538,21 +52668,21 @@ proto.org.dash.platform.dapi.v0.GetVotePollsByEndDateResponse.prototype.hasV0 = * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_[0])); }; @@ -32570,8 +52700,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.toObject(opt_includeInstance, this); }; @@ -32580,13 +52710,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.t * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -32600,23 +52730,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32624,8 +52754,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserialize var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -32641,9 +52771,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.deserialize * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32651,18 +52781,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.s /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter ); } }; @@ -32670,11 +52800,30 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.serializeBi /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.repeatedFields_ = [4]; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + IDENTITY_TOKEN_INFOS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0])); +}; @@ -32691,8 +52840,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -32701,21 +52850,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - indexValuesList: msg.getIndexValuesList_asB64(), - resultType: jspb.Message.getFieldWithDefault(msg, 5, 0), - allowIncludeLockedAndAbstainingVoteTally: jspb.Message.getBooleanFieldWithDefault(msg, 6, false), - startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 8, 0), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + identityTokenInfos: (f = msg.getIdentityTokenInfos()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -32729,23 +52872,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32753,41 +52896,19 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader); + msg.setIdentityTokenInfos(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIndexValues(value); - break; - case 5: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (reader.readEnum()); - msg.setResultType(value); - break; - case 6: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setAllowIncludeLockedAndAbstainingVoteTally(value); - break; - case 7: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); - msg.setStartAtIdentifierInfo(value); - break; - case 8: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 9: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -32802,9 +52923,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32812,73 +52933,145 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getIdentityTokenInfos(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getResultType(); - if (f !== 0.0) { - writer.writeEnum( - 5, - f - ); - } - f = message.getAllowIncludeLockedAndAbstainingVoteTally(); - if (f) { - writer.writeBool( - 6, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getStartAtIdentifierInfo(); + f = message.getMetadata(); if (f != null) { writer.writeMessage( - 7, + 3, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 8)); - if (f != null) { - writer.writeUint32( - 8, - f - ); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject = function(includeInstance, msg) { + var f, obj = { + frozen: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; } - f = message.getProve(); + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setFrozen(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFrozen(); if (f) { writer.writeBool( - 9, + 1, f ); } @@ -32886,17 +53079,26 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** - * @enum {number} + * optional bool frozen = 1; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType = { - DOCUMENTS: 0, - VOTE_TALLY: 1, - DOCUMENTS_AND_VOTE_TALLY: 2 +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.getFrozen = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.prototype.setFrozen = function(value) { + return jspb.Message.setProto3BooleanField(this, 1, value); }; + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -32910,8 +53112,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject(opt_includeInstance, this); }; @@ -32920,14 +53122,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - startIdentifier: msg.getStartIdentifier_asB64(), - startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + identityId: msg.getIdentityId_asB64(), + info: (f = msg.getInfo()) && proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -32941,23 +53143,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -32966,11 +53168,12 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartIdentifier(value); + msg.setIdentityId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartIdentifierIncluded(value); + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.deserializeBinaryFromReader); + msg.setInfo(value); break; default: reader.skipField(); @@ -32985,9 +53188,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -32995,289 +53198,331 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartIdentifier_asU8(); + f = message.getIdentityId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getStartIdentifierIncluded(); - if (f) { - writer.writeBool( + f = message.getInfo(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry.serializeBinaryToWriter ); } }; /** - * optional bytes start_identifier = 1; + * optional bytes identity_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_identifier = 1; - * This is a type-conversion wrapper around `getStartIdentifier()` + * optional bytes identity_id = 1; + * This is a type-conversion wrapper around `getIdentityId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartIdentifier())); + this.getIdentityId())); }; /** - * optional bytes start_identifier = 1; + * optional bytes identity_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIdentifier()` + * This is a type-conversion wrapper around `getIdentityId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getIdentityId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartIdentifier())); + this.getIdentityId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.setIdentityId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool start_identifier_included = 2; - * @return {boolean} + * optional TokenIdentityInfoEntry info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.getInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry, 2)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenIdentityInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * optional bytes contract_id = 1; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.clearInfo = function() { + return this.setInfo(undefined); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; }; -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.repeatedFields_ = [1]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional string document_type_name = 2; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject(opt_includeInstance, this); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.toObject = function(includeInstance, msg) { + var f, obj = { + tokenInfosList: jspb.Message.toObjectList(msg.getTokenInfosList(), + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional string index_name = 3; - * @return {string} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos; + return proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader(msg, reader); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.deserializeBinaryFromReader); + msg.addTokenInfos(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * repeated bytes index_values = 4; - * @return {!Array<string>} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * repeated bytes index_values = 4; - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<string>} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenInfosList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry.serializeBinaryToWriter + ); + } }; /** - * repeated bytes index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<!Uint8Array>} + * repeated TokenInfoEntry token_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.getTokenInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.setTokenInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * @param {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.addIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.addTokenInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.TokenInfoEntry, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearIndexValuesList = function() { - return this.setIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos.prototype.clearTokenInfosList = function() { + return this.setTokenInfosList([]); }; /** - * optional ResultType result_type = 5; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} + * optional IdentityTokenInfos identity_token_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getResultType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getIdentityTokenInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos, 1)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.ResultType} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setResultType = function(value) { - return jspb.Message.setProto3EnumField(this, 5, value); + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.IdentityTokenInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setIdentityTokenInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0], value); }; /** - * optional bool allow_include_locked_and_abstaining_vote_tally = 6; - * @return {boolean} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getAllowIncludeLockedAndAbstainingVoteTally = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearIdentityTokenInfos = function() { + return this.setIdentityTokenInfos(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setAllowIncludeLockedAndAbstainingVoteTally = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasIdentityTokenInfos = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional StartAtIdentifierInfo start_at_identifier_info = 7; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getStartAtIdentifierInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo, 7)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.StartAtIdentifierInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setStartAtIdentifierInfo = function(value) { - return jspb.Message.setWrapperField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearStartAtIdentifierInfo = function() { - return this.setStartAtIdentifierInfo(undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -33285,35 +53530,36 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasStartAtIdentifierInfo = function() { - return jspb.Message.getField(this, 7) != null; +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint32 count = 8; - * @return {number} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 8, value); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 8, undefined); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -33321,53 +53567,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetConteste * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 8) != null; -}; - - -/** - * optional bool prove = 9; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetContestedResourceVoteStateRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} + * optional GetIdentitiesTokenInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.GetContestedResourceVoteStateRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.GetIdentitiesTokenInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -33376,7 +53604,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.c * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetIdentitiesTokenInfosResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -33390,21 +53618,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateRequest.prototype.h * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_[0])); }; @@ -33422,8 +53650,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.toObject(opt_includeInstance, this); }; @@ -33432,13 +53660,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -33452,23 +53680,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -33476,8 +53704,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -33493,9 +53721,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -33503,18 +53731,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter ); } }; @@ -33522,172 +53750,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.serializeB /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_ = [[1,2]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_CONTENDERS: 1, - PROOF: 2 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0])); -}; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.toObject = function(includeInstance, msg) { - var f, obj = { - contestedResourceContenders: (f = msg.getContestedResourceContenders()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader); - msg.setContestedResourceContenders(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getContestedResourceContenders(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.repeatedFields_ = [1]; @@ -33704,8 +53771,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject(opt_includeInstance, this); }; @@ -33714,18 +53781,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - finishedVoteOutcome: jspb.Message.getFieldWithDefault(msg, 1, 0), - wonByIdentityId: msg.getWonByIdentityId_asB64(), - finishedAtBlockHeight: jspb.Message.getFieldWithDefault(msg, 3, 0), - finishedAtCoreBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), - finishedAtBlockTimeMs: jspb.Message.getFieldWithDefault(msg, 5, 0), - finishedAtEpoch: jspb.Message.getFieldWithDefault(msg, 6, 0) + tokenIdsList: msg.getTokenIdsList_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -33739,23 +53802,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -33763,28 +53826,12 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (reader.readEnum()); - msg.setFinishedVoteOutcome(value); - break; - case 2: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setWonByIdentityId(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFinishedAtBlockHeight(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFinishedAtCoreBlockHeight(value); - break; - case 5: - var value = /** @type {number} */ (reader.readUint64()); - msg.setFinishedAtBlockTimeMs(value); + msg.addTokenIds(value); break; - case 6: - var value = /** @type {number} */ (reader.readUint32()); - msg.setFinishedAtEpoch(value); + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -33799,9 +53846,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -33809,223 +53856,170 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getFinishedVoteOutcome(); - if (f !== 0.0) { - writer.writeEnum( + f = message.getTokenIdsList_asU8(); + if (f.length > 0) { + writer.writeRepeatedBytes( 1, f ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( + f = message.getProve(); + if (f) { + writer.writeBool( 2, f ); } - f = message.getFinishedAtBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 3, - f - ); - } - f = message.getFinishedAtCoreBlockHeight(); - if (f !== 0) { - writer.writeUint32( - 4, - f - ); - } - f = message.getFinishedAtBlockTimeMs(); - if (f !== 0) { - writer.writeUint64( - 5, - f - ); - } - f = message.getFinishedAtEpoch(); - if (f !== 0) { - writer.writeUint32( - 6, - f - ); - } -}; - - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome = { - TOWARDS_IDENTITY: 0, - LOCKED: 1, - NO_PREVIOUS_WINNER: 2 -}; - -/** - * optional FinishedVoteOutcome finished_vote_outcome = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedVoteOutcome = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.FinishedVoteOutcome} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * repeated bytes token_ids = 1; + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedVoteOutcome = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList = function() { + return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * optional bytes won_by_identity_id = 2; - * @return {string} + * repeated bytes token_ids = 1; + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<string>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList_asB64 = function() { + return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( + this.getTokenIdsList())); }; /** - * optional bytes won_by_identity_id = 2; - * This is a type-conversion wrapper around `getWonByIdentityId()` - * @return {string} + * repeated bytes token_ids = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenIdsList()` + * @return {!Array<!Uint8Array>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getWonByIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getTokenIdsList_asU8 = function() { + return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( + this.getTokenIdsList())); }; /** - * optional bytes won_by_identity_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getWonByIdentityId()` - * @return {!Uint8Array} + * @param {!(Array<!Uint8Array>|Array<string>)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getWonByIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getWonByIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.setTokenIdsList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setWonByIdentityId = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.addTokenIds = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.clearWonByIdentityId = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.clearTokenIdsList = function() { + return this.setTokenIdsList([]); }; /** - * Returns whether this field is set. + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.hasWonByIdentityId = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * optional uint64 finished_at_block_height = 3; - * @return {number} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * optional GetTokenStatusesRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0, 1)); }; /** - * optional uint32 finished_at_core_block_height = 4; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtCoreBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.GetTokenStatusesRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.oneofGroups_[0], value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtCoreBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; /** - * optional uint64 finished_at_block_time_ms = 5; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtBlockTimeMs = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtBlockTimeMs = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); -}; - /** - * optional uint32 finished_at_epoch = 6; - * @return {number} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.getFinishedAtEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_ = [[1]]; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.prototype.setFinishedAtEpoch = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 }; - - /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_[0])); +}; @@ -34042,8 +54036,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.toObject(opt_includeInstance, this); }; @@ -34052,17 +54046,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.toObject = function(includeInstance, msg) { var f, obj = { - contendersList: jspb.Message.toObjectList(msg.getContendersList(), - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject, includeInstance), - abstainVoteTally: jspb.Message.getFieldWithDefault(msg, 2, 0), - lockVoteTally: jspb.Message.getFieldWithDefault(msg, 3, 0), - finishedVoteInfo: (f = msg.getFinishedVoteInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -34076,23 +54066,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34100,22 +54090,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader); - msg.addContenders(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setAbstainVoteTally(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLockVoteTally(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.deserializeBinaryFromReader); - msg.setFinishedVoteInfo(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -34130,9 +54107,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34140,189 +54117,188 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContendersList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint32( - 2, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint32( - 3, - f - ); - } - f = message.getFinishedVoteInfo(); + f = message.getV0(); if (f != null) { writer.writeMessage( - 4, + 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter ); } }; -/** - * repeated Contender contenders = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getContendersList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, 1)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender>} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setContendersList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.addContenders = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearContendersList = function() { - return this.setContendersList([]); -}; - /** - * optional uint32 abstain_vote_tally = 2; - * @return {number} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getAbstainVoteTally = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_ = [[1,2]]; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setAbstainVoteTally = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + TOKEN_STATUSES: 1, + PROOF: 2 }; - /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * @return {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearAbstainVoteTally = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0])); }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasAbstainVoteTally = function() { - return jspb.Message.getField(this, 2) != null; -}; - +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint32 lock_vote_tally = 3; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getLockVoteTally = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setLockVoteTally = function(value) { - return jspb.Message.setField(this, 3, value); -}; - +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.toObject = function(includeInstance, msg) { + var f, obj = { + tokenStatuses: (f = msg.getTokenStatuses()) && proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearLockVoteTally = function() { - return jspb.Message.setField(this, 3, undefined); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * Returns whether this field is set. - * @return {boolean} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasLockVoteTally = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader(msg, reader); }; /** - * optional FinishedVoteInfo finished_vote_info = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.getFinishedVoteInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo, 4)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.FinishedVoteInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.setFinishedVoteInfo = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader); + msg.setTokenStatuses(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.clearFinishedVoteInfo = function() { - return this.setFinishedVoteInfo(undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders.prototype.hasFinishedVoteInfo = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenStatuses(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } }; @@ -34342,8 +54318,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject(opt_includeInstance, this); }; @@ -34352,15 +54328,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject = function(includeInstance, msg) { var f, obj = { - identifier: msg.getIdentifier_asB64(), - voteCount: jspb.Message.getFieldWithDefault(msg, 2, 0), - document: msg.getDocument_asB64() + tokenId: msg.getTokenId_asB64(), + paused: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -34374,23 +54349,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34399,15 +54374,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentifier(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setVoteCount(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setDocument(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setPaused(value); break; default: reader.skipField(); @@ -34422,9 +54393,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34432,30 +54403,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentifier_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeUint32( - 2, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 3)); + f = /** @type {boolean} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeBytes( - 3, + writer.writeBool( + 2, f ); } @@ -34463,70 +54427,70 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** - * optional bytes identifier = 1; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes identifier = 1; - * This is a type-conversion wrapper around `getIdentifier()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentifier())); + this.getTokenId())); }; /** - * optional bytes identifier = 1; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentifier()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentifier())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.setTokenId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 vote_count = 2; - * @return {number} + * optional bool paused = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getVoteCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.getPaused = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setVoteCount = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.setPaused = function(value) { return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearVoteCount = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.clearPaused = function() { return jspb.Message.setField(this, 2, undefined); }; @@ -34535,96 +54499,196 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasVoteCount = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.prototype.hasPaused = function() { return jspb.Message.getField(this, 2) != null; }; + /** - * optional bytes document = 3; - * @return {string} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject(opt_includeInstance, this); }; /** - * optional bytes document = 3; - * This is a type-conversion wrapper around `getDocument()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getDocument())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.toObject = function(includeInstance, msg) { + var f, obj = { + tokenStatusesList: jspb.Message.toObjectList(msg.getTokenStatusesList(), + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes document = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getDocument()` + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses; + return proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.deserializeBinaryFromReader); + msg.addTokenStatuses(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.getDocument_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getDocument())); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.setDocument = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenStatusesList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry.serializeBinaryToWriter + ); + } }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender} returns this + * repeated TokenStatusEntry token_statuses = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.clearDocument = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.getTokenStatusesList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, 1)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.setTokenStatusesList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.Contender.prototype.hasDocument = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.addTokenStatuses = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatusEntry, opt_index); }; /** - * optional ContestedResourceContenders contested_resource_contenders = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getContestedResourceContenders = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders, 1)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses.prototype.clearTokenStatusesList = function() { + return this.setTokenStatusesList([]); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.ContestedResourceContenders|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * optional TokenStatuses token_statuses = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} + */ +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getTokenStatuses = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.TokenStatuses|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setContestedResourceContenders = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setTokenStatuses = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearContestedResourceContenders = function() { - return this.setContestedResourceContenders(undefined); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearTokenStatuses = function() { + return this.setTokenStatuses(undefined); }; @@ -34632,7 +54696,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasContestedResourceContenders = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasTokenStatuses = function() { return jspb.Message.getField(this, 1) != null; }; @@ -34641,7 +54705,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -34649,18 +54713,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -34669,7 +54733,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -34678,7 +54742,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -34686,18 +54750,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -34706,35 +54770,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContest * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; /** - * optional GetContestedResourceVoteStateResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} + * optional GetTokenStatusesResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.GetContestedResourceVoteStateResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.GetTokenStatusesResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -34743,7 +54807,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenStatusesResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -34757,21 +54821,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVoteStateResponse.prototype. * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_[0])); }; @@ -34789,8 +54853,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.toObject(opt_includeInstance, this); }; @@ -34799,13 +54863,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -34819,23 +54883,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34843,8 +54907,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.des var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -34860,9 +54924,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -34870,31 +54934,24 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter ); } }; -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.repeatedFields_ = [4]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -34910,8 +54967,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject(opt_includeInstance, this); }; @@ -34920,21 +54977,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - indexName: jspb.Message.getFieldWithDefault(msg, 3, ""), - indexValuesList: msg.getIndexValuesList_asB64(), - contestantId: msg.getContestantId_asB64(), - startAtIdentifierInfo: (f = msg.getStartAtIdentifierInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(includeInstance, f), - count: jspb.Message.getFieldWithDefault(msg, 7, 0), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 8, false), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + tokenId: msg.getTokenId_asB64(), + startAtInfo: (f = msg.getStartAtInfo()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject(includeInstance, f), + limit: jspb.Message.getFieldWithDefault(msg, 3, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) }; if (includeInstance) { @@ -34948,23 +55000,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -34973,38 +55025,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); + msg.setTokenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader); + msg.setStartAtInfo(value); break; case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setIndexName(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addIndexValues(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContestantId(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader); - msg.setStartAtIdentifierInfo(value); - break; - case 7: var value = /** @type {number} */ (reader.readUint32()); - msg.setCount(value); - break; - case 8: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); + msg.setLimit(value); break; - case 9: + case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -35021,9 +55053,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35031,73 +55063,38 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getIndexName(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } - f = message.getIndexValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 4, - f - ); - } - f = message.getContestantId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getStartAtIdentifierInfo(); + f = message.getStartAtInfo(); if (f != null) { writer.writeMessage( - 6, + 2, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter ); } - f = /** @type {number} */ (jspb.Message.getField(message, 7)); + f = /** @type {number} */ (jspb.Message.getField(message, 3)); if (f != null) { writer.writeUint32( - 7, - f - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 8, + 3, f ); } f = message.getProve(); if (f) { writer.writeBool( - 9, + 4, f ); } @@ -35120,8 +55117,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject(opt_includeInstance, this); }; @@ -35130,14 +55127,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.toObject = function(includeInstance, msg) { var f, obj = { - startIdentifier: msg.getStartIdentifier_asB64(), - startIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + startTimeMs: jspb.Message.getFieldWithDefault(msg, 1, 0), + startRecipient: msg.getStartRecipient_asB64(), + startRecipientIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) }; if (includeInstance) { @@ -35151,23 +55149,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35175,12 +55173,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartIdentifier(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setStartTimeMs(value); break; case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartRecipient(value); + break; + case 3: var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartIdentifierIncluded(value); + msg.setStartRecipientIncluded(value); break; default: reader.skipField(); @@ -35195,9 +55197,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35205,295 +55207,217 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getStartIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getStartTimeMs(); + if (f !== 0) { + writer.writeUint64( 1, f ); } - f = message.getStartIdentifierIncluded(); - if (f) { - writer.writeBool( + f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeBytes( 2, f ); } + f = /** @type {boolean} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeBool( + 3, + f + ); + } }; /** - * optional bytes start_identifier = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes start_identifier = 1; - * This is a type-conversion wrapper around `getStartIdentifier()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartIdentifier())); -}; - - -/** - * optional bytes start_identifier = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartIdentifier()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifier_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartIdentifier())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifier = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional bool start_identifier_included = 2; - * @return {boolean} + * optional uint64 start_time_ms = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.getStartIdentifierIncluded = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartTimeMs = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo.prototype.setStartIdentifierIncluded = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartTimeMs = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional bytes contract_id = 1; + * optional bytes start_recipient = 2; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` + * optional bytes start_recipient = 2; + * This is a type-conversion wrapper around `getStartRecipient()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); + this.getStartRecipient())); }; /** - * optional bytes contract_id = 1; + * optional bytes start_recipient = 2; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` + * This is a type-conversion wrapper around `getStartRecipient()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContractId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipient_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); + this.getStartRecipient())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string document_type_name = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional string index_name = 3; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexName = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartRecipient = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * repeated bytes index_values = 4; - * @return {!Array<string>} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 4)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.clearStartRecipient = function() { + return jspb.Message.setField(this, 2, undefined); }; /** - * repeated bytes index_values = 4; - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.hasStartRecipient = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * repeated bytes index_values = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIndexValuesList()` - * @return {!Array<!Uint8Array>} + * optional bool start_recipient_included = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getIndexValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getIndexValuesList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.getStartRecipientIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setIndexValuesList = function(value) { - return jspb.Message.setField(this, 4, value || []); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.setStartRecipientIncluded = function(value) { + return jspb.Message.setField(this, 3, value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.addIndexValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 4, value, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.clearStartRecipientIncluded = function() { + return jspb.Message.setField(this, 3, undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearIndexValuesList = function() { - return this.setIndexValuesList([]); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo.prototype.hasStartRecipientIncluded = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bytes contestant_id = 5; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes contestant_id = 5; - * This is a type-conversion wrapper around `getContestantId()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContestantId())); + this.getTokenId())); }; /** - * optional bytes contestant_id = 5; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContestantId()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getContestantId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContestantId())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setContestantId = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional StartAtIdentifierInfo start_at_identifier_info = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} + * optional StartAtInfo start_at_info = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getStartAtIdentifierInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo, 6)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getStartAtInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.StartAtIdentifierInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.StartAtInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setStartAtIdentifierInfo = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setStartAtInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearStartAtIdentifierInfo = function() { - return this.setStartAtIdentifierInfo(undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.clearStartAtInfo = function() { + return this.setStartAtInfo(undefined); }; @@ -35501,35 +55425,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasStartAtIdentifierInfo = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.hasStartAtInfo = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint32 count = 7; + * optional uint32 limit = 3; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getLimit = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setCount = function(value) { - return jspb.Message.setField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setLimit = function(value) { + return jspb.Message.setField(this, 3, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.clearCount = function() { - return jspb.Message.setField(this, 7, undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.clearLimit = function() { + return jspb.Message.setField(this, 3, undefined); }; @@ -35537,71 +55461,53 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.Get * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.hasCount = function() { - return jspb.Message.getField(this, 7) != null; -}; - - -/** - * optional bool order_ascending = 8; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 8, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.hasLimit = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional bool prove = 9; + * optional bool prove = 4; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 9, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * optional GetContestedResourceVotersForIdentityRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} + * optional GetTokenPreProgrammedDistributionsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.GetContestedResourceVotersForIdentityRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.GetTokenPreProgrammedDistributionsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -35610,7 +55516,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -35624,21 +55530,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityRequest.pro * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_[0])); }; @@ -35656,8 +55562,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.toObject(opt_includeInstance, this); }; @@ -35666,13 +55572,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -35686,23 +55592,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35710,8 +55616,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -35727,9 +55633,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35737,18 +55643,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter ); } }; @@ -35763,22 +55669,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.se * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CONTESTED_RESOURCE_VOTERS: 1, + TOKEN_DISTRIBUTIONS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0])); }; @@ -35796,8 +55702,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject(opt_includeInstance, this); }; @@ -35806,13 +55712,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceVoters: (f = msg.getContestedResourceVoters()) && proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(includeInstance, f), + tokenDistributions: (f = msg.getTokenDistributions()) && proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -35828,23 +55734,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -35852,9 +55758,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader); - msg.setContestedResourceVoters(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader); + msg.setTokenDistributions(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -35879,9 +55785,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -35889,18 +55795,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceVoters(); + f = message.getTokenDistributions(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter ); } f = message.getProof(); @@ -35923,13 +55829,6 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.repeatedFields_ = [1]; - if (jspb.Message.GENERATE_TO_OBJECT) { @@ -35945,8 +55844,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject(opt_includeInstance, this); }; @@ -35955,14 +55854,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject = function(includeInstance, msg) { var f, obj = { - votersList: msg.getVotersList_asB64(), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + recipientId: msg.getRecipientId_asB64(), + amount: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -35976,23 +55875,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters; - return proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36001,11 +55900,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addVoters(value); + msg.setRecipientId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; default: reader.skipField(); @@ -36020,9 +55919,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36030,22 +55929,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotersList_asU8(); + f = message.getRecipientId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } - f = message.getFinishedResults(); - if (f) { - writer.writeBool( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 2, f ); @@ -36054,109 +55953,440 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** - * repeated bytes voters = 1; - * @return {!Array<string>} + * optional bytes recipient_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes voters = 1; - * This is a type-conversion wrapper around `getVotersList()` - * @return {!Array<string>} + * optional bytes recipient_id = 1; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getVotersList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; /** - * repeated bytes voters = 1; + * optional bytes recipient_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getVotersList()` - * @return {!Array<!Uint8Array>} + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getVotersList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getVotersList())); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setVotersList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * optional uint64 amount = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + timestamp: jspb.Message.getFieldWithDefault(msg, 1, 0), + distributionsList: jspb.Message.toObjectList(msg.getDistributionsList(), + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTimestamp(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.deserializeBinaryFromReader); + msg.addDistributions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTimestamp(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getDistributionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * optional uint64 timestamp = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.getTimestamp = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.setTimestamp = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * repeated TokenDistributionEntry distributions = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.getDistributionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.setDistributionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.addVoters = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.addDistributions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributionEntry, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.clearVotersList = function() { - return this.setVotersList([]); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.prototype.clearDistributionsList = function() { + return this.setDistributionsList([]); }; + /** - * optional bool finished_results = 2; - * @return {boolean} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.repeatedFields_ = [1]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject(opt_includeInstance, this); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.toObject = function(includeInstance, msg) { + var f, obj = { + tokenDistributionsList: jspb.Message.toObjectList(msg.getTokenDistributionsList(), + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional ContestedResourceVoters contested_resource_voters = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getContestedResourceVoters = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters, 1)); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions; + return proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.ContestedResourceVoters|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.deserializeBinaryFromReader); + msg.addTokenDistributions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenDistributionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry.serializeBinaryToWriter + ); + } +}; + + +/** + * repeated TokenTimedDistributionEntry token_distributions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.getTokenDistributionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, 1)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setContestedResourceVoters = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.setTokenDistributionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.addTokenDistributions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenTimedDistributionEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} returns this + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions.prototype.clearTokenDistributionsList = function() { + return this.setTokenDistributionsList([]); +}; + + +/** + * optional TokenDistributions token_distributions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getTokenDistributions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.TokenDistributions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setTokenDistributions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearContestedResourceVoters = function() { - return this.setContestedResourceVoters(undefined); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearTokenDistributions = function() { + return this.setTokenDistributions(undefined); }; @@ -36164,7 +56394,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasContestedResourceVoters = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasTokenDistributions = function() { return jspb.Message.getField(this, 1) != null; }; @@ -36173,7 +56403,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -36181,18 +56411,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -36201,7 +56431,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; @@ -36210,7 +56440,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; @@ -36218,18 +56448,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.setMetadata = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.setMetadata = function(value) { return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -36238,35 +56468,35 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.Ge * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0.prototype.hasMetadata = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0.prototype.hasMetadata = function() { return jspb.Message.getField(this, 3) != null; }; -/** - * optional GetContestedResourceVotersForIdentityResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0, 1)); +/** + * optional GetTokenPreProgrammedDistributionsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.GetContestedResourceVotersForIdentityResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.GetTokenPreProgrammedDistributionsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -36275,7 +56505,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenPreProgrammedDistributionsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -36289,21 +56519,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceVotersForIdentityResponse.pr * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_[0])); }; @@ -36321,8 +56551,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.toObject(opt_includeInstance, this); }; @@ -36331,13 +56561,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -36351,23 +56581,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.toObjec /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36375,8 +56605,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deseria var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -36392,9 +56622,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.deseria * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36402,18 +56632,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter ); } }; @@ -36435,8 +56665,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject(opt_includeInstance, this); }; @@ -36445,18 +56675,14 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - identityId: msg.getIdentityId_asB64(), - limit: (f = msg.getLimit()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - offset: (f = msg.getOffset()) && google_protobuf_wrappers_pb.UInt32Value.toObject(includeInstance, f), - orderAscending: jspb.Message.getBooleanFieldWithDefault(msg, 4, false), - startAtVotePollIdInfo: (f = msg.getStartAtVotePollIdInfo()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(includeInstance, f), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) + tokenId: msg.getTokenId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -36470,23 +56696,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -36495,28 +56721,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); + msg.setTokenId(value); break; case 2: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setLimit(value); - break; - case 3: - var value = new google_protobuf_wrappers_pb.UInt32Value; - reader.readMessage(value,google_protobuf_wrappers_pb.UInt32Value.deserializeBinaryFromReader); - msg.setOffset(value); - break; - case 4: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setOrderAscending(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader); - msg.setStartAtVotePollIdInfo(value); - break; - case 6: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -36533,9 +56740,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -36543,175 +56750,20 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getIdentityId_asU8(); + f = message.getTokenId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getLimit(); - if (f != null) { - writer.writeMessage( - 2, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOffset(); - if (f != null) { - writer.writeMessage( - 3, - f, - google_protobuf_wrappers_pb.UInt32Value.serializeBinaryToWriter - ); - } - f = message.getOrderAscending(); - if (f) { - writer.writeBool( - 4, - f - ); - } - f = message.getStartAtVotePollIdInfo(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter - ); - } f = message.getProve(); - if (f) { - writer.writeBool( - 6, - f - ); - } -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.toObject = function(includeInstance, msg) { - var f, obj = { - startAtPollIdentifier: msg.getStartAtPollIdentifier_asB64(), - startPollIdentifierIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setStartAtPollIdentifier(value); - break; - case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setStartPollIdentifierIncluded(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getStartAtPollIdentifier_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getStartPollIdentifierIncluded(); if (f) { writer.writeBool( 2, @@ -36722,278 +56774,89 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetCont /** - * optional bytes start_at_poll_identifier = 1; + * optional bytes token_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes start_at_poll_identifier = 1; - * This is a type-conversion wrapper around `getStartAtPollIdentifier()` + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getStartAtPollIdentifier())); + this.getTokenId())); }; /** - * optional bytes start_at_poll_identifier = 1; + * optional bytes token_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getStartAtPollIdentifier()` + * This is a type-conversion wrapper around `getTokenId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartAtPollIdentifier_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getTokenId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getStartAtPollIdentifier())); + this.getTokenId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartAtPollIdentifier = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.setTokenId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool start_poll_identifier_included = 2; + * optional bool prove = 2; * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.getStartPollIdentifierIncluded = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.getProve = function() { return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo.prototype.setStartPollIdentifierIncluded = function(value) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0.prototype.setProve = function(value) { return jspb.Message.setProto3BooleanField(this, 2, value); }; /** - * optional bytes identity_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes identity_id = 1; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); -}; - - -/** - * optional bytes identity_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setIdentityId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional google.protobuf.UInt32Value limit = 2; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getLimit = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 2)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setLimit = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearLimit = function() { - return this.setLimit(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasLimit = function() { - return jspb.Message.getField(this, 2) != null; -}; - - -/** - * optional google.protobuf.UInt32Value offset = 3; - * @return {?proto.google.protobuf.UInt32Value} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOffset = function() { - return /** @type{?proto.google.protobuf.UInt32Value} */ ( - jspb.Message.getWrapperField(this, google_protobuf_wrappers_pb.UInt32Value, 3)); -}; - - -/** - * @param {?proto.google.protobuf.UInt32Value|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOffset = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearOffset = function() { - return this.setOffset(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasOffset = function() { - return jspb.Message.getField(this, 3) != null; -}; - - -/** - * optional bool order_ascending = 4; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getOrderAscending = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setOrderAscending = function(value) { - return jspb.Message.setProto3BooleanField(this, 4, value); -}; - - -/** - * optional StartAtVotePollIdInfo start_at_vote_poll_id_info = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getStartAtVotePollIdInfo = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo, 5)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.StartAtVotePollIdInfo|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setStartAtVotePollIdInfo = function(value) { - return jspb.Message.setWrapperField(this, 5, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.clearStartAtVotePollIdInfo = function() { - return this.setStartAtVotePollIdInfo(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.hasStartAtVotePollIdInfo = function() { - return jspb.Message.getField(this, 5) != null; -}; - - -/** - * optional bool prove = 6; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 6, value); -}; - - -/** - * optional GetContestedResourceIdentityVotesRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} + * optional GetTokenTotalSupplyRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.GetContestedResourceIdentityVotesRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.GetTokenTotalSupplyRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -37002,7 +56865,7 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -37016,21 +56879,21 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesRequest.prototy * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_[0])); }; @@ -37048,8 +56911,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.toObject(opt_includeInstance, this); }; @@ -37058,13 +56921,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -37078,23 +56941,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37102,8 +56965,8 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -37119,9 +56982,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37129,18 +56992,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter ); } }; @@ -37155,22 +57018,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.serial * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase = { RESULT_NOT_SET: 0, - VOTES: 1, + TOKEN_TOTAL_SUPPLY: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0])); }; @@ -37188,8 +57051,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject(opt_includeInstance, this); }; @@ -37198,13 +57061,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - votes: (f = msg.getVotes()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(includeInstance, f), + tokenTotalSupply: (f = msg.getTokenTotalSupply()) && proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -37220,23 +57083,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37244,9 +57107,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader); - msg.setVotes(value); + var value = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader); + msg.setTokenTotalSupply(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; @@ -37271,9 +57134,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37281,18 +57144,18 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVotes(); + f = message.getTokenTotalSupply(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter ); } f = message.getProof(); @@ -37309,18 +57172,11 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon 3, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter - ); - } -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.repeatedFields_ = [1]; + ); + } +}; + + @@ -37337,8 +57193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject(opt_includeInstance, this); }; @@ -37347,15 +57203,15 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.toObject = function(includeInstance, msg) { var f, obj = { - contestedResourceIdentityVotesList: jspb.Message.toObjectList(msg.getContestedResourceIdentityVotesList(), - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject, includeInstance), - finishedResults: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + tokenId: msg.getTokenId_asB64(), + totalAggregatedAmountInUserAccounts: jspb.Message.getFieldWithDefault(msg, 2, 0), + totalSystemAmount: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -37369,23 +57225,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry; + return proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37393,13 +57249,16 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader); - msg.addContestedResourceIdentityVotes(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setFinishedResults(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setTotalAggregatedAmountInUserAccounts(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint64()); + msg.setTotalSystemAmount(value); break; default: reader.skipField(); @@ -37414,9 +57273,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37424,285 +57283,250 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} message + * @param {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContestedResourceIdentityVotesList(); + f = message.getTokenId_asU8(); if (f.length > 0) { - writer.writeRepeatedMessage( + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter + f ); } - f = message.getFinishedResults(); - if (f) { - writer.writeBool( + f = message.getTotalAggregatedAmountInUserAccounts(); + if (f !== 0) { + writer.writeUint64( 2, f ); } + f = message.getTotalSystemAmount(); + if (f !== 0) { + writer.writeUint64( + 3, + f + ); + } }; /** - * repeated ContestedResourceIdentityVote contested_resource_identity_votes = 1; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} + * optional bytes token_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getContestedResourceIdentityVotesList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, 1)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote>} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setContestedResourceIdentityVotesList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); + * optional bytes token_id = 1; + * This is a type-conversion wrapper around `getTokenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenId())); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * optional bytes token_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.addContestedResourceIdentityVotes = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote, opt_index); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTokenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenId())); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.clearContestedResourceIdentityVotesList = function() { - return this.setContestedResourceIdentityVotesList([]); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTokenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool finished_results = 2; - * @return {boolean} + * optional uint64 total_aggregated_amount_in_user_accounts = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.getFinishedResults = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTotalAggregatedAmountInUserAccounts = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes.prototype.setFinishedResults = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTotalAggregatedAmountInUserAccounts = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; +/** + * optional uint64 total_system_amount = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.getTotalSystemAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; - -if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry.prototype.setTotalSystemAmount = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); }; /** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages + * optional TokenTotalSupplyEntry token_total_supply = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject = function(includeInstance, msg) { - var f, obj = { - voteChoiceType: jspb.Message.getFieldWithDefault(msg, 1, 0), - identityId: msg.getIdentityId_asB64() - }; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getTokenTotalSupply = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry, 1)); +}; - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.TokenTotalSupplyEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setTokenTotalSupply = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0], value); }; -} /** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader(msg, reader); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearTokenTotalSupply = function() { + return this.setTokenTotalSupply(undefined); }; /** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (reader.readEnum()); - msg.setVoteChoiceType(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setIdentityId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasTokenTotalSupply = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getVoteChoiceType(); - if (f !== 0.0) { - writer.writeEnum( - 1, - f - ); - } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeBytes( - 2, - f - ); - } + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.oneofGroups_[0], value); }; /** - * @enum {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType = { - TOWARDS_IDENTITY: 0, - ABSTAIN: 1, - LOCK: 2 +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; + /** - * optional VoteChoiceType vote_choice_type = 1; - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getVoteChoiceType = function() { - return /** @type {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.VoteChoiceType} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setVoteChoiceType = function(value) { - return jspb.Message.setProto3EnumField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * optional bytes identity_id = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** - * optional bytes identity_id = 2; - * This is a type-conversion wrapper around `getIdentityId()` - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * optional bytes identity_id = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getIdentityId()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.getIdentityId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getIdentityId())); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * optional GetTokenTotalSupplyResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.setIdentityId = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0, 1)); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.GetTokenTotalSupplyResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} returns this +*/ +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.clearIdentityId = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -37710,18 +57534,36 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.prototype.hasIdentityId = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetTokenTotalSupplyResponse.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * List of repeated fields within this message type. - * @private {!Array<number>} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.repeatedFields_ = [3]; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_[0])); +}; @@ -37738,8 +57580,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.toObject(opt_includeInstance, this); }; @@ -37748,16 +57590,13 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.toObject = function(includeInstance, msg) { var f, obj = { - contractId: msg.getContractId_asB64(), - documentTypeName: jspb.Message.getFieldWithDefault(msg, 2, ""), - serializedIndexStorageValuesList: msg.getSerializedIndexStorageValuesList_asB64(), - voteChoice: (f = msg.getVoteChoice()) && proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -37771,23 +57610,23 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote; - return proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest; + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -37795,21 +57634,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setContractId(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDocumentTypeName(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addSerializedIndexStorageValues(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.deserializeBinaryFromReader); - msg.setVoteChoice(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader); + msg.setV0(value); break; default: reader.skipField(); @@ -37824,9 +57651,9 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -37834,264 +57661,262 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getContractId_asU8(); - if (f.length > 0) { - writer.writeBytes( - 1, - f - ); - } - f = message.getDocumentTypeName(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getSerializedIndexStorageValuesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 3, - f - ); - } - f = message.getVoteChoice(); + f = message.getV0(); if (f != null) { writer.writeMessage( - 4, + 1, f, - proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter ); } }; -/** - * optional bytes contract_id = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes contract_id = 1; - * This is a type-conversion wrapper around `getContractId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getContractId())); -}; - - -/** - * optional bytes contract_id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getContractId()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getContractId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getContractId())); -}; - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setContractId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional string document_type_name = 2; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getDocumentTypeName = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject(opt_includeInstance, this); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setDocumentTypeName = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + }; -/** - * repeated bytes serialized_index_storage_values = 3; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 3)); + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * repeated bytes serialized_index_storage_values = 3; - * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` - * @return {!Array<string>} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getSerializedIndexStorageValuesList())); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader(msg, reader); }; /** - * repeated bytes serialized_index_storage_values = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getSerializedIndexStorageValuesList()` - * @return {!Array<!Uint8Array>} + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getSerializedIndexStorageValuesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getSerializedIndexStorageValuesList())); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setSerializedIndexStorageValuesList = function(value) { - return jspb.Message.setField(this, 3, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.addSerializedIndexStorageValues = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 3, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 3, + f + ); + } }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearSerializedIndexStorageValuesList = function() { - return this.setSerializedIndexStorageValuesList([]); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional ResourceVoteChoice vote_choice = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.getVoteChoice = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice, 4)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ResourceVoteChoice|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.setVoteChoice = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote} returns this + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.clearVoteChoice = function() { - return this.setVoteChoice(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVote.prototype.hasVoteChoice = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional ContestedResourceIdentityVotes votes = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} + * optional uint32 group_contract_position = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getVotes = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.ContestedResourceIdentityVotes|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setVotes = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * optional bool prove = 3; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearVotes = function() { - return this.setVotes(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasVotes = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 3, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * optional GetGroupInfoRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.GetGroupInfoRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.clearV0 = function() { + return this.setV0(undefined); }; @@ -38099,82 +57924,147 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetCon * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoRequest.prototype.hasV0 = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_ = [[1]]; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase = { + VERSION_NOT_SET: 0, + V0: 1 +}; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_[0])); }; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.toObject = function(includeInstance, msg) { + var f, obj = { + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional GetContestedResourceIdentityVotesResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.GetContestedResourceIdentityVotesResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.oneofGroups_[0], value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader); + msg.setV0(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getV0(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter + ); + } }; @@ -38187,21 +58077,22 @@ proto.org.dash.platform.dapi.v0.GetContestedResourceIdentityVotesResponse.protot * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_INFO: 1, + PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0])); }; @@ -38219,8 +58110,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject(opt_includeInstance, this); }; @@ -38229,13 +58120,15 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(includeInstance, f) + groupInfo: (f = msg.getGroupInfo()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -38249,23 +58142,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38273,9 +58166,19 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader); + msg.setGroupInfo(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -38290,9 +58193,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38300,18 +58203,34 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); + f = message.getGroupInfo(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; @@ -38333,8 +58252,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject(opt_includeInstance, this); }; @@ -38343,14 +58262,14 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) + memberId: msg.getMemberId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -38364,23 +58283,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38389,11 +58308,11 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + msg.setMemberId(value); break; case 2: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setPower(value); break; default: reader.skipField(); @@ -38408,9 +58327,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38418,22 +58337,22 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); + f = message.getMemberId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getProve(); - if (f) { - writer.writeBool( + f = message.getPower(); + if (f !== 0) { + writer.writeUint32( 2, f ); @@ -38442,127 +58361,72 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefund /** - * optional bytes id = 1; + * optional bytes member_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` + * optional bytes member_id = 1; + * This is a type-conversion wrapper around `getMemberId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + this.getMemberId())); }; /** - * optional bytes id = 1; + * optional bytes member_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` + * This is a type-conversion wrapper around `getMemberId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getId_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getMemberId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); + this.getMemberId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setId = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.setMemberId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional bool prove = 2; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 2, value); -}; - - -/** - * optional GetPrefundedSpecializedBalanceRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0, 1)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.GetPrefundedSpecializedBalanceRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.oneofGroups_[0], value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest} returns this + * optional uint32 power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.getPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.prototype.setPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} + * List of repeated fields within this message type. + * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_ = [[1]]; - -/** - * @enum {number} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 -}; - -/** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} - */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.repeatedFields_ = [1]; @@ -38579,8 +58443,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject(opt_includeInstance, this); }; @@ -38589,13 +58453,15 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(includeInstance, f) + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.toObject, includeInstance), + groupRequiredPower: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -38609,23 +58475,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.toObject /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38633,9 +58499,13 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deseriali var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupRequiredPower(value); break; default: reader.skipField(); @@ -38650,9 +58520,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.deseriali * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38660,52 +58530,89 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry.serializeBinaryToWriter + ); + } + f = message.getGroupRequiredPower(); + if (f !== 0) { + writer.writeUint32( + 2, + f ); } }; +/** + * repeated GroupMemberEntry members = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, 1)); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupMemberEntry, opt_index); +}; + /** - * @enum {number} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - BALANCE: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.clearMembersList = function() { + return this.setMembersList([]); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} + * optional uint32 group_required_power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.getGroupRequiredPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.prototype.setGroupRequiredPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -38719,8 +58626,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject(opt_includeInstance, this); }; @@ -38729,15 +58636,13 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.toObject = function(includeInstance, msg) { var f, obj = { - balance: jspb.Message.getFieldWithDefault(msg, 1, 0), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + groupInfo: (f = msg.getGroupInfo()) && proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.toObject(includeInstance, f) }; if (includeInstance) { @@ -38751,23 +58656,23 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0; - return proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo; + return proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -38775,18 +58680,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBalance(value); - break; - case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.deserializeBinaryFromReader); + msg.setGroupInfo(value); break; default: reader.skipField(); @@ -38801,9 +58697,9 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -38811,62 +58707,85 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); - if (f != null) { - writer.writeUint64( - 1, - f - ); - } - f = message.getProof(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); + f = message.getGroupInfo(); if (f != null) { writer.writeMessage( - 3, + 1, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry.serializeBinaryToWriter ); } }; /** - * optional uint64 balance = 1; - * @return {number} + * optional GroupInfoEntry group_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.getGroupInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfoEntry|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.setGroupInfo = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getBalance = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.clearGroupInfo = function() { + return this.setGroupInfo(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setBalance = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo.prototype.hasGroupInfo = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * optional GroupInfo group_info = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearBalance = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getGroupInfo = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.GroupInfo|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setGroupInfo = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearGroupInfo = function() { + return this.setGroupInfo(undefined); }; @@ -38874,7 +58793,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasBalance = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasGroupInfo = function() { return jspb.Message.getField(this, 1) != null; }; @@ -38883,7 +58802,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * optional Proof proof = 2; * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getProof = function() { return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; @@ -38891,18 +58810,18 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun /** * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearProof = function() { return this.setProof(undefined); }; @@ -38911,35 +58830,35 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasProof = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasProof = function() { return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 3; + * optional ResponseMetadata metadata = 4; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 4)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -38948,35 +58867,35 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefun * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional GetPrefundedSpecializedBalanceResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} + * optional GetGroupInfoResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.GetPrefundedSpecializedBalanceResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.GetGroupInfoResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfoResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -38985,7 +58904,7 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfoResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -38999,21 +58918,21 @@ proto.org.dash.platform.dapi.v0.GetPrefundedSpecializedBalanceResponse.prototype * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_[0])); }; @@ -39031,8 +58950,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.toObject(opt_includeInstance, this); }; @@ -39041,13 +58960,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.toObj * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -39061,23 +58980,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.toObject = func /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39085,8 +59004,8 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBina var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -39102,9 +59021,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.deserializeBina * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39112,18 +59031,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.seria /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter ); } }; @@ -39145,8 +59064,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject(opt_includeInstance, this); }; @@ -39155,13 +59074,14 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject = function(includeInstance, msg) { var f, obj = { - prove: jspb.Message.getBooleanFieldWithDefault(msg, 1, false) + startGroupContractPosition: jspb.Message.getFieldWithDefault(msg, 1, 0), + startGroupContractPositionIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -39175,23 +59095,185 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setStartGroupContractPosition(value); + break; + case 2: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartGroupContractPositionIncluded(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStartGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getStartGroupContractPositionIncluded(); + if (f) { + writer.writeBool( + 2, + f + ); + } +}; + + +/** + * optional uint32 start_group_contract_position = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.getStartGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.setStartGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional bool start_group_contract_position_included = 2; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.getStartGroupContractPositionIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.prototype.setStartGroupContractPositionIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.toObject = function(includeInstance, msg) { + var f, obj = { + contractId: msg.getContractId_asB64(), + startAtGroupContractPosition: (f = msg.getStartAtGroupContractPosition()) && proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 3, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 4, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39199,6 +59281,19 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits var field = reader.getFieldNumber(); switch (field) { case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.deserializeBinaryFromReader); + msg.setStartAtGroupContractPosition(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 4: var value = /** @type {boolean} */ (reader.readBool()); msg.setProve(value); break; @@ -39215,9 +59310,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39225,16 +59320,38 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getStartAtGroupContractPosition(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeUint32( + 3, + f + ); + } f = message.getProve(); if (f) { writer.writeBool( - 1, + 4, f ); } @@ -39242,47 +59359,162 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCredits /** - * optional bool prove = 1; + * optional bytes contract_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional StartAtGroupContractPosition start_at_group_contract_position = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getStartAtGroupContractPosition = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition, 2)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.StartAtGroupContractPosition|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setStartAtGroupContractPosition = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.clearStartAtGroupContractPosition = function() { + return this.setStartAtGroupContractPosition(undefined); +}; + + +/** + * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.hasStartAtGroupContractPosition = function() { + return jspb.Message.getField(this, 2) != null; +}; + + +/** + * optional uint32 count = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bool prove = 4; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false)); }; /** * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 4, value); }; /** - * optional GetTotalCreditsInPlatformRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} + * optional GetGroupInfosRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.GetTotalCreditsInPlatformRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.GetGroupInfosRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -39291,7 +59523,7 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.clear * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -39305,21 +59537,21 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformRequest.prototype.hasV0 * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_[0])); }; @@ -39337,8 +59569,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.toObject(opt_includeInstance, this); }; @@ -39347,13 +59579,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.toOb * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -39367,23 +59599,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.toObject = fun /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39391,8 +59623,8 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBin var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -39408,9 +59640,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.deserializeBin * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39418,18 +59650,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.seri /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter ); } }; @@ -39444,22 +59676,22 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.serializeBinar * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_ = [[1,2]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_ = [[1,2]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase = { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase = { RESULT_NOT_SET: 0, - CREDITS: 1, + GROUP_INFOS: 1, PROOF: 2 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0])); }; @@ -39477,8 +59709,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject(opt_includeInstance, this); }; @@ -39487,13 +59719,13 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - credits: jspb.Message.getFieldWithDefault(msg, 1, 0), + groupInfos: (f = msg.getGroupInfos()) && proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject(includeInstance, f), proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; @@ -39509,23 +59741,23 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0; - return proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39533,15 +59765,16 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setCredits(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader); + msg.setGroupInfos(value); break; case 2: var value = new proto.org.dash.platform.dapi.v0.Proof; reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); msg.setProof(value); break; - case 3: + case 4: var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); msg.setMetadata(value); @@ -39559,9 +59792,9 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39569,17 +59802,18 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = /** @type {number} */ (jspb.Message.getField(message, 1)); + f = message.getGroupInfos(); if (f != null) { - writer.writeUint64( + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter ); } f = message.getProof(); @@ -39593,7 +59827,7 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit f = message.getMetadata(); if (f != null) { writer.writeMessage( - 3, + 4, f, proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); @@ -39601,178 +59835,197 @@ proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCredit }; -/** - * optional uint64 credits = 1; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getCredits = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); -}; - - -/** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setCredits = function(value) { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); -}; - - -/** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearCredits = function() { - return jspb.Message.setOneofField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], undefined); -}; - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasCredits = function() { - return jspb.Message.getField(this, 1) != null; -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject(opt_includeInstance, this); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); -}; - +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject = function(includeInstance, msg) { + var f, obj = { + memberId: msg.getMemberId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setMemberId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setPower(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getMemberId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getPower(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } }; /** - * optional GetTotalCreditsInPlatformResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} + * optional bytes member_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.GetTotalCreditsInPlatformResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this -*/ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.oneofGroups_[0], value); + * optional bytes member_id = 1; + * This is a type-conversion wrapper around `getMemberId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getMemberId())); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse} returns this + * optional bytes member_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getMemberId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getMemberId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getMemberId())); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetTotalCreditsInPlatformResponse.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.setMemberId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; - /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * optional uint32 power = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.getPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + /** - * @enum {number} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.prototype.setPower = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; + + /** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0])); -}; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.repeatedFields_ = [2]; @@ -39789,8 +60042,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject(opt_includeInstance, this); }; @@ -39799,13 +60052,16 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.toObject = func * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(includeInstance, f) + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 1, 0), + membersList: jspb.Message.toObjectList(msg.getMembersList(), + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.toObject, includeInstance), + groupRequiredPower: jspb.Message.getFieldWithDefault(msg, 3, 0) }; if (includeInstance) { @@ -39819,23 +60075,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.toObject = function(inclu /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest; - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39843,9 +60099,17 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromRead var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.deserializeBinaryFromReader); + msg.addMembers(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupRequiredPower(value); break; default: reader.skipField(); @@ -39860,9 +60124,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.deserializeBinaryFromRead * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -39870,30 +60134,118 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.serializeBinary /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( 1, + f + ); + } + f = message.getMembersList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 2, f, - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry.serializeBinaryToWriter + ); + } + f = message.getGroupRequiredPower(); + if (f !== 0) { + writer.writeUint32( + 3, + f ); } }; +/** + * optional uint32 group_contract_position = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * repeated GroupMemberEntry members = 2; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getMembersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, 2)); +}; + + +/** + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setMembersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 2, value); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.addMembers = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupMemberEntry, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.clearMembersList = function() { + return this.setMembersList([]); +}; + + +/** + * optional uint32 group_required_power = 3; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.getGroupRequiredPower = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.prototype.setGroupRequiredPower = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.repeatedFields_ = [1,2]; +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.repeatedFields_ = [1]; @@ -39910,8 +60262,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject(opt_includeInstance, this); }; @@ -39920,15 +60272,14 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.toObject = function(includeInstance, msg) { var f, obj = { - pathList: msg.getPathList_asB64(), - keysList: msg.getKeysList_asB64(), - prove: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + groupInfosList: jspb.Message.toObjectList(msg.getGroupInfosList(), + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.toObject, includeInstance) }; if (includeInstance) { @@ -39942,23 +60293,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0; - return proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos; + return proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -39966,16 +60317,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addPath(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addKeys(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setProve(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.deserializeBinaryFromReader); + msg.addGroupInfos(value); break; default: reader.skipField(); @@ -39990,9 +60334,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40000,200 +60344,196 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getPathList_asU8(); + f = message.getGroupInfosList(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeRepeatedMessage( 1, - f - ); - } - f = message.getKeysList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 2, - f - ); - } - f = message.getProve(); - if (f) { - writer.writeBool( - 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry.serializeBinaryToWriter ); } }; /** - * repeated bytes path = 1; - * @return {!Array<string>} + * repeated GroupPositionInfoEntry group_infos = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.getGroupInfosList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, 1)); }; /** - * repeated bytes path = 1; - * This is a type-conversion wrapper around `getPathList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getPathList())); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.setGroupInfosList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * repeated bytes path = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getPathList()` - * @return {!Array<!Uint8Array>} + * @param {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getPathList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getPathList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.addGroupInfos = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupPositionInfoEntry, opt_index); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setPathList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos.prototype.clearGroupInfosList = function() { + return this.setGroupInfosList([]); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * optional GroupInfos group_infos = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addPath = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getGroupInfos = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos, 1)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearPathList = function() { - return this.setPathList([]); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.GroupInfos|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setGroupInfos = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0], value); }; /** - * repeated bytes keys = 2; - * @return {!Array<string>} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearGroupInfos = function() { + return this.setGroupInfos(undefined); }; /** - * repeated bytes keys = 2; - * This is a type-conversion wrapper around `getKeysList()` - * @return {!Array<string>} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getKeysList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasGroupInfos = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * repeated bytes keys = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getKeysList()` - * @return {!Array<!Uint8Array>} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getKeysList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getKeysList())); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setKeysList = function(value) { - return jspb.Message.setField(this, 2, value || []); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.addKeys = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * optional ResponseMetadata metadata = 4; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.clearKeysList = function() { - return this.setKeysList([]); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 4)); }; /** - * optional bool prove = 3; - * @return {boolean} + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 4, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.getProve = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0.prototype.setProve = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * optional GetPathElementsRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} + * optional GetGroupInfosResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsRequest.GetPathElementsRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.GetGroupInfosResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupInfosResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -40202,7 +60542,7 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.clearV0 = funct * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupInfosResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -40216,21 +60556,21 @@ proto.org.dash.platform.dapi.v0.GetPathElementsRequest.prototype.hasV0 = functio * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_[0])); }; @@ -40248,8 +60588,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.toObject(opt_includeInstance, this); }; @@ -40258,13 +60598,13 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.toObject = fun * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -40278,23 +60618,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.toObject = function(incl /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40302,8 +60642,8 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromRea var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -40319,9 +60659,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.deserializeBinaryFromRea * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40329,49 +60669,31 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.serializeBinar /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter ); } }; - -/** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_ = [[1,2]]; - /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase = { - RESULT_NOT_SET: 0, - ELEMENTS: 1, - PROOF: 2 +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus = { + ACTIVE: 0, + CLOSED: 1 }; -/** - * @return {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getResultCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0])); -}; @@ -40388,8 +60710,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject(opt_includeInstance, this); }; @@ -40398,15 +60720,14 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject = function(includeInstance, msg) { var f, obj = { - elements: (f = msg.getElements()) && proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(includeInstance, f), - proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + startActionId: msg.getStartActionId_asB64(), + startActionIdIncluded: jspb.Message.getBooleanFieldWithDefault(msg, 2, false) }; if (includeInstance) { @@ -40420,23 +60741,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40444,19 +60765,12 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader); - msg.setElements(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setStartActionId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.Proof; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); - msg.setProof(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = /** @type {boolean} */ (reader.readBool()); + msg.setStartActionIdIncluded(value); break; default: reader.skipField(); @@ -40471,9 +60785,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40481,46 +60795,89 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getElements(); - if (f != null) { - writer.writeMessage( + f = message.getStartActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter + f ); } - f = message.getProof(); - if (f != null) { - writer.writeMessage( + f = message.getStartActionIdIncluded(); + if (f) { + writer.writeBool( 2, - f, - proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + f ); } }; +/** + * optional bytes start_action_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes start_action_id = 1; + * This is a type-conversion wrapper around `getStartActionId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getStartActionId())); +}; + + +/** + * optional bytes start_action_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getStartActionId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getStartActionId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.setStartActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + /** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const + * optional bool start_action_id_included = 2; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.repeatedFields_ = [1]; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.getStartActionIdIncluded = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.prototype.setStartActionIdIncluded = function(value) { + return jspb.Message.setProto3BooleanField(this, 2, value); +}; + + @@ -40537,8 +60894,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject(opt_includeInstance, this); }; @@ -40547,13 +60904,18 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - elementsList: msg.getElementsList_asB64() + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + status: jspb.Message.getFieldWithDefault(msg, 3, 0), + startAtActionId: (f = msg.getStartAtActionId()) && proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.toObject(includeInstance, f), + count: jspb.Message.getFieldWithDefault(msg, 5, 0), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 6, false) }; if (includeInstance) { @@ -40567,23 +60929,23 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements; - return proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40592,7 +60954,28 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addElements(value); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 4: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.deserializeBinaryFromReader); + msg.setStartAtActionId(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint32()); + msg.setCount(value); + break; + case 6: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); break; default: reader.skipField(); @@ -40607,9 +60990,9 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40617,218 +61000,251 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getElementsList_asU8(); + f = message.getContractId_asU8(); if (f.length > 0) { - writer.writeRepeatedBytes( + writer.writeBytes( 1, f ); } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 3, + f + ); + } + f = message.getStartAtActionId(); + if (f != null) { + writer.writeMessage( + 4, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId.serializeBinaryToWriter + ); + } + f = /** @type {number} */ (jspb.Message.getField(message, 5)); + if (f != null) { + writer.writeUint32( + 5, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 6, + f + ); + } }; /** - * repeated bytes elements = 1; - * @return {!Array<string>} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * repeated bytes elements = 1; - * This is a type-conversion wrapper around `getElementsList()` - * @return {!Array<string>} + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getElementsList())); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); }; /** - * repeated bytes elements = 1; + * optional bytes contract_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getElementsList()` - * @return {!Array<!Uint8Array>} + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.getElementsList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getElementsList())); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.setElementsList = function(value) { - return jspb.Message.setField(this, 1, value || []); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * optional uint32 group_contract_position = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.addElements = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} returns this + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements.prototype.clearElementsList = function() { - return this.setElementsList([]); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional Elements elements = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} + * optional ActionStatus status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getElements = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.Elements|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setElements = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.ActionStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional StartAtActionId start_at_action_id = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearElements = function() { - return this.setElements(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getStartAtActionId = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId, 4)); }; /** - * Returns whether this field is set. - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasElements = function() { - return jspb.Message.getField(this, 1) != null; + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.StartAtActionId|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setStartAtActionId = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** - * optional Proof proof = 2; - * @return {?proto.org.dash.platform.dapi.v0.Proof} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getProof = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.clearStartAtActionId = function() { + return this.setStartAtActionId(undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setProof = function(value) { - return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.oneofGroups_[0], value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.hasStartAtActionId = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional uint32 count = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearProof = function() { - return this.setProof(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getCount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasProof = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setCount = function(value) { + return jspb.Message.setField(this, 5, value); }; /** - * optional ResponseMetadata metadata = 3; - * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.getMetadata = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.clearCount = function() { + return jspb.Message.setField(this, 5, undefined); }; /** - * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 3, value); + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.hasCount = function() { + return jspb.Message.getField(this, 5) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} returns this + * optional bool prove = 6; + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.clearMetadata = function() { - return this.setMetadata(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 6, false)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 6, value); }; /** - * optional GetPathElementsResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} + * optional GetGroupActionsRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetPathElementsResponse.GetPathElementsResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.GetGroupActionsRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetPathElementsResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetPathElementsResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -40837,7 +61253,7 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.clearV0 = func * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -40851,21 +61267,21 @@ proto.org.dash.platform.dapi.v0.GetPathElementsResponse.prototype.hasV0 = functi * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetStatusRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_[0])); }; @@ -40883,8 +61299,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.toObject(opt_includeInstance, this); }; @@ -40893,13 +61309,13 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.toObject = function(o * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -40913,23 +61329,23 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.toObject = function(includeInst /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -40937,8 +61353,8 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -40954,9 +61370,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.deserializeBinaryFromReader = f * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -40964,24 +61380,50 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.serializeBinary = fun /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_ACTIONS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -40997,8 +61439,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject(opt_includeInstance, this); }; @@ -41007,13 +61449,157 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.to * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.toObject = function(includeInstance, msg) { var f, obj = { + groupActions: (f = msg.getGroupActions()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader); + msg.setGroupActions(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGroupActions(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter + ); + } + f = message.getProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter + ); + } + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + ); + } +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject(opt_includeInstance, this); +}; + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject = function(includeInstance, msg) { + var f, obj = { + amount: jspb.Message.getFieldWithDefault(msg, 1, 0), + recipientId: msg.getRecipientId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -41027,29 +61613,41 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.toObject = f /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0; - return proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRecipientId(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; default: reader.skipField(); break; @@ -41063,9 +61661,9 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.deserializeB * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41073,80 +61671,135 @@ proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.prototype.se /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( + 1, + f + ); + } + f = message.getRecipientId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 3)); + if (f != null) { + writer.writeString( + 3, + f + ); + } }; /** - * optional GetStatusRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} + * optional uint64 amount = 1; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusRequest.GetStatusRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusRequest.oneofGroups_[0], value); + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusRequest} returns this + * optional bytes recipient_id = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.clearV0 = function() { - return this.setV0(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * Returns whether this field is set. - * @return {boolean} + * optional bytes recipient_id = 2; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusRequest.prototype.hasV0 = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; +/** + * optional bytes recipient_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); +}; + /** - * Oneof group definitions for this message. Each group defines the field - * numbers belonging to that group. When of these fields' value is set, all - * other fields in the group are cleared. During deserialization, if multiple - * fields are encountered for a group, only the last value seen will be kept. - * @private {!Array<!Array<number>>} - * @const + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + /** - * @enum {number} + * optional string public_note = 3; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase = { - VERSION_NOT_SET: 0, - V0: 1 +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; + /** - * @return {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetStatusResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 3, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 3, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 3) != null; }; + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -41160,8 +61813,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject(opt_includeInstance, this); }; @@ -41170,13 +61823,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.toObject = function( * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(includeInstance, f) + amount: jspb.Message.getFieldWithDefault(msg, 1, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41190,23 +61844,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.toObject = function(includeIns /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41214,9 +61868,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader); - msg.setV0(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41231,9 +61888,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.deserializeBinaryFromReader = * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41241,23 +61898,83 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.serializeBinary = fu /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getV0(); - if (f != null) { - writer.writeMessage( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f ); } }; +/** + * optional uint64 amount = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41274,8 +61991,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject(opt_includeInstance, this); }; @@ -41284,18 +62001,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject = function(includeInstance, msg) { var f, obj = { - version: (f = msg.getVersion()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(includeInstance, f), - node: (f = msg.getNode()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(includeInstance, f), - chain: (f = msg.getChain()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(includeInstance, f), - network: (f = msg.getNetwork()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(includeInstance, f), - stateSync: (f = msg.getStateSync()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(includeInstance, f), - time: (f = msg.getTime()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(includeInstance, f) + frozenId: msg.getFrozenId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41309,23 +62022,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.toObject = /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41333,34 +62046,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializ var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader); - msg.setVersion(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader); - msg.setNode(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader); - msg.setChain(value); - break; - case 4: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader); - msg.setNetwork(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader); - msg.setStateSync(value); - break; - case 6: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader); - msg.setTime(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41375,9 +62066,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.deserializ * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41385,63 +62076,107 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getVersion(); - if (f != null) { - writer.writeMessage( + f = message.getFrozenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter + f ); } - f = message.getNode(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter - ); - } - f = message.getChain(); - if (f != null) { - writer.writeMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter - ); - } - f = message.getNetwork(); - if (f != null) { - writer.writeMessage( - 4, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter - ); - } - f = message.getStateSync(); - if (f != null) { - writer.writeMessage( - 5, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter - ); - } - f = message.getTime(); - if (f != null) { - writer.writeMessage( - 6, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter + f ); } }; +/** + * optional bytes frozen_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); +}; + + +/** + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41458,8 +62193,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject(opt_includeInstance, this); }; @@ -41468,14 +62203,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject = function(includeInstance, msg) { var f, obj = { - software: (f = msg.getSoftware()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(includeInstance, f), - protocol: (f = msg.getProtocol()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(includeInstance, f) + frozenId: msg.getFrozenId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -41489,23 +62224,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41513,14 +62248,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader); - msg.setSoftware(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader); - msg.setProtocol(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41535,9 +62268,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41545,31 +62278,107 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getSoftware(); - if (f != null) { - writer.writeMessage( + f = message.getFrozenId_asU8(); + if (f.length > 0) { + writer.writeBytes( 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter + f ); } - f = message.getProtocol(); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeMessage( + writer.writeString( 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter + f ); } }; +/** + * optional bytes frozen_id = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); +}; + + +/** + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + @@ -41586,8 +62395,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject(opt_includeInstance, this); }; @@ -41596,15 +62405,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject = function(includeInstance, msg) { var f, obj = { - dapi: jspb.Message.getFieldWithDefault(msg, 1, ""), - drive: jspb.Message.getFieldWithDefault(msg, 2, ""), - tenderdash: jspb.Message.getFieldWithDefault(msg, 3, "") + frozenId: msg.getFrozenId_asB64(), + amount: jspb.Message.getFieldWithDefault(msg, 2, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 3, "") }; if (includeInstance) { @@ -41618,23 +62427,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41642,16 +62451,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setDapi(value); + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFrozenId(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setDrive(value); + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; case 3: var value = /** @type {string} */ (reader.readString()); - msg.setTenderdash(value); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -41666,9 +62475,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -41676,22 +62485,22 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getDapi(); + f = message.getFrozenId_asU8(); if (f.length > 0) { - writer.writeString( + writer.writeBytes( 1, f ); } - f = /** @type {string} */ (jspb.Message.getField(message, 2)); - if (f != null) { - writer.writeString( + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( 2, f ); @@ -41707,82 +62516,88 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So /** - * optional string dapi = 1; + * optional bytes frozen_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDapi = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * optional bytes frozen_id = 1; + * This is a type-conversion wrapper around `getFrozenId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDapi = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFrozenId())); }; /** - * optional string drive = 2; - * @return {string} + * optional bytes frozen_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFrozenId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getDrive = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getFrozenId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFrozenId())); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setDrive = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setFrozenId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * optional uint64 amount = 2; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearDrive = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasDrive = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); }; /** - * optional string tenderdash = 3; + * optional string public_note = 3; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.getTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.getPublicNote = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); }; /** * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.setTenderdash = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.setPublicNote = function(value) { return jspb.Message.setField(this, 3, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.clearTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.clearPublicNote = function() { return jspb.Message.setField(this, 3, undefined); }; @@ -41791,7 +62606,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.So * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software.prototype.hasTenderdash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.prototype.hasPublicNote = function() { return jspb.Message.getField(this, 3) != null; }; @@ -41812,8 +62627,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject(opt_includeInstance, this); }; @@ -41822,14 +62637,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject = function(includeInstance, msg) { var f, obj = { - tenderdash: (f = msg.getTenderdash()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(includeInstance, f), - drive: (f = msg.getDrive()) && proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(includeInstance, f) + senderKeyIndex: jspb.Message.getFieldWithDefault(msg, 1, 0), + recipientKeyIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + encryptedData: msg.getEncryptedData_asB64() }; if (includeInstance) { @@ -41843,23 +62659,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41867,14 +62683,16 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader); - msg.setTenderdash(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setSenderKeyIndex(value); break; case 2: - var value = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader); - msg.setDrive(value); + var value = /** @type {number} */ (reader.readUint32()); + msg.setRecipientKeyIndex(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptedData(value); break; default: reader.skipField(); @@ -41889,38 +62707,121 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; /** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getSenderKeyIndex(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getRecipientKeyIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getEncryptedData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } +}; + + +/** + * optional uint32 sender_key_index = 1; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getSenderKeyIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setSenderKeyIndex = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 recipient_key_index = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getRecipientKeyIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setRecipientKeyIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional bytes encrypted_data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes encrypted_data = 3; + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptedData())); +}; + + +/** + * optional bytes encrypted_data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.getEncryptedData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptedData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTenderdash(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter - ); - } - f = message.getDrive(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter - ); - } +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.prototype.setEncryptedData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); }; @@ -41940,8 +62841,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject(opt_includeInstance, this); }; @@ -41950,14 +62851,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject = function(includeInstance, msg) { var f, obj = { - p2p: jspb.Message.getFieldWithDefault(msg, 1, 0), - block: jspb.Message.getFieldWithDefault(msg, 2, 0) + rootEncryptionKeyIndex: jspb.Message.getFieldWithDefault(msg, 1, 0), + derivationEncryptionKeyIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + encryptedData: msg.getEncryptedData_asB64() }; if (includeInstance) { @@ -41971,23 +62873,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -41996,11 +62898,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr switch (field) { case 1: var value = /** @type {number} */ (reader.readUint32()); - msg.setP2p(value); + msg.setRootEncryptionKeyIndex(value); break; case 2: var value = /** @type {number} */ (reader.readUint32()); - msg.setBlock(value); + msg.setDerivationEncryptionKeyIndex(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setEncryptedData(value); break; default: reader.skipField(); @@ -42015,9 +62921,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42025,65 +62931,114 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getP2p(); + f = message.getRootEncryptionKeyIndex(); if (f !== 0) { writer.writeUint32( 1, f ); } - f = message.getBlock(); + f = message.getDerivationEncryptionKeyIndex(); if (f !== 0) { writer.writeUint32( 2, f ); } + f = message.getEncryptedData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } }; /** - * optional uint32 p2p = 1; + * optional uint32 root_encryption_key_index = 1; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getP2p = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getRootEncryptionKeyIndex = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setP2p = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setRootEncryptionKeyIndex = function(value) { return jspb.Message.setProto3IntField(this, 1, value); }; /** - * optional uint32 block = 2; + * optional uint32 derivation_encryption_key_index = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.getBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getDerivationEncryptionKeyIndex = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash.prototype.setBlock = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setDerivationEncryptionKeyIndex = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; +/** + * optional bytes encrypted_data = 3; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes encrypted_data = 3; + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getEncryptedData())); +}; + + +/** + * optional bytes encrypted_data = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getEncryptedData()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.getEncryptedData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getEncryptedData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.prototype.setEncryptedData = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + @@ -42100,8 +63055,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject(opt_includeInstance, this); }; @@ -42110,14 +63065,17 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject = function(includeInstance, msg) { var f, obj = { - latest: jspb.Message.getFieldWithDefault(msg, 3, 0), - current: jspb.Message.getFieldWithDefault(msg, 4, 0) + recipientId: msg.getRecipientId_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, ""), + sharedEncryptedNote: (f = msg.getSharedEncryptedNote()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.toObject(includeInstance, f), + personalEncryptedNote: (f = msg.getPersonalEncryptedNote()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.toObject(includeInstance, f), + amount: jspb.Message.getFieldWithDefault(msg, 5, 0) }; if (includeInstance) { @@ -42131,36 +63089,50 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRecipientId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setLatest(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.deserializeBinaryFromReader); + msg.setSharedEncryptedNote(value); break; case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCurrent(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.deserializeBinaryFromReader); + msg.setPersonalEncryptedNote(value); + break; + case 5: + var value = /** @type {number} */ (reader.readUint64()); + msg.setAmount(value); break; default: reader.skipField(); @@ -42175,9 +63147,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42185,23 +63157,46 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getLatest(); - if (f !== 0) { - writer.writeUint32( - 3, + f = message.getRecipientId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, f ); } - f = message.getCurrent(); - if (f !== 0) { - writer.writeUint32( + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } + f = message.getSharedEncryptedNote(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote.serializeBinaryToWriter + ); + } + f = message.getPersonalEncryptedNote(); + if (f != null) { + writer.writeMessage( 4, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote.serializeBinaryToWriter + ); + } + f = message.getAmount(); + if (f !== 0) { + writer.writeUint64( + 5, f ); } @@ -42209,66 +63204,71 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr /** - * optional uint32 latest = 3; - * @return {number} + * optional bytes recipient_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getLatest = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this + * optional bytes recipient_id = 1; + * This is a type-conversion wrapper around `getRecipientId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setLatest = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRecipientId())); }; /** - * optional uint32 current = 4; - * @return {number} + * optional bytes recipient_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRecipientId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.getCurrent = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getRecipientId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRecipientId())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} returns this + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive.prototype.setCurrent = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setRecipientId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional Tenderdash tenderdash = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} + * optional string public_note = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getTenderdash = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Tenderdash|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setTenderdash = function(value) { - return jspb.Message.setWrapperField(this, 1, value); + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearTenderdash = function() { - return this.setTenderdash(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); }; @@ -42276,36 +63276,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasTenderdash = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Drive drive = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} + * optional SharedEncryptedNote shared_encrypted_note = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.getDrive = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getSharedEncryptedNote = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.Drive|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.SharedEncryptedNote|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.setDrive = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setSharedEncryptedNote = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.clearDrive = function() { - return this.setDrive(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearSharedEncryptedNote = function() { + return this.setSharedEncryptedNote(undefined); }; @@ -42313,36 +63313,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol.prototype.hasDrive = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasSharedEncryptedNote = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional Software software = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} + * optional PersonalEncryptedNote personal_encrypted_note = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getSoftware = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getPersonalEncryptedNote = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote, 4)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Software|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.PersonalEncryptedNote|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setSoftware = function(value) { - return jspb.Message.setWrapperField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setPersonalEncryptedNote = function(value) { + return jspb.Message.setWrapperField(this, 4, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearSoftware = function() { - return this.setSoftware(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.clearPersonalEncryptedNote = function() { + return this.setPersonalEncryptedNote(undefined); }; @@ -42350,45 +63350,26 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.pr * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasSoftware = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional Protocol protocol = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.getProtocol = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol, 2)); -}; - - -/** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.Protocol|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.setProtocol = function(value) { - return jspb.Message.setWrapperField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.hasPersonalEncryptedNote = function() { + return jspb.Message.getField(this, 4) != null; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} returns this + * optional uint64 amount = 5; + * @return {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.clearProtocol = function() { - return this.setProtocol(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.getAmount = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); }; /** - * Returns whether this field is set. - * @return {boolean} + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version.prototype.hasProtocol = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.prototype.setAmount = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); }; @@ -42408,8 +63389,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject(opt_includeInstance, this); }; @@ -42418,16 +63399,14 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject = function(includeInstance, msg) { var f, obj = { - local: jspb.Message.getFieldWithDefault(msg, 1, 0), - block: jspb.Message.getFieldWithDefault(msg, 2, 0), - genesis: jspb.Message.getFieldWithDefault(msg, 3, 0), - epoch: jspb.Message.getFieldWithDefault(msg, 4, 0) + actionType: jspb.Message.getFieldWithDefault(msg, 1, 0), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") }; if (includeInstance) { @@ -42441,23 +63420,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42465,20 +63444,12 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setLocal(value); + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} */ (reader.readEnum()); + msg.setActionType(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBlock(value); - break; - case 3: - var value = /** @type {number} */ (reader.readUint64()); - msg.setGenesis(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint32()); - msg.setEpoch(value); + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); break; default: reader.skipField(); @@ -42493,9 +63464,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42503,84 +63474,78 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getLocal(); - if (f !== 0) { - writer.writeUint64( + f = message.getActionType(); + if (f !== 0.0) { + writer.writeEnum( 1, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 2)); + f = /** @type {string} */ (jspb.Message.getField(message, 2)); if (f != null) { - writer.writeUint64( + writer.writeString( 2, f ); } - f = /** @type {number} */ (jspb.Message.getField(message, 3)); - if (f != null) { - writer.writeUint64( - 3, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 4)); - if (f != null) { - writer.writeUint32( - 4, - f - ); - } }; /** - * optional uint64 local = 1; - * @return {number} + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getLocal = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType = { + PAUSE: 0, + RESUME: 1 +}; + +/** + * optional ActionType action_type = 1; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.getActionType = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.ActionType} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setLocal = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.setActionType = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); }; /** - * optional uint64 block = 2; - * @return {number} + * optional string public_note = 2; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getBlock = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setBlock = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.setPublicNote = function(value) { return jspb.Message.setField(this, 2, value); }; /** * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.clearPublicNote = function() { return jspb.Message.setField(this, 2, undefined); }; @@ -42589,86 +63554,243 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasBlock = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.prototype.hasPublicNote = function() { return jspb.Message.getField(this, 2) != null; }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional uint64 genesis = 3; - * @return {number} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getGenesis = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject(opt_includeInstance, this); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setGenesis = function(value) { - return jspb.Message.setField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + tokenConfigUpdateItem: msg.getTokenConfigUpdateItem_asB64(), + publicNote: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearGenesis = function() { - return jspb.Message.setField(this, 3, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setTokenConfigUpdateItem(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPublicNote(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasGenesis = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * optional uint32 epoch = 4; - * @return {number} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.getEpoch = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTokenConfigUpdateItem_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = /** @type {string} */ (jspb.Message.getField(message, 2)); + if (f != null) { + writer.writeString( + 2, + f + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * optional bytes token_config_update_item = 1; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes token_config_update_item = 1; + * This is a type-conversion wrapper around `getTokenConfigUpdateItem()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getTokenConfigUpdateItem())); +}; + + +/** + * optional bytes token_config_update_item = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getTokenConfigUpdateItem()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getTokenConfigUpdateItem_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getTokenConfigUpdateItem())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.setTokenConfigUpdateItem = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional string public_note = 2; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.getPublicNote = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.setPublicNote = function(value) { + return jspb.Message.setField(this, 2, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.clearPublicNote = function() { + return jspb.Message.setField(this, 2, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.prototype.hasPublicNote = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.setEpoch = function(value) { - return jspb.Message.setField(this, 4, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_ = [[1,2,3]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.clearEpoch = function() { - return jspb.Message.setField(this, 4, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase = { + EVENT_TYPE_NOT_SET: 0, + TOKEN_EVENT: 1, + DOCUMENT_EVENT: 2, + CONTRACT_EVENT: 3 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time.prototype.hasEpoch = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getEventTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.EventTypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -42682,8 +63804,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject(opt_includeInstance, this); }; @@ -42692,14 +63814,15 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject = function(includeInstance, msg) { var f, obj = { - id: msg.getId_asB64(), - proTxHash: msg.getProTxHash_asB64() + tokenEvent: (f = msg.getTokenEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject(includeInstance, f), + documentEvent: (f = msg.getDocumentEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject(includeInstance, f), + contractEvent: (f = msg.getContractEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -42713,23 +63836,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.toObj /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42737,12 +63860,19 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deser var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setId(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader); + msg.setTokenEvent(value); break; case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader); + msg.setDocumentEvent(value); + break; + case 3: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader); + msg.setContractEvent(value); break; default: reader.skipField(); @@ -42757,9 +63887,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.deser * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -42767,119 +63897,138 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getId_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getTokenEvent(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter ); } - f = /** @type {!(string|Uint8Array)} */ (jspb.Message.getField(message, 2)); + f = message.getDocumentEvent(); if (f != null) { - writer.writeBytes( + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter + ); + } + f = message.getContractEvent(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter ); } }; /** - * optional bytes id = 1; - * @return {string} + * optional TokenEvent token_event = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getTokenEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent, 1)); }; /** - * optional bytes id = 1; - * This is a type-conversion wrapper around `getId()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getId())); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setTokenEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); }; /** - * optional bytes id = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getId()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getId_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getId())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearTokenEvent = function() { + return this.setTokenEvent(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setId = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasTokenEvent = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional bytes pro_tx_hash = 2; - * @return {string} + * optional DocumentEvent document_event = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getDocumentEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent, 2)); }; /** - * optional bytes pro_tx_hash = 2; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setDocumentEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearDocumentEvent = function() { + return this.setDocumentEvent(undefined); }; /** - * optional bytes pro_tx_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasDocumentEvent = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * optional ContractEvent contract_event = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.setProTxHash = function(value) { - return jspb.Message.setField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.getContractEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent, 3)); }; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.setContractEvent = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.clearProTxHash = function() { - return jspb.Message.setField(this, 2, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.clearContractEvent = function() { + return this.setContractEvent(undefined); }; @@ -42887,12 +64036,37 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.proto * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node.prototype.hasProTxHash = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.prototype.hasContractEvent = function() { + return jspb.Message.getField(this, 3) != null; }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_ = [[1]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase = { + TYPE_NOT_SET: 0, + CREATE: 1 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -42908,8 +64082,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject(opt_includeInstance, this); }; @@ -42918,21 +64092,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.toObject = function(includeInstance, msg) { var f, obj = { - catchingUp: jspb.Message.getBooleanFieldWithDefault(msg, 1, false), - latestBlockHash: msg.getLatestBlockHash_asB64(), - latestAppHash: msg.getLatestAppHash_asB64(), - latestBlockHeight: jspb.Message.getFieldWithDefault(msg, 4, 0), - earliestBlockHash: msg.getEarliestBlockHash_asB64(), - earliestAppHash: msg.getEarliestAppHash_asB64(), - earliestBlockHeight: jspb.Message.getFieldWithDefault(msg, 7, 0), - maxPeerBlockHeight: jspb.Message.getFieldWithDefault(msg, 9, 0), - coreChainLockedHeight: jspb.Message.getFieldWithDefault(msg, 10, 0) + create: (f = msg.getCreate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -42946,23 +64112,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.toOb /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -42970,40 +64136,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.dese var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setCatchingUp(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLatestBlockHash(value); - break; - case 3: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLatestAppHash(value); - break; - case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setLatestBlockHeight(value); - break; - case 5: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setEarliestBlockHash(value); - break; - case 6: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setEarliestAppHash(value); - break; - case 7: - var value = /** @type {number} */ (reader.readUint64()); - msg.setEarliestBlockHeight(value); - break; - case 9: - var value = /** @type {number} */ (reader.readUint64()); - msg.setMaxPeerBlockHeight(value); - break; - case 10: - var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreChainLockedHeight(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader); + msg.setCreate(value); break; default: reader.skipField(); @@ -43018,9 +64153,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.dese * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43028,357 +64163,396 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getCatchingUp(); - if (f) { - writer.writeBool( - 1, - f - ); - } - f = message.getLatestBlockHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getLatestAppHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 3, - f - ); - } - f = message.getLatestBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 4, - f - ); - } - f = message.getEarliestBlockHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 5, - f - ); - } - f = message.getEarliestAppHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 6, - f - ); - } - f = message.getEarliestBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 7, - f - ); - } - f = message.getMaxPeerBlockHeight(); - if (f !== 0) { - writer.writeUint64( - 9, - f - ); - } - f = /** @type {number} */ (jspb.Message.getField(message, 10)); + f = message.getCreate(); if (f != null) { - writer.writeUint32( - 10, - f + writer.writeMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter ); } }; /** - * optional bool catching_up = 1; - * @return {boolean} + * optional DocumentCreateEvent create = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCatchingUp = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 1, false)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.getCreate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent, 1)); }; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCatchingUp = function(value) { - return jspb.Message.setProto3BooleanField(this, 1, value); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.setCreate = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.oneofGroups_[0], value); }; /** - * optional bytes latest_block_hash = 2; - * @return {string} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.clearCreate = function() { + return this.setCreate(undefined); }; /** - * optional bytes latest_block_hash = 2; - * This is a type-conversion wrapper around `getLatestBlockHash()` - * @return {string} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLatestBlockHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentEvent.prototype.hasCreate = function() { + return jspb.Message.getField(this, 1) != null; }; -/** - * optional bytes latest_block_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLatestBlockHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLatestBlockHash())); -}; - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); -}; +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes latest_app_hash = 3; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject(opt_includeInstance, this); }; /** - * optional bytes latest_app_hash = 3; - * This is a type-conversion wrapper around `getLatestAppHash()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLatestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + createdDocument: msg.getCreatedDocument_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes latest_app_hash = 3; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLatestAppHash()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestAppHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLatestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestAppHash = function(value) { - return jspb.Message.setProto3BytesField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setCreatedDocument(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint64 latest_block_height = 4; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getLatestBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setLatestBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCreatedDocument_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } }; /** - * optional bytes earliest_block_hash = 5; + * optional bytes created_document = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes earliest_block_hash = 5; - * This is a type-conversion wrapper around `getEarliestBlockHash()` + * optional bytes created_document = 1; + * This is a type-conversion wrapper around `getCreatedDocument()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getEarliestBlockHash())); + this.getCreatedDocument())); }; /** - * optional bytes earliest_block_hash = 5; + * optional bytes created_document = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEarliestBlockHash()` + * This is a type-conversion wrapper around `getCreatedDocument()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.getCreatedDocument_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getEarliestBlockHash())); + this.getCreatedDocument())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHash = function(value) { - return jspb.Message.setProto3BytesField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DocumentCreateEvent.prototype.setCreatedDocument = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * optional bytes earliest_app_hash = 6; - * @return {string} + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject(opt_includeInstance, this); }; /** - * optional bytes earliest_app_hash = 6; - * This is a type-conversion wrapper around `getEarliestAppHash()` - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getEarliestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject = function(includeInstance, msg) { + var f, obj = { + updatedContract: msg.getUpdatedContract_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional bytes earliest_app_hash = 6; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getEarliestAppHash()` - * @return {!Uint8Array} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestAppHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getEarliestAppHash())); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader(msg, reader); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestAppHash = function(value) { - return jspb.Message.setProto3BytesField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setUpdatedContract(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * optional uint64 earliest_block_height = 7; - * @return {number} + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getEarliestBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUpdatedContract_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * optional bytes updated_contract = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setEarliestBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional uint64 max_peer_block_height = 9; - * @return {number} + * optional bytes updated_contract = 1; + * This is a type-conversion wrapper around `getUpdatedContract()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getMaxPeerBlockHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 9, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getUpdatedContract())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * optional bytes updated_contract = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getUpdatedContract()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setMaxPeerBlockHeight = function(value) { - return jspb.Message.setProto3IntField(this, 9, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.getUpdatedContract_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getUpdatedContract())); }; /** - * optional uint32 core_chain_locked_height = 10; - * @return {number} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.getCoreChainLockedHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 10, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.prototype.setUpdatedContract = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; + /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.setCoreChainLockedHeight = function(value) { - return jspb.Message.setField(this, 10, value); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_ = [[1]]; /** - * Clears the field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.clearCoreChainLockedHeight = function() { - return jspb.Message.setField(this, 10, undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase = { + TYPE_NOT_SET: 0, + UPDATE: 1 }; - /** - * Returns whether this field is set. - * @return {boolean} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain.prototype.hasCoreChainLockedHeight = function() { - return jspb.Message.getField(this, 10) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_[0])); }; - - if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. @@ -43392,8 +64566,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject(opt_includeInstance, this); }; @@ -43402,15 +64576,13 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.pr * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.toObject = function(includeInstance, msg) { var f, obj = { - chainId: jspb.Message.getFieldWithDefault(msg, 1, ""), - peersCount: jspb.Message.getFieldWithDefault(msg, 2, 0), - listening: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + update: (f = msg.getUpdate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -43424,23 +64596,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.to /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -43448,16 +64620,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.de var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {string} */ (reader.readString()); - msg.setChainId(value); - break; - case 2: - var value = /** @type {number} */ (reader.readUint32()); - msg.setPeersCount(value); - break; - case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setListening(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.deserializeBinaryFromReader); + msg.setUpdate(value); break; default: reader.skipField(); @@ -43472,9 +64637,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.de * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43482,90 +64647,92 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.pr /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getChainId(); - if (f.length > 0) { - writer.writeString( + f = message.getUpdate(); + if (f != null) { + writer.writeMessage( 1, - f - ); - } - f = message.getPeersCount(); - if (f !== 0) { - writer.writeUint32( - 2, - f - ); - } - f = message.getListening(); - if (f) { - writer.writeBool( - 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent.serializeBinaryToWriter ); } }; /** - * optional string chain_id = 1; - * @return {string} + * optional ContractUpdateEvent update = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getChainId = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.getUpdate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent, 1)); }; /** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setChainId = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractUpdateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.setUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.oneofGroups_[0], value); }; /** - * optional uint32 peers_count = 2; - * @return {number} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getPeersCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.clearUpdate = function() { + return this.setUpdate(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setPeersCount = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.ContractEvent.prototype.hasUpdate = function() { + return jspb.Message.getField(this, 1) != null; }; + /** - * optional bool listening = 3; - * @return {boolean} + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.getListening = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_ = [[1,2,3,4,5,6,7,8]]; /** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} returns this + * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network.prototype.setListening = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase = { + TYPE_NOT_SET: 0, + MINT: 1, + BURN: 2, + FREEZE: 3, + UNFREEZE: 4, + DESTROY_FROZEN_FUNDS: 5, + TRANSFER: 6, + EMERGENCY_ACTION: 7, + TOKEN_CONFIG_UPDATE: 8 }; - +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTypeCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.TypeCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0])); +}; @@ -43582,8 +64749,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject(opt_includeInstance, this); }; @@ -43592,20 +64759,20 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.toObject = function(includeInstance, msg) { var f, obj = { - totalSyncedTime: jspb.Message.getFieldWithDefault(msg, 1, 0), - remainingTime: jspb.Message.getFieldWithDefault(msg, 2, 0), - totalSnapshots: jspb.Message.getFieldWithDefault(msg, 3, 0), - chunkProcessAvgTime: jspb.Message.getFieldWithDefault(msg, 4, 0), - snapshotHeight: jspb.Message.getFieldWithDefault(msg, 5, 0), - snapshotChunksCount: jspb.Message.getFieldWithDefault(msg, 6, 0), - backfilledBlocks: jspb.Message.getFieldWithDefault(msg, 7, 0), - backfillBlocksTotal: jspb.Message.getFieldWithDefault(msg, 8, 0) + mint: (f = msg.getMint()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.toObject(includeInstance, f), + burn: (f = msg.getBurn()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.toObject(includeInstance, f), + freeze: (f = msg.getFreeze()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.toObject(includeInstance, f), + unfreeze: (f = msg.getUnfreeze()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.toObject(includeInstance, f), + destroyFrozenFunds: (f = msg.getDestroyFrozenFunds()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.toObject(includeInstance, f), + transfer: (f = msg.getTransfer()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.toObject(includeInstance, f), + emergencyAction: (f = msg.getEmergencyAction()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.toObject(includeInstance, f), + tokenConfigUpdate: (f = msg.getTokenConfigUpdate()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.toObject(includeInstance, f) }; if (includeInstance) { @@ -43619,23 +64786,23 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync; - return proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -43643,36 +64810,44 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {number} */ (reader.readUint64()); - msg.setTotalSyncedTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.deserializeBinaryFromReader); + msg.setMint(value); break; case 2: - var value = /** @type {number} */ (reader.readUint64()); - msg.setRemainingTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.deserializeBinaryFromReader); + msg.setBurn(value); break; case 3: - var value = /** @type {number} */ (reader.readUint32()); - msg.setTotalSnapshots(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.deserializeBinaryFromReader); + msg.setFreeze(value); break; case 4: - var value = /** @type {number} */ (reader.readUint64()); - msg.setChunkProcessAvgTime(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.deserializeBinaryFromReader); + msg.setUnfreeze(value); break; case 5: - var value = /** @type {number} */ (reader.readUint64()); - msg.setSnapshotHeight(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.deserializeBinaryFromReader); + msg.setDestroyFrozenFunds(value); break; case 6: - var value = /** @type {number} */ (reader.readUint64()); - msg.setSnapshotChunksCount(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.deserializeBinaryFromReader); + msg.setTransfer(value); break; case 7: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBackfilledBlocks(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.deserializeBinaryFromReader); + msg.setEmergencyAction(value); break; case 8: - var value = /** @type {number} */ (reader.readUint64()); - msg.setBackfillBlocksTotal(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.deserializeBinaryFromReader); + msg.setTokenConfigUpdate(value); break; default: reader.skipField(); @@ -43687,9 +64862,9 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -43697,351 +64872,765 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync. /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getTotalSyncedTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getMint(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent.serializeBinaryToWriter ); } - f = message.getRemainingTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getBurn(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent.serializeBinaryToWriter ); } - f = message.getTotalSnapshots(); - if (f !== 0) { - writer.writeUint32( + f = message.getFreeze(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent.serializeBinaryToWriter ); } - f = message.getChunkProcessAvgTime(); - if (f !== 0) { - writer.writeUint64( + f = message.getUnfreeze(); + if (f != null) { + writer.writeMessage( 4, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent.serializeBinaryToWriter ); } - f = message.getSnapshotHeight(); - if (f !== 0) { - writer.writeUint64( + f = message.getDestroyFrozenFunds(); + if (f != null) { + writer.writeMessage( 5, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent.serializeBinaryToWriter ); } - f = message.getSnapshotChunksCount(); - if (f !== 0) { - writer.writeUint64( + f = message.getTransfer(); + if (f != null) { + writer.writeMessage( 6, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent.serializeBinaryToWriter ); } - f = message.getBackfilledBlocks(); - if (f !== 0) { - writer.writeUint64( + f = message.getEmergencyAction(); + if (f != null) { + writer.writeMessage( 7, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent.serializeBinaryToWriter ); } - f = message.getBackfillBlocksTotal(); - if (f !== 0) { - writer.writeUint64( + f = message.getTokenConfigUpdate(); + if (f != null) { + writer.writeMessage( 8, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent.serializeBinaryToWriter ); } }; /** - * optional uint64 total_synced_time = 1; - * @return {number} + * optional MintEvent mint = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSyncedTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getMint = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent, 1)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.MintEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setMint = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSyncedTime = function(value) { - return jspb.Message.setProto3IntField(this, 1, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearMint = function() { + return this.setMint(undefined); }; /** - * optional uint64 remaining_time = 2; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getRemainingTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasMint = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional BurnEvent burn = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setRemainingTime = function(value) { - return jspb.Message.setProto3IntField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getBurn = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent, 2)); }; /** - * optional uint32 total_snapshots = 3; - * @return {number} + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.BurnEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setBurn = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getTotalSnapshots = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearBurn = function() { + return this.setBurn(undefined); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setTotalSnapshots = function(value) { - return jspb.Message.setProto3IntField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasBurn = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional uint64 chunk_process_avg_time = 4; - * @return {number} + * optional FreezeEvent freeze = 3; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getChunkProcessAvgTime = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getFreeze = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent, 3)); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.FreezeEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setFreeze = function(value) { + return jspb.Message.setOneofWrapperField(this, 3, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setChunkProcessAvgTime = function(value) { - return jspb.Message.setProto3IntField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearFreeze = function() { + return this.setFreeze(undefined); }; /** - * optional uint64 snapshot_height = 5; - * @return {number} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotHeight = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasFreeze = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional UnfreezeEvent unfreeze = 4; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getUnfreeze = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent, 4)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.UnfreezeEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setUnfreeze = function(value) { + return jspb.Message.setOneofWrapperField(this, 4, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearUnfreeze = function() { + return this.setUnfreeze(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasUnfreeze = function() { + return jspb.Message.getField(this, 4) != null; +}; + + +/** + * optional DestroyFrozenFundsEvent destroy_frozen_funds = 5; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getDestroyFrozenFunds = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent, 5)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.DestroyFrozenFundsEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setDestroyFrozenFunds = function(value) { + return jspb.Message.setOneofWrapperField(this, 5, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearDestroyFrozenFunds = function() { + return this.setDestroyFrozenFunds(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasDestroyFrozenFunds = function() { + return jspb.Message.getField(this, 5) != null; +}; + + +/** + * optional TransferEvent transfer = 6; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTransfer = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent, 6)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TransferEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setTransfer = function(value) { + return jspb.Message.setOneofWrapperField(this, 6, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearTransfer = function() { + return this.setTransfer(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasTransfer = function() { + return jspb.Message.getField(this, 6) != null; +}; + + +/** + * optional EmergencyActionEvent emergency_action = 7; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getEmergencyAction = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent, 7)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.EmergencyActionEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setEmergencyAction = function(value) { + return jspb.Message.setOneofWrapperField(this, 7, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearEmergencyAction = function() { + return this.setEmergencyAction(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasEmergencyAction = function() { + return jspb.Message.getField(this, 7) != null; +}; + + +/** + * optional TokenConfigUpdateEvent token_config_update = 8; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.getTokenConfigUpdate = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent, 8)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenConfigUpdateEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.setTokenConfigUpdate = function(value) { + return jspb.Message.setOneofWrapperField(this, 8, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.clearTokenConfigUpdate = function() { + return this.setTokenConfigUpdate(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.TokenEvent.prototype.hasTokenConfigUpdate = function() { + return jspb.Message.getField(this, 8) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject = function(includeInstance, msg) { + var f, obj = { + actionId: msg.getActionId_asB64(), + event: (f = msg.getEvent()) && proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setActionId(value); + break; + case 2: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.deserializeBinaryFromReader); + msg.setEvent(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getEvent(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent.serializeBinaryToWriter + ); + } }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional bytes action_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotHeight = function(value) { - return jspb.Message.setProto3IntField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional uint64 snapshot_chunks_count = 6; - * @return {number} + * optional bytes action_id = 1; + * This is a type-conversion wrapper around `getActionId()` + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getSnapshotChunksCount = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 6, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getActionId())); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional bytes action_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getActionId()` + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setSnapshotChunksCount = function(value) { - return jspb.Message.setProto3IntField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getActionId())); }; /** - * optional uint64 backfilled_blocks = 7; - * @return {number} + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfilledBlocks = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.setActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * optional GroupActionEvent event = 2; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfilledBlocks = function(value) { - return jspb.Message.setProto3IntField(this, 7, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.getEvent = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent, 2)); }; /** - * optional uint64 backfill_blocks_total = 8; - * @return {number} - */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.getBackfillBlocksTotal = function() { - return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 8, 0)); + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEvent|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.setEvent = function(value) { + return jspb.Message.setWrapperField(this, 2, value); }; /** - * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} returns this + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync.prototype.setBackfillBlocksTotal = function(value) { - return jspb.Message.setProto3IntField(this, 8, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.clearEvent = function() { + return this.setEvent(undefined); }; /** - * optional Version version = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getVersion = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.prototype.hasEvent = function() { + return jspb.Message.getField(this, 2) != null; }; + /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Version|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setVersion = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; + * List of repeated fields within this message type. + * @private {!Array<number>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.repeatedFields_ = [1]; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearVersion = function() { - return this.setVersion(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject(opt_includeInstance, this); }; /** - * Returns whether this field is set. - * @return {boolean} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasVersion = function() { - return jspb.Message.getField(this, 1) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.toObject = function(includeInstance, msg) { + var f, obj = { + groupActionsList: jspb.Message.toObjectList(msg.getGroupActionsList(), + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * optional Node node = 2; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNode = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node, 2)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions; + return proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader(msg, reader); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Node|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNode = function(value) { - return jspb.Message.setWrapperField(this, 2, value); + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.deserializeBinaryFromReader); + msg.addGroupActions(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNode = function() { - return this.setNode(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); }; /** - * Returns whether this field is set. - * @return {boolean} + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNode = function() { - return jspb.Message.getField(this, 2) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getGroupActionsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 1, + f, + proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry.serializeBinaryToWriter + ); + } }; /** - * optional Chain chain = 3; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} + * repeated GroupActionEntry group_actions = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getChain = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.getGroupActionsList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Chain|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setChain = function(value) { - return jspb.Message.setWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.setGroupActionsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry=} opt_value + * @param {number=} opt_index + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearChain = function() { - return this.setChain(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.addGroupActions = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActionEntry, opt_index); }; /** - * Returns whether this field is set. - * @return {boolean} + * Clears the list making it empty but non-null. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasChain = function() { - return jspb.Message.getField(this, 3) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions.prototype.clearGroupActionsList = function() { + return this.setGroupActionsList([]); }; /** - * optional Network network = 4; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} + * optional GroupActions group_actions = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getNetwork = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network, 4)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getGroupActions = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Network|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.GroupActions|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setNetwork = function(value) { - return jspb.Message.setWrapperField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setGroupActions = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearNetwork = function() { - return this.setNetwork(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearGroupActions = function() { + return this.setGroupActions(undefined); }; @@ -44049,36 +65638,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasNetwork = function() { - return jspb.Message.getField(this, 4) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasGroupActions = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional StateSync state_sync = 5; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getStateSync = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync, 5)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.StateSync|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setStateSync = function(value) { - return jspb.Message.setWrapperField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearStateSync = function() { - return this.setStateSync(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; @@ -44086,36 +65675,36 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasStateSync = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional Time time = 6; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} + * optional ResponseMetadata metadata = 3; + * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.getTime = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time, 6)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.getMetadata = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.Time|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.setTime = function(value) { - return jspb.Message.setWrapperField(this, 6, value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.clearTime = function() { - return this.setTime(undefined); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.clearMetadata = function() { + return this.setMetadata(undefined); }; @@ -44123,35 +65712,35 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype. * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0.prototype.hasTime = function() { - return jspb.Message.getField(this, 6) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetStatusResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} + * optional GetGroupActionsResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetStatusResponse.GetStatusResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.GetGroupActionsResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetStatusResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetStatusResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionsResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -44160,7 +65749,7 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.clearV0 = function() * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionsResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -44174,21 +65763,21 @@ proto.org.dash.platform.dapi.v0.GetStatusResponse.prototype.hasV0 = function() { * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_[0])); }; @@ -44206,8 +65795,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.toObject(opt_includeInstance, this); }; @@ -44216,13 +65805,13 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -44236,23 +65825,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.toObject = function /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44260,8 +65849,8 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFr var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -44277,9 +65866,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.deserializeBinaryFr * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44287,23 +65876,31 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.serialize /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter ); } }; +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus = { + ACTIVE: 0, + CLOSED: 1 +}; + @@ -44320,8 +65917,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject(opt_includeInstance, this); }; @@ -44330,13 +65927,17 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.toObject = function(includeInstance, msg) { var f, obj = { - + contractId: msg.getContractId_asB64(), + groupContractPosition: jspb.Message.getFieldWithDefault(msg, 2, 0), + status: jspb.Message.getFieldWithDefault(msg, 3, 0), + actionId: msg.getActionId_asB64(), + prove: jspb.Message.getBooleanFieldWithDefault(msg, 5, false) }; if (includeInstance) { @@ -44350,29 +65951,49 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; } var field = reader.getFieldNumber(); switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setContractId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGroupContractPosition(value); + break; + case 3: + var value = /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setActionId(value); + break; + case 5: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setProve(value); + break; default: reader.skipField(); break; @@ -44386,9 +66007,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44396,39 +66017,212 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsIn /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; + f = message.getContractId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getGroupContractPosition(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 3, + f + ); + } + f = message.getActionId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getProve(); + if (f) { + writer.writeBool( + 5, + f + ); + } }; /** - * optional GetCurrentQuorumsInfoRequestV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} + * optional bytes contract_id = 1; + * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.GetCurrentQuorumsInfoRequestV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + * optional bytes contract_id = 1; + * This is a type-conversion wrapper around `getContractId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getContractId())); +}; + + +/** + * optional bytes contract_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getContractId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getContractId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getContractId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setContractId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 group_contract_position = 2; + * @return {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getGroupContractPosition = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setGroupContractPosition = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional ActionStatus status = 3; + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getStatus = function() { + return /** @type {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.ActionStatus} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 3, value); +}; + + +/** + * optional bytes action_id = 4; + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes action_id = 4; + * This is a type-conversion wrapper around `getActionId()` + * @return {string} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getActionId())); +}; + + +/** + * optional bytes action_id = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getActionId()` + * @return {!Uint8Array} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getActionId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getActionId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setActionId = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional bool prove = 5; + * @return {boolean} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.getProve = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 5, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} returns this + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0.prototype.setProve = function(value) { + return jspb.Message.setProto3BooleanField(this, 5, value); +}; + + +/** + * optional GetGroupActionSignersRequestV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0, 1)); +}; + + +/** + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.GetGroupActionSignersRequestV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -44437,7 +66231,7 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.clearV0 = * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersRequest.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; @@ -44451,21 +66245,21 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoRequest.prototype.hasV0 = f * @private {!Array<!Array<number>>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_ = [[1]]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_ = [[1]]; /** * @enum {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase = { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase = { VERSION_NOT_SET: 0, V0: 1 }; /** - * @return {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getVersionCase = function() { - return /** @type {proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0])); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.getVersionCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.VersionCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_[0])); }; @@ -44483,8 +66277,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.toObject(opt_includeInstance, this); }; @@ -44493,13 +66287,13 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.toObject * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.toObject = function(includeInstance, msg) { var f, obj = { - v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(includeInstance, f) + v0: (f = msg.getV0()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject(includeInstance, f) }; if (includeInstance) { @@ -44513,23 +66307,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.toObject = functio /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44537,8 +66331,8 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryF var field = reader.getFieldNumber(); switch (field) { case 1: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader); msg.setV0(value); break; default: @@ -44554,9 +66348,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.deserializeBinaryF * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44564,24 +66358,50 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.serializ /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.serializeBinaryToWriter = function(message, writer) { var f = undefined; f = message.getV0(); if (f != null) { writer.writeMessage( 1, f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter ); } }; +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array<!Array<number>>} + * @const + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase = { + RESULT_NOT_SET: 0, + GROUP_ACTION_SIGNERS: 1, + PROOF: 2 +}; + +/** + * @return {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase} + */ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getResultCase = function() { + return /** @type {proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.ResultCase} */(jspb.Message.computeOneofCase(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0])); +}; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -44597,8 +66417,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject(opt_includeInstance, this); }; @@ -44607,15 +66427,15 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.protot * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.toObject = function(includeInstance, msg) { var f, obj = { - proTxHash: msg.getProTxHash_asB64(), - nodeIp: jspb.Message.getFieldWithDefault(msg, 2, ""), - isBanned: jspb.Message.getBooleanFieldWithDefault(msg, 3, false) + groupActionSigners: (f = msg.getGroupActionSigners()) && proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject(includeInstance, f), + proof: (f = msg.getProof()) && proto.org.dash.platform.dapi.v0.Proof.toObject(includeInstance, f), + metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) }; if (includeInstance) { @@ -44629,23 +66449,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObje /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44653,16 +66473,19 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deseri var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setProTxHash(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader); + msg.setGroupActionSigners(value); break; case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setNodeIp(value); + var value = new proto.org.dash.platform.dapi.v0.Proof; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.Proof.deserializeBinaryFromReader); + msg.setProof(value); break; case 3: - var value = /** @type {boolean} */ (reader.readBool()); - msg.setIsBanned(value); + var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); + msg.setMetadata(value); break; default: reader.skipField(); @@ -44677,9 +66500,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deseri * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44687,121 +66510,39 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.protot /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getProTxHash_asU8(); - if (f.length > 0) { - writer.writeBytes( + f = message.getGroupActionSigners(); + if (f != null) { + writer.writeMessage( 1, - f + f, + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter ); } - f = message.getNodeIp(); - if (f.length > 0) { - writer.writeString( + f = message.getProof(); + if (f != null) { + writer.writeMessage( 2, - f + f, + proto.org.dash.platform.dapi.v0.Proof.serializeBinaryToWriter ); } - f = message.getIsBanned(); - if (f) { - writer.writeBool( + f = message.getMetadata(); + if (f != null) { + writer.writeMessage( 3, - f + f, + proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter ); } }; -/** - * optional bytes pro_tx_hash = 1; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * This is a type-conversion wrapper around `getProTxHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getProTxHash())); -}; - - -/** - * optional bytes pro_tx_hash = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getProTxHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getProTxHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getProTxHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setProTxHash = function(value) { - return jspb.Message.setProto3BytesField(this, 1, value); -}; - - -/** - * optional string node_ip = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getNodeIp = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * @param {string} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setNodeIp = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); -}; - - -/** - * optional bool is_banned = 3; - * @return {boolean} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.getIsBanned = function() { - return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false)); -}; - - -/** - * @param {boolean} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.prototype.setIsBanned = function(value) { - return jspb.Message.setProto3BooleanField(this, 3, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array<number>} - * @const - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.repeatedFields_ = [3]; @@ -44818,8 +66559,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject(opt_includeInstance, this); }; @@ -44828,17 +66569,14 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.pro * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject = function(includeInstance, msg) { var f, obj = { - quorumHash: msg.getQuorumHash_asB64(), - coreHeight: jspb.Message.getFieldWithDefault(msg, 2, 0), - membersList: jspb.Message.toObjectList(msg.getMembersList(), - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.toObject, includeInstance), - thresholdPublicKey: msg.getThresholdPublicKey_asB64() + signerId: msg.getSignerId_asB64(), + power: jspb.Message.getFieldWithDefault(msg, 2, 0) }; if (includeInstance) { @@ -44852,23 +66590,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toO /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -44877,20 +66615,11 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.des switch (field) { case 1: var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setQuorumHash(value); + msg.setSignerId(value); break; case 2: var value = /** @type {number} */ (reader.readUint32()); - msg.setCoreHeight(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.deserializeBinaryFromReader); - msg.addMembers(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setThresholdPublicKey(value); + msg.setPower(value); break; default: reader.skipField(); @@ -44905,9 +66634,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.des * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -44915,191 +66644,96 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.pro /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getQuorumHash_asU8(); + f = message.getSignerId_asU8(); if (f.length > 0) { writer.writeBytes( 1, f ); } - f = message.getCoreHeight(); + f = message.getPower(); if (f !== 0) { writer.writeUint32( 2, f ); } - f = message.getMembersList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0.serializeBinaryToWriter - ); - } - f = message.getThresholdPublicKey_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } }; /** - * optional bytes quorum_hash = 1; + * optional bytes signer_id = 1; * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId = function() { return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); }; /** - * optional bytes quorum_hash = 1; - * This is a type-conversion wrapper around `getQuorumHash()` + * optional bytes signer_id = 1; + * This is a type-conversion wrapper around `getSignerId()` * @return {string} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asB64 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId_asB64 = function() { return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getQuorumHash())); + this.getSignerId())); }; /** - * optional bytes quorum_hash = 1; + * optional bytes signer_id = 1; * Note that Uint8Array is not supported on all browsers. * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHash()` + * This is a type-conversion wrapper around `getSignerId()` * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getQuorumHash_asU8 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getSignerId_asU8 = function() { return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getQuorumHash())); + this.getSignerId())); }; /** * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setQuorumHash = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.setSignerId = function(value) { return jspb.Message.setProto3BytesField(this, 1, value); }; /** - * optional uint32 core_height = 2; + * optional uint32 power = 2; * @return {number} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getCoreHeight = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.getPower = function() { return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); }; /** * @param {number} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setCoreHeight = function(value) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.prototype.setPower = function(value) { return jspb.Message.setProto3IntField(this, 2, value); }; -/** - * repeated ValidatorV0 members = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getMembersList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, 3)); -}; - - -/** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0>} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this -*/ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setMembersList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); -}; - - -/** - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.addMembers = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorV0, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.clearMembersList = function() { - return this.setMembersList([]); -}; - - -/** - * optional bytes threshold_public_key = 4; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); -}; - - -/** - * optional bytes threshold_public_key = 4; - * This is a type-conversion wrapper around `getThresholdPublicKey()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getThresholdPublicKey())); -}; - - -/** - * optional bytes threshold_public_key = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getThresholdPublicKey()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.getThresholdPublicKey_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getThresholdPublicKey())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.prototype.setThresholdPublicKey = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); -}; - - /** * List of repeated fields within this message type. * @private {!Array<number>} * @const */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.repeatedFields_ = [1,3]; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.repeatedFields_ = [1]; @@ -45116,8 +66750,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.toObject = function(opt_includeInstance) { - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject(opt_includeInstance, this); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.toObject = function(opt_includeInstance) { + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject(opt_includeInstance, this); }; @@ -45126,18 +66760,14 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The msg instance to transform. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.toObject = function(includeInstance, msg) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.toObject = function(includeInstance, msg) { var f, obj = { - quorumHashesList: msg.getQuorumHashesList_asB64(), - currentQuorumHash: msg.getCurrentQuorumHash_asB64(), - validatorSetsList: jspb.Message.toObjectList(msg.getValidatorSetsList(), - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.toObject, includeInstance), - lastBlockProposer: msg.getLastBlockProposer_asB64(), - metadata: (f = msg.getMetadata()) && proto.org.dash.platform.dapi.v0.ResponseMetadata.toObject(includeInstance, f) + signersList: jspb.Message.toObjectList(msg.getSignersList(), + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.toObject, includeInstance) }; if (includeInstance) { @@ -45151,23 +66781,23 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinary = function(bytes) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0; - return proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader(msg, reader); + var msg = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners; + return proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} msg The message object to deserialize into. + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.deserializeBinaryFromReader = function(msg, reader) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -45175,26 +66805,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI var field = reader.getFieldNumber(); switch (field) { case 1: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.addQuorumHashes(value); - break; - case 2: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setCurrentQuorumHash(value); - break; - case 3: - var value = new proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.deserializeBinaryFromReader); - msg.addValidatorSets(value); - break; - case 4: - var value = /** @type {!Uint8Array} */ (reader.readBytes()); - msg.setLastBlockProposer(value); - break; - case 5: - var value = new proto.org.dash.platform.dapi.v0.ResponseMetadata; - reader.readMessage(value,proto.org.dash.platform.dapi.v0.ResponseMetadata.deserializeBinaryFromReader); - msg.setMetadata(value); + var value = new proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner; + reader.readMessage(value,proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.deserializeBinaryFromReader); + msg.addSigners(value); break; default: reader.skipField(); @@ -45209,9 +66822,9 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.serializeBinary = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter(this, writer); + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -45219,259 +66832,159 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} message + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.serializeBinaryToWriter = function(message, writer) { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getQuorumHashesList_asU8(); - if (f.length > 0) { - writer.writeRepeatedBytes( - 1, - f - ); - } - f = message.getCurrentQuorumHash_asU8(); - if (f.length > 0) { - writer.writeBytes( - 2, - f - ); - } - f = message.getValidatorSetsList(); + f = message.getSignersList(); if (f.length > 0) { writer.writeRepeatedMessage( - 3, - f, - proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0.serializeBinaryToWriter - ); - } - f = message.getLastBlockProposer_asU8(); - if (f.length > 0) { - writer.writeBytes( - 4, - f - ); - } - f = message.getMetadata(); - if (f != null) { - writer.writeMessage( - 5, + 1, f, - proto.org.dash.platform.dapi.v0.ResponseMetadata.serializeBinaryToWriter + proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner.serializeBinaryToWriter ); } }; /** - * repeated bytes quorum_hashes = 1; - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList = function() { - return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * repeated bytes quorum_hashes = 1; - * This is a type-conversion wrapper around `getQuorumHashesList()` - * @return {!Array<string>} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asB64 = function() { - return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64( - this.getQuorumHashesList())); -}; - - -/** - * repeated bytes quorum_hashes = 1; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getQuorumHashesList()` - * @return {!Array<!Uint8Array>} + * repeated GroupActionSigner signers = 1; + * @return {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getQuorumHashesList_asU8 = function() { - return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8( - this.getQuorumHashesList())); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.getSignersList = function() { + return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, 1)); }; /** - * @param {!(Array<!Uint8Array>|Array<string>)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setQuorumHashesList = function(value) { - return jspb.Message.setField(this, 1, value || []); + * @param {!Array<!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner>} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.setSignersList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 1, value); }; /** - * @param {!(string|Uint8Array)} value + * @param {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner=} opt_value * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addQuorumHashes = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.addSigners = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigner, opt_index); }; /** * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearQuorumHashesList = function() { - return this.setQuorumHashesList([]); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * This is a type-conversion wrapper around `getCurrentQuorumHash()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getCurrentQuorumHash())); -}; - - -/** - * optional bytes current_quorum_hash = 2; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getCurrentQuorumHash()` - * @return {!Uint8Array} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getCurrentQuorumHash_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getCurrentQuorumHash())); -}; - - -/** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setCurrentQuorumHash = function(value) { - return jspb.Message.setProto3BytesField(this, 2, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners.prototype.clearSignersList = function() { + return this.setSignersList([]); }; /** - * repeated ValidatorSetV0 validator_sets = 3; - * @return {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} + * optional GroupActionSigners group_action_signers = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getValidatorSetsList = function() { - return /** @type{!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, 3)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getGroupActionSigners = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners, 1)); }; /** - * @param {!Array<!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0>} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.GroupActionSigners|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setValidatorSetsList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 3, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setGroupActionSigners = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0], value); }; /** - * @param {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0=} opt_value - * @param {number=} opt_index - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.addValidatorSets = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.ValidatorSetV0, opt_index); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearGroupActionSigners = function() { + return this.setGroupActionSigners(undefined); }; /** - * Clears the list making it empty but non-null. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearValidatorSetsList = function() { - return this.setValidatorSetsList([]); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasGroupActionSigners = function() { + return jspb.Message.getField(this, 1) != null; }; /** - * optional bytes last_block_proposer = 4; - * @return {string} + * optional Proof proof = 2; + * @return {?proto.org.dash.platform.dapi.v0.Proof} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getProof = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.Proof} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.Proof, 2)); }; /** - * optional bytes last_block_proposer = 4; - * This is a type-conversion wrapper around `getLastBlockProposer()` - * @return {string} - */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asB64 = function() { - return /** @type {string} */ (jspb.Message.bytesAsB64( - this.getLastBlockProposer())); + * @param {?proto.org.dash.platform.dapi.v0.Proof|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this +*/ +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setProof = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.oneofGroups_[0], value); }; /** - * optional bytes last_block_proposer = 4; - * Note that Uint8Array is not supported on all browsers. - * @see http://caniuse.com/Uint8Array - * This is a type-conversion wrapper around `getLastBlockProposer()` - * @return {!Uint8Array} + * Clears the message field making it undefined. + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getLastBlockProposer_asU8 = function() { - return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( - this.getLastBlockProposer())); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearProof = function() { + return this.setProof(undefined); }; /** - * @param {!(string|Uint8Array)} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * Returns whether this field is set. + * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setLastBlockProposer = function(value) { - return jspb.Message.setProto3BytesField(this, 4, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasProof = function() { + return jspb.Message.getField(this, 2) != null; }; /** - * optional ResponseMetadata metadata = 5; + * optional ResponseMetadata metadata = 3; * @return {?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.getMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.getMetadata = function() { return /** @type{?proto.org.dash.platform.dapi.v0.ResponseMetadata} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 5)); + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.ResponseMetadata, 3)); }; /** * @param {?proto.org.dash.platform.dapi.v0.ResponseMetadata|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.setMetadata = function(value) { - return jspb.Message.setWrapperField(this, 5, value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.setMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.clearMetadata = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.clearMetadata = function() { return this.setMetadata(undefined); }; @@ -45480,35 +66993,35 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsI * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0.prototype.hasMetadata = function() { - return jspb.Message.getField(this, 5) != null; +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0.prototype.hasMetadata = function() { + return jspb.Message.getField(this, 3) != null; }; /** - * optional GetCurrentQuorumsInfoResponseV0 v0 = 1; - * @return {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} + * optional GetGroupActionSignersResponseV0 v0 = 1; + * @return {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.getV0 = function() { - return /** @type{?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0} */ ( - jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0, 1)); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.getV0 = function() { + return /** @type{?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0} */ ( + jspb.Message.getWrapperField(this, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0, 1)); }; /** - * @param {?proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.GetCurrentQuorumsInfoResponseV0|undefined} value - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + * @param {?proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.GetGroupActionSignersResponseV0|undefined} value + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.setV0 = function(value) { - return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.oneofGroups_[0], value); +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.setV0 = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.oneofGroups_[0], value); }; /** * Clears the message field making it undefined. - * @return {!proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse} returns this + * @return {!proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse} returns this */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.clearV0 = function() { return this.setV0(undefined); }; @@ -45517,7 +67030,7 @@ proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.clearV0 * Returns whether this field is set. * @return {boolean} */ -proto.org.dash.platform.dapi.v0.GetCurrentQuorumsInfoResponse.prototype.hasV0 = function() { +proto.org.dash.platform.dapi.v0.GetGroupActionSignersResponse.prototype.hasV0 = function() { return jspb.Message.getField(this, 1) != null; }; diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts index 11bc954b2d0..78116e10177 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts @@ -292,6 +292,105 @@ type PlatformgetCurrentQuorumsInfo = { readonly responseType: typeof platform_pb.GetCurrentQuorumsInfoResponse; }; +type PlatformgetIdentityTokenBalances = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentityTokenBalancesRequest; + readonly responseType: typeof platform_pb.GetIdentityTokenBalancesResponse; +}; + +type PlatformgetIdentitiesTokenBalances = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentitiesTokenBalancesRequest; + readonly responseType: typeof platform_pb.GetIdentitiesTokenBalancesResponse; +}; + +type PlatformgetIdentityTokenInfos = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentityTokenInfosRequest; + readonly responseType: typeof platform_pb.GetIdentityTokenInfosResponse; +}; + +type PlatformgetIdentitiesTokenInfos = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetIdentitiesTokenInfosRequest; + readonly responseType: typeof platform_pb.GetIdentitiesTokenInfosResponse; +}; + +type PlatformgetTokenStatuses = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetTokenStatusesRequest; + readonly responseType: typeof platform_pb.GetTokenStatusesResponse; +}; + +type PlatformgetTokenPreProgrammedDistributions = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetTokenPreProgrammedDistributionsRequest; + readonly responseType: typeof platform_pb.GetTokenPreProgrammedDistributionsResponse; +}; + +type PlatformgetTokenTotalSupply = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetTokenTotalSupplyRequest; + readonly responseType: typeof platform_pb.GetTokenTotalSupplyResponse; +}; + +type PlatformgetGroupInfo = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetGroupInfoRequest; + readonly responseType: typeof platform_pb.GetGroupInfoResponse; +}; + +type PlatformgetGroupInfos = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetGroupInfosRequest; + readonly responseType: typeof platform_pb.GetGroupInfosResponse; +}; + +type PlatformgetGroupActions = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetGroupActionsRequest; + readonly responseType: typeof platform_pb.GetGroupActionsResponse; +}; + +type PlatformgetGroupActionSigners = { + readonly methodName: string; + readonly service: typeof Platform; + readonly requestStream: false; + readonly responseStream: false; + readonly requestType: typeof platform_pb.GetGroupActionSignersRequest; + readonly responseType: typeof platform_pb.GetGroupActionSignersResponse; +}; + export class Platform { static readonly serviceName: string; static readonly broadcastStateTransition: PlatformbroadcastStateTransition; @@ -326,6 +425,17 @@ export class Platform { static readonly getPathElements: PlatformgetPathElements; static readonly getStatus: PlatformgetStatus; static readonly getCurrentQuorumsInfo: PlatformgetCurrentQuorumsInfo; + static readonly getIdentityTokenBalances: PlatformgetIdentityTokenBalances; + static readonly getIdentitiesTokenBalances: PlatformgetIdentitiesTokenBalances; + static readonly getIdentityTokenInfos: PlatformgetIdentityTokenInfos; + static readonly getIdentitiesTokenInfos: PlatformgetIdentitiesTokenInfos; + static readonly getTokenStatuses: PlatformgetTokenStatuses; + static readonly getTokenPreProgrammedDistributions: PlatformgetTokenPreProgrammedDistributions; + static readonly getTokenTotalSupply: PlatformgetTokenTotalSupply; + static readonly getGroupInfo: PlatformgetGroupInfo; + static readonly getGroupInfos: PlatformgetGroupInfos; + static readonly getGroupActions: PlatformgetGroupActions; + static readonly getGroupActionSigners: PlatformgetGroupActionSigners; } export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } @@ -648,5 +758,104 @@ export class PlatformClient { requestMessage: platform_pb.GetCurrentQuorumsInfoRequest, callback: (error: ServiceError|null, responseMessage: platform_pb.GetCurrentQuorumsInfoResponse|null) => void ): UnaryResponse; + getIdentityTokenBalances( + requestMessage: platform_pb.GetIdentityTokenBalancesRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityTokenBalancesResponse|null) => void + ): UnaryResponse; + getIdentityTokenBalances( + requestMessage: platform_pb.GetIdentityTokenBalancesRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityTokenBalancesResponse|null) => void + ): UnaryResponse; + getIdentitiesTokenBalances( + requestMessage: platform_pb.GetIdentitiesTokenBalancesRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesTokenBalancesResponse|null) => void + ): UnaryResponse; + getIdentitiesTokenBalances( + requestMessage: platform_pb.GetIdentitiesTokenBalancesRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesTokenBalancesResponse|null) => void + ): UnaryResponse; + getIdentityTokenInfos( + requestMessage: platform_pb.GetIdentityTokenInfosRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityTokenInfosResponse|null) => void + ): UnaryResponse; + getIdentityTokenInfos( + requestMessage: platform_pb.GetIdentityTokenInfosRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentityTokenInfosResponse|null) => void + ): UnaryResponse; + getIdentitiesTokenInfos( + requestMessage: platform_pb.GetIdentitiesTokenInfosRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesTokenInfosResponse|null) => void + ): UnaryResponse; + getIdentitiesTokenInfos( + requestMessage: platform_pb.GetIdentitiesTokenInfosRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetIdentitiesTokenInfosResponse|null) => void + ): UnaryResponse; + getTokenStatuses( + requestMessage: platform_pb.GetTokenStatusesRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenStatusesResponse|null) => void + ): UnaryResponse; + getTokenStatuses( + requestMessage: platform_pb.GetTokenStatusesRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenStatusesResponse|null) => void + ): UnaryResponse; + getTokenPreProgrammedDistributions( + requestMessage: platform_pb.GetTokenPreProgrammedDistributionsRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenPreProgrammedDistributionsResponse|null) => void + ): UnaryResponse; + getTokenPreProgrammedDistributions( + requestMessage: platform_pb.GetTokenPreProgrammedDistributionsRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenPreProgrammedDistributionsResponse|null) => void + ): UnaryResponse; + getTokenTotalSupply( + requestMessage: platform_pb.GetTokenTotalSupplyRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenTotalSupplyResponse|null) => void + ): UnaryResponse; + getTokenTotalSupply( + requestMessage: platform_pb.GetTokenTotalSupplyRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetTokenTotalSupplyResponse|null) => void + ): UnaryResponse; + getGroupInfo( + requestMessage: platform_pb.GetGroupInfoRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupInfoResponse|null) => void + ): UnaryResponse; + getGroupInfo( + requestMessage: platform_pb.GetGroupInfoRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupInfoResponse|null) => void + ): UnaryResponse; + getGroupInfos( + requestMessage: platform_pb.GetGroupInfosRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupInfosResponse|null) => void + ): UnaryResponse; + getGroupInfos( + requestMessage: platform_pb.GetGroupInfosRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupInfosResponse|null) => void + ): UnaryResponse; + getGroupActions( + requestMessage: platform_pb.GetGroupActionsRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupActionsResponse|null) => void + ): UnaryResponse; + getGroupActions( + requestMessage: platform_pb.GetGroupActionsRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupActionsResponse|null) => void + ): UnaryResponse; + getGroupActionSigners( + requestMessage: platform_pb.GetGroupActionSignersRequest, + metadata: grpc.Metadata, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupActionSignersResponse|null) => void + ): UnaryResponse; + getGroupActionSigners( + requestMessage: platform_pb.GetGroupActionSignersRequest, + callback: (error: ServiceError|null, responseMessage: platform_pb.GetGroupActionSignersResponse|null) => void + ): UnaryResponse; } diff --git a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js index 5ba77dbcd45..3a5bab94009 100644 --- a/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js +++ b/packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.js @@ -298,6 +298,105 @@ Platform.getCurrentQuorumsInfo = { responseType: platform_pb.GetCurrentQuorumsInfoResponse }; +Platform.getIdentityTokenBalances = { + methodName: "getIdentityTokenBalances", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentityTokenBalancesRequest, + responseType: platform_pb.GetIdentityTokenBalancesResponse +}; + +Platform.getIdentitiesTokenBalances = { + methodName: "getIdentitiesTokenBalances", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentitiesTokenBalancesRequest, + responseType: platform_pb.GetIdentitiesTokenBalancesResponse +}; + +Platform.getIdentityTokenInfos = { + methodName: "getIdentityTokenInfos", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentityTokenInfosRequest, + responseType: platform_pb.GetIdentityTokenInfosResponse +}; + +Platform.getIdentitiesTokenInfos = { + methodName: "getIdentitiesTokenInfos", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetIdentitiesTokenInfosRequest, + responseType: platform_pb.GetIdentitiesTokenInfosResponse +}; + +Platform.getTokenStatuses = { + methodName: "getTokenStatuses", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetTokenStatusesRequest, + responseType: platform_pb.GetTokenStatusesResponse +}; + +Platform.getTokenPreProgrammedDistributions = { + methodName: "getTokenPreProgrammedDistributions", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetTokenPreProgrammedDistributionsRequest, + responseType: platform_pb.GetTokenPreProgrammedDistributionsResponse +}; + +Platform.getTokenTotalSupply = { + methodName: "getTokenTotalSupply", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetTokenTotalSupplyRequest, + responseType: platform_pb.GetTokenTotalSupplyResponse +}; + +Platform.getGroupInfo = { + methodName: "getGroupInfo", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetGroupInfoRequest, + responseType: platform_pb.GetGroupInfoResponse +}; + +Platform.getGroupInfos = { + methodName: "getGroupInfos", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetGroupInfosRequest, + responseType: platform_pb.GetGroupInfosResponse +}; + +Platform.getGroupActions = { + methodName: "getGroupActions", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetGroupActionsRequest, + responseType: platform_pb.GetGroupActionsResponse +}; + +Platform.getGroupActionSigners = { + methodName: "getGroupActionSigners", + service: Platform, + requestStream: false, + responseStream: false, + requestType: platform_pb.GetGroupActionSignersRequest, + responseType: platform_pb.GetGroupActionSignersResponse +}; + exports.Platform = Platform; function PlatformClient(serviceHost, options) { @@ -1297,5 +1396,346 @@ PlatformClient.prototype.getCurrentQuorumsInfo = function getCurrentQuorumsInfo( }; }; +PlatformClient.prototype.getIdentityTokenBalances = function getIdentityTokenBalances(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentityTokenBalances, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getIdentitiesTokenBalances = function getIdentitiesTokenBalances(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentitiesTokenBalances, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getIdentityTokenInfos = function getIdentityTokenInfos(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentityTokenInfos, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getIdentitiesTokenInfos = function getIdentitiesTokenInfos(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getIdentitiesTokenInfos, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getTokenStatuses = function getTokenStatuses(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getTokenStatuses, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getTokenPreProgrammedDistributions = function getTokenPreProgrammedDistributions(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getTokenPreProgrammedDistributions, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getTokenTotalSupply = function getTokenTotalSupply(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getTokenTotalSupply, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getGroupInfo = function getGroupInfo(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getGroupInfo, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getGroupInfos = function getGroupInfos(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getGroupInfos, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getGroupActions = function getGroupActions(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getGroupActions, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + +PlatformClient.prototype.getGroupActionSigners = function getGroupActionSigners(requestMessage, metadata, callback) { + if (arguments.length === 2) { + callback = arguments[1]; + } + var client = grpc.unary(Platform.getGroupActionSigners, { + request: requestMessage, + host: this.serviceHost, + metadata: metadata, + transport: this.options.transport, + debug: this.options.debug, + onEnd: function (response) { + if (callback) { + if (response.status !== grpc.Code.OK) { + var err = new Error(response.statusMessage); + err.code = response.status; + err.metadata = response.trailers; + callback(err, null); + } else { + callback(null, response.message); + } + } + } + }); + return { + cancel: function () { + callback = null; + client.close(); + } + }; +}; + exports.PlatformClient = PlatformClient; diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 234e8c514c0..4353b32278f 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "1.6.2", + "version": "1.8.0", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", @@ -59,7 +59,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "mocha-sinon": "^2.1.2", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" diff --git a/packages/dapi-grpc/protos/platform/v0/platform.proto b/packages/dapi-grpc/protos/platform/v0/platform.proto index b46d784ceb7..d35efdd131a 100644 --- a/packages/dapi-grpc/protos/platform/v0/platform.proto +++ b/packages/dapi-grpc/protos/platform/v0/platform.proto @@ -55,6 +55,17 @@ service Platform { rpc getPathElements(GetPathElementsRequest) returns (GetPathElementsResponse); rpc getStatus(GetStatusRequest) returns (GetStatusResponse); rpc getCurrentQuorumsInfo(GetCurrentQuorumsInfoRequest) returns (GetCurrentQuorumsInfoResponse); + rpc getIdentityTokenBalances(GetIdentityTokenBalancesRequest) returns (GetIdentityTokenBalancesResponse); + rpc getIdentitiesTokenBalances(GetIdentitiesTokenBalancesRequest) returns (GetIdentitiesTokenBalancesResponse); + rpc getIdentityTokenInfos(GetIdentityTokenInfosRequest) returns (GetIdentityTokenInfosResponse); + rpc getIdentitiesTokenInfos(GetIdentitiesTokenInfosRequest) returns (GetIdentitiesTokenInfosResponse); + rpc getTokenStatuses(GetTokenStatusesRequest) returns (GetTokenStatusesResponse); + rpc getTokenPreProgrammedDistributions(GetTokenPreProgrammedDistributionsRequest) returns (GetTokenPreProgrammedDistributionsResponse); + rpc getTokenTotalSupply(GetTokenTotalSupplyRequest) returns (GetTokenTotalSupplyResponse); + rpc getGroupInfo(GetGroupInfoRequest) returns (GetGroupInfoResponse); + rpc getGroupInfos(GetGroupInfosRequest) returns (GetGroupInfosResponse); + rpc getGroupActions(GetGroupActionsRequest) returns (GetGroupActionsResponse); + rpc getGroupActionSigners(GetGroupActionSignersRequest) returns (GetGroupActionSignersResponse); } // Proof message includes cryptographic proofs for validating responses @@ -69,12 +80,12 @@ message Proof { // ResponseMetadata provides metadata about the blockchain state at the time of response message ResponseMetadata { - uint64 height = 1; // Current blockchain height - uint32 core_chain_locked_height = 2; // Latest known core height in consensus - uint32 epoch = 3; // Current epoch number - uint64 time_ms = 4; // Timestamp in milliseconds - uint32 protocol_version = 5; // Protocol version - string chain_id = 6; // Identifier of the blockchain + uint64 height = 1 [jstype = JS_STRING]; // Current blockchain height + uint32 core_chain_locked_height = 2; // Latest known core height in consensus + uint32 epoch = 3; // Current epoch number + uint64 time_ms = 4 [jstype = JS_STRING]; // Timestamp in milliseconds + uint32 protocol_version = 5; // Protocol version + string chain_id = 6; // Identifier of the blockchain } message StateTransitionBroadcastError { @@ -164,7 +175,7 @@ message GetIdentityNonceResponse { message GetIdentityNonceResponseV0 { oneof result { - uint64 identity_nonce = 1; + uint64 identity_nonce = 1 [jstype = JS_STRING]; Proof proof = 2; } ResponseMetadata metadata = 3; @@ -177,7 +188,7 @@ message GetIdentityContractNonceResponse { message GetIdentityContractNonceResponseV0 { oneof result { - uint64 identity_contract_nonce = 1; + uint64 identity_contract_nonce = 1 [jstype = JS_STRING]; Proof proof = 2; } ResponseMetadata metadata = 3; @@ -190,7 +201,7 @@ message GetIdentityBalanceResponse { message GetIdentityBalanceResponseV0 { oneof result { - uint64 balance = 1; // The balance of the requested identity + uint64 balance = 1 [jstype = JS_STRING]; // The balance of the requested identity Proof proof = 2; // Proof of the balance, if requested } ResponseMetadata metadata = 3; // Metadata about the blockchain state @@ -203,8 +214,8 @@ message GetIdentityBalanceAndRevisionResponse { message GetIdentityBalanceAndRevisionResponseV0 { message BalanceAndRevision { - uint64 balance = 1; // Balance of the identity - uint64 revision = 2; // Revision number of the identity + uint64 balance = 1 [jstype = JS_STRING]; // Balance of the identity + uint64 revision = 2 [jstype = JS_STRING]; // Revision number of the identity } oneof result { @@ -330,7 +341,7 @@ message GetEvonodesProposedEpochBlocksResponse { message GetEvonodesProposedEpochBlocksResponseV0 { message EvonodeProposedBlocks { bytes pro_tx_hash = 1; - uint64 count = 2; + uint64 count = 2 [jstype = JS_STRING]; } message EvonodesProposedBlocks { @@ -376,7 +387,7 @@ message GetIdentitiesBalancesResponse { message GetIdentitiesBalancesResponseV0 { message IdentityBalance { bytes identity_id = 1; - optional uint64 balance = 2; + optional uint64 balance = 2 [jstype = JS_STRING]; } message IdentitiesBalances { @@ -436,10 +447,27 @@ message GetProofsRequest { oneof request_type { ContestedResourceVoteStatusRequest contested_resource_vote_status_request = 1; } } + message IdentityTokenBalanceRequest { + bytes token_id = 1; + bytes identity_id = 2; + } + + message IdentityTokenInfoRequest { + bytes token_id = 1; + bytes identity_id = 2; + } + + message TokenStatusRequest { + bytes token_id = 1; + } + repeated IdentityRequest identities = 1; // List of identity requests repeated ContractRequest contracts = 2; // List of contract requests repeated DocumentRequest documents = 3; // List of document requests repeated VoteStatusRequest votes = 4; + repeated IdentityTokenBalanceRequest identity_token_balances = 5; + repeated IdentityTokenInfoRequest identity_token_infos = 6; + repeated TokenStatusRequest token_statuses = 7; } oneof version { GetProofsRequestV0 v0 = 1; } @@ -509,7 +537,7 @@ message GetDataContractHistoryRequest { bytes id = 1; // The unique ID of the data contract google.protobuf.UInt32Value limit = 2; // The maximum number of history entries to return google.protobuf.UInt32Value offset = 3; // The offset for pagination through the contract history - uint64 start_at_ms = 4; // Only return results starting at this time in milliseconds + uint64 start_at_ms = 4 [jstype = JS_STRING]; // Only return results starting at this time in milliseconds bool prove = 5; // Flag to request a proof as the response } oneof version { GetDataContractHistoryRequestV0 v0 = 1; } @@ -519,7 +547,7 @@ message GetDataContractHistoryResponse { message GetDataContractHistoryResponseV0 { // Represents a single entry in the data contract's history message DataContractHistoryEntry { - uint64 date = 1; // The date of the history entry + uint64 date = 1 [jstype = JS_STRING]; // The date of the history entry bytes value = 2; // The value of the data contract at this point in history } @@ -735,9 +763,9 @@ message GetEpochsInfoResponse { // EpochInfo represents information about a single epoch message EpochInfo { uint32 number = 1; // The number of the epoch - uint64 first_block_height = 2; // The height of the first block in this epoch + uint64 first_block_height = 2 [jstype = JS_STRING]; // The height of the first block in this epoch uint32 first_core_block_height = 3; // The height of the first Core block in this epoch - uint64 start_time = 4; // The start time of the epoch + uint64 start_time = 4 [jstype = JS_STRING]; // The start time of the epoch double fee_multiplier = 5; // The fee multiplier applicable in this epoch uint32 protocol_version = 6; } @@ -798,11 +826,11 @@ message GetContestedResourcesResponse { message GetVotePollsByEndDateRequest { message GetVotePollsByEndDateRequestV0 { message StartAtTimeInfo { - uint64 start_time_ms = 1; + uint64 start_time_ms = 1 [jstype = JS_STRING]; bool start_time_included = 2; } message EndAtTimeInfo { - uint64 end_time_ms = 1; + uint64 end_time_ms = 1 [jstype = JS_STRING]; bool end_time_included = 2; } optional StartAtTimeInfo start_time_info = 1; @@ -821,7 +849,7 @@ message GetVotePollsByEndDateRequest { message GetVotePollsByEndDateResponse { message GetVotePollsByEndDateResponseV0 { message SerializedVotePollsByTimestamp { - uint64 timestamp = 1; + uint64 timestamp = 1 [jstype = JS_STRING]; repeated bytes serialized_vote_polls = 2; } @@ -881,9 +909,9 @@ message GetContestedResourceVoteStateResponse { } FinishedVoteOutcome finished_vote_outcome = 1; optional bytes won_by_identity_id = 2; // Only used when vote_choice_type is TOWARDS_IDENTITY - uint64 finished_at_block_height = 3; + uint64 finished_at_block_height = 3 [jstype = JS_STRING]; uint32 finished_at_core_block_height = 4; - uint64 finished_at_block_time_ms = 5; + uint64 finished_at_block_time_ms = 5 [jstype = JS_STRING]; uint32 finished_at_epoch = 6; } @@ -1024,7 +1052,7 @@ message GetPrefundedSpecializedBalanceResponse { message GetPrefundedSpecializedBalanceResponseV0 { oneof result { - uint64 balance = 1; + uint64 balance = 1 [jstype = JS_STRING]; Proof proof = 2; } ResponseMetadata metadata = 3; @@ -1046,7 +1074,7 @@ message GetTotalCreditsInPlatformRequest { message GetTotalCreditsInPlatformResponse { message GetTotalCreditsInPlatformResponseV0 { oneof result { - uint64 credits = 1; + uint64 credits = 1 [jstype = JS_STRING]; Proof proof = 2; } @@ -1128,11 +1156,11 @@ message GetStatusResponse { } message Time { - uint64 local = 1; + uint64 local = 1 [jstype = JS_STRING]; // It will be missing if Drive is not responding - optional uint64 block = 2; + optional uint64 block = 2 [jstype = JS_STRING]; // It will be missing if Drive is not responding - optional uint64 genesis = 3; + optional uint64 genesis = 3 [jstype = JS_STRING]; // It will be missing if Drive is not responding optional uint32 epoch = 4; } @@ -1148,11 +1176,11 @@ message GetStatusResponse { bool catching_up = 1; bytes latest_block_hash = 2; bytes latest_app_hash = 3; - uint64 latest_block_height = 4; + uint64 latest_block_height = 4 [jstype = JS_STRING]; bytes earliest_block_hash = 5; bytes earliest_app_hash = 6; - uint64 earliest_block_height = 7; - uint64 max_peer_block_height = 9; + uint64 earliest_block_height = 7 [jstype = JS_STRING]; + uint64 max_peer_block_height = 9 [jstype = JS_STRING]; // Latest known core height in consensus. // It will be missing if Drive is not responding optional uint32 core_chain_locked_height = 10; @@ -1165,14 +1193,14 @@ message GetStatusResponse { } message StateSync { - uint64 total_synced_time = 1; - uint64 remaining_time = 2; + uint64 total_synced_time = 1 [jstype = JS_STRING]; + uint64 remaining_time = 2 [jstype = JS_STRING]; uint32 total_snapshots = 3; - uint64 chunk_process_avg_time = 4; - uint64 snapshot_height = 5; - uint64 snapshot_chunks_count = 6; - uint64 backfilled_blocks = 7; - uint64 backfill_blocks_total = 8; + uint64 chunk_process_avg_time = 4 [jstype = JS_STRING]; + uint64 snapshot_height = 5 [jstype = JS_STRING]; + uint64 snapshot_chunks_count = 6 [jstype = JS_STRING]; + uint64 backfilled_blocks = 7 [jstype = JS_STRING]; + uint64 backfill_blocks_total = 8 [jstype = JS_STRING]; } Version version = 1; @@ -1215,3 +1243,536 @@ message GetCurrentQuorumsInfoResponse { } oneof version { GetCurrentQuorumsInfoResponseV0 v0 = 1; } } + +message GetIdentityTokenBalancesRequest { + message GetIdentityTokenBalancesRequestV0 { + bytes identity_id = 1; // ID of the identity + repeated bytes token_ids = 2; // List of token IDs + bool prove = 3; // Flag to request a proof as the response + } + oneof version { + GetIdentityTokenBalancesRequestV0 v0 = 1; + } +} + +message GetIdentityTokenBalancesResponse { + message GetIdentityTokenBalancesResponseV0 { + message TokenBalanceEntry { + bytes token_id = 1; // Token ID + optional uint64 balance = 2; // Token balance for the contract + } + + message TokenBalances { + repeated TokenBalanceEntry token_balances = 1; // List of token balances + } + + oneof result { + TokenBalances token_balances = 1; // Actual token balances + Proof proof = 2; // Proof of the token balances, if requested + } + ResponseMetadata metadata = 3; // Metadata about the blockchain state + } + oneof version { + GetIdentityTokenBalancesResponseV0 v0 = 1; + } +} + +message GetIdentitiesTokenBalancesRequest { + message GetIdentitiesTokenBalancesRequestV0 { + bytes token_id = 1; // Token ID + repeated bytes identity_ids = 2; // List of identity IDs + bool prove = 3; // Flag to request a proof as the response + } + oneof version { + GetIdentitiesTokenBalancesRequestV0 v0 = 1; + } +} + +message GetIdentitiesTokenBalancesResponse { + message GetIdentitiesTokenBalancesResponseV0 { + message IdentityTokenBalanceEntry { + bytes identity_id = 1; // Identity ID + optional uint64 balance = 2; // Token balance for the identity + } + + message IdentityTokenBalances { + repeated IdentityTokenBalanceEntry identity_token_balances = 1; // List of identity token balances + } + + oneof result { + IdentityTokenBalances identity_token_balances = 1; // Actual identity token balances + Proof proof = 2; // Proof of the balances, if requested + } + ResponseMetadata metadata = 3; // Metadata about the blockchain state + } + oneof version { + GetIdentitiesTokenBalancesResponseV0 v0 = 1; + } +} + + + +message GetIdentityTokenInfosRequest { + message GetIdentityTokenInfosRequestV0 { + bytes identity_id = 1; + repeated bytes token_ids = 2; + bool prove = 3; + } + oneof version { + GetIdentityTokenInfosRequestV0 v0 = 1; + } +} + +message GetIdentityTokenInfosResponse { + message GetIdentityTokenInfosResponseV0 { + message TokenIdentityInfoEntry { + bool frozen = 1; + } + + message TokenInfoEntry { + bytes token_id = 1; + optional TokenIdentityInfoEntry info = 2; + } + + message TokenInfos { + repeated TokenInfoEntry token_infos = 1; + } + + oneof result { + TokenInfos token_infos = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetIdentityTokenInfosResponseV0 v0 = 1; + } +} + +message GetIdentitiesTokenInfosRequest { + message GetIdentitiesTokenInfosRequestV0 { + bytes token_id = 1; + repeated bytes identity_ids = 2; + bool prove = 3; + } + oneof version { + GetIdentitiesTokenInfosRequestV0 v0 = 1; + } +} + +message GetIdentitiesTokenInfosResponse { + message GetIdentitiesTokenInfosResponseV0 { + message TokenIdentityInfoEntry { + bool frozen = 1; + } + + message TokenInfoEntry { + bytes identity_id = 1; + optional TokenIdentityInfoEntry info = 2; + } + + message IdentityTokenInfos { + repeated TokenInfoEntry token_infos = 1; + } + + oneof result { + IdentityTokenInfos identity_token_infos = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetIdentitiesTokenInfosResponseV0 v0 = 1; + } +} + +message GetTokenStatusesRequest { + message GetTokenStatusesRequestV0 { + repeated bytes token_ids = 1; + bool prove = 2; + } + oneof version { + GetTokenStatusesRequestV0 v0 = 1; + } +} + +message GetTokenStatusesResponse { + message GetTokenStatusesResponseV0 { + message TokenStatusEntry { + bytes token_id = 1; + optional bool paused = 2; + } + + message TokenStatuses { + repeated TokenStatusEntry token_statuses = 1; + } + + oneof result { + TokenStatuses token_statuses = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetTokenStatusesResponseV0 v0 = 1; + } +} + +message GetTokenPreProgrammedDistributionsRequest { + message GetTokenPreProgrammedDistributionsRequestV0 { + bytes token_id = 1; + message StartAtInfo { + uint64 start_time_ms = 1; + optional bytes start_recipient = 2; + optional bool start_recipient_included = 3; + } + optional StartAtInfo start_at_info = 2; + optional uint32 limit = 3; + bool prove = 4; + } + oneof version { + GetTokenPreProgrammedDistributionsRequestV0 v0 = 1; + } +} + +message GetTokenPreProgrammedDistributionsResponse { + message GetTokenPreProgrammedDistributionsResponseV0 { + message TokenDistributionEntry { + bytes recipient_id = 1; + uint64 amount = 2; + } + + message TokenTimedDistributionEntry { + uint64 timestamp = 1; + repeated TokenDistributionEntry distributions = 2; + } + + message TokenDistributions { + repeated TokenTimedDistributionEntry token_distributions = 1; + } + + oneof result { + TokenDistributions token_distributions = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetTokenPreProgrammedDistributionsResponseV0 v0 = 1; + } +} + +message GetTokenTotalSupplyRequest { + message GetTokenTotalSupplyRequestV0 { + bytes token_id = 1; + bool prove = 2; + } + oneof version { + GetTokenTotalSupplyRequestV0 v0 = 1; + } +} + +message GetTokenTotalSupplyResponse { + message GetTokenTotalSupplyResponseV0 { + message TokenTotalSupplyEntry { + bytes token_id = 1; + uint64 total_aggregated_amount_in_user_accounts = 2; + uint64 total_system_amount = 3; + } + + oneof result { + TokenTotalSupplyEntry token_total_supply = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetTokenTotalSupplyResponseV0 v0 = 1; + } +} + +message GetGroupInfoRequest { + message GetGroupInfoRequestV0 { + bytes contract_id = 1; + uint32 group_contract_position = 2; + bool prove = 3; + } + oneof version { + GetGroupInfoRequestV0 v0 = 1; + } +} + +message GetGroupInfoResponse { + message GetGroupInfoResponseV0 { + message GroupMemberEntry { + bytes member_id = 1; + uint32 power = 2; + } + + message GroupInfoEntry { + repeated GroupMemberEntry members = 1; + uint32 group_required_power = 2; + } + + message GroupInfo { + optional GroupInfoEntry group_info = 1; + } + + oneof result { + GroupInfo group_info = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 4; + } + oneof version { + GetGroupInfoResponseV0 v0 = 1; + } +} + +message GetGroupInfosRequest { + message StartAtGroupContractPosition { + uint32 start_group_contract_position = 1; + bool start_group_contract_position_included = 2; + } + + message GetGroupInfosRequestV0 { + bytes contract_id = 1; + optional StartAtGroupContractPosition start_at_group_contract_position = 2; + optional uint32 count = 3; + bool prove = 4; + } + oneof version { + GetGroupInfosRequestV0 v0 = 1; + } +} + +message GetGroupInfosResponse { + message GetGroupInfosResponseV0 { + message GroupMemberEntry { + bytes member_id = 1; + uint32 power = 2; + } + + message GroupPositionInfoEntry { + uint32 group_contract_position = 1; + repeated GroupMemberEntry members = 2; + uint32 group_required_power = 3; + } + + message GroupInfos { + repeated GroupPositionInfoEntry group_infos = 1; + } + + oneof result { + GroupInfos group_infos = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 4; + } + oneof version { + GetGroupInfosResponseV0 v0 = 1; + } +} + +message GetGroupActionsRequest { + enum ActionStatus { + ACTIVE = 0; // Request the active actions + CLOSED = 1; // Request the closed actions + } + + message StartAtActionId { + bytes start_action_id = 1; + bool start_action_id_included = 2; + } + + message GetGroupActionsRequestV0 { + bytes contract_id = 1; + uint32 group_contract_position = 2; + ActionStatus status = 3; + optional StartAtActionId start_at_action_id = 4; + optional uint32 count = 5; + bool prove = 6; + } + oneof version { + GetGroupActionsRequestV0 v0 = 1; + } +} + +message GetGroupActionsResponse { + message GetGroupActionsResponseV0 { + // Mint event + message MintEvent { + uint64 amount = 1; // Amount to mint + bytes recipient_id = 2; // Recipient identifier + optional string public_note = 3; // Public note + } + + // Burn event + message BurnEvent { + uint64 amount = 1; // Amount to burn + optional string public_note = 2; // Public note + } + + // Freeze event + message FreezeEvent { + bytes frozen_id = 1; // Identifier of the frozen entity + optional string public_note = 2; // Public note + } + + // Unfreeze event + message UnfreezeEvent { + bytes frozen_id = 1; // Identifier of the unfrozen entity + optional string public_note = 2; // Public note + } + + // Destroy frozen funds event + message DestroyFrozenFundsEvent { + bytes frozen_id = 1; // Identifier of the frozen entity + uint64 amount = 2; // Amount to destroy + optional string public_note = 3; // Public note + } + + // Shared encrypted note + message SharedEncryptedNote { + uint32 sender_key_index = 1; // Sender key index + uint32 recipient_key_index = 2; // Recipient key index + bytes encrypted_data = 3; // Encrypted data + } + + // Personal encrypted note + message PersonalEncryptedNote { + uint32 root_encryption_key_index = 1; // Root encryption key index + uint32 derivation_encryption_key_index = 2; // Derivation encryption key index + bytes encrypted_data = 3; // Encrypted data + } + + // Transfer event + message TransferEvent { + bytes recipient_id = 1; // Recipient identifier + optional string public_note = 2; // Public note + optional SharedEncryptedNote shared_encrypted_note = 3; // Shared encrypted note + optional PersonalEncryptedNote personal_encrypted_note = 4; // Personal encrypted note + uint64 amount = 5; // Amount transferred + } + + // Emergency action event + message EmergencyActionEvent { + // Enum for emergency action types + enum ActionType { + PAUSE = 0; // Pause action + RESUME = 1; // Resume action + } + + ActionType action_type = 1; // Emergency action type + optional string public_note = 2; // Public note + } + + // Token config update event + message TokenConfigUpdateEvent { + bytes token_config_update_item = 1; // Token config update item + optional string public_note = 2; // Public note + } + + // Event associated with this action + message GroupActionEvent { + oneof event_type { + TokenEvent token_event = 1; // Token event details + DocumentEvent document_event = 2; + ContractEvent contract_event = 3; + } + } + + message DocumentEvent { + oneof type { + DocumentCreateEvent create = 1; // Create event details + } + } + + message DocumentCreateEvent { + bytes created_document = 1; + } + + message ContractUpdateEvent { + bytes updated_contract = 1; + } + + message ContractEvent { + oneof type { + ContractUpdateEvent update = 1; // Contract update event + } + } + + // Details for token events + message TokenEvent { + oneof type { + MintEvent mint = 1; // Mint event details + BurnEvent burn = 2; // Burn event details + FreezeEvent freeze = 3; // Freeze event details + UnfreezeEvent unfreeze = 4; // Unfreeze event details + DestroyFrozenFundsEvent destroy_frozen_funds = 5; // Destroy frozen funds + TransferEvent transfer = 6; // Transfer event details + EmergencyActionEvent emergency_action = 7; // Emergency action details + TokenConfigUpdateEvent token_config_update = 8; // Token configuration update details + } + } + + message GroupActionEntry { + bytes action_id = 1; // Unique identifier for the action + GroupActionEvent event = 2; // The event data + } + + message GroupActions { + repeated GroupActionEntry group_actions = 1; + } + + oneof result { + GroupActions group_actions = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + oneof version { + GetGroupActionsResponseV0 v0 = 1; + } +} + + +message GetGroupActionSignersRequest { + enum ActionStatus { + ACTIVE = 0; // Request the active actions + CLOSED = 1; // Request the closed actions + } + + message GetGroupActionSignersRequestV0 { + bytes contract_id = 1; + uint32 group_contract_position = 2; + ActionStatus status = 3; + bytes action_id = 4; + bool prove = 5; + } + oneof version { + GetGroupActionSignersRequestV0 v0 = 1; + } +} + +message GetGroupActionSignersResponse { + message GetGroupActionSignersResponseV0 { + message GroupActionSigner { + bytes signer_id = 1; + uint32 power = 2; + } + message GroupActionSigners { + repeated GroupActionSigner signers = 1; + } + + oneof result { + GroupActionSigners group_action_signers = 1; + Proof proof = 2; + } + ResponseMetadata metadata = 3; + } + + oneof version { + GetGroupActionSignersResponseV0 v0 = 1; + } +} \ No newline at end of file diff --git a/packages/dapi-grpc/src/lib.rs b/packages/dapi-grpc/src/lib.rs index 486ba8f3fce..c4258a8ff33 100644 --- a/packages/dapi-grpc/src/lib.rs +++ b/packages/dapi-grpc/src/lib.rs @@ -4,36 +4,45 @@ pub use prost::Message; pub mod core { #![allow(non_camel_case_types)] pub mod v0 { - #[cfg(all(feature = "server", not(feature = "client")))] + // Note: only one of the features can be analyzed at a time + #[cfg(all(feature = "server", not(target_arch = "wasm32")))] include!("core/server/org.dash.platform.dapi.v0.rs"); - #[cfg(all(feature = "client", not(feature = "server")))] + #[cfg(all( + feature = "client", + not(feature = "server"), + not(target_arch = "wasm32") + ))] include!("core/client/org.dash.platform.dapi.v0.rs"); - #[cfg(all(feature = "server", feature = "client"))] - include!("core/client_server/org.dash.platform.dapi.v0.rs"); + #[cfg(target_arch = "wasm32")] + include!("core/wasm/org.dash.platform.dapi.v0.rs"); } } #[cfg(feature = "platform")] pub mod platform { pub mod v0 { - #[cfg(all(feature = "server", not(feature = "client")))] + #[cfg(all(feature = "server", not(target_arch = "wasm32")))] include!("platform/server/org.dash.platform.dapi.v0.rs"); - #[cfg(all(feature = "client", not(feature = "server")))] + #[cfg(all( + feature = "client", + not(feature = "server"), + not(target_arch = "wasm32") + ))] include!("platform/client/org.dash.platform.dapi.v0.rs"); - #[cfg(all(feature = "server", feature = "client"))] - include!("platform/client_server/org.dash.platform.dapi.v0.rs"); + #[cfg(target_arch = "wasm32")] + include!("platform/wasm/org.dash.platform.dapi.v0.rs"); } #[cfg(feature = "tenderdash-proto")] pub use tenderdash_proto as proto; - #[cfg(any(feature = "server", feature = "client"))] + #[cfg(any(feature = "server", feature = "client", target_arch = "wasm32"))] mod versioning; - #[cfg(any(feature = "server", feature = "client"))] + #[cfg(any(feature = "server", feature = "client", target_arch = "wasm32"))] pub use versioning::{VersionedGrpcMessage, VersionedGrpcResponse}; } diff --git a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js index 0d50ddd67a7..4b8de795000 100644 --- a/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js +++ b/packages/dapi/lib/externalApis/drive/fetchProofForStateTransitionFactory.js @@ -3,13 +3,21 @@ const { GetProofsRequest, }, } = require('@dashevo/dapi-grpc'); -const { StateTransitionTypes } = require('@dashevo/wasm-dpp'); + +const { + StateTransitionTypes, + TokenTransition, + DocumentTransition, + TokenTransitionType, +} = require('@dashevo/wasm-dpp'); +const { GetDataContractRequest } = require('@dashevo/dapi-grpc/clients/platform/v0/web/platform_pb'); /** * @param {PlatformPromiseClient} driveClient + * @param {DashPlatformProtocol} dpp * @return {fetchProofForStateTransition} */ -function fetchProofForStateTransitionFactory(driveClient) { +function fetchProofForStateTransitionFactory(driveClient, dpp) { /** * @typedef {fetchProofForStateTransition} * @param {AbstractStateTransition} stateTransition @@ -22,25 +30,160 @@ function fetchProofForStateTransitionFactory(driveClient) { const requestV0 = new GetProofsRequestV0(); + const dataContractsCache = {}; + if (stateTransition.isDocumentStateTransition()) { - const { DocumentRequest } = GetProofsRequestV0; + const { + DocumentRequest, + IdentityTokenBalanceRequest, + IdentityTokenInfoRequest, + TokenStatusRequest, + } = GetProofsRequestV0; - const documentsList = stateTransition.getTransitions().map((documentTransition) => { - const documentRequest = new DocumentRequest(); - documentRequest.setContractId(documentTransition.getDataContractId().toBuffer()); - documentRequest.setDocumentType(documentTransition.getType()); - documentRequest.setDocumentId(documentTransition.getId().toBuffer()); + const documentsList = []; + const identityTokenBalancesList = []; + const identityTokenInfosList = []; + const tokenStatusesList = []; - const status = documentTransition.hasPrefundedBalance() - ? DocumentRequest.DocumentContestedStatus.CONTESTED - : DocumentRequest.DocumentContestedStatus.NOT_CONTESTED; + for (const batchedTransition of stateTransition.getTransitions()) { + if (batchedTransition instanceof TokenTransition) { + switch (batchedTransition.getTransitionType()) { + case TokenTransitionType.Burn: { + const request = new IdentityTokenBalanceRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: stateTransition.getOwnerId() + .toBuffer(), + }); - documentRequest.setDocumentContestedStatus(status); + identityTokenBalancesList.push(request); + break; + } + case TokenTransitionType.Mint: { + // Fetch data contract to determine correct recipient identity + const dataContractId = batchedTransition.getDataContractId(); + const dataContractIdString = dataContractId.toString(); - return documentRequest; - }); + if (!dataContractsCache[dataContractIdString]) { + const dataContractRequestV0 = new GetDataContractRequest.GetDataContractRequestV0({ + id: dataContractId.toBuffer(), + }); + + const dataContractRequest = new GetDataContractRequest(); + dataContractRequest.setV0(dataContractRequestV0); + + const dataContractResponse = await driveClient.getDataContract(dataContractRequest); + + const dataContractBuffer = Buffer.from( + dataContractResponse.getV0().getDataContract_asU8(), + ); + + dataContractsCache[dataContractIdString] = await dpp.dataContract + .createFromBuffer(dataContractBuffer); + } + + const dataContract = dataContractsCache[dataContractIdString]; + + const tokenConfiguration = dataContract.getTokenConfiguration( + batchedTransition.getTokenContractPosition(), + ); + + const request = new IdentityTokenBalanceRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: batchedTransition.toTransition().getRecipientId(tokenConfiguration) + .toBuffer(), + }); + + identityTokenBalancesList.push(request); + break; + } + case TokenTransitionType.Transfer: { + const requestSender = new IdentityTokenBalanceRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: stateTransition.getOwnerId().toBuffer(), + }); + + const requestRecipient = new IdentityTokenBalanceRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: batchedTransition.toTransition().getRecipientId() + .toBuffer(), + }); + + identityTokenBalancesList.push(requestSender, requestRecipient); + break; + } + case TokenTransitionType.DestroyFrozenFunds: { + const request = new IdentityTokenBalanceRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: batchedTransition.toTransition().getFrozenIdentityId() + .toBuffer(), + }); + + identityTokenBalancesList.push(request); + break; + } + case TokenTransitionType.EmergencyAction: + { + const request = new TokenStatusRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + }); - requestV0.setDocumentsList(documentsList); + tokenStatusesList.push(request); + break; + } + case TokenTransitionType.Freeze: + case TokenTransitionType.Unfreeze: { + const request = new IdentityTokenInfoRequest({ + tokenId: batchedTransition.getTokenId() + .toBuffer(), + identityId: batchedTransition.toTransition().getFrozenIdentityId() + .toBuffer(), + }); + + identityTokenInfosList.push(request); + break; + } + default: + throw new Error(`Unsupported token transition type ${batchedTransition.getTransitionType()}`); + } + } else if (batchedTransition instanceof DocumentTransition) { + const documentRequest = new DocumentRequest(); + documentRequest.setContractId(batchedTransition.getDataContractId().toBuffer()); + documentRequest.setDocumentType(batchedTransition.getType()); + documentRequest.setDocumentId(batchedTransition.getId().toBuffer()); + + const status = batchedTransition.hasPrefundedBalance() + ? DocumentRequest.DocumentContestedStatus.CONTESTED + : DocumentRequest.DocumentContestedStatus.NOT_CONTESTED; + + documentRequest.setDocumentContestedStatus(status); + + documentsList.push(documentRequest); + } else { + throw new Error(`Unsupported batched transition type ${batchedTransition.constructor.name}`); + } + } + + if (documentsList.length > 0) { + requestV0.setDocumentsList(documentsList); + } + + if (identityTokenBalancesList.length > 0) { + requestV0.setIdentityTokenBalancesList(identityTokenBalancesList); + } + + if (identityTokenInfosList.length > 0) { + requestV0.setIdentityTokenInfosList(identityTokenInfosList); + } + + if (tokenStatusesList.length > 0) { + requestV0.setTokenStatusesList(tokenStatusesList); + } } if (stateTransition.isIdentityStateTransition()) { const { IdentityRequest } = GetProofsRequestV0; diff --git a/packages/dapi/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js b/packages/dapi/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js index 4bfafbe30f9..104a8f2671a 100644 --- a/packages/dapi/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js +++ b/packages/dapi/lib/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.js @@ -14,7 +14,6 @@ const { }, } = require('@dashevo/dapi-grpc'); -const cbor = require('cbor'); const UnavailableGrpcError = require('@dashevo/grpc-common/lib/server/error/UnavailableGrpcError'); const TransactionWaitPeriodExceededError = require('../../../errors/TransactionWaitPeriodExceededError'); const TransactionErrorResult = require('../../../externalApis/tenderdash/waitForTransactionToBeProvable/transactionResult/TransactionErrorResult'); @@ -49,9 +48,13 @@ function waitForStateTransitionResultHandlerFactory( const error = new StateTransitionBroadcastError(); + const metadata = grpcError.getRawMetadata(); + if (metadata['dash-serialized-consensus-error-bin']) { + error.setData(metadata['dash-serialized-consensus-error-bin']); + } + error.setCode(txDeliverResult.code); error.setMessage(grpcError.getMessage()); - error.setData(cbor.encode(grpcError.getRawMetadata())); return error; } diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 77a81d9c492..82423687179 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "1.6.2", + "version": "1.8.0", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", @@ -66,7 +66,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "mocha-sinon": "^2.1.2", "nyc": "^15.1.0", "semver": "^7.5.3", diff --git a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js index 9e996362167..21559b20848 100644 --- a/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js +++ b/packages/dapi/test/integration/grpcServer/handlers/platform/waitForStateTransitionResultHandlerFactory.spec.js @@ -64,7 +64,7 @@ describe('waitForStateTransitionResultHandlerFactory', () => { errorInfo = { message: 'Identity not found', metadata: { - error: 'some data', + 'dash-serialized-consensus-error-bin': Buffer.from('0122a249dac309c9a8b775316c905688da04bf0ee05b3861db05814540c32fba4179', 'hex'), }, }; @@ -305,26 +305,28 @@ describe('waitForStateTransitionResultHandlerFactory', () => { it('should wait for state transition and return result with error', (done) => { waitForStateTransitionResultHandler(call).then((result) => { - expect(result).to.be.an.instanceOf(WaitForStateTransitionResultResponse); - expect(result.getV0().getProof()).to.be.undefined(); - - const error = result.getV0().getError(); - expect(error).to.be.an.instanceOf(StateTransitionBroadcastError); - - const errorData = error.getData(); - const errorCode = error.getCode(); - const errorMessage = error.getMessage(); - - expect(createGrpcErrorFromDriveResponseMock).to.be.calledOnceWithExactly( - wsMessagesFixture.error.data.value.result.code, - wsMessagesFixture.error.data.value.result.info, - ); - - expect(errorCode).to.equal(wsMessagesFixture.error.data.value.result.code); - expect(errorData).to.deep.equal(cbor.encode(errorInfo.metadata)); - expect(errorMessage).to.equal(errorInfo.message); - - done(); + try { + expect(result).to.be.an.instanceOf(WaitForStateTransitionResultResponse); + expect(result.getV0().getProof()).to.be.undefined(); + + const error = result.getV0().getError(); + expect(error).to.be.an.instanceOf(StateTransitionBroadcastError); + + const errorData = error.getData(); + const errorCode = error.getCode(); + const errorMessage = error.getMessage(); + + expect(createGrpcErrorFromDriveResponseMock).to.be.calledOnceWithExactly( + wsMessagesFixture.error.data.value.result.code, + wsMessagesFixture.error.data.value.result.info, + ); + + expect(errorCode).to.equal(wsMessagesFixture.error.data.value.result.code); + expect(errorData).to.deep.equal(cbor.encode(errorInfo.metadata)); + expect(errorMessage).to.equal(errorInfo.message); + } finally { + done(); + } }); process.nextTick(() => { diff --git a/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js b/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js index 841a6e73cac..eae636a6bc3 100644 --- a/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js +++ b/packages/dapi/test/unit/externalApis/drive/fetchProofForStateTransitionFactory.spec.js @@ -8,9 +8,13 @@ const { }, } = require('@dashevo/dapi-grpc'); +const { default: loadWasmDpp, DashPlatformProtocol, StateTransitionTypes } = require('@dashevo/wasm-dpp'); + const generateRandomIdentifierAsync = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); -const { StateTransitionTypes } = require('@dashevo/wasm-dpp'); +const getDocumentsFixture = require('@dashevo/wasm-dpp/lib/test/fixtures/getDocumentsFixture'); +const getBlsAdapterMock = require('@dashevo/wasm-dpp/lib/test/mocks/getBlsAdapterMock'); +const createStateRepositoryMock = require('@dashevo/wasm-dpp/lib/test/mocks/createStateRepositoryMock'); const fetchProofForStateTransitionFactory = require('../../../../lib/externalApis/drive/fetchProofForStateTransitionFactory'); describe('fetchProofForStateTransition', () => { @@ -22,6 +26,25 @@ describe('fetchProofForStateTransition', () => { let masternodeVoteResponse; let stateTransitionFixture; + let dpp; + + before(async () => { + await loadWasmDpp(); + }); + + beforeEach(async function beforeEachHandler() { + const blsAdapter = await getBlsAdapterMock(); + const stateRepositoryMock = createStateRepositoryMock(this.sinon); + + dpp = new DashPlatformProtocol( + blsAdapter, + 1, + stateRepositoryMock, + { generate: () => crypto.randomBytes(32) }, + 1, + ); + }); + beforeEach(async function beforeEach() { const { GetProofsResponseV0 } = GetProofsResponse; dataContractsProofResponse = new GetProofsResponse(); @@ -79,18 +102,21 @@ describe('fetchProofForStateTransition', () => { .equal(dataContractsProofResponse.serializeBinary()); }); - it('should fetch documents proofs', async function it() { - stateTransitionFixture.isDocumentStateTransition.returns(true); - stateTransitionFixture.getTransitions = this.sinon.stub().returns([ - { - getDataContractId: this.sinon.stub().returns(await generateRandomIdentifierAsync()), - getType: this.sinon.stub().returns('niceDocument'), - getId: this.sinon.stub().returns(await generateRandomIdentifierAsync()), - hasPrefundedBalance: this.sinon.stub().returns(true), + it('should fetch documents proofs', async () => { + const documents = await getDocumentsFixture(); + + const identityId = documents[0].getOwnerId(); + const contractId = documents[0].getDataContractId(); + + const transition = dpp.document.createStateTransition({ + create: documents, + }, { + [identityId.toString()]: { + [contractId.toString()]: '1', }, - ]); + }); - const result = await fetchProofForStateTransition(stateTransitionFixture); + const result = await fetchProofForStateTransition(transition); expect(result.serializeBinary()).to.deep .equal(documentsProofResponse.serializeBinary()); }); diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index 7d620c2bb6a..52e7ea9f0c3 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "2.6.2", + "version": "2.8.0", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { @@ -24,7 +24,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "should": "^13.2.3", "sinon": "^17.0.1" } diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index e26e67ca504..1614216ad2a 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -53,7 +53,7 @@ export default function getBaseConfigFactory() { port: 3001, }, docker: { - image: 'dashpay/dashd:21', + image: 'dashpay/dashd:22', commandArgs: [], }, p2p: { @@ -118,7 +118,6 @@ export default function getBaseConfigFactory() { miner: { enable: false, interval: '2.5m', - mediantime: null, address: null, }, devnet: { @@ -310,7 +309,7 @@ export default function getBaseConfigFactory() { tenderdash: { mode: 'full', docker: { - image: 'dashpay/tenderdash:1.3', + image: 'dashpay/tenderdash:1', }, p2p: { host: '0.0.0.0', diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index 5004bd870b4..6b9092ab005 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1048,6 +1048,24 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) }); return configFile; }, + '1.7.0': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.core.docker.image = 'dashpay/dashd:22'; + options.platform.drive.tenderdash.docker.image = 'dashpay/tenderdash:1'; + }); + return configFile; + }, + '1.8.0': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + delete options.core.miner.mediantime; + + options.platform.drive.abci.docker.image = 'dashpay/drive:1'; + options.platform.dapi.api.docker.image = 'dashpay/dapi:1'; + }); + return configFile; + }, }; } diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 37ccb840e8b..f819aad6da2 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "1.6.2", + "version": "1.8.0", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", @@ -91,7 +91,7 @@ "qs": "^6.11.0", "rxjs": "^6.6.7", "semver": "^7.5.3", - "systeminformation": "^5.22.11", + "systeminformation": "^5.25.11", "table": "^6.8.1", "tar": "7.4.3", "wrap-ansi": "^7.0.0" @@ -106,7 +106,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", "globby": "^11", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "mocha-sinon": "^2.1.2", "oclif": "^4.0.3", "sinon": "^17.0.1", diff --git a/packages/dashmate/src/config/configJsonSchema.js b/packages/dashmate/src/config/configJsonSchema.js index ed77019f290..0f57fbbf50d 100644 --- a/packages/dashmate/src/config/configJsonSchema.js +++ b/packages/dashmate/src/config/configJsonSchema.js @@ -349,15 +349,11 @@ export default { interval: { $ref: '#/definitions/duration', }, - mediantime: { - type: ['integer', 'null'], - minimum: 0, - }, address: { type: ['string', 'null'], }, }, - required: ['enable', 'interval', 'mediantime', 'address'], + required: ['enable', 'interval', 'address'], additionalProperties: false, }, devnet: { diff --git a/packages/dashmate/src/core/quorum/waitForMasternodeProbes.js b/packages/dashmate/src/core/quorum/waitForMasternodeProbes.js index b16197dcaf1..5e6ccb40851 100644 --- a/packages/dashmate/src/core/quorum/waitForMasternodeProbes.js +++ b/packages/dashmate/src/core/quorum/waitForMasternodeProbes.js @@ -1,14 +1,14 @@ import { LLMQ_TYPE_TEST } from '../../constants.js'; +import wait from '../../util/wait.js'; /** * Checks all mastrenodoes probes to incterconnected masternodes * * @param {RpcClient[]} rpcClients - * @param {Function} bumpMockTime * * @return {Promise<boolean>} */ -async function checkProbes(rpcClients, bumpMockTime) { +async function checkProbes(rpcClients) { let masternodes = await Promise.all( rpcClients.map((rpc) => { const promise = rpc.masternode('status'); @@ -30,8 +30,6 @@ async function checkProbes(rpcClients, bumpMockTime) { .find((connection) => connection.llmqType === LLMQ_TYPE_TEST); if (!llmqConnection) { - await bumpMockTime(); - return false; } @@ -49,16 +47,12 @@ async function checkProbes(rpcClients, bumpMockTime) { // probe is not too old. Probes are retried after 50 minutes, while DKGs consider // a probe as failed after 60 minutes if (mnInfo.metaInfo.lastOutboundSuccessElapsed > 55 * 60) { - await bumpMockTime(); - return false; } // MN is expected to be offline, so let's only check that // the last probe is not too long ago } else if (mnInfo.metaInfo.lastOutboundAttemptElapsed > 55 * 60 && mnInfo.metaInfo.lastOutboundSuccessElapsed > 55 * 60) { - await bumpMockTime(); - return false; } } @@ -72,20 +66,21 @@ async function checkProbes(rpcClients, bumpMockTime) { /** * * @param {RpcClient[]} rpcClients - * @param {Function} bumpMockTime * @param {number} [timeout] * @return {Promise<void>} */ -export default async function waitForMasternodeProbes(rpcClients, bumpMockTime, timeout = 30000) { +export default async function waitForMasternodeProbes(rpcClients, timeout = 30000) { const deadline = Date.now() + timeout; let isReady = false; while (!isReady) { - isReady = await checkProbes(rpcClients, bumpMockTime); + isReady = await checkProbes(rpcClients); if (Date.now() > deadline) { throw new Error(`waitForMasternodeProbes deadline of ${timeout} exceeded`); } + + await wait(100); } } diff --git a/packages/dashmate/src/core/quorum/waitForQuorumConnections.js b/packages/dashmate/src/core/quorum/waitForQuorumConnections.js index 465ab84c197..90d512f77d8 100644 --- a/packages/dashmate/src/core/quorum/waitForQuorumConnections.js +++ b/packages/dashmate/src/core/quorum/waitForQuorumConnections.js @@ -31,14 +31,12 @@ async function checkQuorumConnections(rpcClient, expectedConnectionsCount) { * * @param {RpcClient[]} rpcClients * @param {number} expectedConnectionsCount - * @param {Function} bumpMockTime * @param {number} [timeout] * @return {Promise<void>} */ export default async function waitForQuorumConnections( rpcClients, expectedConnectionsCount, - bumpMockTime, timeout = 300000, ) { const deadline = Date.now() + timeout; @@ -58,8 +56,6 @@ export default async function waitForQuorumConnections( })); if (readyNodes.size < nodesToWait) { - await bumpMockTime(); - await wait(1000); } diff --git a/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js index 374c7f37043..108a53047e2 100644 --- a/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js @@ -123,14 +123,6 @@ export default function resetNodeTaskFactory( } }, }, - { - title: 'Reset dashmate\'s ephemeral data', - enabled: (ctx) => !ctx.removeConfig && !ctx.isHardReset && !ctx.isPlatformOnlyReset, - task: () => { - // TODO: We should remove it from config - config.set('core.miner.mediantime', null); - }, - }, { title: `Remove config ${config.getName()}`, enabled: (ctx) => ctx.removeConfig, diff --git a/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js index d059e9c8606..0ba938c2c14 100644 --- a/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js @@ -2,7 +2,6 @@ import { Listr } from 'listr2'; import { Observable } from 'rxjs'; import DashCoreLib from '@dashevo/dashcore-lib'; import waitForNodesToHaveTheSameHeight from '../../../../core/waitForNodesToHaveTheSameHeight.js'; -import waitForNodesToHaveTheSameSporks from '../../../../core/waitForNodesToHaveTheSameSporks.js'; import { NETWORK_LOCAL, HPMN_COLLATERAL_AMOUNT } from '../../../../constants.js'; @@ -93,9 +92,40 @@ export default function configureCoreTaskFactory( }, }, { - title: 'Activating DIP3', + title: 'Create wallet', + task: async () => { + const disablePrivateKeys = false; + const createBlankWallet = false; + const walletPassphrase = ''; + const avoidReuse = false; + const loadOnStartup = true; + const descriptors = false; + + await ctx.coreService.getRpcClient().createWallet( + 'main', + disablePrivateKeys, + createBlankWallet, + walletPassphrase, + avoidReuse, + descriptors, + loadOnStartup, + ); + }, + }, + { + title: 'Generating funds to use as a collateral for masternodes', + task: () => { + const amount = HPMN_COLLATERAL_AMOUNT * configGroup.length; + return generateToAddressTask( + configGroup.find((c) => c.getName() === 'local_seed'), + amount, + ); + }, + }, + { + title: 'Activating v19 and v20', task: () => new Observable(async (observer) => { - const dip3ActivationHeight = 1000; + const dip3ActivationHeight = 901; const blocksToGenerateInOneStep = 10; let blocksGenerated = 0; @@ -126,37 +156,6 @@ export default function configureCoreTaskFactory( return this; }), }, - { - title: 'Create wallet', - task: async () => { - const disablePrivateKeys = false; - const createBlankWallet = false; - const walletPassphrase = ''; - const avoidReuse = false; - const loadOnStartup = true; - const descriptors = false; - - await ctx.coreService.getRpcClient().createWallet( - 'main', - disablePrivateKeys, - createBlankWallet, - walletPassphrase, - avoidReuse, - descriptors, - loadOnStartup, - ); - }, - }, - { - title: 'Generating funds to use as a collateral for masternodes', - task: () => { - const amount = HPMN_COLLATERAL_AMOUNT * configGroup.length; - return generateToAddressTask( - configGroup.find((c) => c.getName() === 'local_seed'), - amount, - ); - }, - }, { title: 'Register masternodes', task: async () => { @@ -213,15 +212,6 @@ export default function configureCoreTaskFactory( )); ctx.seedRpcClient = ctx.seedCoreService.getRpcClient(); - - ctx.mockTime = 0; - ctx.bumpMockTime = async (time = 1) => { - ctx.mockTime += time; - - await Promise.all( - ctx.rpcClients.map((rpcClient) => rpcClient.setMockTime(ctx.mockTime)), - ); - }; }, }, { @@ -233,25 +223,6 @@ export default function configureCoreTaskFactory( ))); }, }, - { - title: 'Set initial mock time', - task: async () => { - // Set initial mock time from the last block - const { result: bestBlockHash } = await ctx.seedRpcClient.getBestBlockHash(); - const { result: bestBlock } = await ctx.seedRpcClient.getBlock(bestBlockHash); - - await ctx.bumpMockTime(bestBlock.time); - - // Sync nodes - await ctx.bumpMockTime(); - - await generateBlocks( - ctx.seedCoreService, - 1, - NETWORK_LOCAL, - ); - }, - }, { title: 'Wait for nodes to have the same height', task: () => waitForNodesToHaveTheSameHeight( @@ -276,51 +247,6 @@ export default function configureCoreTaskFactory( ); }, }, - { - title: 'Wait for nodes to have the same sporks', - task: () => waitForNodesToHaveTheSameSporks(ctx.coreServices), - }, - { - title: 'Activating DIP8 to enable ChainLocks', - task: () => new Observable(async (observer) => { - let isDip8Activated = false; - let blockchainInfo; - - let blocksGenerated = 0; - - const blocksToGenerateInOneStep = 10; - - do { - ({ - result: blockchainInfo, - } = await ctx.seedCoreService.getRpcClient().getBlockchainInfo()); - - isDip8Activated = blockchainInfo.softforks.dip0008.active; - - if (isDip8Activated) { - break; - } - - await generateBlocks( - ctx.seedCoreService, - blocksToGenerateInOneStep, - NETWORK_LOCAL, - // eslint-disable-next-line no-loop-func - (blocks) => { - blocksGenerated += blocks; - - observer.next(`${blocksGenerated} blocks generated`); - }, - ); - } while (!isDip8Activated); - - observer.next(`DIP8 has been activated at height ${blockchainInfo.softforks.dip0008.height}`); - - observer.complete(); - - return this; - }), - }, { title: 'Wait for nodes to have the same height', task: () => waitForNodesToHaveTheSameHeight( @@ -347,47 +273,6 @@ export default function configureCoreTaskFactory( title: 'Wait for quorums to be enabled', task: () => enableCoreQuorumsTask(), }, - { - title: 'Activating V20 fork', - task: () => new Observable(async (observer) => { - let isV20Activated = false; - let blockchainInfo; - - let blocksGenerated = 0; - - const blocksToGenerateInOneStep = 10; - - do { - ({ - result: blockchainInfo, - } = await ctx.seedCoreService.getRpcClient().getBlockchainInfo()); - - isV20Activated = blockchainInfo.softforks && blockchainInfo.softforks.v20 - && blockchainInfo.softforks.v20.active; - if (isV20Activated) { - break; - } - - await generateBlocks( - ctx.seedCoreService, - blocksToGenerateInOneStep, - NETWORK_LOCAL, - // eslint-disable-next-line no-loop-func - (blocks) => { - blocksGenerated += blocks; - - observer.next(`${blocksGenerated} blocks generated`); - }, - ); - } while (!isV20Activated); - - observer.next(`V20 fork has been activated at height ${blockchainInfo.softforks.v20.height}`); - - observer.complete(); - - return this; - }), - }, { title: 'Wait for nodes to have the same height', task: () => waitForNodesToHaveTheSameHeight( @@ -396,41 +281,23 @@ export default function configureCoreTaskFactory( ), }, { - title: 'Enable EHF spork', - task: async () => new Observable(async (observer) => { - const seedRpcClient = ctx.seedCoreService.getRpcClient(); - const { - result: initialCoreChainLockedHeight, - } = await seedRpcClient.getBlockCount(); - - await activateCoreSpork( - seedRpcClient, - 'SPORK_24_TEST_EHF', - initialCoreChainLockedHeight, - ); - - let isEhfActivated = false; - let blockchainInfo; + title: 'Activating v21 fork', + task: () => new Observable(async (observer) => { + const dip3ActivationHeight = 1001; + const blocksToGenerateInOneStep = 10; let blocksGenerated = 0; - - const blocksToGenerateInOneStep = 48; + let { + result: currentBlockHeight, + } = await ctx.coreService.getRpcClient().getBlockCount(); do { ({ - result: blockchainInfo, - } = await ctx.seedCoreService.getRpcClient().getBlockchainInfo()); - - isEhfActivated = blockchainInfo.softforks && blockchainInfo.softforks.mn_rr - && blockchainInfo.softforks.mn_rr.active; - if (isEhfActivated) { - break; - } - - await ctx.bumpMockTime(blocksToGenerateInOneStep); + result: currentBlockHeight, + } = await ctx.coreService.getRpcClient().getBlockCount()); await generateBlocks( - ctx.seedCoreService, + ctx.coreService, blocksToGenerateInOneStep, NETWORK_LOCAL, // eslint-disable-next-line no-loop-func @@ -440,9 +307,7 @@ export default function configureCoreTaskFactory( observer.next(`${blocksGenerated} blocks generated`); }, ); - } while (!isEhfActivated); - - observer.next(`EHF has been activated at height ${blockchainInfo.softforks.mn_rr.height}`); + } while (dip3ActivationHeight > currentBlockHeight); observer.complete(); diff --git a/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js index 49fbbd47379..a7036cbacfb 100644 --- a/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/local/enableCoreQuorumsTaskFactory.js @@ -50,8 +50,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { // move forward to next DKG const blocksUntilNextDKG = 24 - (bestBlockHeight % 24); if (blocksUntilNextDKG !== 0) { - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, blocksUntilNextDKG, @@ -82,7 +80,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { await waitForQuorumConnections( ctx.masternodeRpcClients, ctx.expectedConnections, - ctx.bumpMockTime, ); const { result: sporks } = await ctx.seedRpcClient.spork('show'); @@ -91,12 +88,9 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { if (isSpork21Active) { await waitForMasternodeProbes( ctx.masternodeRpcClients, - ctx.bumpMockTime, ); } - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 2, @@ -119,8 +113,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ctx.expectedMembers, ); - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 2, @@ -145,8 +137,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ctx.expectedComplaints, ); - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 2, @@ -171,8 +161,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ctx.expectedJustifications, ); - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 2, @@ -197,8 +185,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { ctx.expectedCommitments, ); - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 2, @@ -232,8 +218,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { { title: 'Mining final commitment', task: async (ctx, task) => { - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 1, @@ -246,8 +230,6 @@ export default function enableCoreQuorumsTaskFactory(generateBlocks) { while (!testPlatformQuorumEnabled) { await wait(300); - await ctx.bumpMockTime(); - await generateBlocks( ctx.seedCoreService, 1, diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 242f65582ad..270bcda5bb6 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -143,13 +143,11 @@ export default function setupLocalPresetTaskFactory( config.set('core.log.debug.enabled', true); } - // Although not all nodes are miners, all nodes should be aware of - // the miner interval to be able to sync mocked time - config.set('core.miner.interval', ctx.minerInterval); - config.set('dashmate.helper.api.port', config.get('dashmate.helper.api.port') + (i * 100)); if (config.getName() === 'local_seed') { + config.set('core.miner.interval', ctx.minerInterval); + config.set('description', 'seed node for local network'); config.set('core.masternode.enable', false); diff --git a/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js b/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js index eae01bd49e4..53b6762ee1e 100644 --- a/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/startGroupNodesTaskFactory.js @@ -82,46 +82,6 @@ export default function startGroupNodesTaskFactory( return new Listr(tasks, { concurrent: true }); }, }, - { - title: 'Mock core node time', - enabled: () => minerConfig && minerConfig.get('network') === NETWORK_LOCAL, - task: async () => { - // TASK RATIONALE: - // During DKG sessions, nodes can make only 1 quorum request per 10 minutes. - // If mocktime is not adjusted, quorums will start failing to form after some time. - const minerInterval = minerConfig.get('core.miner.interval'); - // 2.5 minutes - mimics the behaviour of the real network - const secondsToAdd = 150; - - const tasks = configGroup.map((config) => ({ - title: `Adjust ${config.getName()} mock time`, - task: async () => { - /* eslint-disable no-useless-escape */ - await dockerCompose.execCommand( - config, - 'core', - [ - 'bash', - '-c', - ` - response=\$(dash-cli getblockchaininfo); - mocktime=\$(echo \${response} | grep -o -E '\"mediantime\"\: [0-9]+' | cut -d ' ' -f2); - while true; do - mocktime=\$((mocktime + ${secondsToAdd})); - dash-cli setmocktime \$mocktime; - sleep ${minerInterval}; - done - `, - ], - ['--detach'], - ); - /* eslint-enable no-useless-escape */ - }, - })); - - return new Listr(tasks, { concurrent: true }); - }, - }, { title: 'Start a miner', enabled: () => minerConfig && minerConfig.get('network') === NETWORK_LOCAL, diff --git a/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js index e57101c96b3..1d3de2707c0 100644 --- a/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/stopNodeTaskFactory.js @@ -67,23 +67,6 @@ export default function stopNodeTaskFactory( host: await getConnectionHost(config, 'core', 'core.rpc.host'), })), }, - { - title: 'Save core node time', - enabled: () => config.get('group') === 'local', - skip: (ctx) => ctx.isForce, - task: async () => { - const rpcClient = createRpcClient({ - port: config.get('core.rpc.port'), - user: 'dashmate', - pass: config.get('core.rpc.users.dashmate.password'), - host: await getConnectionHost(config, 'core', 'core.rpc.host'), - }); - - const { result: { mediantime } } = await rpcClient.getBlockchainInfo(); - - config.set('core.miner.mediantime', mediantime); - }, - }, { title: `Stopping ${config.getName()} node`, task: async (ctx) => { diff --git a/packages/dashmate/src/status/scopes/platform.js b/packages/dashmate/src/status/scopes/platform.js index dca8783e31c..467e8e4ce0e 100644 --- a/packages/dashmate/src/status/scopes/platform.js +++ b/packages/dashmate/src/status/scopes/platform.js @@ -1,4 +1,3 @@ -import prettyMs from 'pretty-ms'; import { PortStateEnum } from '../enums/portState.js'; import DockerComposeError from '../../docker/errors/DockerComposeError.js'; import providers from '../providers.js'; @@ -314,11 +313,7 @@ export default function getPlatformScopeFactory( if (mnRRSoftFork.active) { scope.platformActivation = `Activated (at height ${mnRRSoftFork.height})`; } else { - const startTime = mnRRSoftFork.bip9.start_time; - - const diff = (new Date().getTime() - startTime) / 1000; - - scope.platformActivation = `Waiting for activation (approximately in ${prettyMs(diff, { compact: true })})`; + scope.platformActivation = `Waiting for activation on height ${mnRRSoftFork.height}`; } const [tenderdash, drive] = await Promise.all([ diff --git a/packages/dashmate/templates/core/dash.conf.dot b/packages/dashmate/templates/core/dash.conf.dot index cbc0b933735..5e5729de132 100644 --- a/packages/dashmate/templates/core/dash.conf.dot +++ b/packages/dashmate/templates/core/dash.conf.dot @@ -31,7 +31,6 @@ debuglogfile=/var/log/dash/debug.log # JSON RPC server=1 rpcwallet=main -deprecatedrpc=hpmn rpcworkqueue=64 rpcthreads=16 rpcwhitelistdefault=0 @@ -93,9 +92,9 @@ fallbackfee=0.00001 {{?? it.network === 'local'}} regtest=1 [regtest] +testactivationheight=mn_rr@1000 {{? it.core.spork.address}}sporkaddr={{=it.core.spork.address}}{{?}} {{? it.core.spork.privateKey}}sporkkey={{=it.core.spork.privateKey}}{{?}} -{{? it.core.miner.mediantime}}mocktime={{=it.core.miner.mediantime}}{{?}} llmqtestinstantsenddip0024=llmq_test_instantsend {{?? it.network === 'devnet'}} @@ -108,7 +107,7 @@ devnet={{=it.core.devnet.name}} powtargetspacing={{=it.core.devnet.powTargetSpacing}} minimumdifficultyblocks={{=it.core.devnet.minimumDifficultyBlocks}} highsubsidyblocks=500 -highsubsidyfactor=10 +highsubsidyfactor=100 llmqchainlocks={{=it.core.devnet.llmq.chainLocks}} llmqinstantsenddip0024={{=it.core.devnet.llmq.instantSend}} llmqplatform={{=it.core.devnet.llmq.platform}} diff --git a/packages/dashpay-contract/Cargo.toml b/packages/dashpay-contract/Cargo.toml index fcf2cc445d4..2ce75ff3744 100644 --- a/packages/dashpay-contract/Cargo.toml +++ b/packages/dashpay-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dashpay-contract" description = "DashPay data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 589b87926ae..f37995ca053 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", @@ -31,7 +31,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/packages/data-contracts/Cargo.toml b/packages/data-contracts/Cargo.toml index 1c011e3d109..110a267a51a 100644 --- a/packages/data-contracts/Cargo.toml +++ b/packages/data-contracts/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "data-contracts" description = "Dash Platform system data contracts" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" @@ -17,3 +17,4 @@ dashpay-contract = { path = "../dashpay-contract" } feature-flags-contract = { path = "../feature-flags-contract" } platform-value = { path = "../rs-platform-value" } wallet-utils-contract = { path = "../wallet-utils-contract" } +token-history-contract = { path = "../token-history-contract" } diff --git a/packages/data-contracts/src/error.rs b/packages/data-contracts/src/error.rs index 0550873b012..7c0c802b71e 100644 --- a/packages/data-contracts/src/error.rs +++ b/packages/data-contracts/src/error.rs @@ -119,3 +119,20 @@ impl From<wallet_utils_contract::Error> for Error { } } } + +impl From<token_history_contract::Error> for Error { + fn from(e: token_history_contract::Error) -> Self { + match e { + token_history_contract::Error::UnknownVersionMismatch { + method, + known_versions, + received, + } => Error::UnknownVersionMismatch { + method, + known_versions, + received, + }, + token_history_contract::Error::InvalidSchemaJson(e) => Error::InvalidSchemaJson(e), + } + } +} diff --git a/packages/data-contracts/src/lib.rs b/packages/data-contracts/src/lib.rs index 65f324137fd..a78ffefc373 100644 --- a/packages/data-contracts/src/lib.rs +++ b/packages/data-contracts/src/lib.rs @@ -9,6 +9,7 @@ pub use feature_flags_contract; pub use masternode_reward_shares_contract; use platform_value::Identifier; use platform_version::version::PlatformVersion; +pub use token_history_contract; pub use wallet_utils_contract; pub use withdrawals_contract; @@ -21,6 +22,7 @@ pub enum SystemDataContract { DPNS = 3, Dashpay = 4, WalletUtils = 5, + TokenHistory = 6, } pub struct DataContractSource { @@ -40,6 +42,7 @@ impl SystemDataContract { SystemDataContract::DPNS => dpns_contract::ID_BYTES, SystemDataContract::Dashpay => dashpay_contract::ID_BYTES, SystemDataContract::WalletUtils => wallet_utils_contract::ID_BYTES, + SystemDataContract::TokenHistory => token_history_contract::ID_BYTES, }; Identifier::new(bytes) } @@ -92,6 +95,13 @@ impl SystemDataContract { definitions: wallet_utils_contract::load_definitions(platform_version)?, document_schemas: wallet_utils_contract::load_documents_schemas(platform_version)?, }, + SystemDataContract::TokenHistory => DataContractSource { + id_bytes: token_history_contract::ID_BYTES, + owner_id_bytes: token_history_contract::OWNER_ID_BYTES, + version: platform_version.system_data_contracts.wallet as u32, + definitions: token_history_contract::load_definitions(platform_version)?, + document_schemas: token_history_contract::load_documents_schemas(platform_version)?, + }, }; Ok(data) diff --git a/packages/dpns-contract/Cargo.toml b/packages/dpns-contract/Cargo.toml index d06e221794e..1cd1af6a603 100644 --- a/packages/dpns-contract/Cargo.toml +++ b/packages/dpns-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dpns-contract" description = "DPNS data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 0a765a7c800..ed377e38dfd 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", @@ -37,7 +37,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/packages/feature-flags-contract/Cargo.toml b/packages/feature-flags-contract/Cargo.toml index e367d43942a..a9828c88ba2 100644 --- a/packages/feature-flags-contract/Cargo.toml +++ b/packages/feature-flags-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "feature-flags-contract" description = "Feature flags data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index fa4d9ff7ab8..d4e036859bc 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", @@ -38,7 +38,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/packages/js-dapi-client/.eslintrc.yml b/packages/js-dapi-client/.eslintrc.yml index 8a7b8f358c7..5296a3af919 100644 --- a/packages/js-dapi-client/.eslintrc.yml +++ b/packages/js-dapi-client/.eslintrc.yml @@ -1,6 +1,8 @@ extends: - airbnb-base - plugin:jsdoc/recommended +env: + es2020: true rules: eol-last: - error diff --git a/packages/js-dapi-client/lib/BlockHeadersProvider/BlockHeadersProvider.js b/packages/js-dapi-client/lib/BlockHeadersProvider/BlockHeadersProvider.js index 0a3c60319c5..d9ca211bcef 100644 --- a/packages/js-dapi-client/lib/BlockHeadersProvider/BlockHeadersProvider.js +++ b/packages/js-dapi-client/lib/BlockHeadersProvider/BlockHeadersProvider.js @@ -5,9 +5,10 @@ const BlockHeadersReader = require('./BlockHeadersReader'); /** * @typedef {BlockHeadersProviderOptions} BlockHeadersProviderOptions - * @property {string} [network=testnet] + * @property {string} [network='testnet'] network type * @property {number} [maxParallelStreams=5] max parallel streams to read historical block headers * @property {number} [targetBatchSize=100000] a target batch size per stream + * @property {number} [fromBlockHeight=1] a target batch size per stream * @property {number} [maxRetries=10] max amount of retries per stream connection */ const defaultOptions = { @@ -35,9 +36,9 @@ const STATES = { class BlockHeadersProvider extends EventEmitter { /** - * @param {BlockHeadersProviderOptions} options - * @param {Function} [createHistoricalSyncStream] - * @param {Function} [createContinuousSyncStream] + * @param {BlockHeadersProviderOptions} options for block headers + * @param {Function} [createHistoricalSyncStream] createHistoricalSyncStream + * @param {Function} [createContinuousSyncStream] createContinuousSyncStream */ // TODO move options to as last param // eslint-disable-next-line default-param-last @@ -60,7 +61,7 @@ class BlockHeadersProvider extends EventEmitter { } /** - * @param {BlockHeadersReader} blockHeadersReader + * @param {BlockHeadersReader} blockHeadersReader instance */ setBlockHeadersReader(blockHeadersReader) { this.blockHeadersReader = blockHeadersReader; @@ -68,7 +69,7 @@ class BlockHeadersProvider extends EventEmitter { /** * - * @param {SpvChain} spvChain + * @param {SpvChain} spvChain instance */ setSpvChain(spvChain) { this.spvChain = spvChain; @@ -104,8 +105,8 @@ class BlockHeadersProvider extends EventEmitter { /** * Initializes SPV chain with a list of headers and a known lastSyncedHeaderHeight - * @param headers - * @param firstHeaderHeight + * @param {BlockHeader[]} headers array of headers + * @param firstHeaderHeight {number} first block header height */ async initializeChainWith(headers, firstHeaderHeight) { await SpvChain.wasmX11Ready(); @@ -122,7 +123,7 @@ class BlockHeadersProvider extends EventEmitter { /** * Checks whether spv chain has header at specified height and flushes chains if not * @private - * @param height + * @param {number} height block height */ ensureChainRoot(height) { // Flush spv chain in case header at specified height was not found @@ -134,8 +135,8 @@ class BlockHeadersProvider extends EventEmitter { /** * Reads historical block headers - * @param fromBlockHeight - * @param toBlockHeight + * @param {number} fromBlockHeight height block height + * @param {number} toBlockHeight height block height * @returns {Promise<void>} */ async readHistorical(fromBlockHeight, toBlockHeight) { @@ -196,8 +197,8 @@ class BlockHeadersProvider extends EventEmitter { /** * @private - * @param headersData - * @param reject + * @param {object} headersData object with header and headHeight + * @param {function} reject callback function */ headersHandler(headersData, reject) { const { headers, headHeight } = headersData; diff --git a/packages/js-dapi-client/lib/SimplifiedMasternodeListProvider/createMasternodeListStreamFactory.js b/packages/js-dapi-client/lib/SimplifiedMasternodeListProvider/createMasternodeListStreamFactory.js index a80bd3feffb..67511925dc4 100644 --- a/packages/js-dapi-client/lib/SimplifiedMasternodeListProvider/createMasternodeListStreamFactory.js +++ b/packages/js-dapi-client/lib/SimplifiedMasternodeListProvider/createMasternodeListStreamFactory.js @@ -11,11 +11,10 @@ const ReconnectableStream = require('../transport/ReconnectableStream'); /** * Creates continues masternode list stream - * * @param {createDAPIAddressProviderFromOptions} createDAPIAddressProviderFromOptions * @param {ListDAPIAddressProvider} listDAPIAddressProvider - * @param {Object} options - * @return {function(...[*]): Promise<ReconnectableStream>} + * @param {object} options + * @returns {function(...[*]): Promise<ReconnectableStream>} */ function createMasternodeListStreamFactory( createDAPIAddressProviderFromOptions, diff --git a/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/DataContractHistoryEntry.js b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/DataContractHistoryEntry.js new file mode 100644 index 00000000000..b34a49fc98a --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/DataContractHistoryEntry.js @@ -0,0 +1,26 @@ +class DataContractHistoryEntry { + /** + * @param {bigint} date - timestamp + * @param {Buffer} value - buffer value of the data contract + */ + constructor(date, value) { + this.date = date; + this.value = value; + } + + /** + * @returns {bigint} - date + */ + getDate() { + return this.date; + } + + /** + * @returns {Buffer} - raw binary value of the data contract + */ + getValue() { + return this.value; + } +} + +module.exports = DataContractHistoryEntry; diff --git a/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.js b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.js index e8af7838421..1dfbb0747c0 100644 --- a/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.js @@ -1,9 +1,10 @@ const AbstractResponse = require('../response/AbstractResponse'); const InvalidResponseError = require('../response/errors/InvalidResponseError'); +const DataContractHistoryEntry = require('./DataContractHistoryEntry'); class GetDataContractHistoryResponse extends AbstractResponse { /** - * @param {object.<number, Buffer>} dataContractHistory + * @param {DataContractHistoryEntry[]} dataContractHistory * @param {Metadata} metadata * @param {Proof} [proof] */ @@ -14,7 +15,7 @@ class GetDataContractHistoryResponse extends AbstractResponse { } /** - * @returns {object.<number, Buffer>} + * @returns {DataContractHistoryEntry[]} array of data contract history entries */ getDataContractHistory() { return this.dataContractHistory; @@ -33,19 +34,12 @@ class GetDataContractHistoryResponse extends AbstractResponse { throw new InvalidResponseError('DataContract is not defined'); } - const history = {}; - - if (dataContractHistory) { - const dataContractHistoryEntries = dataContractHistory.getDataContractEntriesList(); - - // eslint-disable-next-line no-restricted-syntax - for (const historyEntry of dataContractHistoryEntries) { - history[historyEntry.getDate()] = historyEntry.getValue(); - } - } - return new GetDataContractHistoryResponse( - history, + dataContractHistory ? dataContractHistory.getDataContractEntriesList() + .map((dataContractHistoryEntry) => new DataContractHistoryEntry( + BigInt(dataContractHistoryEntry.getDate()), + dataContractHistoryEntry.getValue(), + )) : null, metadata, proof, ); diff --git a/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/getDataContractHistoryFactory.js b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/getDataContractHistoryFactory.js index 18120ca106d..1059c74bd58 100644 --- a/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/getDataContractHistoryFactory.js +++ b/packages/js-dapi-client/lib/methods/platform/getDataContractHistory/getDataContractHistoryFactory.js @@ -18,7 +18,7 @@ function getDataContractHistoryFactory(grpcTransport) { * Fetch Data Contract by id * @typedef {getDataContractHistory} * @param {Buffer} contractId - * @param {number} [startAtMs] + * @param {bigint} [startAtMs] * @param {number} [limit] * @param {number} [offset] * @param {DAPIClientOptions & {prove: boolean}} [options] @@ -26,7 +26,7 @@ function getDataContractHistoryFactory(grpcTransport) { */ async function getDataContractHistory( contractId, - startAtMs = 0, + startAtMs = BigInt(0), limit = 10, offset = 0, options = {}, @@ -45,7 +45,7 @@ function getDataContractHistoryFactory(grpcTransport) { getDataContractHistoryRequest.setV0( new GetDataContractHistoryRequestV0() .setId(contractId) - .setStartAtMs(startAtMs) + .setStartAtMs(startAtMs.toString()) .setLimit(new UInt32Value([limit])) .setOffset(new UInt32Value([offset])) .setProve(!!options.prove), diff --git a/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/EpochInfo.js b/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/EpochInfo.js index 47638bbc5cb..61bd651c75f 100644 --- a/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/EpochInfo.js +++ b/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/EpochInfo.js @@ -2,9 +2,9 @@ class EpochInfo { /** * * @param {number} number - * @param {number} firstBlockHeight + * @param {bigint} firstBlockHeight * @param {number} firstCoreBlockHeight - * @param {number} startTime + * @param {bigint} startTime * @param {number} feeMultiplier */ constructor(number, firstBlockHeight, firstCoreBlockHeight, startTime, feeMultiplier) { @@ -23,7 +23,7 @@ class EpochInfo { } /** - * @returns {number} + * @returns {bigint} */ getFirstBlockHeight() { return this.firstBlockHeight; @@ -37,7 +37,7 @@ class EpochInfo { } /** - * @returns {number} + * @returns {bigint} */ getStartTime() { return this.startTime; diff --git a/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/GetEpochsInfoResponse.js b/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/GetEpochsInfoResponse.js index 874d99d70e8..3db067e1a77 100644 --- a/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/GetEpochsInfoResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getEpochsInfo/GetEpochsInfoResponse.js @@ -41,9 +41,9 @@ class GetEpochsInfoResponse extends AbstractResponse { if (epochsInfoList) { epochsInfo = epochsInfoList.map((epoch) => new EpochInfo( epoch.getNumber(), - epoch.getFirstBlockHeight(), + BigInt(epoch.getFirstBlockHeight()), epoch.getFirstCoreBlockHeight(), - epoch.getStartTime(), + BigInt(epoch.getStartTime()), epoch.getFeeMultiplier(), )); } diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.js index b5b4a59b310..76c0f4e4a53 100644 --- a/packages/js-dapi-client/lib/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.js @@ -3,7 +3,7 @@ const InvalidResponseError = require('../response/errors/InvalidResponseError'); class GetIdentityBalanceResponse extends AbstractResponse { /** - * @param {number} balance + * @param {bigint} balance * @param {Metadata} metadata * @param {Proof} [proof] */ @@ -14,7 +14,7 @@ class GetIdentityBalanceResponse extends AbstractResponse { } /** - * @returns {number} + * @returns {bigint} */ getBalance() { return this.balance; @@ -25,7 +25,7 @@ class GetIdentityBalanceResponse extends AbstractResponse { * @returns {GetIdentityBalanceResponse} */ static createFromProto(proto) { - const balance = proto.getV0().getBalance(); + const balance = BigInt(proto.getV0().getBalance()); const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto(proto); if ((balance === null || balance === undefined) && !proof) { diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js index e04d6aaafa5..0cca1d9708e 100644 --- a/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityContractNonce/GetIdentityContractNonceResponse.js @@ -1,11 +1,11 @@ const AbstractResponse = require('../response/AbstractResponse'); const InvalidResponseError = require('../response/errors/InvalidResponseError'); -const IDENTITY_CONTRACT_NONCE_VALUE_FILTER = 0xFFFFFFFFFF; +const IDENTITY_CONTRACT_NONCE_VALUE_FILTER = BigInt(0xFFFFFFFFFF); class GetIdentityContractNonceResponse extends AbstractResponse { /** - * @param {number} identityContractNonce + * @param {bigint} identityContractNonce * @param {Metadata} metadata * @param {Proof} [proof] */ @@ -16,7 +16,7 @@ class GetIdentityContractNonceResponse extends AbstractResponse { } /** - * @returns {number} + * @returns {bigint} */ getIdentityContractNonce() { return this.identityContractNonce; @@ -28,8 +28,8 @@ class GetIdentityContractNonceResponse extends AbstractResponse { */ static createFromProto(proto) { // eslint-disable-next-line - const identityContractNonce = proto.getV0() - .getIdentityContractNonce() & IDENTITY_CONTRACT_NONCE_VALUE_FILTER; + const identityContractNonce = BigInt(proto.getV0() + .getIdentityContractNonce()) & IDENTITY_CONTRACT_NONCE_VALUE_FILTER; const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( proto, ); diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js index 68b20db334e..4bc32a03a65 100644 --- a/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityKeys/getIdentityKeysFactory.js @@ -4,10 +4,14 @@ const { GetIdentityKeysRequest, KeyRequestType, SpecificKeys, + AllKeys, }, } = require('@dashevo/dapi-grpc'); + const { UInt32Value } = require('google-protobuf/google/protobuf/wrappers_pb'); +const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const GetIdentityKeysResponse = require('./GetIdentityKeysResponse'); const InvalidResponseError = require('../response/errors/InvalidResponseError'); @@ -20,25 +24,30 @@ function getIdentityKeysFactory(grpcTransport) { * Fetch the version upgrade votes status * @typedef {getIdentityKeys} * @param {Buffer} identityId - * @param {number[]} keyIds + * @param {number[]=} keyIds * @param {number} limit * @param {DAPIClientOptions & {prove: boolean}} [options] * @returns {Promise<GetIdentityKeysResponse>} */ async function getIdentityKeys(identityId, keyIds, limit = 100, options = {}) { - const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; - const getIdentityKeysRequest = new GetIdentityKeysRequest(); - if (Buffer.isBuffer(identityId)) { // eslint-disable-next-line no-param-reassign identityId = Buffer.from(identityId); } + const getIdentityKeysRequest = new GetIdentityKeysRequest(); + const requestType = new KeyRequestType(); + + if (keyIds) { + requestType.setSpecificKeys(new SpecificKeys().setKeyIdsList(keyIds)); + } else { + requestType.setAllKeys(new AllKeys()); + } + getIdentityKeysRequest.setV0( new GetIdentityKeysRequestV0() .setIdentityId(identityId) - .setRequestType(new KeyRequestType() - .setSpecificKeys(new SpecificKeys().setKeyIdsList(keyIds))) + .setRequestType(requestType) .setLimit(new UInt32Value([limit])) .setProve(!!options.prove), ); diff --git a/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js index a490a1390b5..daead898b39 100644 --- a/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getIdentityNonce/GetIdentityNonceResponse.js @@ -1,11 +1,11 @@ const AbstractResponse = require('../response/AbstractResponse'); const InvalidResponseError = require('../response/errors/InvalidResponseError'); -const IDENTITY_NONCE_VALUE_FILTER = 0xFFFFFFFFFF; +const IDENTITY_NONCE_VALUE_FILTER = BigInt(0xFFFFFFFFFF); class GetIdentityNonceResponse extends AbstractResponse { /** - * @param {number} identityNonce + * @param {bigint} identityNonce * @param {Metadata} metadata * @param {Proof} [proof] */ @@ -16,7 +16,7 @@ class GetIdentityNonceResponse extends AbstractResponse { } /** - * @returns {number} + * @returns {bigint} */ getIdentityNonce() { return this.identityNonce; @@ -28,8 +28,8 @@ class GetIdentityNonceResponse extends AbstractResponse { */ static createFromProto(proto) { // eslint-disable-next-line - const identityNonce = proto.getV0() - .getIdentityNonce() & IDENTITY_NONCE_VALUE_FILTER; + const identityNonce = BigInt(proto.getV0() + .getIdentityNonce()) & IDENTITY_NONCE_VALUE_FILTER; const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( proto, ); diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/ChainStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/ChainStatus.js new file mode 100644 index 00000000000..caa2ca991ef --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/ChainStatus.js @@ -0,0 +1,99 @@ +class ChainStatus { + /** + * @param {boolean} catchingUp - is node syncing? + * @param {string} latestBlockHash - latest block hash + * @param {string} latestAppHash - latest app hash + * @param {bigint} latestBlockHeight - latest block height + * @param {string} earliestBlockHash - earliest block hash + * @param {string} earliestAppHash - earliest app hash + * @param {bigint} earliestBlockHeight - earliest block height + * @param {bigint} maxPeerBlockHeight - max peer block height + * @param {number=} coreChainLockedHeight - core chain locked height + */ + constructor( + catchingUp, + latestBlockHash, + latestAppHash, + latestBlockHeight, + earliestBlockHash, + earliestAppHash, + earliestBlockHeight, + maxPeerBlockHeight, + coreChainLockedHeight, + ) { + this.catchingUp = catchingUp; + this.latestBlockHash = latestBlockHash; + this.latestAppHash = latestAppHash; + this.latestBlockHeight = latestBlockHeight; + this.earliestBlockHash = earliestBlockHash; + this.earliestAppHash = earliestAppHash; + this.earliestBlockHeight = earliestBlockHeight; + this.maxPeerBlockHeight = maxPeerBlockHeight; + this.coreChainLockedHeight = coreChainLockedHeight || null; + } + + /** + * @returns {boolean} returns true if node is currently syncing + */ + isCatchingUp() { + return this.catchingUp; + } + + /** + * @returns {string} latest block hash + */ + getLatestBlockHash() { + return this.latestBlockHash; + } + + /** + * @returns {string} latest app hash + */ + getLatestAppHash() { + return this.latestAppHash; + } + + /** + * @returns {bigint} latest block height + */ + getLatestBlockHeight() { + return this.latestBlockHeight; + } + + /** + * @returns {string} earliest block hash + */ + getEarliestBlockHash() { + return this.earliestBlockHash; + } + + /** + * @returns {string} earliest app hash + */ + getEarliestAppHash() { + return this.earliestAppHash; + } + + /** + * @returns {bigint} earliest block height + */ + getEarliestBlockHeight() { + return this.earliestBlockHeight; + } + + /** + * @returns {bigint} max peer block height + */ + getMaxPeerBlockHeight() { + return this.maxPeerBlockHeight; + } + + /** + * @returns {number|null} core chain locked height + */ + getCoreChainLockedHeight() { + return this.coreChainLockedHeight; + } +} + +module.exports = ChainStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/GetStatusResponse.js b/packages/js-dapi-client/lib/methods/platform/getStatus/GetStatusResponse.js new file mode 100644 index 00000000000..51a5773cdf0 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/GetStatusResponse.js @@ -0,0 +1,164 @@ +const VersionStatus = require('./VersionStatus'); +const NodeStatus = require('./NodeStatus'); +const ChainStatus = require('./ChainStatus'); +const TimeStatus = require('./TimeStatus'); +const StateSyncStatus = require('./StateSyncStatus'); +const NetworkStatus = require('./NetworkStatus'); + +class GetStatusResponse { + /** + * @param {VersionStatus} version - status versions + * @param {NodeStatus} node - node status + * @param {ChainStatus} chain - chain status + * @param {NetworkStatus} network - network status + * @param {StateSyncStatus} stateSync - state sync status + * @param {TimeStatus} time - time status + */ + constructor(version, node, chain, network, stateSync, time) { + this.version = version; + this.node = node; + this.chain = chain; + this.network = network; + this.stateSync = stateSync; + this.time = time; + } + + /** + * @returns {VersionStatus} network versions status + */ + getVersionStatus() { + return this.version; + } + + /** + * @returns {NodeStatus} node info status + */ + getNodeStatus() { + return this.node; + } + + /** + * @returns {ChainStatus} chain status + */ + getChainStatus() { + return this.chain; + } + + /** + * @returns {NetworkStatus} network status + */ + getNetworkStatus() { + return this.network; + } + + /** + * @returns {StateSyncStatus} state sync status + */ + getStateSyncStatus() { + return this.stateSync; + } + + /** + * @returns {TimeStatus} time status + */ + getTimeStatus() { + return this.time; + } + + /** + * @param {GetStatusResponse} proto GRPC GetStatusResponse + * @returns {GetStatusResponse} JS DAPI Client GetStatusResponse + */ + static createFromProto(proto) { + const v0 = proto.getV0(); + + const dapiVersion = v0.getVersion().getSoftware().getDapi(); + const driveVersion = v0.getVersion().getSoftware().getDrive(); + const tenderdashVersion = v0.getVersion().getSoftware().getTenderdash(); + const tenderdashP2pProtocol = v0.getVersion().getProtocol().getTenderdash().getP2p(); + const tenderdashBlockProtocol = v0.getVersion().getProtocol().getTenderdash().getBlock(); + const driveCurrentProtocol = v0.getVersion().getProtocol().getDrive().getCurrent(); + const driveLatestProtocol = v0.getVersion().getProtocol().getDrive().getLatest(); + + const version = new VersionStatus( + dapiVersion, + driveVersion, + tenderdashVersion, + tenderdashP2pProtocol, + tenderdashBlockProtocol, + driveCurrentProtocol, + driveLatestProtocol, + ); + + const nodeId = Buffer.from(v0.getNode().getId()).toString('hex'); + const proTxHash = Buffer.from(v0.getNode().getProTxHash()).toString('hex'); + + const node = new NodeStatus(nodeId, proTxHash); + + const catchingUp = v0.getChain().getCatchingUp(); + const latestBlockHash = Buffer.from(v0.getChain().getLatestBlockHash()).toString('hex'); + const latestAppHash = Buffer.from(v0.getChain().getLatestAppHash()).toString('hex'); + const latestBlockHeight = BigInt(v0.getChain().getLatestBlockHeight()); + const earliestBlockHash = Buffer.from(v0.getChain().getEarliestBlockHash()).toString('hex'); + const earliestAppHash = Buffer.from(v0.getChain().getEarliestAppHash()).toString('hex'); + const earliestBlockHeight = BigInt(v0.getChain().getEarliestBlockHeight()); + const maxPeerBlockHeight = BigInt(v0.getChain().getMaxPeerBlockHeight()); + const coreChainLockedHeight = v0.getChain().getCoreChainLockedHeight(); + + const chain = new ChainStatus( + catchingUp, + latestBlockHash, + latestAppHash, + latestBlockHeight, + earliestBlockHash, + earliestAppHash, + earliestBlockHeight, + maxPeerBlockHeight, + coreChainLockedHeight, + ); + + const chainId = v0.getNetwork().getChainId(); + const peersCount = v0.getNetwork().getPeersCount(); + const isListening = v0.getNetwork().getListening(); + + const network = new NetworkStatus(chainId, peersCount, isListening); + + const totalSyncedTime = BigInt(v0.getStateSync().getTotalSyncedTime()); + const remainingTime = BigInt(v0.getStateSync().getRemainingTime()); + const totalSnapshots = v0.getStateSync().getTotalSnapshots(); + const chunkProcessAverageTime = BigInt(v0.getStateSync().getChunkProcessAvgTime()); + const snapshotHeight = BigInt(v0.getStateSync().getSnapshotHeight()); + const snapshotChunksCount = BigInt(v0.getStateSync().getSnapshotChunksCount()); + const backfilledBlocks = BigInt(v0.getStateSync().getBackfilledBlocks()); + const backfillBlocksTotal = BigInt(v0.getStateSync().getBackfillBlocksTotal()); + + const stateSync = new StateSyncStatus( + totalSyncedTime, + remainingTime, + totalSnapshots, + chunkProcessAverageTime, + snapshotHeight, + snapshotChunksCount, + backfilledBlocks, + backfillBlocksTotal, + ); + + const local = BigInt(v0.getTime().getLocal()); + const block = BigInt(v0.getTime().getBlock()); + const genesis = BigInt(v0.getTime().getGenesis()); + const epoch = v0.getTime().getEpoch(); + + const time = new TimeStatus(local, block, genesis, epoch); + + return new GetStatusResponse( + version, + node, + chain, + network, + stateSync, + time, + ); + } +} + +module.exports = GetStatusResponse; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/NetworkStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/NetworkStatus.js new file mode 100644 index 00000000000..0b2f66693a8 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/NetworkStatus.js @@ -0,0 +1,35 @@ +class NetworkStatus { + /** + * @param {string} chainId - Chain id + * @param {number} peersCount - Peers count + * @param {boolean} listening - Is listening to P2P network + */ + constructor(chainId, peersCount, listening) { + this.chainId = chainId; + this.peersCount = peersCount; + this.listening = listening; + } + + /** + * @returns {string} chain id + */ + getChainId() { + return this.chainId; + } + + /** + * @returns {number} peers count + */ + getPeersCount() { + return this.peersCount; + } + + /** + * @returns {boolean} is listening to p2p + */ + isListening() { + return this.listening; + } +} + +module.exports = NetworkStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/NodeStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/NodeStatus.js new file mode 100644 index 00000000000..5a73a568a27 --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/NodeStatus.js @@ -0,0 +1,26 @@ +class NodeStatus { + /** + * @param {string} nodeId - Node ID + * @param {string=} proTxHash - Node's proTxHash + */ + constructor(nodeId, proTxHash) { + this.nodeId = nodeId; + this.proTxHash = proTxHash || null; + } + + /** + * @returns {string} Node ID + */ + getNodeId() { + return this.nodeId; + } + + /** + * @returns {string} Pro Tx Hash + */ + getProTxHash() { + return this.proTxHash; + } +} + +module.exports = NodeStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/StateSyncStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/StateSyncStatus.js new file mode 100644 index 00000000000..1927d214ade --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/StateSyncStatus.js @@ -0,0 +1,89 @@ +class StateSyncStatus { + /** + * @param {bigint} totalSyncedTime - Total synced time + * @param {bigint} remainingTime - Remaining time to sync + * @param {number} totalSnapshots - Total snapshots count + * @param {bigint} chunkProcessAverageTime - Chunk process average time + * @param {bigint} snapshotHeight - Snapshot height + * @param {bigint} snapshotChunksCount - Snapshot chunks count + * @param {bigint} backfilledBlocks - Backfilled blocks + * @param {bigint} backfillBlocksTotal - Backfilled blocks total count + */ + constructor( + totalSyncedTime, + remainingTime, + totalSnapshots, + chunkProcessAverageTime, + snapshotHeight, + snapshotChunksCount, + backfilledBlocks, + backfillBlocksTotal, + ) { + this.totalSyncedTime = totalSyncedTime; + this.remainingTime = remainingTime; + this.totalSnapshots = totalSnapshots; + this.chunkProcessAverageTime = chunkProcessAverageTime; + this.snapshotHeight = snapshotHeight; + this.snapshotChunksCount = snapshotChunksCount; + this.backfilledBlocks = backfilledBlocks; + this.backfillBlocksTotal = backfillBlocksTotal; + } + + /** + * @returns {bigint} Total synced time + */ + getTotalSyncedTime() { + return this.totalSyncedTime; + } + + /** + * @returns {bigint} Total synced time + */ + getRemainingTime() { + return this.remainingTime; + } + + /** + * @returns {number} Total snapshots count + */ + getTotalSnapshots() { + return this.totalSnapshots; + } + + /** + * @returns {bigint} Chunk process average time + */ + getChunkProcessAverageTime() { + return this.chunkProcessAverageTime; + } + + /** + * @returns {bigint} Chunk process average time + */ + getSnapshotHeight() { + return this.snapshotHeight; + } + + /** + * @returns {bigint} Chunk process average time + */ + getSnapshotChunkCount() { + return this.snapshotChunksCount; + } + + /** + * @returns {bigint} Backfilled blocks + */ + getBackfilledBlocks() { + return this.backfilledBlocks; + } + + /** + * @returns {bigint} Backfill blocks total + */ + getBackfilledBlockTotal() { + return this.backfillBlocksTotal; + } +} + +module.exports = StateSyncStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/TimeStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/TimeStatus.js new file mode 100644 index 00000000000..1c26509354b --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/TimeStatus.js @@ -0,0 +1,49 @@ +class TimeStatus { + /** + * @param {bigint} local - Local system time + * @param {bigint=} block - Block time + * @param {bigint=} genesis - Genesis time + * @param {number=} epoch - Epoch number + */ + constructor( + local, + block, + genesis, + epoch, + ) { + this.local = local; + this.block = typeof block === 'bigint' ? block : null; + this.genesis = typeof genesis === 'bigint' ? genesis : null; + this.epoch = epoch || null; + } + + /** + * @returns {bigint} Local system time + */ + getLocalTime() { + return this.local; + } + + /** + * @returns {bigint|null} Block time + */ + getBlockTime() { + return this.block; + } + + /** + * @returns {bigint|null} Genesis time + */ + getGenesisTime() { + return this.genesis; + } + + /** + * @returns {number|null} Epoch number + */ + getEpochNumber() { + return this.epoch; + } +} + +module.exports = TimeStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/VersionStatus.js b/packages/js-dapi-client/lib/methods/platform/getStatus/VersionStatus.js new file mode 100644 index 00000000000..204f18df23e --- /dev/null +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/VersionStatus.js @@ -0,0 +1,79 @@ +class VersionStatus { + /** + * @param {string} dapiVersion - DAPI version + * @param {string=} driveVersion - Drive ABCI version + * @param {string=} tenderdashVersion - Tenderdash version + * @param {number} tenderdashP2pProtocol - Tenderdash Protocol Version + * @param {number} tenderdashBlockProtocol - Tenderdash Block Version + * @param {number} driveCurrentProtocol - Current Dash Platform (Drive) protocol version + * @param {number} driveLatestProtocol - Next Dash Platform (Drive) protocol version + */ + constructor( + dapiVersion, + driveVersion, + tenderdashVersion, + tenderdashP2pProtocol, + tenderdashBlockProtocol, + driveCurrentProtocol, + driveLatestProtocol, + ) { + this.dapiVersion = dapiVersion; + this.driveVersion = driveVersion || null; + this.tenderdashVersion = tenderdashVersion || null; + this.tenderdashP2pProtocol = tenderdashP2pProtocol; + this.tenderdashBlockProtocol = tenderdashBlockProtocol; + this.driveCurrentProtocol = driveCurrentProtocol; + this.driveLatestProtocol = driveLatestProtocol; + } + + /** + * @returns {string|null} DAPI version + */ + getDapiVersion() { + return this.dapiVersion; + } + + /** + * @returns {string|null} Drive ABCI version + */ + getDriveVersion() { + return this.driveVersion; + } + + /** + * @returns {string|null} Tenderdash version + */ + getTenderdashVersion() { + return this.tenderdashVersion; + } + + /** + * @returns {number} Tenderdash P2P protocol + */ + getTenderdashP2pProtocol() { + return this.tenderdashP2pProtocol; + } + + /** + * @returns {number} Tenderdash Block protocol + */ + getTenderdashBlockProtocol() { + return this.tenderdashBlockProtocol; + } + + /** + * @returns {number} Drive Current Protocol + */ + getDriveCurrentProtocol() { + return this.driveCurrentProtocol; + } + + /** + * @returns {number} Drive Latest Protocol + */ + getDriveLatestProtocol() { + return this.driveLatestProtocol; + } +} + +module.exports = VersionStatus; diff --git a/packages/js-dapi-client/lib/methods/platform/getStatus/getStatusFactory.js b/packages/js-dapi-client/lib/methods/platform/getStatus/getStatusFactory.js index cce7acfb4c3..0c2bd5fec26 100644 --- a/packages/js-dapi-client/lib/methods/platform/getStatus/getStatusFactory.js +++ b/packages/js-dapi-client/lib/methods/platform/getStatus/getStatusFactory.js @@ -6,18 +6,18 @@ const { } = require('@dashevo/dapi-grpc'); const InvalidResponseError = require('../response/errors/InvalidResponseError'); +const GetStatusResponse = require('./GetStatusResponse'); /** * @param {GrpcTransport} grpcTransport - * @returns {getIdentity} + * @returns {getStatus} */ function getStatusFactory(grpcTransport) { /** - * Fetch the identity by id - * @typedef {getIdentity} - * @param {Buffer} id + * Fetch node status + * @typedef {getStatus} * @param {DAPIClientOptions & {prove: boolean}} [options] - * @returns {Promise<GetIdentityResponse>} + * @returns {Promise<GetStatusResponse>} */ async function getStatus(options = {}) { const { GetStatusRequestV0 } = GetStatusRequest; @@ -45,7 +45,7 @@ function getStatusFactory(grpcTransport) { throw new InvalidResponseError('GetStatusResponseV0 is not defined'); } - return getStatusResponse.getV0().toObject(); + return GetStatusResponse.createFromProto(getStatusResponse); } catch (e) { if (e instanceof InvalidResponseError) { lastError = e; diff --git a/packages/js-dapi-client/lib/methods/platform/getTotalCreditsInPlatform/GetTotalCreditsInPlatformResponse.js b/packages/js-dapi-client/lib/methods/platform/getTotalCreditsInPlatform/GetTotalCreditsInPlatformResponse.js index a682d646d31..5dc64e1bd98 100644 --- a/packages/js-dapi-client/lib/methods/platform/getTotalCreditsInPlatform/GetTotalCreditsInPlatformResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/getTotalCreditsInPlatform/GetTotalCreditsInPlatformResponse.js @@ -3,7 +3,7 @@ const InvalidResponseError = require('../response/errors/InvalidResponseError'); class GetTotalCreditsInPlatformResponse extends AbstractResponse { /** - * @param {number} totalCreditsInPlatform + * @param {bigint} totalCreditsInPlatform * @param {Metadata} metadata * @param {Proof} [proof] */ @@ -14,7 +14,7 @@ class GetTotalCreditsInPlatformResponse extends AbstractResponse { } /** - * @returns {number} + * @returns {bigint} */ getTotalCreditsInPlatform() { return this.totalCreditsInPlatform; @@ -26,7 +26,7 @@ class GetTotalCreditsInPlatformResponse extends AbstractResponse { */ static createFromProto(proto) { // eslint-disable-next-line - const totalCreditsInPlatform = proto.getV0().getCredits(); + const totalCreditsInPlatform = BigInt(proto.getV0().getCredits()); const { metadata, proof } = AbstractResponse.createMetadataAndProofFromProto( proto, ); diff --git a/packages/js-dapi-client/lib/methods/platform/response/AbstractResponse.js b/packages/js-dapi-client/lib/methods/platform/response/AbstractResponse.js index b9f69c1cf77..50a3508bd07 100644 --- a/packages/js-dapi-client/lib/methods/platform/response/AbstractResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/response/AbstractResponse.js @@ -50,7 +50,12 @@ class AbstractResponse { } return { - metadata: new Metadata(metadata.toObject()), + metadata: new Metadata({ + height: metadata.getHeight(), + coreChainLockedHeight: metadata.getCoreChainLockedHeight(), + timeMs: metadata.getTimeMs(), + protocolVersion: metadata.getProtocolVersion(), + }), proof, }; } diff --git a/packages/js-dapi-client/lib/methods/platform/response/Metadata.js b/packages/js-dapi-client/lib/methods/platform/response/Metadata.js index a64e203d345..070134e3935 100644 --- a/packages/js-dapi-client/lib/methods/platform/response/Metadata.js +++ b/packages/js-dapi-client/lib/methods/platform/response/Metadata.js @@ -1,21 +1,21 @@ class Metadata { /** * @param {object} properties - * @param {number} properties.height - block height + * @param {bigint|string} properties.height - block height * @param {number} properties.coreChainLockedHeight - core chain locked height - * @param {number} properties.timeMs - block time + * @param {bigint|string} properties.timeMs - block time * @param {number} properties.protocolVersion - protocol version */ constructor(properties) { - this.height = properties.height; + this.height = BigInt(properties.height); this.coreChainLockedHeight = properties.coreChainLockedHeight; - this.timeMs = properties.timeMs; + this.timeMs = BigInt(properties.timeMs); this.protocolVersion = properties.protocolVersion; } /** * Get height - * @returns {number} - block height + * @returns {bigint} - block height */ getHeight() { return this.height; @@ -31,7 +31,7 @@ class Metadata { /** * Get block time - * @returns {number} + * @returns {bigint} */ getTimeMs() { return this.timeMs; diff --git a/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/ErrorResult.js b/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/ErrorResult.js index 8bc98691f89..55072f849b6 100644 --- a/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/ErrorResult.js +++ b/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/ErrorResult.js @@ -2,7 +2,7 @@ class ErrorResult { /** * @param {number} code * @param {string} message - * @param {*} data + * @param {Buffer|undefined} data */ constructor(code, message, data) { this.code = code; @@ -25,7 +25,7 @@ class ErrorResult { } /** - * @returns {*} + * @returns {Buffer|undefined} */ getData() { return this.data; diff --git a/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/WaitForStateTransitionResultResponse.js b/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/WaitForStateTransitionResultResponse.js index da357d7d9d7..836987a2376 100644 --- a/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/WaitForStateTransitionResultResponse.js +++ b/packages/js-dapi-client/lib/methods/platform/waitForStateTransitionResult/WaitForStateTransitionResultResponse.js @@ -1,5 +1,3 @@ -const cbor = require('cbor'); - const AbstractResponse = require('../response/AbstractResponse'); const Metadata = require('../response/Metadata'); const Proof = require('../response/Proof'); @@ -38,9 +36,9 @@ class WaitForStateTransitionResultResponse extends AbstractResponse { if (proto.getV0().getError()) { let data; - const rawData = proto.getV0().getError().getData(); - if (rawData) { - data = cbor.decode(Buffer.from(rawData)); + + if (proto.getV0().getError().getData()) { + data = Buffer.from(proto.getV0().getError().getData()); } error = new ErrorResult( diff --git a/packages/js-dapi-client/lib/test/fixtures/getMetadataFixture.js b/packages/js-dapi-client/lib/test/fixtures/getMetadataFixture.js index 962dce20e9b..6ce49e99854 100644 --- a/packages/js-dapi-client/lib/test/fixtures/getMetadataFixture.js +++ b/packages/js-dapi-client/lib/test/fixtures/getMetadataFixture.js @@ -1,17 +1,16 @@ /** * @returns {{ - * coreChainLockedHeight: number, - * height: number, - * signature: Buffer, + * height: bigint, + * coreChainLockedHeight: string, + * timeMs: string, * protocolVersion: number, - * timeMs: number, * }} */ function getMetadataFixture() { return { - height: 10, - coreChainLockedHeight: 42, - timeMs: new Date().getTime(), + height: BigInt(10), + coreChainLockedHeight: '42', + timeMs: new Date().getTime().toString(), protocolVersion: 1, }; } diff --git a/packages/js-dapi-client/lib/test/fixtures/getStatusFixture.js b/packages/js-dapi-client/lib/test/fixtures/getStatusFixture.js new file mode 100644 index 00000000000..61bdb9bf49f --- /dev/null +++ b/packages/js-dapi-client/lib/test/fixtures/getStatusFixture.js @@ -0,0 +1,62 @@ +/** + * + */ +function getStatusFixture() { + return { + version: { + software: { + dapi: '1.8.0-rc.2', + drive: '1.8.0-rc.3', + tenderdash: '1.4.0', + }, + protocol: { + tenderdash: { + p2p: 10, + block: 14, + }, + drive: { + latest: 9, + current: 8, + }, + }, + }, + node: { + id: new Uint8Array(Buffer.from('QbMI9zfKnjn2e1UxWJAxmKiMUW4=', 'base64')), + proTxHash: new Uint8Array(Buffer.from('s7V0hXG2D+mtEScV1qUXJdblpSqcOvX9NqFyTPUNhi8=', 'base64')), + }, + chain: { + catchingUp: false, + latestBlockHash: new Uint8Array(Buffer.from('mVDwGtY2oJSaLLgv3WpLp2dFDyFEtqhD4z1gl2OJceY=', 'base64')), + latestAppHash: new Uint8Array(Buffer.from('jHgEBK8aZ74TUKcUGN58EFzUNvNsLboOgYe6eH/JetU=', 'base64')), + latestBlockHeight: '94461', + earliestBlockHash: new Uint8Array(Buffer.from('CPoCwn7AOQujAeT8fj1+rbNQyBk+PmKgk2iXBuOiC/o=', 'base64')), + earliestAppHash: new Uint8Array(Buffer.from('vwzLnKBxugGubmegwJD5eAPSbVbWddzVExeBy8rI7I8=', 'base64')), + earliestBlockHeight: '1', + maxPeerBlockHeight: '94461', + coreChainLockedHeight: 1187358, + }, + network: { + chainId: 'dash-testnet-51', + peersCount: 96, + listening: true, + }, + stateSync: { + totalSyncedTime: '2312323', + remainingTime: '1337', + totalSnapshots: 300, + chunkProcessAverageTime: '213123', + snapshotHeight: '10000', + snapshotChunksCount: '1000', + backfilledBlocks: '1400', + backfillBlocksTotal: '2000', + }, + time: { + local: '1738336806994', + block: '1738336736273', + genesis: '0', + epoch: 4717, + }, + }; +} + +module.exports = getStatusFixture; diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index ac8c6265833..a8a30dc544e 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "1.6.2", + "version": "1.8.0", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ @@ -64,7 +64,7 @@ "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-webpack": "^5.0.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "nyc": "^15.1.0", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", @@ -82,7 +82,8 @@ "files": [ "docs", "lib", - "polyfills" + "polyfills", + "dist" ], "scripts": { "build:web": "webpack", diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDataContract/GetDataContractResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDataContract/GetDataContractResponse.spec.js index 61986919aac..7ac39250489 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDataContract/GetDataContractResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDataContract/GetDataContractResponse.spec.js @@ -63,6 +63,8 @@ describe('GetDataContractResponse', () => { const metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); proto.setV0( new GetDataContractResponseV0() @@ -74,12 +76,14 @@ describe('GetDataContractResponse', () => { expect(getDataContractResponse).to.be.an.instanceOf(GetDataContractResponseClass); expect(getDataContractResponse.getDataContract()).to.deep.equal(dataContractFixture.toBuffer()); - expect(getDataContractResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getDataContractResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getDataContractResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getDataContractResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getDataContractResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getDataContractResponse.getProof()).to.equal(undefined); }); @@ -97,6 +101,8 @@ describe('GetDataContractResponse', () => { const metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); proto.setV0( new GetDataContractResponseV0() @@ -109,12 +115,14 @@ describe('GetDataContractResponse', () => { expect(getDataContractResponse).to.be.an.instanceOf(GetDataContractResponseClass); expect(getDataContractResponse.getDataContract()).to.deep.equal(Buffer.alloc(0)); - expect(getDataContractResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getDataContractResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getDataContractResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getDataContractResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getDataContractResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getDataContractResponse.getProof(); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDataContract/getDataContractFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDataContract/getDataContractFactory.spec.js index 219531898f1..4d725d0256f 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDataContract/getDataContractFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDataContract/getDataContractFactory.spec.js @@ -84,11 +84,15 @@ describe('getDataContractFactory', () => { ]); expect(result.getDataContract()).to.deep.equal(dataContractFixture.toBuffer()); expect(result.getProof()).to.equal(undefined); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should return proof', async () => { @@ -115,16 +119,21 @@ describe('getDataContractFactory', () => { ]); expect(result.getDataContract()).to.deep.equal(Buffer.alloc(0)); + expect(result.getProof()).to.be.an.instanceOf(ProofClass); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.spec.js index 39d04be0983..90da73d3739 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/GetDataContractHistoryResponse.spec.js @@ -24,10 +24,15 @@ describe('GetDataContractHistoryResponse', () => { beforeEach(async () => { metadataFixture = getMetadataFixture(); dataContractFixture = await getDataContractFixture(); - dataContractHistoryFixture = { - 2000: dataContractFixture.toBuffer(), - 3000: dataContractFixture.toBuffer(), - }; + + dataContractHistoryFixture = [{ + date: BigInt('10000'), + value: dataContractFixture.toBuffer(), + }, + { + date: BigInt('20000'), + value: dataContractFixture.toBuffer(), + }]; proofFixture = getProofFixture(); getDataContractHistoryResponse = new GetDataContractHistoryResponseClass( @@ -37,16 +42,16 @@ describe('GetDataContractHistoryResponse', () => { }); it('should return data contract history', () => { - const dataContract = getDataContractHistoryResponse.getDataContractHistory(); + const dataContractHistory = getDataContractHistoryResponse.getDataContractHistory(); const proof = getDataContractHistoryResponse.getProof(); - expect(dataContract).to.deep.equal(dataContractHistoryFixture); + expect(dataContractHistory).to.deep.equal(dataContractHistoryFixture); expect(proof).to.equal(undefined); }); it('should return proof', () => { getDataContractHistoryResponse = new GetDataContractHistoryResponseClass( - {}, + null, new Metadata(metadataFixture), new Proof(proofFixture), ); @@ -54,7 +59,7 @@ describe('GetDataContractHistoryResponse', () => { const dataContract = getDataContractHistoryResponse.getDataContractHistory(); const proof = getDataContractHistoryResponse.getProof(); - expect(dataContract).to.deep.equal({}); + expect(dataContract).to.deep.equal(null); expect(proof).to.be.an.instanceOf(Proof); expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); @@ -67,20 +72,18 @@ describe('GetDataContractHistoryResponse', () => { GetDataContractHistoryResponseV0, } = GetDataContractHistoryResponse; - const { - DataContractHistory, - DataContractHistoryEntry, - } = GetDataContractHistoryResponseV0; - - const dataContractHistoryEntryProto = new DataContractHistoryEntry(); - dataContractHistoryEntryProto.setDate(1000); + const dataContractHistoryEntryProto = new GetDataContractHistoryResponseV0 + .DataContractHistoryEntry(); + dataContractHistoryEntryProto.setDate('10000'); dataContractHistoryEntryProto.setValue(dataContractFixture.toBuffer()); - const dataContractHistoryEntryProto2 = new DataContractHistoryEntry(); - dataContractHistoryEntryProto2.setDate(2000); + const dataContractHistoryEntryProto2 = new GetDataContractHistoryResponseV0 + .DataContractHistoryEntry(); + dataContractHistoryEntryProto2.setDate('20000'); dataContractHistoryEntryProto2.setValue(dataContractFixture.toBuffer()); - const dataContractHistoryProto = new DataContractHistory(); + const dataContractHistoryProto = new GetDataContractHistoryResponseV0 + .DataContractHistory(); dataContractHistoryProto.setDataContractEntriesList([ dataContractHistoryEntryProto, dataContractHistoryEntryProto2, @@ -93,6 +96,8 @@ describe('GetDataContractHistoryResponse', () => { const metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); proto.setV0( new GetDataContractHistoryResponseV0() @@ -103,10 +108,8 @@ describe('GetDataContractHistoryResponse', () => { getDataContractHistoryResponse = GetDataContractHistoryResponseClass.createFromProto(proto); expect(getDataContractHistoryResponse).to.be.an.instanceOf(GetDataContractHistoryResponseClass); - expect(getDataContractHistoryResponse.getDataContractHistory()).to.deep.equal({ - 1000: dataContractFixture.toBuffer(), - 2000: dataContractFixture.toBuffer(), - }); + expect(getDataContractHistoryResponse.getDataContractHistory()) + .to.deep.equal(dataContractHistoryFixture); expect(getDataContractHistoryResponse.getMetadata()) .to.be.an.instanceOf(Metadata); @@ -131,6 +134,8 @@ describe('GetDataContractHistoryResponse', () => { const metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); proto.setV0( new GetDataContractHistoryResponseV0() @@ -141,14 +146,16 @@ describe('GetDataContractHistoryResponse', () => { getDataContractHistoryResponse = GetDataContractHistoryResponseClass.createFromProto(proto); expect(getDataContractHistoryResponse).to.be.an.instanceOf(GetDataContractHistoryResponseClass); - expect(getDataContractHistoryResponse.getDataContractHistory()).to.deep.equal({}); + expect(getDataContractHistoryResponse.getDataContractHistory()).to.deep.equal(null); - expect(getDataContractHistoryResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getDataContractHistoryResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getDataContractHistoryResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getDataContractHistoryResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getDataContractHistoryResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getDataContractHistoryResponse.getProof(); @@ -163,20 +170,18 @@ describe('GetDataContractHistoryResponse', () => { GetDataContractHistoryResponseV0, } = GetDataContractHistoryResponse; - const { - DataContractHistory, - DataContractHistoryEntry, - } = GetDataContractHistoryResponseV0; - - const dataContractHistoryEntryProto = new DataContractHistoryEntry(); + const dataContractHistoryEntryProto = new GetDataContractHistoryResponseV0 + .DataContractHistoryEntry(); dataContractHistoryEntryProto.setDate(1000); dataContractHistoryEntryProto.setValue(dataContractFixture.toBuffer()); - const dataContractHistoryEntryProto2 = new DataContractHistoryEntry(); + const dataContractHistoryEntryProto2 = new GetDataContractHistoryResponseV0 + .DataContractHistoryEntry(); dataContractHistoryEntryProto2.setDate(2000); dataContractHistoryEntryProto2.setValue(dataContractFixture.toBuffer()); - const dataContractHistoryProto = new DataContractHistory(); + const dataContractHistoryProto = new GetDataContractHistoryResponseV0 + .DataContractHistory(); dataContractHistoryProto.setDataContractEntriesList([ dataContractHistoryEntryProto, dataContractHistoryEntryProto2, diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/getDataContractHistoryFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/getDataContractHistoryFactory.spec.js index 4ef665e37f9..b8597e45c22 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/getDataContractHistoryFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDataContractHistory/getDataContractHistoryFactory.spec.js @@ -41,17 +41,22 @@ describe('getDataContractHistoryFactory', () => { beforeEach(async function beforeEach() { dataContractFixture = await getDataContractFixture(); - dataContractHistoryFixture = { - 1000: dataContractFixture.toBuffer(), - 2000: dataContractFixture.toBuffer(), - }; + + dataContractHistoryFixture = [{ + date: BigInt(10000), + value: dataContractFixture.toBuffer(), + }, + { + date: BigInt(20000), + value: dataContractFixture.toBuffer(), + }]; const dataContractHistoryEntryProto = new DataContractHistoryEntry(); - dataContractHistoryEntryProto.setDate(1000); + dataContractHistoryEntryProto.setDate('10000'); dataContractHistoryEntryProto.setValue(dataContractFixture.toBuffer()); const dataContractHistoryEntryProto2 = new DataContractHistoryEntry(); - dataContractHistoryEntryProto2.setDate(2000); + dataContractHistoryEntryProto2.setDate('20000'); dataContractHistoryEntryProto2.setValue(dataContractFixture.toBuffer()); const dataContractHistoryProto = new DataContractHistory(); @@ -98,7 +103,7 @@ describe('getDataContractHistoryFactory', () => { it('should return data contract history', async () => { const contractId = dataContractFixture.getId().toBuffer(); - const result = await getDataContractHistory(contractId, 0, 10, 0, options); + const result = await getDataContractHistory(contractId, BigInt(0), 10, 0, options); const { GetDataContractHistoryRequestV0 } = GetDataContractHistoryRequest; const request = new GetDataContractHistoryRequest(); @@ -107,7 +112,7 @@ describe('getDataContractHistoryFactory', () => { .setId(contractId) .setLimit(new UInt32Value([10])) .setOffset(new UInt32Value([0])) - .setStartAtMs(0) + .setStartAtMs('0') .setProve(false), ); @@ -118,12 +123,17 @@ describe('getDataContractHistoryFactory', () => { options, ]); expect(result.getDataContractHistory()).to.deep.equal(dataContractHistoryFixture); + expect(result.getProof()).to.equal(undefined); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should return proof', async () => { @@ -132,7 +142,7 @@ describe('getDataContractHistoryFactory', () => { response.getV0().setDataContractHistory(undefined); const contractId = dataContractFixture.getId().toBuffer(); - const result = await getDataContractHistory(contractId, 0, 10, 0, options); + const result = await getDataContractHistory(contractId, BigInt(0), 10, 0, options); const { GetDataContractHistoryRequestV0 } = GetDataContractHistoryRequest; const request = new GetDataContractHistoryRequest(); @@ -141,7 +151,7 @@ describe('getDataContractHistoryFactory', () => { .setId(contractId) .setLimit(new UInt32Value([10])) .setOffset(new UInt32Value([0])) - .setStartAtMs(0) + .setStartAtMs('0') .setProve(true), ); @@ -152,17 +162,22 @@ describe('getDataContractHistoryFactory', () => { options, ]); - expect(result.getDataContractHistory()).to.deep.equal({}); + expect(result.getDataContractHistory()).to.deep.equal(null); + expect(result.getProof()).to.be.an.instanceOf(ProofClass); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should throw unknown error', async () => { @@ -178,12 +193,12 @@ describe('getDataContractHistoryFactory', () => { .setId(contractId.toBuffer()) .setLimit(new UInt32Value([10])) .setOffset(new UInt32Value([0])) - .setStartAtMs(0) + .setStartAtMs('0') .setProve(false), ); try { - await getDataContractHistory(contractId, 0, 10, 0, options); + await getDataContractHistory(contractId, BigInt(0), 10, 0, options); expect.fail('should throw unknown error'); } catch (e) { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDocuments/GetDocumentsResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDocuments/GetDocumentsResponse.spec.js index 4aa187b0b83..777ceb112ff 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDocuments/GetDocumentsResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDocuments/GetDocumentsResponse.spec.js @@ -36,6 +36,8 @@ describe('GetDocumentsResponse', () => { const metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); + metadata.setTimeMs(metadataFixture.timeMs); + metadata.setProtocolVersion(metadataFixture.protocolVersion); proto.setV0( new GetDocumentsResponseV0() @@ -82,12 +84,14 @@ describe('GetDocumentsResponse', () => { expect(getDocumentsResponse).to.be.an.instanceOf(GetDocumentsResponseClass); expect(getDocumentsResponse.getDocuments()).to.deep.equal(serializedDocuments); - expect(getDocumentsResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getDocumentsResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getDocumentsResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getDocumentsResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getDocumentsResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getDocumentsResponse.getProof()).to.equal(undefined); }); @@ -106,12 +110,14 @@ describe('GetDocumentsResponse', () => { expect(getDocumentsResponse).to.be.an.instanceOf(GetDocumentsResponseClass); expect(getDocumentsResponse.getDocuments()).to.deep.members([]); - expect(getDocumentsResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getDocumentsResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getDocumentsResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getDocumentsResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getDocumentsResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getDocumentsResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getDocuments/getDocumentsFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getDocuments/getDocumentsFactory.spec.js index 07ebf9f2acf..02f99ae7fca 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getDocuments/getDocumentsFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getDocuments/getDocumentsFactory.spec.js @@ -109,7 +109,16 @@ describe('getDocumentsFactory', () => { options, ); expect(result.getDocuments()).to.deep.equal(serializedDocuments); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -142,18 +151,20 @@ describe('getDocumentsFactory', () => { expect(result.getDocuments()).to.deep.members([]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should return documents when contract id is identifier', async () => { @@ -180,7 +191,16 @@ describe('getDocumentsFactory', () => { options, ); expect(result.getDocuments()).to.deep.equal(serializedDocuments); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); }); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/GetEpochsInfoResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/GetEpochsInfoResponse.spec.js index b8d81c1e0c7..bb0c1e44b1f 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/GetEpochsInfoResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/GetEpochsInfoResponse.spec.js @@ -23,7 +23,7 @@ describe('GetEpochsInfoResponse', () => { beforeEach(async () => { metadataFixture = getMetadataFixture(); - epochInfoFixture = new EpochInfoClass(1, 1, 1, Date.now(), 1.1); + epochInfoFixture = new EpochInfoClass(1, BigInt(1), 1, BigInt(Date.now()), 1.1); proofFixture = getProofFixture(); const { GetEpochsInfoResponseV0 } = GetEpochsInfoResponse; @@ -71,6 +71,7 @@ describe('GetEpochsInfoResponse', () => { const epochsInfo = getEpochsInfoResponse.getEpochsInfo(); const proof = getEpochsInfoResponse.getProof(); + const metadata = getEpochsInfoResponse.getMetadata(); expect(epochsInfo).to.deep.equal([]); expect(proof).to.be.an.instanceOf(Proof); @@ -78,6 +79,15 @@ describe('GetEpochsInfoResponse', () => { expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(proof.getSignature()).to.deep.equal(proofFixture.signature); expect(proof.getRound()).to.deep.equal(proofFixture.round); + + expect(metadata.getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(metadata.getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(metadata.getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(metadata.getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should create an instance from proto', () => { @@ -85,12 +95,14 @@ describe('GetEpochsInfoResponse', () => { expect(getEpochsInfoResponse).to.be.an.instanceOf(GetEpochsInfoResponseClass); expect(getEpochsInfoResponse.getEpochsInfo()).to.deep.equal([epochInfoFixture]); - expect(getEpochsInfoResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getEpochsInfoResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getEpochsInfoResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getEpochsInfoResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getEpochsInfoResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getEpochsInfoResponse.getProof()).to.equal(undefined); }); @@ -109,7 +121,15 @@ describe('GetEpochsInfoResponse', () => { getEpochsInfoResponse = GetEpochsInfoResponseClass.createFromProto(proto); expect(getEpochsInfoResponse.getEpochsInfo()).to.deep.equal([]); - expect(getEpochsInfoResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getEpochsInfoResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getEpochsInfoResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getEpochsInfoResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getEpochsInfoResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getEpochsInfoResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/getEpochsInfoFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/getEpochsInfoFactory.spec.js index c9b2378beb3..6e099599fa3 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/getEpochsInfoFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getEpochsInfo/getEpochsInfoFactory.spec.js @@ -27,7 +27,7 @@ describe('getEpochsInfoFactory', () => { let proofResponse; beforeEach(async function beforeEach() { - epochInfoFixture = new EpochInfo(1, 1, 1, Date.now(), 1.1); + epochInfoFixture = new EpochInfo(1, BigInt(1), 1, BigInt(Date.now()), 1.1); metadataFixture = getMetadataFixture(); proofFixture = getProofFixture(); @@ -91,7 +91,16 @@ describe('getEpochsInfoFactory', () => { options, ); expect(result.getEpochsInfo()).to.deep.equal([epochInfoFixture]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -122,18 +131,20 @@ describe('getEpochsInfoFactory', () => { expect(result.getEpochsInfo()).to.deep.equal([]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js index 36fe8f57d7a..920ba2c8bf2 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/GetIdentitiesContractKeysResponse.spec.js @@ -103,12 +103,22 @@ describe('GetIdentitiesContractKeysResponse', () => { const keys = getIdentitiesContractKeysResponse.getIdentitiesKeys(); const proof = getIdentitiesContractKeysResponse.getProof(); + const metadata = getIdentitiesContractKeysResponse.getMetadata(); expect(keys).to.deep.equal({}); expect(proof).to.be.an.instanceOf(Proof); expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + + expect(metadata.getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(metadata.getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(metadata.getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(metadata.getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should create an instance from proto', () => { @@ -122,12 +132,14 @@ describe('GetIdentitiesContractKeysResponse', () => { identitiesContractKeys, ); - expect(getIdentitiesContractKeysResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getIdentitiesContractKeysResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getIdentitiesContractKeysResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentitiesContractKeysResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentitiesContractKeysResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getIdentitiesContractKeysResponse.getProof()).to.equal(undefined); }); @@ -148,7 +160,15 @@ describe('GetIdentitiesContractKeysResponse', () => { GetIdentitiesContractKeysResponseClass, ); expect(getIdentitiesContractKeysResponse.getIdentitiesKeys()).to.deep.equal({}); - expect(getIdentitiesContractKeysResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentitiesContractKeysResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentitiesContractKeysResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentitiesContractKeysResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentitiesContractKeysResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getIdentitiesContractKeysResponse.getProof()) .to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js index f6f061092db..1dbb6f6be1a 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentitiesContractKeys/getIdentitiesContractKeysFactory.spec.js @@ -144,7 +144,16 @@ describe('getIdentitiesContractKeysFactory', () => { options, ); expect(result.getIdentitiesKeys()).to.deep.equal(identitiesContractKeys); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -170,18 +179,20 @@ describe('getIdentitiesContractKeysFactory', () => { ); expect(result.getIdentitiesKeys()).to.deep.equal({}); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/GetIdentityResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentity/GetIdentityResponse.spec.js similarity index 85% rename from packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/GetIdentityResponse.spec.js rename to packages/js-dapi-client/test/unit/methods/platform/getIdentity/GetIdentityResponse.spec.js index 9cc60506473..788184965fa 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/GetIdentityResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentity/GetIdentityResponse.spec.js @@ -79,12 +79,14 @@ describe('GetIdentityResponse', () => { expect(getIdentityResponse).to.be.an.instanceOf(GetIdentityResponseClass); expect(getIdentityResponse.getIdentity()).to.deep.equal(identityFixture.toBuffer()); - expect(getIdentityResponse.getMetadata()) - .to.be.an.instanceOf(Metadata); expect(getIdentityResponse.getMetadata().getHeight()) - .to.equal(metadataFixture.height); + .to.deep.equal(BigInt(metadataFixture.height)); expect(getIdentityResponse.getMetadata().getCoreChainLockedHeight()) - .to.equal(metadataFixture.coreChainLockedHeight); + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getIdentityResponse.getProof()).to.equal(undefined); }); @@ -103,7 +105,15 @@ describe('GetIdentityResponse', () => { getIdentityResponse = GetIdentityResponseClass.createFromProto(proto); expect(getIdentityResponse.getIdentity()).to.deep.equal(Buffer.alloc(0)); - expect(getIdentityResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentityResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getIdentityResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/getIdentityFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentity/getIdentityFactory.spec.js similarity index 83% rename from packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/getIdentityFactory.spec.js rename to packages/js-dapi-client/test/unit/methods/platform/getIdentity/getIdentityFactory.spec.js index 1827125c59c..711ff8b16c3 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentitiy/getIdentityFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentity/getIdentityFactory.spec.js @@ -83,7 +83,16 @@ describe('getIdentityFactory', () => { options, ); expect(result.getIdentity()).to.deep.equal(identityFixture.toBuffer()); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -111,18 +120,20 @@ describe('getIdentityFactory', () => { expect(result.getIdentity()).to.deep.equal(Buffer.alloc(0)); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.spec.js index 3df6adb6be5..51d5d1ccce3 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/GetIdentityBalanceResponse.spec.js @@ -23,7 +23,7 @@ describe('GetIdentityBalanceResponse', () => { beforeEach(async () => { metadataFixture = getMetadataFixture(); proofFixture = getProofFixture(); - balance = 1337; + balance = BigInt(1337); const { GetIdentityBalanceResponseV0 } = GetIdentityBalanceResponse; proto = new GetIdentityBalanceResponse(); @@ -101,8 +101,16 @@ describe('GetIdentityBalanceResponse', () => { getIdentityBalanceResponse = GetIdentityBalanceResponseClass.createFromProto(proto); - expect(getIdentityBalanceResponse.getBalance()).to.equal(0); - expect(getIdentityBalanceResponse.getMetadata()).to.deep.equal(metadataFixture); + expect(getIdentityBalanceResponse.getBalance()).to.equal(BigInt(0)); + + expect(getIdentityBalanceResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityBalanceResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityBalanceResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityBalanceResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getIdentityBalanceResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/getIdentityBalanceFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/getIdentityBalanceFactory.spec.js index 210d2a8a9f9..daffa9f3cbc 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/getIdentityBalanceFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityBalance/getIdentityBalanceFactory.spec.js @@ -27,7 +27,7 @@ describe('getIdentityBalanceFactory', () => { let proofResponse; beforeEach(async function beforeEach() { - balance = 1337; + balance = BigInt(1337); identityId = Buffer.alloc(32).fill(0); @@ -84,7 +84,16 @@ describe('getIdentityBalanceFactory', () => { options, ); expect(result.getBalance()).to.deep.equal(balance); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -110,20 +119,22 @@ describe('getIdentityBalanceFactory', () => { options, ); - expect(result.getBalance()).to.deep.equal(0); + expect(result.getBalance()).to.deep.equal(BigInt(0)); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js index bda482f7dff..18545b0f54c 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/GetIdentityByPublicKeyHashResponse.spec.js @@ -67,12 +67,23 @@ describe('GetIdentityByPublicKeyHashResponse', () => { const identity = getIdentityResponse.getIdentity(); const proof = getIdentityResponse.getProof(); + const metadata = getIdentityResponse.getMetadata(); expect(identity).to.equal(undefined); + expect(proof).to.be.an.instanceOf(Proof); expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(proof.getSignature()).to.deep.equal(proofFixture.signature); + + expect(metadata.getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(metadata.getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(metadata.getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(metadata.getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); }); it('should create an instance from proto', () => { @@ -108,7 +119,15 @@ describe('GetIdentityByPublicKeyHashResponse', () => { GetIdentityByPublicKeyHashResponseClass, ); expect(getIdentityResponse.getIdentity()).to.deep.equal(Buffer.alloc(0)); - expect(getIdentityResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentityResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(getIdentityResponse.getProof()) .to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js index c36acc5eff6..1a8514b375c 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityByPublicKeyHash/getIdentityByPublicKeyHashFactory.spec.js @@ -88,7 +88,16 @@ describe('getIdentityByPublicKeyHashFactory', () => { options, ); expect(result.getIdentity()).to.have.deep.equal(identityFixture.toBuffer()); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -114,18 +123,20 @@ describe('getIdentityByPublicKeyHashFactory', () => { ); expect(result.getIdentity()).to.deep.equal(Buffer.alloc(0)); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js index efb8e532f4d..1d8065f2875 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/GetIdentityContractNonce.spec.js @@ -22,7 +22,7 @@ describe('GetIdentityContractNonceResponse', () => { beforeEach(async () => { metadataFixture = getMetadataFixture(); - nonce = 1; + nonce = BigInt(1); proofFixture = getProofFixture(); const { GetIdentityContractNonceResponseV0 } = GetIdentityContractNonceResponse; @@ -38,7 +38,6 @@ describe('GetIdentityContractNonceResponse', () => { new GetIdentityContractNonceResponseV0() .setIdentityContractNonce(nonce) .setMetadata(metadata), - ); getIdentityContractNonceResponse = new GetIdentityContractNonceResponseClass( @@ -103,10 +102,19 @@ describe('GetIdentityContractNonceResponse', () => { getIdentityContractNonceResponse = GetIdentityContractNonceResponseClass.createFromProto(proto); expect(getIdentityContractNonceResponse.getIdentityContractNonce()) - .to.deep.equal(0); - expect(getIdentityContractNonceResponse.getMetadata()).to.deep.equal(metadataFixture); + .to.deep.equal(BigInt(0)); + + expect(getIdentityContractNonceResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityContractNonceResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityContractNonceResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityContractNonceResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getIdentityContractNonceResponse.getProof(); + expect(proof).to.be.an.instanceOf(Proof); expect(proof.getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(proof.getQuorumHash()).to.deep.equal(proofFixture.quorumHash); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js index 0f5e46045b9..966820157a5 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityContractNonce/getIdentityContractNonceFactory.spec.js @@ -26,7 +26,7 @@ describe('getIdentityContractNonceFactory', () => { let proofResponse; beforeEach(async function beforeEach() { - nonce = 1; + nonce = BigInt(1); identityId = Buffer.alloc(32).fill(0); contractId = Buffer.alloc(32).fill(1); @@ -84,7 +84,16 @@ describe('getIdentityContractNonceFactory', () => { options, ); expect(result.getIdentityContractNonce()).to.deep.equal(nonce); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -111,20 +120,22 @@ describe('getIdentityContractNonceFactory', () => { options, ); - expect(result.getIdentityContractNonce()).to.deep.equal(0); + expect(result.getIdentityContractNonce()).to.deep.equal(BigInt(0)); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js index e9d13836c2e..84e88aee243 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/GetIdentityKeys.spec.js @@ -105,7 +105,15 @@ describe('GetIdentityKeysResponse', () => { expect(getIdentityKeysResponse.getIdentityKeys()) .to.deep.equal([]); - expect(getIdentityKeysResponse.getMetadata()).to.deep.equal(metadataFixture); + + expect(getIdentityKeysResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityKeysResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityKeysResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityKeysResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getIdentityKeysResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js index b1368ee41b9..f9873c97a62 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityKeys/getIdentityKeysFactory.spec.js @@ -7,6 +7,7 @@ const { Proof: ProofResponse, KeyRequestType, SpecificKeys, + AllKeys, }, } = require('@dashevo/dapi-grpc'); const { UInt32Value } = require('google-protobuf/google/protobuf/wrappers_pb'); @@ -24,6 +25,7 @@ describe('getIdentityKeysFactory', () => { let getIdentityKeys; let options; let response; + let metadata; let keys; let identityId; let keyIds; @@ -42,7 +44,7 @@ describe('getIdentityKeysFactory', () => { metadataFixture = getMetadataFixture(); proofFixture = getProofFixture(); - const metadata = new ResponseMetadata(); + metadata = new ResponseMetadata(); metadata.setHeight(metadataFixture.height); metadata.setCoreChainLockedHeight(metadataFixture.coreChainLockedHeight); metadata.setTimeMs(metadataFixture.timeMs); @@ -74,8 +76,14 @@ describe('getIdentityKeysFactory', () => { }; }); - it('should return identity keys', async () => { - const result = await getIdentityKeys(identityId, keyIds, limit, options); + it('should return specific identity keys', async () => { + response.setV0( + new GetIdentityKeysResponseV0() + .setKeys(new Keys().setKeysBytesList([keys[0]])) + .setMetadata(metadata), + ); + + const result = await getIdentityKeys(identityId, [keyIds[0]], limit, options); const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; const request = new GetIdentityKeysRequest(); @@ -83,7 +91,44 @@ describe('getIdentityKeysFactory', () => { new GetIdentityKeysRequestV0() .setIdentityId(identityId) .setRequestType(new KeyRequestType().setSpecificKeys(new SpecificKeys() - .setKeyIdsList(keyIds))) + .setKeyIdsList([keyIds[0]]))) + .setLimit(new UInt32Value([limit])) + .setProve(false), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getIdentityKeys', + request, + options, + ); + expect(result.getIdentityKeys()).to.deep.equal([keys[0]]); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); + }); + + it('should return all identity keys', async () => { + response.setV0( + new GetIdentityKeysResponseV0() + .setKeys(new Keys().setKeysBytesList(keys)) + .setMetadata(metadata), + ); + + const result = await getIdentityKeys(identityId, null, limit, options); + + const { GetIdentityKeysRequestV0 } = GetIdentityKeysRequest; + const request = new GetIdentityKeysRequest(); + request.setV0( + new GetIdentityKeysRequestV0() + .setIdentityId(identityId) + .setRequestType(new KeyRequestType().setAllKeys(new AllKeys())) .setLimit(new UInt32Value([limit])) .setProve(false), ); @@ -95,7 +140,16 @@ describe('getIdentityKeysFactory', () => { options, ); expect(result.getIdentityKeys()).to.deep.equal(keys); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -126,18 +180,20 @@ describe('getIdentityKeysFactory', () => { expect(result.getIdentityKeys()).to.deep.equal([]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js index 6a0d7ca6f6c..b79e8a27014 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/GetIdentityNonce.spec.js @@ -22,7 +22,7 @@ describe('GetIdentityNonceResponse', () => { beforeEach(async () => { metadataFixture = getMetadataFixture(); - nonce = 1; + nonce = BigInt(1); proofFixture = getProofFixture(); const { GetIdentityNonceResponseV0 } = GetIdentityNonceResponse; @@ -38,7 +38,6 @@ describe('GetIdentityNonceResponse', () => { new GetIdentityNonceResponseV0() .setIdentityNonce(nonce) .setMetadata(metadata), - ); getIdentityNonceResponse = new GetIdentityNonceResponseClass( @@ -103,8 +102,16 @@ describe('GetIdentityNonceResponse', () => { getIdentityNonceResponse = GetIdentityNonceResponseClass.createFromProto(proto); expect(getIdentityNonceResponse.getIdentityNonce()) - .to.deep.equal(0); - expect(getIdentityNonceResponse.getMetadata()).to.deep.equal(metadataFixture); + .to.deep.equal(BigInt(0)); + + expect(getIdentityNonceResponse.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getIdentityNonceResponse.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getIdentityNonceResponse.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getIdentityNonceResponse.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getIdentityNonceResponse.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js index b0f0b9fc222..564b7326da3 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getIdentityNonce/getIdentityNonceFactory.spec.js @@ -25,7 +25,7 @@ describe('getIdentityNonceFactory', () => { let proofResponse; beforeEach(async function beforeEach() { - nonce = 1; + nonce = BigInt(1); identityId = Buffer.alloc(32).fill(0); metadataFixture = getMetadataFixture(); @@ -81,7 +81,16 @@ describe('getIdentityNonceFactory', () => { options, ); expect(result.getIdentityNonce()).to.deep.equal(nonce); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -107,20 +116,22 @@ describe('getIdentityNonceFactory', () => { options, ); - expect(result.getIdentityNonce()).to.deep.equal(0); + expect(result.getIdentityNonce()).to.deep.equal(BigInt(0)); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/GetProtocolVersionUpgradeStateResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/GetProtocolVersionUpgradeStateResponse.spec.js index 6d450bd94ef..e837ff1d0b8 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/GetProtocolVersionUpgradeStateResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/GetProtocolVersionUpgradeStateResponse.spec.js @@ -110,7 +110,15 @@ describe('GetProtocolVersionUpgradeStateResponse', () => { .createFromProto(proto); expect(getProtocolVersionUpgradeState.getVersionEntries()).to.deep.equal([]); - expect(getProtocolVersionUpgradeState.getMetadata()).to.deep.equal(metadataFixture); + + expect(getProtocolVersionUpgradeState.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getProtocolVersionUpgradeState.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getProtocolVersionUpgradeState.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getProtocolVersionUpgradeState.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getProtocolVersionUpgradeState.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory.spec.js index 3ed3450ffdc..06760cff863 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeState/getProtocolVersionUpgradeStateFactory.spec.js @@ -87,7 +87,16 @@ describe('getProtocolVersionUpgradeStateFactory', () => { ); expect(result.getVersionEntries()).to.deep.equal([versionEntryFixture]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -115,18 +124,20 @@ describe('getProtocolVersionUpgradeStateFactory', () => { expect(result.getVersionEntries()).to.deep.equal([]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/GetProtocolVersionUpgradeVoteStatusResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/GetProtocolVersionUpgradeVoteStatusResponse.spec.js index 99d6cf812d9..b6e6f887bd4 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/GetProtocolVersionUpgradeVoteStatusResponse.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/GetProtocolVersionUpgradeVoteStatusResponse.spec.js @@ -113,7 +113,15 @@ describe('GetProtocolVersionUpgradeVoteStatusResponse', () => { .createFromProto(proto); expect(getProtocolVersionUpgradeVoteStatus.getVersionSignals()).to.deep.equal([]); - expect(getProtocolVersionUpgradeVoteStatus.getMetadata()).to.deep.equal(metadataFixture); + + expect(getProtocolVersionUpgradeVoteStatus.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(getProtocolVersionUpgradeVoteStatus.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(getProtocolVersionUpgradeVoteStatus.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(getProtocolVersionUpgradeVoteStatus.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); const proof = getProtocolVersionUpgradeVoteStatus.getProof(); expect(proof).to.be.an.instanceOf(Proof); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/getProtocolVersionUpgradeVoteStatusFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/getProtocolVersionUpgradeVoteStatusFactory.spec.js index 24cbc95a1f1..ff36627aa02 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/getProtocolVersionUpgradeVoteStatusFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/getProtocolVersionUpgradeVoteStatus/getProtocolVersionUpgradeVoteStatusFactory.spec.js @@ -97,7 +97,16 @@ describe('getProtocolVersionUpgradeVoteStatusFactory', () => { ); expect(result.getVersionSignals()).to.deep.equal([versionSignalFixture]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); }); @@ -129,18 +138,20 @@ describe('getProtocolVersionUpgradeVoteStatusFactory', () => { expect(result.getVersionSignals()).to.deep.equal([]); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); expect(result.getProof()).to.be.an.instanceOf(Proof); expect(result.getProof().getGrovedbProof()).to.deep.equal(proofFixture.merkleProof); expect(result.getProof().getQuorumHash()).to.deep.equal(proofFixture.quorumHash); expect(result.getProof().getSignature()).to.deep.equal(proofFixture.signature); expect(result.getProof().getRound()).to.deep.equal(proofFixture.round); - expect(result.getMetadata()).to.deep.equal(metadataFixture); - expect(result.getMetadata().getHeight()).to.equal(metadataFixture.height); - expect(result.getMetadata().getCoreChainLockedHeight()).to.equal( - metadataFixture.coreChainLockedHeight, - ); }); it('should throw unknown error', async () => { diff --git a/packages/js-dapi-client/test/unit/methods/platform/getStatus/GetStatusResponse.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getStatus/GetStatusResponse.spec.js new file mode 100644 index 00000000000..ebdcfc281b7 --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getStatus/GetStatusResponse.spec.js @@ -0,0 +1,347 @@ +const { + v0: { + GetStatusResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const GetStatusResponseClass = require('../../../../../lib/methods/platform/getStatus/GetStatusResponse'); +const getStatusFixture = require('../../../../../lib/test/fixtures/getStatusFixture'); +const VersionStatus = require('../../../../../lib/methods/platform/getStatus/VersionStatus'); +const NodeStatus = require('../../../../../lib/methods/platform/getStatus/NodeStatus'); +const ChainStatus = require('../../../../../lib/methods/platform/getStatus/ChainStatus'); +const NetworkStatus = require('../../../../../lib/methods/platform/getStatus/NetworkStatus'); +const StateSyncStatus = require('../../../../../lib/methods/platform/getStatus/StateSyncStatus'); +const TimeStatus = require('../../../../../lib/methods/platform/getStatus/TimeStatus'); + +describe('GetStatusResponse', () => { + let getStatusResponse; + let proto; + let statusFixture; + + beforeEach(async () => { + statusFixture = getStatusFixture(); + + const { GetStatusResponseV0 } = GetStatusResponse; + proto = new GetStatusResponse(); + + proto.setV0( + new GetStatusResponseV0() + .setVersion(new GetStatusResponseV0.Version() + .setSoftware( + new GetStatusResponse.GetStatusResponseV0.Version.Software() + .setDapi(statusFixture.version.software.dapi) + .setDrive(statusFixture.version.software.drive) + .setTenderdash(statusFixture.version.software.tenderdash), + ) + .setProtocol( + new GetStatusResponse.GetStatusResponseV0.Version.Protocol() + .setDrive(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Drive() + .setLatest(statusFixture.version.protocol.drive.latest) + .setCurrent(statusFixture.version.protocol.drive.current)) + .setTenderdash(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Tenderdash() + .setP2p(statusFixture.version.protocol.tenderdash.p2p) + .setBlock(statusFixture.version.protocol.tenderdash.block)), + )) + .setNode(new GetStatusResponse.GetStatusResponseV0.Node() + .setId(statusFixture.node.id) + .setProTxHash(statusFixture.node.proTxHash)) + .setChain(new GetStatusResponse.GetStatusResponseV0.Chain() + .setCatchingUp(statusFixture.chain.catchingUp) + .setLatestBlockHash(statusFixture.chain.latestBlockHash) + .setLatestAppHash(statusFixture.chain.latestAppHash) + .setLatestBlockHeight(statusFixture.chain.latestBlockHeight) + .setEarliestBlockHash(statusFixture.chain.earliestBlockHash) + .setEarliestAppHash(statusFixture.chain.earliestAppHash) + .setEarliestBlockHeight(statusFixture.chain.earliestBlockHeight) + .setMaxPeerBlockHeight(statusFixture.chain.maxPeerBlockHeight) + .setCoreChainLockedHeight(statusFixture.chain.coreChainLockedHeight)) + .setNetwork(new GetStatusResponse.GetStatusResponseV0.Network() + .setChainId(statusFixture.network.chainId) + .setPeersCount(statusFixture.network.peersCount) + .setListening(statusFixture.network.listening)) + .setStateSync(new GetStatusResponse.GetStatusResponseV0.StateSync() + .setTotalSyncedTime(statusFixture.stateSync.totalSyncedTime) + .setRemainingTime(statusFixture.stateSync.remainingTime) + .setTotalSnapshots(statusFixture.stateSync.totalSnapshots) + .setChunkProcessAvgTime(statusFixture.stateSync.chunkProcessAverageTime) + .setSnapshotHeight(statusFixture.stateSync.snapshotHeight) + .setSnapshotChunksCount(statusFixture.stateSync.snapshotChunksCount) + .setBackfilledBlocks(statusFixture.stateSync.backfilledBlocks) + .setBackfillBlocksTotal(statusFixture.stateSync.backfillBlocksTotal)) + .setTime(new GetStatusResponse.GetStatusResponseV0.Time() + .setLocal(statusFixture.time.local) + .setBlock(statusFixture.time.block) + .setGenesis(statusFixture.time.genesis) + .setEpoch(statusFixture.time.epoch)), + ); + + const version = new VersionStatus( + statusFixture.version.software.dapi, + statusFixture.version.software.drive, + statusFixture.version.software.tenderdash, + statusFixture.version.protocol.tenderdash.p2p, + statusFixture.version.protocol.tenderdash.block, + statusFixture.version.protocol.drive.current, + statusFixture.version.protocol.drive.latest, + ); + + const node = new NodeStatus( + Buffer.from(statusFixture.node.id).toString('hex'), + Buffer.from(statusFixture.node.proTxHash).toString('hex'), + ); + + const chain = new ChainStatus( + statusFixture.chain.catchingUp, + Buffer.from(statusFixture.chain.latestBlockHash).toString('hex'), + Buffer.from(statusFixture.chain.latestAppHash).toString('hex'), + BigInt(statusFixture.chain.latestBlockHeight), + Buffer.from(statusFixture.chain.earliestBlockHash).toString('hex'), + Buffer.from(statusFixture.chain.earliestAppHash).toString('hex'), + BigInt(statusFixture.chain.earliestBlockHeight), + BigInt(statusFixture.chain.maxPeerBlockHeight), + statusFixture.chain.coreChainLockedHeight, + ); + + const network = new NetworkStatus( + statusFixture.network.chainId, + statusFixture.network.peersCount, + statusFixture.network.listening, + ); + + const stateSync = new StateSyncStatus( + BigInt(statusFixture.stateSync.totalSyncedTime), + BigInt(statusFixture.stateSync.remainingTime), + statusFixture.stateSync.totalSnapshots, + BigInt(statusFixture.stateSync.chunkProcessAverageTime), + BigInt(statusFixture.stateSync.snapshotHeight), + BigInt(statusFixture.stateSync.snapshotChunksCount), + BigInt(statusFixture.stateSync.backfilledBlocks), + BigInt(statusFixture.stateSync.backfillBlocksTotal), + ); + + const time = new TimeStatus( + BigInt(statusFixture.time.local), + BigInt(statusFixture.time.block), + BigInt(statusFixture.time.genesis), + statusFixture.time.epoch, + ); + + proto.setV0( + new GetStatusResponseV0() + .setVersion(new GetStatusResponseV0.Version() + .setSoftware( + new GetStatusResponse.GetStatusResponseV0.Version.Software() + .setDapi(statusFixture.version.software.dapi) + .setDrive(statusFixture.version.software.drive) + .setTenderdash(statusFixture.version.software.tenderdash), + ) + .setProtocol( + new GetStatusResponse.GetStatusResponseV0.Version.Protocol() + .setDrive(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Drive() + .setLatest(statusFixture.version.protocol.drive.latest) + .setCurrent(statusFixture.version.protocol.drive.current)) + .setTenderdash(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Tenderdash() + .setP2p(statusFixture.version.protocol.tenderdash.p2p) + .setBlock(statusFixture.version.protocol.tenderdash.block)), + )) + .setNode(new GetStatusResponse.GetStatusResponseV0.Node() + .setId(statusFixture.node.id) + .setProTxHash(statusFixture.node.proTxHash)) + .setChain(new GetStatusResponse.GetStatusResponseV0.Chain() + .setCatchingUp(statusFixture.chain.catchingUp) + .setLatestBlockHash(statusFixture.chain.latestBlockHash) + .setLatestAppHash(statusFixture.chain.latestAppHash) + .setLatestBlockHeight(statusFixture.chain.latestBlockHeight) + .setEarliestBlockHash(statusFixture.chain.earliestBlockHash) + .setEarliestAppHash(statusFixture.chain.earliestAppHash) + .setEarliestBlockHeight(statusFixture.chain.earliestBlockHeight) + .setMaxPeerBlockHeight(statusFixture.chain.maxPeerBlockHeight) + .setCoreChainLockedHeight(statusFixture.chain.coreChainLockedHeight)) + .setNetwork(new GetStatusResponse.GetStatusResponseV0.Network() + .setChainId(statusFixture.network.chainId) + .setPeersCount(statusFixture.network.peersCount) + .setListening(statusFixture.network.listening)) + .setStateSync(new GetStatusResponse.GetStatusResponseV0.StateSync() + .setTotalSyncedTime(statusFixture.stateSync.totalSyncedTime) + .setRemainingTime(statusFixture.stateSync.remainingTime) + .setTotalSnapshots(statusFixture.stateSync.totalSnapshots) + .setChunkProcessAvgTime(statusFixture.stateSync.chunkProcessAverageTime) + .setSnapshotHeight(statusFixture.stateSync.snapshotHeight) + .setSnapshotChunksCount(statusFixture.stateSync.snapshotChunksCount) + .setBackfilledBlocks(statusFixture.stateSync.backfilledBlocks) + .setBackfillBlocksTotal(statusFixture.stateSync.backfillBlocksTotal)) + .setTime(new GetStatusResponse.GetStatusResponseV0.Time() + .setLocal(statusFixture.time.local) + .setBlock(statusFixture.time.block) + .setGenesis(statusFixture.time.genesis) + .setEpoch(statusFixture.time.epoch)), + ); + + getStatusResponse = new GetStatusResponseClass( + version, + node, + chain, + network, + stateSync, + time, + ); + }); + + it('should return status', () => { + const versionStatus = getStatusResponse.getVersionStatus(); + const nodeStatus = getStatusResponse.getNodeStatus(); + const chainStatus = getStatusResponse.getChainStatus(); + const networkStatus = getStatusResponse.getNetworkStatus(); + const stateSyncStatus = getStatusResponse.getStateSyncStatus(); + const timeStatus = getStatusResponse.getTimeStatus(); + + expect(versionStatus).to.be.an.instanceOf(VersionStatus); + expect(versionStatus.getDriveVersion()) + .to.equal(statusFixture.version.software.drive); + expect(versionStatus.getTenderdashVersion()) + .to.equal(statusFixture.version.software.tenderdash); + expect(versionStatus.getTenderdashP2pProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.p2p); + expect(versionStatus.getTenderdashBlockProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.block); + expect(versionStatus.getDriveCurrentProtocol()) + .to.equal(statusFixture.version.protocol.drive.current); + expect(versionStatus.getDriveLatestProtocol()) + .to.equal(statusFixture.version.protocol.drive.latest); + + expect(nodeStatus).to.be.an.instanceOf(NodeStatus); + expect(nodeStatus.getNodeId()).to.equal(Buffer.from(statusFixture.node.id).toString('hex')); + expect(nodeStatus.getProTxHash()).to.equal(Buffer.from(statusFixture.node.proTxHash).toString('hex')); + + expect(chainStatus).to.be.an.instanceOf(ChainStatus); + expect(chainStatus.isCatchingUp()) + .to.equal(statusFixture.chain.catchingUp); + expect(chainStatus.getLatestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.latestBlockHash).toString('hex')); + expect(chainStatus.getLatestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.latestAppHash).toString('hex')); + expect(chainStatus.getLatestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.latestBlockHeight)); + expect(chainStatus.getEarliestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestBlockHash).toString('hex')); + expect(chainStatus.getEarliestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestAppHash).toString('hex')); + expect(chainStatus.getEarliestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.earliestBlockHeight)); + expect(chainStatus.getMaxPeerBlockHeight()) + .to.equal(BigInt(statusFixture.chain.maxPeerBlockHeight)); + expect(chainStatus.getCoreChainLockedHeight()) + .to.equal(statusFixture.chain.coreChainLockedHeight); + + expect(networkStatus).to.be.an.instanceOf(NetworkStatus); + expect(networkStatus.getChainId()).to.equal(statusFixture.network.chainId); + expect(networkStatus.getPeersCount()).to.equal(statusFixture.network.peersCount); + expect(networkStatus.isListening()).to.equal(statusFixture.network.listening); + + expect(stateSyncStatus).to.be.an.instanceOf(StateSyncStatus); + expect(stateSyncStatus.getTotalSyncedTime()) + .to.equal(BigInt(statusFixture.stateSync.totalSyncedTime)); + expect(stateSyncStatus.getRemainingTime()) + .to.equal(BigInt(statusFixture.stateSync.remainingTime)); + expect(stateSyncStatus.getTotalSnapshots()) + .to.equal(statusFixture.stateSync.totalSnapshots); + expect(stateSyncStatus.getChunkProcessAverageTime()) + .to.equal(BigInt(statusFixture.stateSync.chunkProcessAverageTime)); + expect(stateSyncStatus.getSnapshotHeight()) + .to.equal(BigInt(statusFixture.stateSync.snapshotHeight)); + expect(stateSyncStatus.getSnapshotChunkCount()) + .to.equal(BigInt(statusFixture.stateSync.snapshotChunksCount)); + expect(stateSyncStatus.getBackfilledBlocks()) + .to.equal(BigInt(statusFixture.stateSync.backfilledBlocks)); + expect(stateSyncStatus.getBackfilledBlockTotal()) + .to.equal(BigInt(statusFixture.stateSync.backfillBlocksTotal)); + + expect(timeStatus).to.be.an.instanceOf(TimeStatus); + expect(timeStatus.getLocalTime()).to.equal(BigInt(statusFixture.time.local)); + expect(timeStatus.getBlockTime()).to.equal(BigInt(statusFixture.time.block)); + expect(timeStatus.getGenesisTime()).to.equal(BigInt(statusFixture.time.genesis)); + expect(timeStatus.getEpochNumber()).to.equal(statusFixture.time.epoch); + }); + + it('should create an instance from proto', () => { + getStatusResponse = GetStatusResponseClass.createFromProto(proto); + + const versionStatus = getStatusResponse.getVersionStatus(); + const nodeStatus = getStatusResponse.getNodeStatus(); + const chainStatus = getStatusResponse.getChainStatus(); + const networkStatus = getStatusResponse.getNetworkStatus(); + const stateSyncStatus = getStatusResponse.getStateSyncStatus(); + const timeStatus = getStatusResponse.getTimeStatus(); + + expect(versionStatus).to.be.an.instanceOf(VersionStatus); + expect(versionStatus.getDriveVersion()) + .to.equal(statusFixture.version.software.drive); + expect(versionStatus.getTenderdashVersion()) + .to.equal(statusFixture.version.software.tenderdash); + expect(versionStatus.getTenderdashP2pProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.p2p); + expect(versionStatus.getTenderdashBlockProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.block); + expect(versionStatus.getDriveCurrentProtocol()) + .to.equal(statusFixture.version.protocol.drive.current); + expect(versionStatus.getDriveLatestProtocol()) + .to.equal(statusFixture.version.protocol.drive.latest); + + expect(nodeStatus).to.be.an.instanceOf(NodeStatus); + expect(nodeStatus.getNodeId()).to.equal(Buffer.from(statusFixture.node.id).toString('hex')); + expect(nodeStatus.getProTxHash()).to.equal(Buffer.from(statusFixture.node.proTxHash).toString('hex')); + + expect(chainStatus).to.be.an.instanceOf(ChainStatus); + expect(chainStatus.isCatchingUp()) + .to.equal(statusFixture.chain.catchingUp); + expect(chainStatus.getLatestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.latestBlockHash).toString('hex')); + expect(chainStatus.getLatestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.latestAppHash).toString('hex')); + expect(chainStatus.getLatestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.latestBlockHeight)); + expect(chainStatus.getEarliestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestBlockHash).toString('hex')); + expect(chainStatus.getEarliestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestAppHash).toString('hex')); + expect(chainStatus.getEarliestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.earliestBlockHeight)); + expect(chainStatus.getMaxPeerBlockHeight()) + .to.equal(BigInt(statusFixture.chain.maxPeerBlockHeight)); + expect(chainStatus.getCoreChainLockedHeight()) + .to.equal(statusFixture.chain.coreChainLockedHeight); + + expect(networkStatus).to.be.an.instanceOf(NetworkStatus); + expect(networkStatus.getChainId()).to.equal(statusFixture.network.chainId); + expect(networkStatus.getPeersCount()).to.equal(statusFixture.network.peersCount); + expect(networkStatus.isListening()).to.equal(statusFixture.network.listening); + + expect(stateSyncStatus).to.be.an.instanceOf(StateSyncStatus); + expect(stateSyncStatus.getTotalSyncedTime()) + .to.equal(BigInt(statusFixture.stateSync.totalSyncedTime)); + expect(stateSyncStatus.getRemainingTime()) + .to.equal(BigInt(statusFixture.stateSync.remainingTime)); + expect(stateSyncStatus.getTotalSnapshots()) + .to.equal(statusFixture.stateSync.totalSnapshots); + expect(stateSyncStatus.getChunkProcessAverageTime()) + .to.equal(BigInt(statusFixture.stateSync.chunkProcessAverageTime)); + expect(stateSyncStatus.getSnapshotHeight()) + .to.equal(BigInt(statusFixture.stateSync.snapshotHeight)); + expect(stateSyncStatus.getSnapshotChunkCount()) + .to.equal(BigInt(statusFixture.stateSync.snapshotChunksCount)); + expect(stateSyncStatus.getBackfilledBlocks()) + .to.equal(BigInt(statusFixture.stateSync.backfilledBlocks)); + expect(stateSyncStatus.getBackfilledBlockTotal()) + .to.equal(BigInt(statusFixture.stateSync.backfillBlocksTotal)); + + expect(timeStatus).to.be.an.instanceOf(TimeStatus); + expect(timeStatus.getLocalTime()).to.equal(BigInt(statusFixture.time.local)); + expect(timeStatus.getBlockTime()).to.equal(BigInt(statusFixture.time.block)); + expect(timeStatus.getGenesisTime()).to.equal(BigInt(statusFixture.time.genesis)); + expect(timeStatus.getEpochNumber()).to.equal(statusFixture.time.epoch); + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/getStatus/getStatusFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/getStatus/getStatusFactory.spec.js new file mode 100644 index 00000000000..365ad6a0abc --- /dev/null +++ b/packages/js-dapi-client/test/unit/methods/platform/getStatus/getStatusFactory.spec.js @@ -0,0 +1,279 @@ +const { + v0: { + PlatformPromiseClient, + GetStatusRequest, + GetStatusResponse, + }, +} = require('@dashevo/dapi-grpc'); + +const getStatusFixture = require('../../../../../lib/test/fixtures/getStatusFixture'); +const getStatusFactory = require('../../../../../lib/methods/platform/getStatus/getStatusFactory'); +const VersionStatus = require('../../../../../lib/methods/platform/getStatus/VersionStatus'); +const NodeStatus = require('../../../../../lib/methods/platform/getStatus/NodeStatus'); +const ChainStatus = require('../../../../../lib/methods/platform/getStatus/ChainStatus'); +const NetworkStatus = require('../../../../../lib/methods/platform/getStatus/NetworkStatus'); +const StateSyncStatus = require('../../../../../lib/methods/platform/getStatus/StateSyncStatus'); +const TimeStatus = require('../../../../../lib/methods/platform/getStatus/TimeStatus'); + +describe('getStatusFactory', () => { + let grpcTransportMock; + let getStatus; + let statusFixture; + let response; + let options; + + beforeEach(async function beforeEach() { + statusFixture = getStatusFixture(); + + const { GetStatusResponseV0 } = GetStatusResponse; + response = new GetStatusResponse(); + + response.setV0( + new GetStatusResponseV0() + .setVersion(new GetStatusResponseV0.Version() + .setSoftware( + new GetStatusResponse.GetStatusResponseV0.Version.Software() + .setDapi(statusFixture.version.software.dapi) + .setDrive(statusFixture.version.software.drive) + .setTenderdash(statusFixture.version.software.tenderdash), + ) + .setProtocol( + new GetStatusResponse.GetStatusResponseV0.Version.Protocol() + .setDrive(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Drive() + .setLatest(statusFixture.version.protocol.drive.latest) + .setCurrent(statusFixture.version.protocol.drive.current)) + .setTenderdash(new GetStatusResponse.GetStatusResponseV0 + .Version.Protocol.Tenderdash() + .setP2p(statusFixture.version.protocol.tenderdash.p2p) + .setBlock(statusFixture.version.protocol.tenderdash.block)), + )) + .setNode(new GetStatusResponse.GetStatusResponseV0.Node() + .setId(statusFixture.node.id) + .setProTxHash(statusFixture.node.proTxHash)) + .setChain(new GetStatusResponse.GetStatusResponseV0.Chain() + .setCatchingUp(statusFixture.chain.catchingUp) + .setLatestBlockHash(statusFixture.chain.latestBlockHash) + .setLatestAppHash(statusFixture.chain.latestAppHash) + .setLatestBlockHeight(statusFixture.chain.latestBlockHeight) + .setEarliestBlockHash(statusFixture.chain.earliestBlockHash) + .setEarliestAppHash(statusFixture.chain.earliestAppHash) + .setEarliestBlockHeight(statusFixture.chain.earliestBlockHeight) + .setMaxPeerBlockHeight(statusFixture.chain.maxPeerBlockHeight) + .setCoreChainLockedHeight(statusFixture.chain.coreChainLockedHeight)) + .setNetwork(new GetStatusResponse.GetStatusResponseV0.Network() + .setChainId(statusFixture.network.chainId) + .setPeersCount(statusFixture.network.peersCount) + .setListening(statusFixture.network.listening)) + .setStateSync(new GetStatusResponse.GetStatusResponseV0.StateSync() + .setTotalSyncedTime(statusFixture.stateSync.totalSyncedTime) + .setRemainingTime(statusFixture.stateSync.remainingTime) + .setTotalSnapshots(statusFixture.stateSync.totalSnapshots) + .setChunkProcessAvgTime(statusFixture.stateSync.chunkProcessAverageTime) + .setSnapshotHeight(statusFixture.stateSync.snapshotHeight) + .setSnapshotChunksCount(statusFixture.stateSync.snapshotChunksCount) + .setBackfilledBlocks(statusFixture.stateSync.backfilledBlocks) + .setBackfillBlocksTotal(statusFixture.stateSync.backfillBlocksTotal)) + .setTime(new GetStatusResponse.GetStatusResponseV0.Time() + .setLocal(statusFixture.time.local) + .setBlock(statusFixture.time.block) + .setGenesis(statusFixture.time.genesis) + .setEpoch(statusFixture.time.epoch)), + ); + + grpcTransportMock = { + request: this.sinon.stub().resolves(response), + }; + + getStatus = getStatusFactory(grpcTransportMock); + options = { + timeout: 1000, + }; + }); + + it('should return status from grpc', async () => { + const result = await getStatus(options); + + const { GetStatusRequestV0 } = GetStatusRequest; + const request = new GetStatusRequest(); + request.setV0( + new GetStatusRequestV0(), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getStatus', + request, + options, + ); + const versionStatus = result.getVersionStatus(); + const nodeStatus = result.getNodeStatus(); + const chainStatus = result.getChainStatus(); + const networkStatus = result.getNetworkStatus(); + const stateSyncStatus = result.getStateSyncStatus(); + const timeStatus = result.getTimeStatus(); + + expect(versionStatus).to.be.an.instanceOf(VersionStatus); + expect(versionStatus.getDriveVersion()) + .to.equal(statusFixture.version.software.drive); + expect(versionStatus.getTenderdashVersion()) + .to.equal(statusFixture.version.software.tenderdash); + expect(versionStatus.getTenderdashP2pProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.p2p); + expect(versionStatus.getTenderdashBlockProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.block); + expect(versionStatus.getDriveCurrentProtocol()) + .to.equal(statusFixture.version.protocol.drive.current); + expect(versionStatus.getDriveLatestProtocol()) + .to.equal(statusFixture.version.protocol.drive.latest); + + expect(nodeStatus).to.be.an.instanceOf(NodeStatus); + expect(nodeStatus.getNodeId()).to.equal(Buffer.from(statusFixture.node.id).toString('hex')); + expect(nodeStatus.getProTxHash()).to.equal(Buffer.from(statusFixture.node.proTxHash).toString('hex')); + + expect(chainStatus).to.be.an.instanceOf(ChainStatus); + expect(chainStatus.isCatchingUp()) + .to.equal(statusFixture.chain.catchingUp); + expect(chainStatus.getLatestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.latestBlockHash).toString('hex')); + expect(chainStatus.getLatestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.latestAppHash).toString('hex')); + expect(chainStatus.getLatestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.latestBlockHeight)); + expect(chainStatus.getEarliestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestBlockHash).toString('hex')); + expect(chainStatus.getEarliestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestAppHash).toString('hex')); + expect(chainStatus.getEarliestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.earliestBlockHeight)); + expect(chainStatus.getMaxPeerBlockHeight()) + .to.equal(BigInt(statusFixture.chain.maxPeerBlockHeight)); + expect(chainStatus.getCoreChainLockedHeight()) + .to.equal(statusFixture.chain.coreChainLockedHeight); + + expect(networkStatus).to.be.an.instanceOf(NetworkStatus); + expect(networkStatus.getChainId()).to.equal(statusFixture.network.chainId); + expect(networkStatus.getPeersCount()).to.equal(statusFixture.network.peersCount); + expect(networkStatus.isListening()).to.equal(statusFixture.network.listening); + + expect(stateSyncStatus).to.be.an.instanceOf(StateSyncStatus); + expect(stateSyncStatus.getTotalSyncedTime()) + .to.equal(BigInt(statusFixture.stateSync.totalSyncedTime)); + expect(stateSyncStatus.getRemainingTime()) + .to.equal(BigInt(statusFixture.stateSync.remainingTime)); + expect(stateSyncStatus.getTotalSnapshots()) + .to.equal(statusFixture.stateSync.totalSnapshots); + expect(stateSyncStatus.getChunkProcessAverageTime()) + .to.equal(BigInt(statusFixture.stateSync.chunkProcessAverageTime)); + expect(stateSyncStatus.getSnapshotHeight()) + .to.equal(BigInt(statusFixture.stateSync.snapshotHeight)); + expect(stateSyncStatus.getSnapshotChunkCount()) + .to.equal(BigInt(statusFixture.stateSync.snapshotChunksCount)); + expect(stateSyncStatus.getBackfilledBlocks()) + .to.equal(BigInt(statusFixture.stateSync.backfilledBlocks)); + expect(stateSyncStatus.getBackfilledBlockTotal()) + .to.equal(BigInt(statusFixture.stateSync.backfillBlocksTotal)); + + expect(timeStatus).to.be.an.instanceOf(TimeStatus); + expect(timeStatus.getLocalTime()).to.equal(BigInt(statusFixture.time.local)); + expect(timeStatus.getBlockTime()).to.equal(BigInt(statusFixture.time.block)); + expect(timeStatus.getGenesisTime()).to.equal(BigInt(statusFixture.time.genesis)); + expect(timeStatus.getEpochNumber()).to.equal(statusFixture.time.epoch); + }); + + it('should return when some fields are optional', async () => { + response.getV0().getChain().clearCoreChainLockedHeight(); + response.getV0().getNode().clearProTxHash(); + response.getV0().getTime().clearEpoch(); + response.getV0().getVersion().getSoftware().clearDrive(); + response.getV0().getVersion().getSoftware().clearTenderdash(); + + const result = await getStatus(options); + + const { GetStatusRequestV0 } = GetStatusRequest; + const request = new GetStatusRequest(); + request.setV0( + new GetStatusRequestV0(), + ); + + expect(grpcTransportMock.request).to.be.calledOnceWithExactly( + PlatformPromiseClient, + 'getStatus', + request, + options, + ); + const versionStatus = result.getVersionStatus(); + const nodeStatus = result.getNodeStatus(); + const chainStatus = result.getChainStatus(); + const networkStatus = result.getNetworkStatus(); + const stateSyncStatus = result.getStateSyncStatus(); + const timeStatus = result.getTimeStatus(); + + expect(versionStatus).to.be.an.instanceOf(VersionStatus); + expect(versionStatus.getDriveVersion()) + .to.be.null(); + expect(versionStatus.getTenderdashVersion()) + .to.be.null(); + expect(versionStatus.getTenderdashP2pProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.p2p); + expect(versionStatus.getTenderdashBlockProtocol()) + .to.equal(statusFixture.version.protocol.tenderdash.block); + expect(versionStatus.getDriveCurrentProtocol()) + .to.equal(statusFixture.version.protocol.drive.current); + expect(versionStatus.getDriveLatestProtocol()) + .to.equal(statusFixture.version.protocol.drive.latest); + + expect(nodeStatus).to.be.an.instanceOf(NodeStatus); + expect(nodeStatus.getNodeId()).to.equal(Buffer.from(statusFixture.node.id).toString('hex')); + expect(nodeStatus.getProTxHash()).to.be.null(); + + expect(chainStatus).to.be.an.instanceOf(ChainStatus); + expect(chainStatus.isCatchingUp()) + .to.equal(statusFixture.chain.catchingUp); + expect(chainStatus.getLatestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.latestBlockHash).toString('hex')); + expect(chainStatus.getLatestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.latestAppHash).toString('hex')); + expect(chainStatus.getLatestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.latestBlockHeight)); + expect(chainStatus.getEarliestBlockHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestBlockHash).toString('hex')); + expect(chainStatus.getEarliestAppHash()) + .to.equal(Buffer.from(statusFixture.chain.earliestAppHash).toString('hex')); + expect(chainStatus.getEarliestBlockHeight()) + .to.equal(BigInt(statusFixture.chain.earliestBlockHeight)); + expect(chainStatus.getMaxPeerBlockHeight()) + .to.equal(BigInt(statusFixture.chain.maxPeerBlockHeight)); + expect(chainStatus.getCoreChainLockedHeight()) + .be.null(); + + expect(networkStatus).to.be.an.instanceOf(NetworkStatus); + expect(networkStatus.getChainId()).to.equal(statusFixture.network.chainId); + expect(networkStatus.getPeersCount()).to.equal(statusFixture.network.peersCount); + expect(networkStatus.isListening()).to.equal(statusFixture.network.listening); + + expect(stateSyncStatus).to.be.an.instanceOf(StateSyncStatus); + expect(stateSyncStatus.getTotalSyncedTime()) + .to.equal(BigInt(statusFixture.stateSync.totalSyncedTime)); + expect(stateSyncStatus.getRemainingTime()) + .to.equal(BigInt(statusFixture.stateSync.remainingTime)); + expect(stateSyncStatus.getTotalSnapshots()) + .to.equal(statusFixture.stateSync.totalSnapshots); + expect(stateSyncStatus.getChunkProcessAverageTime()) + .to.equal(BigInt(statusFixture.stateSync.chunkProcessAverageTime)); + expect(stateSyncStatus.getSnapshotHeight()) + .to.equal(BigInt(statusFixture.stateSync.snapshotHeight)); + expect(stateSyncStatus.getSnapshotChunkCount()) + .to.equal(BigInt(statusFixture.stateSync.snapshotChunksCount)); + expect(stateSyncStatus.getBackfilledBlocks()) + .to.equal(BigInt(statusFixture.stateSync.backfilledBlocks)); + expect(stateSyncStatus.getBackfilledBlockTotal()) + .to.equal(BigInt(statusFixture.stateSync.backfillBlocksTotal)); + + expect(timeStatus).to.be.an.instanceOf(TimeStatus); + expect(timeStatus.getLocalTime()).to.equal(BigInt(statusFixture.time.local)); + expect(timeStatus.getBlockTime()).to.equal(BigInt(statusFixture.time.block)); + expect(timeStatus.getGenesisTime()).to.equal(BigInt(statusFixture.time.genesis)); + expect(timeStatus.getEpochNumber()).to.be.null(); + }); +}); diff --git a/packages/js-dapi-client/test/unit/methods/platform/waitForStateTransitionResult/waitForStateTransitionResultFactory.spec.js b/packages/js-dapi-client/test/unit/methods/platform/waitForStateTransitionResult/waitForStateTransitionResultFactory.spec.js index 3f58dfbd7bf..3f7d22932f7 100644 --- a/packages/js-dapi-client/test/unit/methods/platform/waitForStateTransitionResult/waitForStateTransitionResultFactory.spec.js +++ b/packages/js-dapi-client/test/unit/methods/platform/waitForStateTransitionResult/waitForStateTransitionResultFactory.spec.js @@ -55,7 +55,15 @@ describe('waitForStateTransitionResultFactory', () => { const result = await waitForStateTransitionResult(hash, options); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getError()).to.equal(undefined); expect(result.getProof()).to.equal(undefined); @@ -89,7 +97,15 @@ describe('waitForStateTransitionResultFactory', () => { const result = await waitForStateTransitionResult(hash, options); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getError()).to.equal(undefined); expect(result.getProof()).to.be.deep.equal({ merkleProof: Buffer.from('merkleProof'), @@ -119,10 +135,12 @@ describe('waitForStateTransitionResultFactory', () => { }); it('should return response with error', async () => { + const data = cbor.encode({ data: 'error data' }); + const error = new StateTransitionBroadcastError(); error.setCode(2); error.setMessage('Some error'); - error.setData(cbor.encode({ data: 'error data' })); + error.setData(data); response.getV0().setError(error); @@ -130,12 +148,20 @@ describe('waitForStateTransitionResultFactory', () => { const result = await waitForStateTransitionResult(hash, options); - expect(result.getMetadata()).to.deep.equal(metadataFixture); + expect(result.getMetadata().getHeight()) + .to.deep.equal(BigInt(metadataFixture.height)); + expect(result.getMetadata().getCoreChainLockedHeight()) + .to.deep.equal(metadataFixture.coreChainLockedHeight); + expect(result.getMetadata().getTimeMs()) + .to.deep.equal(BigInt(metadataFixture.timeMs)); + expect(result.getMetadata().getProtocolVersion()) + .to.deep.equal(metadataFixture.protocolVersion); + expect(result.getProof()).to.equal(undefined); expect(result.getError()).to.be.deep.equal({ code: 2, message: 'Some error', - data: { data: 'error data' }, + data: Buffer.from(data), }); const { WaitForStateTransitionResultRequestV0 } = WaitForStateTransitionResultRequest; diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 8299d397ec9..cc9e3032b4e 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "4.6.2", + "version": "4.8.0", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", @@ -16,7 +16,7 @@ "test": "yarn run test:types && yarn run test:unit && yarn run test:browsers", "test:browsers": "karma start ./karma/karma.conf.js --single-run", "test:browsers:functional": "LOAD_ENV=true karma start ./karma/karma.functional.conf.js --single-run", - "test:unit": "ts-mocha -p tsconfig.mocha.json src/**/*.spec.ts", + "test:unit": "tsc -p tsconfig.mocha.json && mocha build/**/*.spec.js", "test:functional": "yarn run build:ts && LOAD_ENV=true mocha --recursive tests/functional/**/*.js", "test:types": "yarn pnpify tsd", "prepublishOnly": "yarn run build", @@ -85,7 +85,7 @@ "karma-mocha": "^2.0.1", "karma-mocha-reporter": "^2.2.5", "karma-webpack": "^5.0.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "net": "^1.0.2", "nodemon": "^2.0.20", "os-browserify": "^0.3.0", @@ -97,10 +97,9 @@ "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.11", "tls": "^0.0.1", "ts-loader": "^9.5.0", - "ts-mocha": "^10.0.0", "ts-mock-imports": "^1.3.0", "ts-node": "^10.4.0", "tsd": "^0.28.1", diff --git a/packages/js-dash-sdk/src/SDK/Client/Client.ts b/packages/js-dash-sdk/src/SDK/Client/Client.ts index ee641901dfe..b3f4df7ae54 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Client.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Client.ts @@ -163,13 +163,11 @@ export class Client extends EventEmitter { throw new Error('Wallet is not initialized, pass `wallet` option to Client'); } - options = { + return this.wallet.getAccount({ index: this.defaultAccountIndex, synchronize: true, ...options, - }; - - return this.wallet.getAccount(options); + }); } /** diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/Fetcher.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/Fetcher.ts index 160a060c569..47817e81169 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/Fetcher.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/Fetcher/Fetcher.ts @@ -128,19 +128,19 @@ class Fetcher { /** * Fetches data contract by it's ID - * @param id - * @param startAMs - * @param limit - * @param offset + * @param id {Identifier} + * @param startAMs {bigint} + * @param limit {number} + * @param offset {number} */ public async fetchDataContractHistory( id: Identifier, - startAMs: number, + startAMs: bigint, limit: number, offset: number, ): Promise<GetDataContractHistoryResponse> { // Define query - const query = async (): Promise<GetDataContractHistoryResponse> => await this + const query = async (): Promise<GetDataContractHistoryResponse> => this .dapiClient.platform.getDataContractHistory(id, startAMs, limit, offset); // Define retry attempts. diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts index 2b679814453..08e562082b4 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/IStateTransitionResult.ts @@ -7,6 +7,6 @@ export interface IStateTransitionResult { error?: { code: number, message: string, - data: any, + data?: Buffer, } } diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts index 018150fd933..9b3eed06618 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.spec.ts @@ -21,77 +21,83 @@ describe('Dash - NonceManager', () => { describe('Identity nonce', () => { it('should set and get identity nonce', async () => { - nonceManager.setIdentityNonce(identityId, 1); - expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + nonceManager.setIdentityNonce(identityId, BigInt(1)); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(BigInt(1)); expect(dapiClientMock.platform.getIdentityNonce).to.not.be.called(); }); it('should fetch identity nonce if it is not present', async () => { - dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); - expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: BigInt(1) }); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(BigInt(1)); expect(dapiClientMock.platform.getIdentityNonce).to.be.calledOnce(); }); it('should invalidate and re-fetch nonce after interval passed', async function it() { const clock = this.sinon.useFakeTimers(); - dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); - expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(1); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: BigInt(1) }); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(BigInt(1)); clock.tick(NONCE_FETCH_INTERVAL + 1); - dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 2 }); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: BigInt(2) }); await nonceManager.getIdentityNonce(identityId); - expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(2); + expect(await nonceManager.getIdentityNonce(identityId)).to.be.equal(BigInt(2)); clock.restore(); }); it('should bump identity nonce', async () => { - dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: 1 }); + dapiClientMock.platform.getIdentityNonce.resolves({ identityNonce: BigInt(1) }); const prevNonce = await nonceManager.getIdentityNonce(identityId); const nextNonce = await nonceManager.bumpIdentityNonce(identityId); const currentNonce = await nonceManager.getIdentityNonce(identityId); expect(nextNonce) .to.equal(currentNonce) - .to.equal(prevNonce + 1); + // @ts-ignore + .to.equal(prevNonce + BigInt(1)); }); }); describe('Identity contract nonce', () => { it('should set and get identity contract nonce', async () => { - nonceManager.setIdentityContractNonce(identityId, contractId, 1); + nonceManager.setIdentityContractNonce(identityId, contractId, BigInt(1)); expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) - .to.be.equal(1); + .to.be.equal(BigInt(1)); expect(dapiClientMock.platform.getIdentityContractNonce).to.not.be.called(); }); it('should fetch identity contract nonce if it is not present', async () => { - dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + dapiClientMock.platform.getIdentityContractNonce + .resolves({ identityContractNonce: BigInt(1) }); expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) - .to.be.equal(1); + .to.be.equal(BigInt(1)); expect(dapiClientMock.platform.getIdentityContractNonce).to.be.calledOnce(); }); it('should invalidate and re-fetch nonce after interval passed', async function it() { const clock = this.sinon.useFakeTimers(); - dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + dapiClientMock.platform.getIdentityContractNonce + .resolves({ identityContractNonce: BigInt(1) }); expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) - .to.be.equal(1); + .to.be.equal(BigInt(1)); clock.tick(NONCE_FETCH_INTERVAL + 1); - dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 2 }); + dapiClientMock.platform.getIdentityContractNonce + .resolves({ identityContractNonce: BigInt(2) }); await nonceManager.getIdentityContractNonce(identityId, contractId); expect(await nonceManager.getIdentityContractNonce(identityId, contractId)) - .to.be.equal(2); + .to.be.equal(BigInt(2)); clock.restore(); }); it('should bump identity contract nonce', async () => { - dapiClientMock.platform.getIdentityContractNonce.resolves({ identityContractNonce: 1 }); + dapiClientMock.platform.getIdentityContractNonce + .resolves({ identityContractNonce: BigInt(1) }); const prevNonce = await nonceManager.getIdentityContractNonce(identityId, contractId); const nextNonce = await nonceManager.bumpIdentityContractNonce(identityId, contractId); const currentNonce = await nonceManager.getIdentityContractNonce(identityId, contractId); expect(nextNonce) .to.equal(currentNonce) - .to.equal(prevNonce + 1); + // @ts-ignore + .to.equal(prevNonce + BigInt(1)); }); }); }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts index 8c4cc38268c..3b522566c70 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/NonceManager/NonceManager.ts @@ -2,7 +2,7 @@ import DAPIClient from '@dashevo/dapi-client'; import { Identifier } from '@dashevo/wasm-dpp'; type NonceState = { - value: number, + value: bigint, lastFetchedAt: number, }; @@ -23,7 +23,7 @@ class NonceManager { this.identityContractNonce = new Map(); } - public setIdentityNonce(identityId: Identifier, nonce: number) { + public setIdentityNonce(identityId: Identifier, nonce: bigint) { const identityIdStr = identityId.toString(); const nonceState = this.identityNonce.get(identityIdStr); @@ -37,7 +37,7 @@ class NonceManager { } } - public async getIdentityNonce(identityId: Identifier): Promise<number> { + public async getIdentityNonce(identityId: Identifier): Promise<bigint> { const identityIdStr = identityId.toString(); let nonceState = this.identityNonce.get(identityIdStr); @@ -71,13 +71,16 @@ class NonceManager { return nonceState.value; } - public async bumpIdentityNonce(identityId: Identifier): Promise<number> { - const nextIdentityNonce = await this.getIdentityNonce(identityId) + 1; + public async bumpIdentityNonce(identityId: Identifier): Promise<bigint> { + const identityNonce = await this.getIdentityNonce(identityId); + const nextIdentityNonce = identityNonce + BigInt(1); + this.setIdentityNonce(identityId, nextIdentityNonce); + return nextIdentityNonce; } - public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: number) { + public setIdentityContractNonce(identityId: Identifier, contractId: Identifier, nonce: bigint) { const identityIdStr = identityId.toString(); const contractIdStr = contractId.toString(); @@ -103,7 +106,7 @@ class NonceManager { public async getIdentityContractNonce( identityId: Identifier, contractId: Identifier, - ): Promise<number> { + ): Promise<bigint> { const identityIdStr = identityId.toString(); const contractIdStr = contractId.toString(); @@ -151,9 +154,10 @@ class NonceManager { public async bumpIdentityContractNonce( identityId: Identifier, contractId: Identifier, - ): Promise<number> { - const nextIdentityContractNonce = await this - .getIdentityContractNonce(identityId, contractId) + 1; + ): Promise<bigint> { + const identityContractNonce = await this.getIdentityContractNonce(identityId, contractId); + // @ts-ignore + const nextIdentityContractNonce = identityContractNonce + BigInt(1); this.setIdentityContractNonce(identityId, contractId, nextIdentityContractNonce); return nextIdentityContractNonce; } diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts index a12b67872f4..2dce38a116e 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/broadcastStateTransition.ts @@ -89,7 +89,11 @@ export default async function broadcastStateTransition( // instead of passing it as GrpcError constructor argument // Otherwise it will be converted to grpc-js metadata // Which is not compatible with web - grpcError.metadata = error.data; + if (error.data) { + grpcError.metadata = { + 'dash-serialized-consensus-error-bin': error.data.toString('base64'), + }; + } let cause = await createGrpcTransportError(grpcError); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.spec.ts index baa4cea84ea..7ec6019cb7b 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.spec.ts @@ -81,9 +81,9 @@ describe('Client - Platform - Contracts - .get()', () => { apps, dpp, client, initialize, logger, fetcher, }, dataContractFixture.getId()); expect(contract.toJSON()).to.deep.equal(dataContractFixture.toJSON()); - expect(contract.getMetadata().getBlockHeight()).to.equal(10); + expect(contract.getMetadata().getBlockHeight()).to.equal(BigInt(10)); expect(contract.getMetadata().getCoreChainLockedHeight()).to.equal(42); - expect(contract.getMetadata().getTimeMs()).to.equal(metadataFixture.getTimeMs()); + expect(contract.getMetadata().getTimeMs()).to.equal(BigInt(metadataFixture.getTimeMs())); expect(contract.getMetadata().getProtocolVersion()) .to.equal(metadataFixture.getProtocolVersion()); expect(askedFromDapi).to.equal(1); @@ -95,9 +95,9 @@ describe('Client - Platform - Contracts - .get()', () => { apps, dpp, client, initialize, logger, fetcher, }, dataContractFixture.getId()); expect(contract.toJSON()).to.deep.equal(dataContractFixture.toJSON()); - expect(contract.getMetadata().getBlockHeight()).to.equal(10); + expect(contract.getMetadata().getBlockHeight()).to.equal(BigInt(10)); expect(contract.getMetadata().getCoreChainLockedHeight()).to.equal(42); - expect(contract.getMetadata().getTimeMs()).to.equal(metadataFixture.getTimeMs()); + expect(contract.getMetadata().getTimeMs()).to.equal(BigInt(metadataFixture.getTimeMs())); expect(contract.getMetadata().getProtocolVersion()) .to.equal(metadataFixture.getProtocolVersion()); expect(askedFromDapi).to.equal(1); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.ts index 651718523cc..6238b982181 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/get.ts @@ -47,12 +47,12 @@ export async function get(this: Platform, identifier: ContractIdentifier): Promi let metadata; const responseMetadata = dataContractResponse.getMetadata(); if (responseMetadata) { - metadata = new Metadata({ - blockHeight: responseMetadata.getHeight(), - coreChainLockedHeight: responseMetadata.getCoreChainLockedHeight(), - timeMs: responseMetadata.getTimeMs(), - protocolVersion: responseMetadata.getProtocolVersion(), - }); + metadata = new Metadata( + responseMetadata.getHeight(), + responseMetadata.getCoreChainLockedHeight(), + responseMetadata.getTimeMs(), + responseMetadata.getProtocolVersion(), + ); } contract.setMetadata(metadata); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.spec.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.spec.ts index acf9ae68670..ca874e34ba3 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.spec.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.spec.ts @@ -10,6 +10,7 @@ import identitiesFixtures from '../../../../../../tests/fixtures/identities.json import 'mocha'; import { ClientApps } from '../../../ClientApps'; +const DataContractHistoryEntry = require('@dashevo/dapi-client/lib/methods/platform/getDataContractHistory/DataContractHistoryEntry'); const GetDataContractHistoryResponse = require('@dashevo/dapi-client/lib/methods/platform/getDataContractHistory/GetDataContractHistoryResponse'); const NotFoundError = require('@dashevo/dapi-client/lib/transport/GrpcTransport/errors/NotFoundError'); @@ -56,7 +57,7 @@ describe('Client - Platform - Contracts - .history()', () => { if (id.equals(fixtureIdentifier)) { return new GetDataContractHistoryResponse( - { 1000: dataContractFixture.toBuffer() }, + [new DataContractHistoryEntry(BigInt(1000), dataContractFixture.toBuffer())], metadataFixture, ); } diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.ts index 6faa7fab82f..55d2d9985ef 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/history.ts @@ -1,4 +1,3 @@ -// @ts-ignore import { DataContract, Identifier } from '@dashevo/wasm-dpp'; import { GetDataContractHistoryResponse, @@ -13,15 +12,15 @@ declare type ContractIdentifier = string | Identifier; * Get contracts from the platform * * @param {ContractIdentifier} identifier - identifier of the contract to fetch - * @param startAtMs - * @param limit - * @param offset + * @param {bigint} startAtMs + * @param {number} limit + * @param {number} offset * @returns contracts */ export async function history( this: Platform, identifier: ContractIdentifier, - startAtMs: number, + startAtMs: bigint, limit: number, offset: number, ): Promise<any> { @@ -43,13 +42,13 @@ export async function history( throw e; } - const rawContractHistory = dataContractHistoryResponse.getDataContractHistory(); + const dataContractHistory = dataContractHistoryResponse.getDataContractHistory(); const contractHistory: { [key: number]: DataContract } = {}; // eslint-disable-next-line no-restricted-syntax - for (const [date, contractBytes] of Object.entries(rawContractHistory)) { - contractHistory[date] = await this.dpp.dataContract - .createFromBuffer(contractBytes as Uint8Array); + for (const dataContractHistoryEntry of dataContractHistory) { + contractHistory[Number(dataContractHistoryEntry.getDate().toString())] = await this.dpp + .dataContract.createFromBuffer(dataContractHistoryEntry.getValue() as Uint8Array); } this.logger.debug(`[Contracts#history] Obtained Data Contract history for "${identifier}"`); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts index 7347d158b3c..7da552988ba 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/contracts/update.ts @@ -32,7 +32,7 @@ export default async function update( .bumpIdentityContractNonce(identityId, dataContractId); const dataContractUpdateTransition = dpp.dataContract - .createDataContractUpdateTransition(updatedDataContract, BigInt(identityContractNonce)); + .createDataContractUpdateTransition(updatedDataContract, identityContractNonce); this.logger.silly(`[DataContract#update] Created data contract update transition ${dataContract.getId()}`); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts index 4bbe6b6479d..4a6a7a06026 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/broadcast.ts @@ -47,7 +47,7 @@ export default async function broadcast( const documentsBatchTransition = dpp.document.createStateTransition(documents, { [identityId.toString()]: { - [dataContractId.toString()]: identityContractNonce, + [dataContractId.toString()]: identityContractNonce.toString(), }, }); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/get.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/get.ts index 7a8d4fcfd50..1b1f7d06635 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/get.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/documents/get.ts @@ -152,12 +152,12 @@ export async function get(this: Platform, typeLocator: string, opts: QueryOption let metadata; const responseMetadata = documentsResponse.getMetadata(); if (responseMetadata) { - metadata = new Metadata({ - blockHeight: responseMetadata.getHeight(), - coreChainLockedHeight: responseMetadata.getCoreChainLockedHeight(), - timeMs: responseMetadata.getTimeMs(), - protocolVersion: responseMetadata.getProtocolVersion(), - }); + metadata = new Metadata( + responseMetadata.getHeight(), + responseMetadata.getCoreChainLockedHeight(), + responseMetadata.getTimeMs(), + responseMetadata.getProtocolVersion(), + ); } document.setMetadata(metadata); diff --git a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/get.ts b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/get.ts index 7824f5f5bbd..8c572f79bac 100644 --- a/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/get.ts +++ b/packages/js-dash-sdk/src/SDK/Client/Platform/methods/identities/get.ts @@ -31,12 +31,12 @@ export async function get(this: Platform, id: Identifier | string): Promise<any> let metadata; const responseMetadata = identityResponse.getMetadata(); if (responseMetadata) { - metadata = new Metadata({ - blockHeight: responseMetadata.getHeight(), - coreChainLockedHeight: responseMetadata.getCoreChainLockedHeight(), - timeMs: responseMetadata.getTimeMs(), - protocolVersion: responseMetadata.getProtocolVersion(), - }); + metadata = new Metadata( + responseMetadata.getHeight(), + responseMetadata.getCoreChainLockedHeight(), + responseMetadata.getTimeMs(), + responseMetadata.getProtocolVersion(), + ); } identity.setMetadata(metadata); diff --git a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts index b59c77b43f0..85d46ada220 100644 --- a/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts +++ b/packages/js-dash-sdk/src/test/mocks/createAndAttachTransportMocksToClient.ts @@ -61,7 +61,7 @@ async function makeGetIdentityRespondWithIdentity(client, dapiClientMock) { ); identityToResolve.setBalance( - interceptedIdentityStateTransition.getAssetLockProof().getOutput().satoshis, + BigInt(interceptedIdentityStateTransition.getAssetLockProof().getOutput().satoshis), ); dapiClientMock.platform.getIdentity.withArgs(identityToResolve.getId()) diff --git a/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts b/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts index b0f73ee401b..dd75f959817 100644 --- a/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts +++ b/packages/js-dash-sdk/src/test/mocks/createDapiClientMock.ts @@ -7,8 +7,8 @@ export function createDapiClientMock(sinon: SinonSandbox) { getIdentity: sinon.stub(), waitForStateTransitionResult: sinon.stub().resolves({}), getDataContract: sinon.stub(), - getIdentityContractNonce: sinon.stub().resolves({ identityContractNonce: 1 }), - getIdentityNonce: sinon.stub().resolves({ identityNonce: 1 }), + getIdentityContractNonce: sinon.stub().resolves({ identityContractNonce: BigInt(1) }), + getIdentityNonce: sinon.stub().resolves({ identityNonce: BigInt(1) }), }, }; } diff --git a/packages/js-dash-sdk/tests/functional/sdk.js b/packages/js-dash-sdk/tests/functional/sdk.js index 5f24b7b7a34..c8e303223a5 100644 --- a/packages/js-dash-sdk/tests/functional/sdk.js +++ b/packages/js-dash-sdk/tests/functional/sdk.js @@ -33,7 +33,6 @@ describe('SDK', function suite() { }, }, }; - clientInstance = new Dash.Client(clientOpts); }); diff --git a/packages/js-dash-sdk/tsconfig.json b/packages/js-dash-sdk/tsconfig.json index 3478b30e4c4..6166a1cae01 100644 --- a/packages/js-dash-sdk/tsconfig.json +++ b/packages/js-dash-sdk/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2020", "module": "commonjs", "lib": ["es6", "dom"], "skipLibCheck": true, diff --git a/packages/js-dash-sdk/tsconfig.mocha.json b/packages/js-dash-sdk/tsconfig.mocha.json index b694444e482..9f9e701cdf5 100644 --- a/packages/js-dash-sdk/tsconfig.mocha.json +++ b/packages/js-dash-sdk/tsconfig.mocha.json @@ -2,9 +2,9 @@ "extends": "./tsconfig.json", "compilerOptions": { "target": "es6", + "skipLibCheck": true, + "esModuleInterop": true, + "outDir": "./build", }, - "include": [ - "src/**/*", - ], - "exclude": [] + "include": ["src/**/*.spec.ts", "src/test/**/*.ts"], } diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 67c099b2b01..4a32bb1d978 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "1.6.2", + "version": "1.8.0", "description": "Common GRPC library", "main": "index.js", "scripts": { @@ -19,7 +19,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "mocha-sinon": "^2.1.2", "nyc": "^15.1.0", "sinon": "^17.0.1", diff --git a/packages/masternode-reward-shares-contract/Cargo.toml b/packages/masternode-reward-shares-contract/Cargo.toml index db5adcf9e53..760b45e4c36 100644 --- a/packages/masternode-reward-shares-contract/Cargo.toml +++ b/packages/masternode-reward-shares-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "masternode-reward-shares-contract" description = "Masternode reward shares data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index a62fe88d385..16018f5ea47 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", @@ -37,7 +37,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js b/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js index 5acec950e51..8fdb9d0a8bd 100644 --- a/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js +++ b/packages/platform-test-suite/lib/test/fixtures/getDataContractFixture.js @@ -10,7 +10,7 @@ const { let randomOwnerId = null; /** - * @param {number} identityNonce + * @param {string|number|bigint} identityNonce * @param {Identifier} [ownerId] * @return {Promise<DataContract>} */ diff --git a/packages/platform-test-suite/lib/test/fixtures/getIdentityFixture.js b/packages/platform-test-suite/lib/test/fixtures/getIdentityFixture.js index 2460bdc3071..736507220ce 100644 --- a/packages/platform-test-suite/lib/test/fixtures/getIdentityFixture.js +++ b/packages/platform-test-suite/lib/test/fixtures/getIdentityFixture.js @@ -27,7 +27,7 @@ module.exports = async function getIdentityFixture() { const identity = new Identity(1); identity.setId(id); identity.setPublicKeys([key1, key2]); - identity.setBalance(10000); + identity.setBalance(BigInt(10000)); return identity; }; diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index a3d7067e2f8..52a8cd94d46 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "1.6.2", + "version": "1.8.0", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", @@ -56,7 +56,7 @@ "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^5.0.0", "localforage": "^1.10.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "net": "^1.0.2", "nodeforage": "^1.1.2", "os-browserify": "^0.3.0", diff --git a/packages/platform-test-suite/test/e2e/withdrawals.spec.js b/packages/platform-test-suite/test/e2e/withdrawals.spec.js index f2a80ee4339..b7afc0fb2c7 100644 --- a/packages/platform-test-suite/test/e2e/withdrawals.spec.js +++ b/packages/platform-test-suite/test/e2e/withdrawals.spec.js @@ -110,7 +110,7 @@ describe('Withdrawals', function withdrawalsTest() { // Should ensure balances are right expect(walletBalanceUpdated).to.be.greaterThan(walletBalanceBefore); - expect(identityBalanceUpdated).to.be.lessThan(identityBalanceBefore); + expect(identityBalanceUpdated < identityBalanceBefore).to.be.true(); // Should allow deleting of the withdrawal document await client.platform.documents.broadcast({ @@ -133,10 +133,10 @@ describe('Withdrawals', function withdrawalsTest() { ); let withdrawalBroadcasted = false; - let blocksPassed = 0; + let blocksPassed = BigInt(0); // Wait for first withdrawal to broadcast - while (!withdrawalBroadcasted && blocksPassed === 0) { + while (!withdrawalBroadcasted && blocksPassed === BigInt(0)) { await waitForSTPropagated(); const withdrawals = await client.platform @@ -172,7 +172,7 @@ describe('Withdrawals', function withdrawalsTest() { const account = await client.getWalletAccount(); const identityBalanceBefore = identity.getBalance(); const withdrawTo = await account.getUnusedAddress(); - const amountToWithdraw = identityBalanceBefore * 2; + const amountToWithdraw = identityBalanceBefore * BigInt(2); await expect(client.platform.identities.withdrawCredits( identity, @@ -187,7 +187,7 @@ describe('Withdrawals', function withdrawalsTest() { const account = await client.getWalletAccount(); const identityBalanceBefore = identity.getBalance(); const withdrawTo = await account.getUnusedAddress(); - const amountToWithdraw = identityBalanceBefore / 2; + const amountToWithdraw = identityBalanceBefore / BigInt(2); await expect(client.platform.identities.withdrawCredits( identity, diff --git a/packages/platform-test-suite/test/functional/platform/Document.spec.js b/packages/platform-test-suite/test/functional/platform/Document.spec.js index 55b5c03a489..85f9abf963a 100644 --- a/packages/platform-test-suite/test/functional/platform/Document.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Document.spec.js @@ -300,7 +300,7 @@ describe('Platform', () => { documentsBatchTransition.transitions[0].data.firstName = 'nameToProve'; documentsBatchTransition.transitions[0].updatedAt = new Date(); - documentsBatchTransition.transitions[0].revision += 1; + documentsBatchTransition.transitions[0].revision += BigInt(1); const signedTransition = await signStateTransition( client.platform, documentsBatchTransition, diff --git a/packages/platform-test-suite/test/functional/platform/Epoch.spec.js b/packages/platform-test-suite/test/functional/platform/Epoch.spec.js index 2720e5d2684..3d712b446d8 100644 --- a/packages/platform-test-suite/test/functional/platform/Epoch.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Epoch.spec.js @@ -24,7 +24,7 @@ describe('Platform', () => { const genesisEpoch = response.getEpochsInfo()[0]; expect(genesisEpoch.number).to.equal(0); - expect(genesisEpoch.firstBlockHeight).to.equal(1); + expect(genesisEpoch.firstBlockHeight).to.equal(BigInt(1)); }); }); }); diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 09dd8b8e01b..8f5e8994c40 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -229,7 +229,7 @@ describe('Platform', () => { expect(fetchedIdentityWithoutBalance).to.deep.equal(localIdentityWithoutBalance); - expect(fetchedIdentity.getBalance()).to.be.greaterThan(0); + expect(fetchedIdentity.getBalance() > 0).to.be.true(); }); it('should be able to get newly created identity by it\'s public key', async () => { @@ -317,7 +317,7 @@ describe('Platform', () => { expect(fetchedIdentityWithoutBalance).to.deep.equal(localIdentityWithoutBalance); - expect(fetchedIdentity.getBalance()).to.be.greaterThan(0); + expect(fetchedIdentity.getBalance() > 0).to.be.true(); }); }); @@ -419,7 +419,7 @@ describe('Platform', () => { ); const balanceBeforeTopUp = identityBeforeTopUp.getBalance(); const topUpAmount = 1000000; - const topUpCredits = topUpAmount * 1000; + const topUpCredits = BigInt(topUpAmount) * BigInt(1000); await client.platform.identities.topUp(identity.getId(), topUpAmount); @@ -430,10 +430,9 @@ describe('Platform', () => { identity.getId(), ); - expect(identityAfterTopUp.getBalance()).to.be.greaterThan(balanceBeforeTopUp); + expect(identityAfterTopUp.getBalance() > balanceBeforeTopUp).to.be.true(); - expect(identityAfterTopUp.getBalance()).to.be - .lessThan(balanceBeforeTopUp + topUpCredits); + expect(identityAfterTopUp.getBalance() < balanceBeforeTopUp + topUpCredits).to.be.true(); }); it('should be able to create more documents after the top-up', async () => { @@ -549,10 +548,12 @@ describe('Platform', () => { const recipientBalanceBefore = recipientBeforeTransfer.getBalance(); const recipientBalanceAfter = recipientAfterTransfer.getBalance(); - expect(recipientBalanceAfter).to.be.equal(recipientBalanceBefore + transferAmount); + expect(recipientBalanceAfter).to.be + .equal(recipientBalanceBefore + BigInt(transferAmount)); // TODO: implement the way to get the fee - expect(identityBalanceAfter).to.be.lessThan(identityBalanceBefore + transferAmount); + expect(identityBalanceAfter < identityBalanceBefore + BigInt(transferAmount)) + .to.be.true(); }); it('should not be able to transfer more credits then have', async () => { @@ -566,7 +567,7 @@ describe('Platform', () => { await client.platform.identities.creditTransfer( identity, recipient.getId(), - identity.getBalance() + 1, + identity.getBalance() + BigInt(1), ); } catch (e) { transferError = e; @@ -618,7 +619,7 @@ describe('Platform', () => { identity.getId(), ); - expect(identity.getRevision()).to.equal(identityBeforeUpdate.revision + 1); + expect(identity.getRevision()).to.equal(BigInt(identityBeforeUpdate.revision) + BigInt(1)); expect(identity.getPublicKeyById(2)).to.exist(); const newPublicKeyObject = newPublicKey.toObject(true); @@ -650,7 +651,7 @@ describe('Platform', () => { identity.getId(), ); - expect(identity.getRevision()).to.equal(identityBeforeUpdate.revision + 1); + expect(identity.getRevision()).to.equal(BigInt(identityBeforeUpdate.revision) + BigInt(1)); expect(identity.getPublicKeyById(2)).to.exist(); expect(identity.getPublicKeyById(2).getDisabledAt()).to.be.at.least(now); diff --git a/packages/platform-test-suite/test/functional/platform/getStatus.spec.js b/packages/platform-test-suite/test/functional/platform/getStatus.spec.js index ca066748900..5ca650fbf36 100644 --- a/packages/platform-test-suite/test/functional/platform/getStatus.spec.js +++ b/packages/platform-test-suite/test/functional/platform/getStatus.spec.js @@ -17,12 +17,9 @@ describe('Platform', () => { it('should return status', async () => { const status = await client.dapiClient.platform.getStatus(); - expect(status).to.be.a.property('version'); - expect(status.version).to.have.property('software'); - expect(status.version.software).to.have.an('object'); - expect(status.version.software.dapi).to.be.a('string').and.not.be.empty(); - expect(status.version.software.drive).to.be.a('string').and.not.be.empty(); - expect(status.version.software.tenderdash).to.be.a('string').and.not.be.empty(); + expect(status.getVersionStatus().getDapiVersion()).to.be.a('string').to.exist(); + expect(status.getVersionStatus().getDriveVersion()).to.be.a('string').and.not.be.empty(); + expect(status.getVersionStatus().getTenderdashVersion()).to.be.a('string').and.not.be.empty(); }); }); }); diff --git a/packages/rs-dapi-client/Cargo.toml b/packages/rs-dapi-client/Cargo.toml index 46fa84ab535..322aef1fc59 100644 --- a/packages/rs-dapi-client/Cargo.toml +++ b/packages/rs-dapi-client/Cargo.toml @@ -1,10 +1,12 @@ [package] name = "rs-dapi-client" -version = "1.6.2" +version = "1.8.0" edition = "2021" [features] -default = ["mocks", "offline-testing"] + +default = ["offline-testing"] + mocks = [ "dep:sha2", "dep:hex", @@ -18,16 +20,34 @@ dump = ["mocks"] # skip tests that require connection to the platform; enabled by default offline-testing = [] +# non-wasm dependencies +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +backon = { version = "1.3", default-features = false, features = [ + "tokio-sleep", +] } + +[target.'cfg(target_arch = "wasm32")'.dependencies] +gloo-timers = { version = "0.3.0", features = ["futures"] } +tonic-web-wasm-client = { version = "0.6.0" } +wasm-bindgen-futures = { version = "0.4.49" } +getrandom = { version = "0.2", features = ["js"] } + [dependencies] -backon = { version = "1.2", features = ["tokio-sleep"] } +backon = { version = "1.3", default-features = false } dapi-grpc = { path = "../dapi-grpc", features = [ "core", "platform", "client", ], default-features = false } -futures = "0.3.28" +futures = { version = "0.3.28" } +http = { version = "1.1.0", default-features = false } http-serde = { version = "2.1", optional = true } -rand = { version = "0.8.5", features = ["small_rng"] } + + +rand = { version = "0.8.5", features = [ + "small_rng", + "getrandom", +], default-features = false } thiserror = "1.0.64" tracing = "0.1.40" tokio = { version = "1.40", default-features = false } diff --git a/packages/rs-dapi-client/src/address_list.rs b/packages/rs-dapi-client/src/address_list.rs index 2f59b22c3bc..eeea7be8a22 100644 --- a/packages/rs-dapi-client/src/address_list.rs +++ b/packages/rs-dapi-client/src/address_list.rs @@ -1,7 +1,7 @@ //! Subsystem to manage DAPI nodes. +use crate::Uri; use chrono::Utc; -use dapi_grpc::tonic::transport::Uri; use rand::{rngs::SmallRng, seq::IteratorRandom, SeedableRng}; use std::collections::hash_map::Entry; use std::collections::HashMap; diff --git a/packages/rs-dapi-client/src/connection_pool.rs b/packages/rs-dapi-client/src/connection_pool.rs index 97dd991d509..99effb4ac76 100644 --- a/packages/rs-dapi-client/src/connection_pool.rs +++ b/packages/rs-dapi-client/src/connection_pool.rs @@ -3,12 +3,12 @@ use std::{ sync::{Arc, Mutex}, }; -use dapi_grpc::tonic::transport::Uri; use lru::LruCache; use crate::{ request_settings::AppliedRequestSettings, transport::{CoreGrpcClient, PlatformGrpcClient}, + Uri, }; /// ConnectionPool represents pool of connections to DAPI nodes. diff --git a/packages/rs-dapi-client/src/dapi_client.rs b/packages/rs-dapi-client/src/dapi_client.rs index ebca641f401..8986ac01d67 100644 --- a/packages/rs-dapi-client/src/dapi_client.rs +++ b/packages/rs-dapi-client/src/dapi_client.rs @@ -3,6 +3,8 @@ use backon::{ConstantBuilder, Retryable}; use dapi_grpc::mock::Mockable; use dapi_grpc::tonic::async_trait; +#[cfg(not(target_arch = "wasm32"))] +use dapi_grpc::tonic::transport::Certificate; use std::fmt::{Debug, Display}; use std::sync::atomic::AtomicUsize; use std::sync::Arc; @@ -12,7 +14,7 @@ use tracing::Instrument; use crate::address_list::AddressListError; use crate::connection_pool::ConnectionPool; use crate::request_settings::AppliedRequestSettings; -use crate::transport::TransportError; +use crate::transport::{self, TransportError}; use crate::{ transport::{TransportClient, TransportRequest}, AddressList, CanRetry, DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, @@ -76,6 +78,9 @@ pub struct DapiClient { address_list: AddressList, settings: RequestSettings, pool: ConnectionPool, + #[cfg(not(target_arch = "wasm32"))] + /// Certificate Authority certificate to use for verifying the server's certificate. + pub ca_certificate: Option<Certificate>, #[cfg(feature = "dump")] pub(crate) dump_dir: Option<std::path::PathBuf>, } @@ -92,9 +97,26 @@ impl DapiClient { pool: ConnectionPool::new(address_count), #[cfg(feature = "dump")] dump_dir: None, + #[cfg(not(target_arch = "wasm32"))] + ca_certificate: None, } } + /// Set CA certificate to use when verifying the server's certificate. + /// + /// # Arguments + /// + /// * `pem_ca_cert` - CA certificate in PEM format. + /// + /// # Returns + /// [DapiClient] with CA certificate set. + #[cfg(not(target_arch = "wasm32"))] + pub fn with_ca_certificate(mut self, ca_cert: Certificate) -> Self { + self.ca_certificate = Some(ca_cert); + + self + } + /// Return the [DapiClient] address list. pub fn address_list(&self) -> &AddressList { &self.address_list @@ -183,6 +205,8 @@ impl DapiRequestExecutor for DapiClient { .override_by(R::SETTINGS_OVERRIDES) .override_by(settings) .finalize(); + #[cfg(not(target_arch = "wasm32"))] + let applied_settings = applied_settings.with_ca_certificate(self.ca_certificate.clone()); // Setup retry policy: let retry_settings = ConstantBuilder::default() @@ -198,6 +222,9 @@ impl DapiRequestExecutor for DapiClient { let retries_counter_arc = Arc::new(AtomicUsize::new(0)); let retries_counter_arc_ref = &retries_counter_arc; + // We need reference so that the closure is FnMut + let applied_settings_ref = &applied_settings; + // Setup DAPI request execution routine future. It's a closure that will be called // more once to build new future on each retry. let routine = move || { @@ -212,7 +239,7 @@ impl DapiRequestExecutor for DapiClient { let _span = tracing::trace_span!( "execute request", address = ?address_result, - settings = ?applied_settings, + settings = ?applied_settings_ref, method = request.method_name(), ) .entered(); @@ -242,7 +269,7 @@ impl DapiRequestExecutor for DapiClient { let mut transport_client = R::Client::with_uri_and_settings( address.uri().clone(), - &applied_settings, + applied_settings_ref, &pool, ) .map_err(|error| ExecutionError { @@ -252,7 +279,7 @@ impl DapiRequestExecutor for DapiClient { })?; let result = transport_request - .execute_transport(&mut transport_client, &applied_settings) + .execute_transport(&mut transport_client, applied_settings_ref) .await .map_err(DapiClientError::Transport); @@ -281,17 +308,23 @@ impl DapiRequestExecutor for DapiClient { update_address_ban_status::<R::Response, DapiClientError>( &self.address_list, &execution_result, - &applied_settings, + applied_settings_ref, ); execution_result } }; + let sleeper = transport::BackonSleeper::default(); + // Start the routine with retry policy applied: // We allow let_and_return because `result` is used later if dump feature is enabled - let result = routine + let result: Result< + ExecutionResponse<<R as TransportRequest>::Response>, + ExecutionError<DapiClientError>, + > = routine .retry(retry_settings) + .sleep(sleeper) .notify(|error, duration| { let retries_counter = Arc::clone(&retries_counter_arc); retries_counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed); diff --git a/packages/rs-dapi-client/src/executor.rs b/packages/rs-dapi-client/src/executor.rs index 0afb8f57054..c87b2f9336b 100644 --- a/packages/rs-dapi-client/src/executor.rs +++ b/packages/rs-dapi-client/src/executor.rs @@ -34,7 +34,7 @@ pub trait InnerInto<T> { } /// Error happened during request execution. -#[derive(Debug, Clone, thiserror::Error, Eq, PartialEq)] +#[derive(Debug, Clone, thiserror::Error, Eq)] #[error("{inner}")] pub struct ExecutionError<E> { /// The cause of error @@ -45,6 +45,12 @@ pub struct ExecutionError<E> { pub address: Option<Address>, } +impl<E: PartialEq> PartialEq for ExecutionError<E> { + fn eq(&self, other: &Self) -> bool { + self.inner == other.inner && self.retries == other.retries && self.address == other.address + } +} + impl<F, T> InnerInto<ExecutionError<T>> for ExecutionError<F> where F: Into<T>, diff --git a/packages/rs-dapi-client/src/lib.rs b/packages/rs-dapi-client/src/lib.rs index e820a714a0e..c54e4d3f65b 100644 --- a/packages/rs-dapi-client/src/lib.rs +++ b/packages/rs-dapi-client/src/lib.rs @@ -26,6 +26,10 @@ pub use executor::{ WrapToExecutionResult, }; use futures::{future::BoxFuture, FutureExt}; +#[cfg(any(target_arch = "wasm32", not(feature = "mocks")))] +pub use http::Uri; +#[cfg(all(feature = "mocks", not(target_arch = "wasm32")))] +pub use http_serde::http::Uri; pub use request_settings::RequestSettings; /// A DAPI request could be executed with an initialized [DapiClient]. diff --git a/packages/rs-dapi-client/src/request_settings.rs b/packages/rs-dapi-client/src/request_settings.rs index 9ad08e88614..39f2da42d00 100644 --- a/packages/rs-dapi-client/src/request_settings.rs +++ b/packages/rs-dapi-client/src/request_settings.rs @@ -1,5 +1,7 @@ //! DAPI client request settings processing. +#[cfg(not(target_arch = "wasm32"))] +use dapi_grpc::tonic::transport::Certificate; use std::time::Duration; /// Default low-level client timeout @@ -64,12 +66,14 @@ impl RequestSettings { ban_failed_address: self .ban_failed_address .unwrap_or(DEFAULT_BAN_FAILED_ADDRESS), + #[cfg(not(target_arch = "wasm32"))] + ca_certificate: None, } } } /// DAPI settings ready to use. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub struct AppliedRequestSettings { /// Timeout for establishing a connection. pub connect_timeout: Option<Duration>, @@ -79,4 +83,17 @@ pub struct AppliedRequestSettings { pub retries: usize, /// Ban DAPI address if node not responded or responded with error. pub ban_failed_address: bool, + /// Certificate Authority certificate to use for verifying the server's certificate. + #[cfg(not(target_arch = "wasm32"))] + pub ca_certificate: Option<Certificate>, +} +impl AppliedRequestSettings { + /// Use provided CA certificate for verifying the server's certificate. + /// + /// If set to None, the system's default CA certificates will be used. + #[cfg(not(target_arch = "wasm32"))] + pub fn with_ca_certificate(mut self, ca_cert: Option<Certificate>) -> Self { + self.ca_certificate = ca_cert; + self + } } diff --git a/packages/rs-dapi-client/src/transport.rs b/packages/rs-dapi-client/src/transport.rs index 26c394ff034..3e342dbd708 100644 --- a/packages/rs-dapi-client/src/transport.rs +++ b/packages/rs-dapi-client/src/transport.rs @@ -1,17 +1,28 @@ //! Transport options that DAPI requests use under the hood. pub(crate) mod grpc; +#[cfg(not(target_arch = "wasm32"))] +pub(crate) mod tonic_channel; +#[cfg(target_arch = "wasm32")] +pub(crate) mod wasm_channel; use crate::connection_pool::ConnectionPool; pub use crate::request_settings::AppliedRequestSettings; -use crate::{CanRetry, RequestSettings}; +use crate::{CanRetry, RequestSettings, Uri}; use dapi_grpc::mock::Mockable; -use dapi_grpc::tonic::transport::Uri; pub use futures::future::BoxFuture; -pub use grpc::{CoreGrpcClient, PlatformGrpcClient}; use std::any; use std::fmt::Debug; +#[cfg(not(target_arch = "wasm32"))] +pub use tonic_channel::{ + create_channel, CoreGrpcClient, PlatformGrpcClient, TokioBackonSleeper as BackonSleeper, +}; +#[cfg(target_arch = "wasm32")] +pub use wasm_channel::{ + create_channel, CoreGrpcClient, PlatformGrpcClient, WasmBackonSleeper as BackonSleeper, +}; + /// Generic transport layer request. /// Requires [Clone] as could be retried and a client in general consumes a request. pub trait TransportRequest: Clone + Send + Sync + Debug + Mockable { diff --git a/packages/rs-dapi-client/src/transport/grpc.rs b/packages/rs-dapi-client/src/transport/grpc.rs index 62a75904064..8c6195bd055 100644 --- a/packages/rs-dapi-client/src/transport/grpc.rs +++ b/packages/rs-dapi-client/src/transport/grpc.rs @@ -2,42 +2,16 @@ use std::time::Duration; +use super::create_channel; use super::{CanRetry, TransportClient, TransportError, TransportRequest}; +use super::{CoreGrpcClient, PlatformGrpcClient}; use crate::connection_pool::{ConnectionPool, PoolPrefix}; -use crate::{request_settings::AppliedRequestSettings, RequestSettings}; -use dapi_grpc::core::v0::core_client::CoreClient; +use crate::{request_settings::AppliedRequestSettings, RequestSettings, Uri}; use dapi_grpc::core::v0::{self as core_proto}; -use dapi_grpc::platform::v0::{self as platform_proto, platform_client::PlatformClient}; -use dapi_grpc::tonic::transport::{ClientTlsConfig, Uri}; -use dapi_grpc::tonic::Streaming; -use dapi_grpc::tonic::{transport::Channel, IntoRequest}; +use dapi_grpc::platform::v0::{self as platform_proto}; +use dapi_grpc::tonic::{IntoRequest, Streaming}; use futures::{future::BoxFuture, FutureExt, TryFutureExt}; -/// Platform Client using gRPC transport. -pub type PlatformGrpcClient = PlatformClient<Channel>; -/// Core Client using gRPC transport. -pub type CoreGrpcClient = CoreClient<Channel>; - -fn create_channel( - uri: Uri, - settings: Option<&AppliedRequestSettings>, -) -> Result<Channel, dapi_grpc::tonic::transport::Error> { - let mut builder = Channel::builder(uri).tls_config( - ClientTlsConfig::new() - .with_native_roots() - .with_webpki_roots() - .assume_http2(true), - )?; - - if let Some(settings) = settings { - if let Some(timeout) = settings.connect_timeout { - builder = builder.connect_timeout(timeout); - } - } - - Ok(builder.connect_lazy()) -} - impl TransportClient for PlatformGrpcClient { fn with_uri(uri: Uri, pool: &ConnectionPool) -> Result<Self, TransportError> { Ok(pool @@ -256,8 +230,10 @@ impl_transport_request_grpc!( platform_proto::WaitForStateTransitionResultResponse, PlatformGrpcClient, RequestSettings { - timeout: Some(Duration::from_secs(120)), - ..RequestSettings::default() + timeout: Some(Duration::from_secs(80)), + retries: Some(0), + ban_failed_address: None, + connect_timeout: None, }, wait_for_state_transition_result ); @@ -487,11 +463,24 @@ impl_transport_request_grpc!( CoreGrpcClient, RequestSettings { timeout: Some(STREAMING_TIMEOUT), - ..RequestSettings::default() + ban_failed_address: None, + connect_timeout: None, + retries: None, }, subscribe_to_transactions_with_proofs ); +impl_transport_request_grpc!( + core_proto::MasternodeListRequest, + Streaming<core_proto::MasternodeListResponse>, + CoreGrpcClient, + RequestSettings { + timeout: Some(STREAMING_TIMEOUT), + ..RequestSettings::default() + }, + subscribe_to_masternode_list +); + // rpc getStatus(GetStatusRequest) returns (GetStatusResponse); impl_transport_request_grpc!( platform_proto::GetStatusRequest, diff --git a/packages/rs-dapi-client/src/transport/tonic_channel.rs b/packages/rs-dapi-client/src/transport/tonic_channel.rs new file mode 100644 index 00000000000..6a0b5c4ee13 --- /dev/null +++ b/packages/rs-dapi-client/src/transport/tonic_channel.rs @@ -0,0 +1,45 @@ +use super::TransportError; +use crate::{request_settings::AppliedRequestSettings, Uri}; +use dapi_grpc::core::v0::core_client::CoreClient; +use dapi_grpc::platform::v0::platform_client::PlatformClient; +use dapi_grpc::tonic::transport::{Certificate, Channel, ClientTlsConfig}; + +/// Platform Client using gRPC transport. +pub type PlatformGrpcClient = PlatformClient<Channel>; +/// Core Client using gRPC transport. +pub type CoreGrpcClient = CoreClient<Channel>; + +/// backon::Sleeper +// #[derive(Default, Clone, Debug)] +pub type TokioBackonSleeper = backon::TokioSleeper; + +/// Create channel (connection) for gRPC transport. +pub fn create_channel( + uri: Uri, + settings: Option<&AppliedRequestSettings>, +) -> Result<Channel, TransportError> { + let host = uri.host().expect("Failed to get host from URI").to_string(); + + let mut builder = Channel::builder(uri); + let mut tls_config = ClientTlsConfig::new() + .with_native_roots() + .with_webpki_roots() + .assume_http2(true); + + if let Some(settings) = settings { + if let Some(timeout) = settings.connect_timeout { + builder = builder.connect_timeout(timeout); + } + + if let Some(pem) = settings.ca_certificate.as_ref() { + let cert = Certificate::from_pem(pem); + tls_config = tls_config.ca_certificate(cert).domain_name(host); + }; + } + + builder = builder + .tls_config(tls_config) + .expect("Failed to set TLS config"); + + Ok(builder.connect_lazy()) +} diff --git a/packages/rs-dapi-client/src/transport/wasm_channel.rs b/packages/rs-dapi-client/src/transport/wasm_channel.rs new file mode 100644 index 00000000000..22e7fca5b0f --- /dev/null +++ b/packages/rs-dapi-client/src/transport/wasm_channel.rs @@ -0,0 +1,119 @@ +//! Listing of gRPC requests used in DAPI. + +use std::future::Future; +use std::time::Duration; + +use super::TransportError; +use crate::{request_settings::AppliedRequestSettings, Uri}; +use dapi_grpc::core::v0::core_client::CoreClient; + +use dapi_grpc::platform::v0::platform_client::PlatformClient; +use dapi_grpc::tonic::{self as tonic, Status}; +use futures::channel::oneshot; +use futures::future::BoxFuture; +use futures::{FutureExt, TryFutureExt}; +use http::Response; +use tonic_web_wasm_client::Client; +use wasm_bindgen_futures::spawn_local; + +/// Platform Client using gRPC transport. +pub type PlatformGrpcClient = PlatformClient<WasmClient>; +/// Core Client using gRPC transport. +pub type CoreGrpcClient = CoreClient<WasmClient>; + +/// Create a channel that will be used to communicate with the DAPI. +pub fn create_channel( + uri: Uri, + _settings: Option<&AppliedRequestSettings>, +) -> Result<WasmClient, TransportError> { + WasmClient::new(&uri.to_string()) +} + +/// Transport client used in wasm32 target (eg. Javascript family) +#[derive(Clone, Debug)] +pub struct WasmClient { + client: Client, +} + +impl WasmClient { + /// Create a new instance of the client, connecting to provided uri. + pub fn new(uri: &str) -> Result<Self, TransportError> { + let client = tonic_web_wasm_client::Client::new(uri.to_string()); + Ok(Self { client }) + } +} + +impl tonic::client::GrpcService<tonic::body::BoxBody> for WasmClient { + type Future = BoxFuture<'static, Result<http::Response<Self::ResponseBody>, Self::Error>>; + type ResponseBody = tonic::body::BoxBody; + type Error = Status; + + fn call(&mut self, request: http::Request<tonic::body::BoxBody>) -> Self::Future { + let mut client = self.client.clone(); + let fut = client.call(request).map(|res| match res { + Ok(resp) => { + let body = tonic::body::boxed(resp.into_body()); + Ok(Response::new(body)) + } + Err(e) => Err(wasm_client_error_to_status(e)), + }); + + into_send(fut) + } + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll<Result<(), Self::Error>> { + self.client + .poll_ready(cx) + .map_err(wasm_client_error_to_status) + } +} + +/// Map [`tonic_web_wasm_client::Error`] to [`tonic::Status`]. +/// +/// TODO: Add more error handling. +fn wasm_client_error_to_status(e: tonic_web_wasm_client::Error) -> Status { + match e { + tonic_web_wasm_client::Error::TonicStatusError(status) => status, + _ => Status::internal(format!("Failed to call gRPC service: {}", e)), + } +} + +/// backon::Sleeper implementation for Wasm. +/// +/// ## Note +/// +/// It is already implemented in [::backon] crate, but it is not Send, so it cannot be used in our context. +/// We reimplement it here to make it Send. +// TODO: Consider moving it to different module. +#[derive(Default, Clone, Debug)] +pub struct WasmBackonSleeper {} +impl backon::Sleeper for WasmBackonSleeper { + type Sleep = BoxFuture<'static, ()>; + fn sleep(&self, dur: Duration) -> Self::Sleep { + into_send(gloo_timers::future::sleep(dur)).boxed() + } +} + +/// Convert a future into a boxed future that can be sent between threads. +/// +/// This is a workaround using oneshot channel to synchronize. +/// It spawns a local task that sends the result of the future to the channel. +/// +/// ## Panics +/// +/// It panics if the receiver is dropped (e.g. `f` panics or is cancelled) before the sender sends the result. +fn into_send<'a, F: Future + 'static>(f: F) -> BoxFuture<'a, F::Output> +where + F::Output: Send, +{ + let (tx, rx) = oneshot::channel::<F::Output>(); + spawn_local(async move { + tx.send(f.await).ok(); + }); + + rx.unwrap_or_else(|e| panic!("Failed to receive result: {:?}", e)) + .boxed() +} diff --git a/packages/rs-dapi-client/tests/local_platform_connectivity.rs b/packages/rs-dapi-client/tests/local_platform_connectivity.rs index 0a0ae4b59d7..55c881fe09f 100644 --- a/packages/rs-dapi-client/tests/local_platform_connectivity.rs +++ b/packages/rs-dapi-client/tests/local_platform_connectivity.rs @@ -1,12 +1,10 @@ #[cfg(not(feature = "offline-testing"))] mod tests { - use dapi_grpc::{ - platform::v0::{ - self as platform_proto, get_identity_response, GetIdentityResponse, ResponseMetadata, - }, - tonic::transport::Uri, + use dapi_grpc::platform::v0::{ + self as platform_proto, get_identity_response, GetIdentityResponse, ResponseMetadata, }; use rs_dapi_client::{AddressList, DapiClient, DapiRequest, RequestSettings}; + use std::str::FromStr; pub const OWNER_ID_BYTES: [u8; 32] = [ 65, 63, 57, 243, 204, 9, 106, 71, 187, 2, 94, 221, 190, 127, 141, 114, 137, 209, 243, 50, @@ -15,10 +13,10 @@ mod tests { #[tokio::test] async fn get_identity() { - let mut address_list = AddressList::new(); - address_list.add_uri(Uri::from_static("http://127.0.0.1:2443")); + let address_list = + AddressList::from_str("http://127.0.0.1:2443").expect("unable to parse address list"); - let mut client = DapiClient::new(address_list, RequestSettings::default()); + let client = DapiClient::new(address_list, RequestSettings::default()); let request = platform_proto::GetIdentityRequest { version: Some(platform_proto::get_identity_request::Version::V0( platform_proto::get_identity_request::GetIdentityRequestV0 { @@ -39,9 +37,10 @@ mod tests { }), })), } = request - .execute(&mut client, RequestSettings::default()) + .execute(&client, RequestSettings::default()) .await .expect("unable to perform dapi request") + .inner { assert!(!bytes.is_empty()); assert_eq!(protocol_version, 1); diff --git a/packages/rs-dapi-grpc-macros/Cargo.toml b/packages/rs-dapi-grpc-macros/Cargo.toml index c22dbeecf0c..32c2bddba39 100644 --- a/packages/rs-dapi-grpc-macros/Cargo.toml +++ b/packages/rs-dapi-grpc-macros/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "dapi-grpc-macros" -version = "1.6.2" +version = "1.8.0" edition = "2021" description = "Macros used by dapi-grpc. Internal use only." diff --git a/packages/rs-dpp/Cargo.toml b/packages/rs-dpp/Cargo.toml index cac0277ec38..8c3eb7e6c53 100644 --- a/packages/rs-dpp/Cargo.toml +++ b/packages/rs-dpp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dpp" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true authors = [ @@ -14,6 +14,7 @@ authors = [ [dependencies] anyhow = { version = "1.0.81" } async-trait = { version = "0.1.79" } +ordered-float = { version = "4.6.0", features = ["serde"] } base64 = "0.22.1" bs58 = "0.5" byteorder = { version = "1.4" } @@ -21,14 +22,14 @@ chrono = { version = "0.4.35", default-features = false, features = [ "wasmbind", "clock", ] } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +ciborium = { version = "0.2.2", optional = true } dashcore = { git = "https://github.com/dashpay/rust-dashcore", features = [ "std", "secp-recovery", "rand", "signer", "serde", -], default-features = false, tag = "0.34.0" } +], default-features = false, tag = "v0.37.0" } env_logger = { version = "0.11" } getrandom = { version = "0.2", features = ["js"] } hex = { version = "0.4" } @@ -38,7 +39,6 @@ jsonschema = { git = "https://github.com/dashpay/jsonschema-rs", branch = "confi "draft202012", ], optional = true } lazy_static = { version = "1.4" } -log = { version = "0.4.6" } num_enum = "0.7" bincode = { version = "2.0.0-rc.3", features = ["serde"] } rand = { version = "0.8.5", features = ["small_rng"] } @@ -56,11 +56,11 @@ platform-serialization = { path = "../rs-platform-serialization" } platform-serialization-derive = { path = "../rs-platform-serialization-derive" } derive_more = { version = "1.0", features = ["from", "display", "try_into"] } nohash-hasher = "0.2.0" -rust_decimal = "1.29.1" -rust_decimal_macros = "1.29.1" +rust_decimal = { version = "1.29.1", optional = true } +rust_decimal_macros = { version = "1.29.1", optional = true } indexmap = { version = "2.7.0", features = ["serde"] } strum = { version = "0.26", features = ["derive"] } -json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator' } +json-schema-compatibility-validator = { path = '../rs-json-schema-compatibility-validator', optional = true } once_cell = "1.19.0" [dev-dependencies] @@ -70,14 +70,17 @@ pretty_assertions = { version = "1.4.1" } dpp = { path = ".", features = ["all_features_without_client"] } assert_matches = "1.5.0" once_cell = "1.7" +env_logger = { version = "0.11" } +log = { version = "0.4.22" } [features] -default = ["platform-value", "state-transitions"] +default = ["state-transitions"] +core_verification = ["dashcore/message_verification"] +core_quorum_validation = ["dashcore/quorum_validation"] bls-signatures = ["dashcore/bls"] ed25519-dalek = ["dashcore/eddsa"] all_features = [ "json-object", - "platform-value", "system_contracts", "state-transitions", "extended-document", @@ -121,27 +124,27 @@ all_features = [ ] dash-sdk-features = [ - "json-object", - "platform-value", - "system_contracts", - "state-transitions", - "validation", + # "json-object", + # "platform-value", + # "system_contracts", + # "validation", # TODO: This one is big "identity-hashing", - "identity-serialization", - "vote-serialization", - "document-value-conversion", - "data-contract-value-conversion", + "data-contract-json-conversion", + # "identity-serialization", + # "vote-serialization", + # "document-value-conversion", + # "data-contract-value-conversion", "identity-value-conversion", - "core-types", - "core-types-serialization", - "core-types-serde-conversion", - "state-transition-serde-conversion", + # "core-types", + # "core-types-serialization", + # "core-types-serde-conversion", + # "state-transition-serde-conversion", "state-transition-value-conversion", - "state-transition-json-conversion", - "state-transition-validation", + # "state-transition-json-conversion", + # "state-transition-validation", "state-transition-signing", - "state-transitions", - "fee-distribution", + # "state-transitions", + # "fee-distribution", "client", "platform-value-cbor", ] @@ -208,9 +211,15 @@ validation = [ "state-transition-serde-conversion", "ed25519-dalek", ] +# TODO: Tring to remove regexp +create-contested-document = [] platform-value-json = ["platform-value/json"] platform-value-cbor = ["platform-value/cbor"] -json-schema-validation = ["jsonschema", "platform-value-json"] +json-schema-validation = [ + "jsonschema", + "platform-value-json", + "dep:json-schema-compatibility-validator", +] json-object = ["platform-value", "platform-value-json"] platform-value = [] identity-hashing = ["identity-serialization"] @@ -281,7 +290,7 @@ random-public-keys = ["bls-signatures", "ed25519-dalek"] random-identities = ["random-public-keys"] random-documents = [] random-document-types = ["platform-value-json"] -fee-distribution = [] +fee-distribution = ["dep:rust_decimal", "dep:rust_decimal_macros"] extended-document = [ "document-serde-conversion", "data-contract-serde-conversion", diff --git a/packages/rs-dpp/schema/meta_schemas/token/v0/token-meta.json b/packages/rs-dpp/schema/meta_schemas/token/v0/token-meta.json new file mode 100644 index 00000000000..7e5d833fc8b --- /dev/null +++ b/packages/rs-dpp/schema/meta_schemas/token/v0/token-meta.json @@ -0,0 +1,245 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/dashpay/platform/blob/master/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json", + "type": "object", + "$defs": { + "localization": { + "type": "string", + "pattern": "^[\\p{L}\\p{N}]*$", + "minLength": 1, + "maxLength": 64, + "$comment": "Allow only alphanumeric characters" + }, + "identifier": { + "type": "string", + "contentMediaType": "application/x.dash.dpp.identifier", + "byteArray": true, + "minLength": 32, + "maxLength": 32, + "description": "A 32-byte identifier" + }, + "optionalIdentifier": { + "type": ["string", "null"], + "contentMediaType": "application/x.dash.dpp.identifier", + "byteArray": true, + "minLength": 32, + "maxLength": 32, + "description": "A 32-byte identifier" + }, + "authorizedActionTakers": { + "description": "Specifies who is authorized to take certain actions", + "oneOf": [ + { + "type": "object", + "properties": { + "type": { "const": "noOne" } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { "const": "contractOwner" } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { "const": "mainGroup" } + }, + "required": ["type"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { "const": "specifiedIdentities" }, + "identifiers": { + "type": "array", + "description": "An array of authorized identifiers", + "items": { + "$ref": "#/$defs/identifier" + }, + "uniqueItems": true + }, + "requiredSignersCount": { + "$ref": "#/$defs/requiredSignersCount", + "description": "Rules for required signers within these specified identities" + } + }, + "required": ["type", "identifiers", "requiredSignersCount"], + "additionalProperties": false + } + ] + }, + "changeControlRules": { + "type": "object", + "description": "Defines who can make changes to certain parameters and who can change that ability", + "properties": { + "authorizedToMakeChange": { + "$ref": "#/$defs/authorizedActionTakers", + "description": "Who is authorized to make the relevant change" + }, + "authorizedToChangeAuthorizedActionTakers": { + "$ref": "#/$defs/authorizedActionTakers", + "description": "Who is authorized to modify the list of people who can make the change" + }, + "changingAuthorizedActionTakersToNoOneAllowed": { + "type": "boolean", + "description": "Whether it is allowed to change the authorized action takers to no one in the future" + }, + "changingAuthorizedActionTakersToContractOwnerAllowed": { + "type": "boolean", + "description": "Whether it is allowed to change the authorized action takers to contract owner in the future" + } + }, + "required": [ + "authorizedToMakeChange", + "authorizedToChangeAuthorizedActionTakers", + "changingAuthorizedActionTakersToNoOneAllowed", + "changingAuthorizedActionTakersToContractOwnerAllowed" + ], + "additionalProperties": false + }, + "requiredSignersCount": { + "type": "integer", + "description": "How many signers are required to authorize actions", + "minimum": 1, + "maximum": 255 + } + }, + "properties": { + "description": { + "type": "string", + "maxLength": 1024, + "description": "Token description" + }, + "displayConventions": { + "type": "object", + "description": "Token display conventions including capitalization and localization", + "properties": { + "capitalize": { + "type": "boolean", + "description": "Indicates whether token names should be capitalized" + }, + "localizations": { + "type": "object", + "description": "A map of locale keys to their corresponding singular/plural forms", + "additionalProperties": { + "type": "object", + "description": "Localization forms for a given locale key", + "properties": { + "singularForm": { + "$ref": "#/$defs/localization" + }, + "pluralForm": { + "$ref": "#/$defs/localization" + } + }, + "required": [ + "singularForm", + "pluralForm" + ], + "additionalProperties": false + }, + "maxProperties": 255, + "minProperties": 1, + "propertyNames": { + "type": "string", + "minLength": 1, + "maxLength": 255 + } + }, + "decimals": { + "type": "integer", + "minimum": 0, + "description": "The number of decimal places the token supports" + } + }, + "required": ["capitalize", "localizations", "decimals"], + "additionalProperties": false + }, + "initialSupply": { + "type": "integer", + "minimum": 0, + "description": "The initial (base) supply of the token at creation time" + }, + "initialSupplyDestinationIdentityId": { + "$ref": "#/$defs/optionalIdentifier", + "description": "Optional identity where initial supply tokens are sent. If not set, the data contract owner identity is used" + }, + "maxSupply": { + "type": ["integer", "null"], + "minimum": 1, + "description": "The maximum supply the token can ever have, or null if there is no maximum" + }, + "maxSupplyChangeRules": { + "$ref": "#/$defs/changeControlRules", + "description": "Rules governing who can change the max supply and under what conditions" + }, + "mintedTokensDestinationIdentityId": { + "$ref": "#/$defs/optionalIdentifier", + "description": "Optional identity where newly minted tokens are sent. If set then minted tokens can be sent only to this identity" + }, + "mintedTokensDestinationIdentityRules": { + "$ref": "#/$defs/changeControlRules", + "description": "Rules for changing the new tokens destination identity" + }, + "mintingRules": { + "$ref": "#/$defs/changeControlRules", + "description": "Rules governing who and how new tokens can be minted manually" + }, + "burningRules": { + "$ref": "#/$defs/changeControlRules", + "description": "Rules governing who and how tokens can be burned manually" + }, + "mainControlGroup": { + "type": "array", + "description": "The main control group, if present", + "items": { + "type": "object", + "properties": { + "identifiers": { + "type": "array", + "description": "A set of identities representing members of the control group", + "items": { + "$ref": "#/$defs/identifier" + }, + "uniqueItems": true + }, + "requiredSignersCount": { + "$ref": "#/$defs/requiredSignersCount" + } + }, + "required": ["identifiers", "requiredSignersCount"], + "additionalProperties": false + } + }, + "mainControlGroupCanBeModified": { + "$ref": "#/$defs/authorizedActionTakers", + "description": "Specifies which entities are authorized to modify the main control group" + }, + "metadata": { + "type": "object", + "propertyNames": { + "type": "string", + "maxLength": 255 + }, + "additionalProperties": { + "type": "string", + "maxLength": 1024 + }, + "minProperties": 1, + "maxProperties": 255, + "description": "Token arbitrary metadata" + } + }, + "required": [ + "displayConventions", + "initialSupply" + ], + "additionalProperties": false +} diff --git a/packages/rs-dpp/src/balances/credits.rs b/packages/rs-dpp/src/balances/credits.rs index d0f9e2805b9..02f2479f045 100644 --- a/packages/rs-dpp/src/balances/credits.rs +++ b/packages/rs-dpp/src/balances/credits.rs @@ -16,22 +16,27 @@ use std::convert::TryFrom; pub type Duffs = u64; /// Credits type - pub type Credits = u64; +/// Token Amount type +pub type TokenAmount = u64; + +/// Signed Token Amount type +pub type SignedTokenAmount = i64; + +/// Sum token amount +pub type SumTokenAmount = i128; + /// Signed Credits type is used for internal computations and total credits /// balance verification - pub type SignedCredits = i64; /// Maximum value of credits - pub const MAX_CREDITS: Credits = 9223372036854775807 as Credits; //i64 Max pub const CREDITS_PER_DUFF: Credits = 1000; /// Trait for signed and unsigned credits - pub trait Creditable { /// Convert unsigned credit to singed fn to_signed(&self) -> Result<SignedCredits, ProtocolError>; diff --git a/packages/rs-dpp/src/balances/mod.rs b/packages/rs-dpp/src/balances/mod.rs index a6b48811208..6878bd6d8b8 100644 --- a/packages/rs-dpp/src/balances/mod.rs +++ b/packages/rs-dpp/src/balances/mod.rs @@ -1,3 +1,5 @@ pub mod total_credits_balance; pub mod credits; +pub mod total_single_token_balance; +pub mod total_tokens_balance; diff --git a/packages/rs-dpp/src/balances/total_single_token_balance/mod.rs b/packages/rs-dpp/src/balances/total_single_token_balance/mod.rs new file mode 100644 index 00000000000..e7b0eb0c8ca --- /dev/null +++ b/packages/rs-dpp/src/balances/total_single_token_balance/mod.rs @@ -0,0 +1,49 @@ +use crate::balances::credits::SignedTokenAmount; +use crate::ProtocolError; +use std::fmt; + +/// A structure where the token supply and the aggregated token account balances should always be equal +#[derive(Copy, Clone, Debug)] +pub struct TotalSingleTokenBalance { + /// the token supply + pub token_supply: SignedTokenAmount, + /// the sum of all user account balances + pub aggregated_token_account_balances: SignedTokenAmount, +} + +impl fmt::Display for TotalSingleTokenBalance { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f, "TotalSingleTokenBalance {{")?; + writeln!(f, " token_supply: {},", self.token_supply)?; + writeln!( + f, + " aggregated_token_account_balances: {}", + self.aggregated_token_account_balances + )?; + write!(f, "}}") + } +} +impl TotalSingleTokenBalance { + /// Is the outcome okay? basically do the values match up + /// Errors in case of overflow + pub fn ok(&self) -> Result<bool, ProtocolError> { + let TotalSingleTokenBalance { + token_supply, + aggregated_token_account_balances, + } = *self; + + if token_supply < 0 { + return Err(ProtocolError::Generic( + "Token in platform are less than 0".to_string(), + )); + } + + if aggregated_token_account_balances < 0 { + return Err(ProtocolError::Generic( + "Token in aggregated identity balances are less than 0".to_string(), + )); + } + + Ok(token_supply == aggregated_token_account_balances) + } +} diff --git a/packages/rs-dpp/src/balances/total_tokens_balance/mod.rs b/packages/rs-dpp/src/balances/total_tokens_balance/mod.rs new file mode 100644 index 00000000000..84aa157643a --- /dev/null +++ b/packages/rs-dpp/src/balances/total_tokens_balance/mod.rs @@ -0,0 +1,53 @@ +use crate::balances::credits::SumTokenAmount; +use crate::ProtocolError; +use std::fmt; + +/// The outcome of verifying token balances +#[derive(Copy, Clone, Debug)] +pub struct TotalTokensBalance { + /// all the tokens in platform + pub total_tokens_in_platform: SumTokenAmount, + /// all the tokens in identity token balances + pub total_identity_token_balances: SumTokenAmount, +} + +impl fmt::Display for TotalTokensBalance { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f, "TotalTokensBalance {{")?; + writeln!( + f, + " total_tokens_in_platform: {},", + self.total_tokens_in_platform + )?; + writeln!( + f, + " total_identity_token_balances: {}", + self.total_identity_token_balances + )?; + write!(f, "}}") + } +} +impl TotalTokensBalance { + /// Is the outcome okay? basically do the values match up + /// Errors in case of overflow + pub fn ok(&self) -> Result<bool, ProtocolError> { + let TotalTokensBalance { + total_tokens_in_platform, + total_identity_token_balances, + } = *self; + + if total_tokens_in_platform < 0 { + return Err(ProtocolError::CriticalCorruptedCreditsCodeExecution( + "Tokens in platform are less than 0".to_string(), + )); + } + + if total_identity_token_balances < 0 { + return Err(ProtocolError::CriticalCorruptedCreditsCodeExecution( + "Tokens in identity balances are less than 0".to_string(), + )); + } + + Ok(total_tokens_in_platform == total_identity_token_balances) + } +} diff --git a/packages/rs-dpp/src/bls/mod.rs b/packages/rs-dpp/src/bls/mod.rs index 8b825531c02..a5501f4634d 100644 --- a/packages/rs-dpp/src/bls/mod.rs +++ b/packages/rs-dpp/src/bls/mod.rs @@ -1,4 +1,4 @@ -#[cfg(all(not(target_arch = "wasm32"), feature = "bls-signatures"))] +#[cfg(feature = "bls-signatures")] pub mod native_bls; use crate::{ProtocolError, PublicKeyValidationError}; diff --git a/packages/rs-dpp/src/data_contract/accessors/mod.rs b/packages/rs-dpp/src/data_contract/accessors/mod.rs index fc5dc0789b7..92fdb99bd94 100644 --- a/packages/rs-dpp/src/data_contract/accessors/mod.rs +++ b/packages/rs-dpp/src/data_contract/accessors/mod.rs @@ -1,45 +1,58 @@ use crate::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use crate::data_contract::config::DataContractConfig; use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; -use crate::data_contract::DocumentName; +use crate::data_contract::{ + DocumentName, GroupContractPosition, TokenContractPosition, EMPTY_GROUPS, EMPTY_TOKENS, +}; use crate::metadata::Metadata; use crate::prelude::DataContract; use platform_value::Identifier; +use crate::data_contract::accessors::v1::{DataContractV1Getters, DataContractV1Setters}; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; use crate::data_contract::errors::DataContractError; +use crate::data_contract::group::Group; +use crate::tokens::errors::TokenError; +use crate::ProtocolError; use std::collections::BTreeMap; pub mod v0; +pub mod v1; impl DataContractV0Getters for DataContract { fn id(&self) -> Identifier { match self { DataContract::V0(v0) => v0.id(), + DataContract::V1(v1) => v1.id(), } } fn id_ref(&self) -> &Identifier { match self { DataContract::V0(v0) => v0.id_ref(), + DataContract::V1(v1) => v1.id_ref(), } } fn version(&self) -> u32 { match self { DataContract::V0(v0) => v0.version(), + DataContract::V1(v1) => v1.version(), } } fn owner_id(&self) -> Identifier { match self { DataContract::V0(v0) => v0.owner_id(), + DataContract::V1(v1) => v1.owner_id(), } } fn document_type_cloned_for_name(&self, name: &str) -> Result<DocumentType, DataContractError> { match self { DataContract::V0(v0) => v0.document_type_cloned_for_name(name), + DataContract::V1(v1) => v1.document_type_cloned_for_name(name), } } @@ -49,72 +62,84 @@ impl DataContractV0Getters for DataContract { ) -> Result<&DocumentType, DataContractError> { match self { DataContract::V0(v0) => v0.document_type_borrowed_for_name(name), + DataContract::V1(v1) => v1.document_type_borrowed_for_name(name), } } fn document_type_for_name(&self, name: &str) -> Result<DocumentTypeRef, DataContractError> { match self { DataContract::V0(v0) => v0.document_type_for_name(name), + DataContract::V1(v1) => v1.document_type_for_name(name), } } fn document_type_optional_for_name(&self, name: &str) -> Option<DocumentTypeRef> { match self { DataContract::V0(v0) => v0.document_type_optional_for_name(name), + DataContract::V1(v1) => v1.document_type_optional_for_name(name), } } fn document_type_cloned_optional_for_name(&self, name: &str) -> Option<DocumentType> { match self { DataContract::V0(v0) => v0.document_type_cloned_optional_for_name(name), + DataContract::V1(v1) => v1.document_type_cloned_optional_for_name(name), } } fn has_document_type_for_name(&self, name: &str) -> bool { match self { DataContract::V0(v0) => v0.has_document_type_for_name(name), + DataContract::V1(v1) => v1.has_document_type_for_name(name), } } fn document_types_with_contested_indexes(&self) -> BTreeMap<&DocumentName, &DocumentType> { match self { DataContract::V0(v0) => v0.document_types_with_contested_indexes(), + DataContract::V1(v1) => v1.document_types_with_contested_indexes(), } } fn document_types(&self) -> &BTreeMap<DocumentName, DocumentType> { match self { DataContract::V0(v0) => v0.document_types(), + DataContract::V1(v1) => v1.document_types(), } } fn document_types_mut(&mut self) -> &mut BTreeMap<DocumentName, DocumentType> { match self { DataContract::V0(v0) => v0.document_types_mut(), + DataContract::V1(v1) => v1.document_types_mut(), } } fn metadata(&self) -> Option<&Metadata> { match self { DataContract::V0(v0) => v0.metadata(), + DataContract::V1(v1) => v1.metadata(), } } fn metadata_mut(&mut self) -> Option<&mut Metadata> { match self { DataContract::V0(v0) => v0.metadata_mut(), + DataContract::V1(v1) => v1.metadata_mut(), } } fn config(&self) -> &DataContractConfig { match self { DataContract::V0(v0) => v0.config(), + DataContract::V1(v1) => v1.config(), } } fn config_mut(&mut self) -> &mut DataContractConfig { match self { DataContract::V0(v0) => v0.config_mut(), + DataContract::V1(v1) => v1.config_mut(), } } } @@ -123,36 +148,185 @@ impl DataContractV0Setters for DataContract { fn set_id(&mut self, id: Identifier) { match self { DataContract::V0(v0) => v0.set_id(id), + DataContract::V1(v1) => v1.set_id(id), } } fn set_version(&mut self, version: u32) { match self { DataContract::V0(v0) => v0.set_version(version), + DataContract::V1(v1) => v1.set_version(version), } } fn increment_version(&mut self) { match self { DataContract::V0(v0) => v0.increment_version(), + DataContract::V1(v1) => v1.increment_version(), } } fn set_owner_id(&mut self, owner_id: Identifier) { match self { DataContract::V0(v0) => v0.set_owner_id(owner_id), + DataContract::V1(v1) => v1.set_owner_id(owner_id), } } fn set_metadata(&mut self, metadata: Option<Metadata>) { match self { DataContract::V0(v0) => v0.set_metadata(metadata), + DataContract::V1(v1) => v1.set_metadata(metadata), } } fn set_config(&mut self, config: DataContractConfig) { match self { DataContract::V0(v0) => v0.set_config(config), + DataContract::V1(v1) => v1.set_config(config), + } + } +} + +/// Implementing DataContractV1Getters for DataContract +impl DataContractV1Getters for DataContract { + /// Returns a reference to the groups map. + fn group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError> { + match self { + DataContract::V0(_) => Err(ProtocolError::GroupNotFound( + "There can not be a group in v0 data contracts".to_string(), + )), + DataContract::V1(v1) => v1.group(position), + } + } + + /// Returns a reference to the groups map. + fn groups(&self) -> &BTreeMap<GroupContractPosition, Group> { + match self { + DataContract::V0(_) => &EMPTY_GROUPS, + DataContract::V1(v1) => &v1.groups, + } + } + + /// Returns a mutable reference to the groups map. + /// Returns `None` for V0 since it doesn't have groups. + fn groups_mut(&mut self) -> Option<&mut BTreeMap<GroupContractPosition, Group>> { + match self { + DataContract::V0(_) => None, + DataContract::V1(v1) => Some(&mut v1.groups), + } + } + + /// Returns a reference to a group or an error. + /// Returns an Error for V0 since it doesn't have groups. + fn expected_group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError> { + match self { + DataContract::V0(_) => Err(ProtocolError::GroupNotFound( + "Group not found in contract V0".to_string(), + )), + DataContract::V1(v1) => { + v1.groups + .get(&position) + .ok_or(ProtocolError::GroupNotFound(format!( + "Group not found at position {} in contract {}", + position, + self.id() + ))) + } + } + } + + /// Returns a reference to the tokens map. + fn tokens(&self) -> &BTreeMap<TokenContractPosition, TokenConfiguration> { + match self { + DataContract::V0(_) => &EMPTY_TOKENS, + DataContract::V1(v1) => &v1.tokens, + } + } + + /// Returns a mutable reference to the tokens map. + /// Returns `None` for V0 since it doesn't have tokens. + fn tokens_mut(&mut self) -> Option<&mut BTreeMap<TokenContractPosition, TokenConfiguration>> { + match self { + DataContract::V0(_) => None, + DataContract::V1(v1) => Some(&mut v1.tokens), + } + } + + /// Returns a mutable reference to a token configuration or an error. + /// Returns an Error for V0 since it doesn't have tokens. + fn expected_token_configuration( + &self, + position: TokenContractPosition, + ) -> Result<&TokenConfiguration, ProtocolError> { + match self { + DataContract::V0(_) => Err(ProtocolError::Token( + TokenError::TokenNotFoundOnContractVersion.into(), + )), + DataContract::V1(v1) => v1.tokens.get(&position).ok_or(ProtocolError::Token( + TokenError::TokenNotFoundAtPositionError.into(), + )), + } + } + + /// Returns a mutable reference to a token configuration + /// Returns `None` for V0 since it doesn't have tokens. + fn token_configuration_mut( + &mut self, + position: TokenContractPosition, + ) -> Option<&mut TokenConfiguration> { + match self { + DataContract::V0(_) => None, + DataContract::V1(v1) => v1.tokens.get_mut(&position), + } + } + + fn token_id(&self, position: TokenContractPosition) -> Option<Identifier> { + match self { + DataContract::V0(_) => None, + DataContract::V1(v1) => v1.token_id(position), + } + } +} + +impl DataContractV1Setters for DataContract { + /// Sets the groups map for the data contract. + fn set_groups(&mut self, groups: BTreeMap<GroupContractPosition, Group>) { + match self { + DataContract::V0(_) => {} + DataContract::V1(v1) => { + v1.groups = groups; + } + } + } + + /// Sets the tokens map for the data contract. + fn set_tokens(&mut self, tokens: BTreeMap<TokenContractPosition, TokenConfiguration>) { + match self { + DataContract::V0(_) => {} + DataContract::V1(v1) => { + v1.tokens = tokens; + } + } + } + + /// Adds or updates a single group in the groups map. + fn add_group(&mut self, position: GroupContractPosition, group: Group) { + match self { + DataContract::V0(_) => {} + DataContract::V1(v1) => { + v1.groups.insert(position, group); + } + } + } + + /// Adds or updates a single token configuration in the tokens map. + fn add_token(&mut self, id: TokenContractPosition, token: TokenConfiguration) { + match self { + DataContract::V0(_) => {} + DataContract::V1(v1) => { + v1.tokens.insert(id, token); + } } } } diff --git a/packages/rs-dpp/src/data_contract/accessors/v1/mod.rs b/packages/rs-dpp/src/data_contract/accessors/v1/mod.rs new file mode 100644 index 00000000000..0727a24a21d --- /dev/null +++ b/packages/rs-dpp/src/data_contract/accessors/v1/mod.rs @@ -0,0 +1,57 @@ +use crate::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::{GroupContractPosition, TokenContractPosition}; +use crate::ProtocolError; +use platform_value::Identifier; +use std::collections::BTreeMap; + +pub trait DataContractV1Getters: DataContractV0Getters { + /// Gets a group at a certain position + fn group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError>; + /// Returns a reference to the groups map. + fn groups(&self) -> &BTreeMap<GroupContractPosition, Group>; + + /// Returns a mutable reference to the groups map. + fn groups_mut(&mut self) -> Option<&mut BTreeMap<GroupContractPosition, Group>>; + /// Returns a reference to a group or an error. + /// Returns an Error for V0 since it doesn't have groups. + fn expected_group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError>; + + /// Returns a reference to the tokens map. + fn tokens(&self) -> &BTreeMap<TokenContractPosition, TokenConfiguration>; + + /// Returns a mutable reference to the tokens map. + fn tokens_mut(&mut self) -> Option<&mut BTreeMap<TokenContractPosition, TokenConfiguration>>; + + /// Returns a mutable reference to a token configuration or an error. + /// Returns an Error for V0 since it doesn't have tokens. + fn expected_token_configuration( + &self, + position: TokenContractPosition, + ) -> Result<&TokenConfiguration, ProtocolError>; + + /// Returns a mutable reference to a token configuration + /// Returns `None` for V0 since it doesn't have tokens. + fn token_configuration_mut( + &mut self, + position: TokenContractPosition, + ) -> Option<&mut TokenConfiguration>; + + /// Returns the token id at a certain position + fn token_id(&self, position: TokenContractPosition) -> Option<Identifier>; +} + +pub trait DataContractV1Setters: DataContractV0Setters { + /// Sets the groups map for the data contract. + fn set_groups(&mut self, groups: BTreeMap<GroupContractPosition, Group>); + + /// Sets the tokens map for the data contract. + fn set_tokens(&mut self, tokens: BTreeMap<TokenContractPosition, TokenConfiguration>); + + /// Adds or updates a single group in the groups map. + fn add_group(&mut self, pos: GroupContractPosition, group: Group); + + /// Adds or updates a single token configuration in the tokens map. + fn add_token(&mut self, pos: TokenContractPosition, token: TokenConfiguration); +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/mod.rs new file mode 100644 index 00000000000..099f3e29b6f --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/mod.rs @@ -0,0 +1,7 @@ +pub mod token_configuration; +pub mod token_configuration_convention; +pub mod token_configuration_item; +pub mod token_distribution_key; +pub mod token_distribution_rules; +pub mod token_perpetual_distribution; +pub mod token_pre_programmed_distribution; diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs new file mode 100644 index 00000000000..2f063196a3e --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/mod.rs @@ -0,0 +1,242 @@ +pub mod v0; + +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration::accessors::v0::{ + TokenConfigurationV0Getters, TokenConfigurationV0Setters, +}; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::ChangeControlRules; +use crate::data_contract::GroupContractPosition; +use std::collections::BTreeSet; + +/// Implementing TokenConfigurationV0Getters for TokenConfiguration +impl TokenConfigurationV0Getters for TokenConfiguration { + /// Returns a reference to the conventions. + fn conventions(&self) -> &TokenConfigurationConvention { + match self { + TokenConfiguration::V0(v0) => v0.conventions(), + } + } + + /// Returns a mutable reference to the conventions. + fn conventions_mut(&mut self) -> &mut TokenConfigurationConvention { + match self { + TokenConfiguration::V0(v0) => v0.conventions_mut(), + } + } + + fn conventions_change_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.conventions_change_rules(), + } + } + + /// Returns the base supply. + fn base_supply(&self) -> TokenAmount { + match self { + TokenConfiguration::V0(v0) => v0.base_supply(), + } + } + + /// Returns if we keep history. + fn keeps_history(&self) -> bool { + match self { + TokenConfiguration::V0(v0) => v0.keeps_history(), + } + } + + /// Returns if we start as paused. + fn start_as_paused(&self) -> bool { + match self { + TokenConfiguration::V0(v0) => v0.start_as_paused(), + } + } + + /// Returns the maximum supply. + fn max_supply(&self) -> Option<TokenAmount> { + match self { + TokenConfiguration::V0(v0) => v0.max_supply(), + } + } + + /// Returns the max supply change rules. + fn max_supply_change_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.max_supply_change_rules(), + } + } + + fn distribution_rules(&self) -> &TokenDistributionRules { + match self { + TokenConfiguration::V0(v0) => v0.distribution_rules(), + } + } + + fn distribution_rules_mut(&mut self) -> &mut TokenDistributionRules { + match self { + TokenConfiguration::V0(v0) => v0.distribution_rules_mut(), + } + } + + /// Returns the manual minting rules. + fn manual_minting_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.manual_minting_rules(), + } + } + + /// Returns the manual burning rules. + fn manual_burning_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.manual_burning_rules(), + } + } + + /// Returns the freeze rules. + fn freeze_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.freeze_rules(), + } + } + + /// Returns the unfreeze rules. + fn unfreeze_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.unfreeze_rules(), + } + } + + fn destroy_frozen_funds_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.destroy_frozen_funds_rules(), + } + } + + fn emergency_action_rules(&self) -> &ChangeControlRules { + match self { + TokenConfiguration::V0(v0) => v0.emergency_action_rules(), + } + } + + /// Returns the main control group. + fn main_control_group(&self) -> Option<GroupContractPosition> { + match self { + TokenConfiguration::V0(v0) => v0.main_control_group(), + } + } + + /// Returns the main control group can be modified. + fn main_control_group_can_be_modified(&self) -> &AuthorizedActionTakers { + match self { + TokenConfiguration::V0(v0) => v0.main_control_group_can_be_modified(), + } + } + + /// Returns all group positions used in the token configuration + fn all_used_group_positions(&self) -> BTreeSet<GroupContractPosition> { + match self { + TokenConfiguration::V0(v0) => v0.all_used_group_positions(), + } + } +} + +/// Implementing TokenConfigurationV0Setters for TokenConfiguration +impl TokenConfigurationV0Setters for TokenConfiguration { + /// Sets the conventions. + fn set_conventions(&mut self, conventions: TokenConfigurationConvention) { + match self { + TokenConfiguration::V0(v0) => v0.set_conventions(conventions), + } + } + + /// Sets the conventions change rules. + fn set_conventions_change_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_conventions_change_rules(rules), + } + } + + /// Sets the base supply. + fn set_base_supply(&mut self, base_supply: u64) { + match self { + TokenConfiguration::V0(v0) => v0.set_base_supply(base_supply), + } + } + + /// Sets the maximum supply. + fn set_max_supply(&mut self, max_supply: Option<u64>) { + match self { + TokenConfiguration::V0(v0) => v0.set_max_supply(max_supply), + } + } + + /// Sets the max supply change rules. + fn set_max_supply_change_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_max_supply_change_rules(rules), + } + } + + fn set_distribution_rules(&mut self, rules: TokenDistributionRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_distribution_rules(rules), + } + } + + /// Sets the manual minting rules. + fn set_manual_minting_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_manual_minting_rules(rules), + } + } + + /// Sets the manual burning rules. + fn set_manual_burning_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_manual_burning_rules(rules), + } + } + + /// Sets the freeze rules. + fn set_freeze_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_freeze_rules(rules), + } + } + + /// Sets the unfreeze rules. + fn set_unfreeze_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_unfreeze_rules(rules), + } + } + + fn set_destroy_frozen_funds_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_destroy_frozen_funds_rules(rules), + } + } + + fn set_emergency_action_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenConfiguration::V0(v0) => v0.set_emergency_action_rules(rules), + } + } + + /// Sets the main control group. + fn set_main_control_group(&mut self, group: Option<GroupContractPosition>) { + match self { + TokenConfiguration::V0(v0) => v0.set_main_control_group(group), + } + } + + /// Sets the main control group can be modified. + fn set_main_control_group_can_be_modified(&mut self, action_takers: AuthorizedActionTakers) { + match self { + TokenConfiguration::V0(v0) => v0.set_main_control_group_can_be_modified(action_takers), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/v0/mod.rs new file mode 100644 index 00000000000..2ab5f7a6259 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/accessors/v0/mod.rs @@ -0,0 +1,104 @@ +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::ChangeControlRules; +use crate::data_contract::GroupContractPosition; +use std::collections::BTreeSet; + +/// Accessor trait for getters of `TokenConfigurationV0` +pub trait TokenConfigurationV0Getters { + /// Returns a reference to the conventions. + fn conventions(&self) -> &TokenConfigurationConvention; + + /// Returns a mutable reference to the conventions. + fn conventions_mut(&mut self) -> &mut TokenConfigurationConvention; + /// Returns the new tokens destination identity rules. + fn conventions_change_rules(&self) -> &ChangeControlRules; + + /// Returns the base supply. + fn base_supply(&self) -> TokenAmount; + /// Returns the base supply. + fn keeps_history(&self) -> bool; + fn start_as_paused(&self) -> bool; + + /// Returns the maximum supply. + fn max_supply(&self) -> Option<TokenAmount>; + + /// Returns the max supply change rules. + fn max_supply_change_rules(&self) -> &ChangeControlRules; + + /// Returns the distribution rules. + fn distribution_rules(&self) -> &TokenDistributionRules; + + /// Returns a mutable reference to the distribution rules. + fn distribution_rules_mut(&mut self) -> &mut TokenDistributionRules; + + /// Returns the manual minting rules. + fn manual_minting_rules(&self) -> &ChangeControlRules; + + /// Returns the manual burning rules. + fn manual_burning_rules(&self) -> &ChangeControlRules; + + /// Returns the freeze rules. + fn freeze_rules(&self) -> &ChangeControlRules; + + /// Returns the unfreeze rules. + fn unfreeze_rules(&self) -> &ChangeControlRules; + /// Returns the destroy frozen funds rules. + fn destroy_frozen_funds_rules(&self) -> &ChangeControlRules; + /// Returns the emergency action rules. + fn emergency_action_rules(&self) -> &ChangeControlRules; + + /// Returns the main control group. + fn main_control_group(&self) -> Option<GroupContractPosition>; + + /// Returns the main control group can be modified. + fn main_control_group_can_be_modified(&self) -> &AuthorizedActionTakers; + + /// Returns all group positions used in the token configuration + fn all_used_group_positions(&self) -> BTreeSet<GroupContractPosition>; +} + +/// Accessor trait for setters of `TokenConfigurationV0` +pub trait TokenConfigurationV0Setters { + /// Sets the conventions. + fn set_conventions(&mut self, conventions: TokenConfigurationConvention); + + /// Sets the conventions change rules. + fn set_conventions_change_rules(&mut self, rules: ChangeControlRules); + + /// Sets the base supply. + fn set_base_supply(&mut self, base_supply: TokenAmount); + + /// Sets the maximum supply. + fn set_max_supply(&mut self, max_supply: Option<TokenAmount>); + + /// Sets the max supply change rules. + fn set_max_supply_change_rules(&mut self, rules: ChangeControlRules); + + /// Sets the distribution rules. + fn set_distribution_rules(&mut self, rules: TokenDistributionRules); + + /// Sets the manual minting rules. + fn set_manual_minting_rules(&mut self, rules: ChangeControlRules); + + /// Sets the manual burning rules. + fn set_manual_burning_rules(&mut self, rules: ChangeControlRules); + + /// Sets the freeze rules. + fn set_freeze_rules(&mut self, rules: ChangeControlRules); + + /// Sets the unfreeze rules. + fn set_unfreeze_rules(&mut self, rules: ChangeControlRules); + /// Sets the `destroy frozen funds` rules. + fn set_destroy_frozen_funds_rules(&mut self, rules: ChangeControlRules); + /// Sets the emergency action rules. + fn set_emergency_action_rules(&mut self, rules: ChangeControlRules); + + /// Sets the main control group. + fn set_main_control_group(&mut self, group: Option<GroupContractPosition>); + + /// Sets the main control group can be modified. + fn set_main_control_group_can_be_modified(&mut self, action_takers: AuthorizedActionTakers); +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/mod.rs new file mode 100644 index 00000000000..9468c91ca76 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/mod.rs @@ -0,0 +1,18 @@ +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; + +mod v0; + +impl TokenConfiguration { + /// Applies a `TokenConfigurationChangeItem` to this token configuration. + /// + /// # Parameters + /// - `change_item`: The change item to be applied. + /// + /// This method modifies the current `TokenConfigurationV0` instance in place. + pub fn apply_token_configuration_item(&mut self, change_item: TokenConfigurationChangeItem) { + match self { + TokenConfiguration::V0(v0) => v0.apply_token_configuration_item(change_item), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/v0/mod.rs new file mode 100644 index 00000000000..e3d1c22f06b --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/v0/mod.rs @@ -0,0 +1,140 @@ +use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::{ + TokenDistributionRulesV0Getters, TokenDistributionRulesV0Setters, +}; + +impl TokenConfigurationV0 { + /// Applies a `TokenConfigurationChangeItem` to this token configuration. + /// + /// # Parameters + /// - `change_item`: The change item to be applied. + /// + /// This method modifies the current `TokenConfigurationV0` instance in place. + pub fn apply_token_configuration_item(&mut self, change_item: TokenConfigurationChangeItem) { + match change_item { + TokenConfigurationChangeItem::TokenConfigurationNoChange => { + // No changes are made + } + TokenConfigurationChangeItem::Conventions(conventions) => { + self.conventions = conventions; + } + TokenConfigurationChangeItem::ConventionsControlGroup(control_group) => { + self.conventions_change_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::ConventionsAdminGroup(admin_group) => { + self.conventions_change_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::MaxSupply(max_supply) => { + self.max_supply = max_supply; + } + TokenConfigurationChangeItem::MaxSupplyControlGroup(control_group) => { + self.max_supply_change_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::MaxSupplyAdminGroup(admin_group) => { + self.max_supply_change_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::NewTokensDestinationIdentity(identity) => { + self.distribution_rules + .set_new_tokens_destination_identity(identity); + } + TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + control_group, + ) => { + self.distribution_rules + .new_tokens_destination_identity_rules_mut() + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup(admin_group) => { + self.distribution_rules + .new_tokens_destination_identity_rules_mut() + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::MintingAllowChoosingDestination(allow) => { + self.distribution_rules + .set_minting_allow_choosing_destination(allow); + } + TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + control_group, + ) => { + self.distribution_rules + .minting_allow_choosing_destination_rules_mut() + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + admin_group, + ) => { + self.distribution_rules + .minting_allow_choosing_destination_rules_mut() + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::PerpetualDistribution(perpetual_distribution) => { + self.distribution_rules + .set_perpetual_distribution(perpetual_distribution); + } + TokenConfigurationChangeItem::PerpetualDistributionControlGroup(control_group) => { + self.distribution_rules + .perpetual_distribution_rules_mut() + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::PerpetualDistributionAdminGroup(admin_group) => { + self.distribution_rules + .perpetual_distribution_rules_mut() + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::ManualMinting(control_group) => { + self.manual_minting_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::ManualMintingAdminGroup(admin_group) => { + self.manual_minting_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::ManualBurning(control_group) => { + self.manual_burning_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::ManualBurningAdminGroup(admin_group) => { + self.manual_burning_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::Freeze(control_group) => { + self.freeze_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::FreezeAdminGroup(admin_group) => { + self.freeze_rules.set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::Unfreeze(control_group) => { + self.unfreeze_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::UnfreezeAdminGroup(admin_group) => { + self.unfreeze_rules.set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::DestroyFrozenFunds(control_group) => { + self.destroy_frozen_funds_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(admin_group) => { + self.destroy_frozen_funds_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::EmergencyAction(control_group) => { + self.emergency_action_rules + .set_authorized_to_make_change_action_takers(control_group); + } + TokenConfigurationChangeItem::EmergencyActionAdminGroup(admin_group) => { + self.emergency_action_rules + .set_admin_action_takers(admin_group); + } + TokenConfigurationChangeItem::MainControlGroup(main_group) => { + self.main_control_group = main_group; + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/mod.rs new file mode 100644 index 00000000000..3a52cff1297 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/mod.rs @@ -0,0 +1,25 @@ +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; + +mod v0; + +impl TokenConfiguration { + /// Returns the authorized action takers for a specific `TokenConfigurationChangeItem`. + /// + /// # Parameters + /// - `change_item`: The change item for which to retrieve the authorized action takers. + /// + /// # Returns + /// - `AuthorizedActionTakers`: The authorized action takers for the given change item. + pub fn authorized_action_takers_for_configuration_item( + &self, + change_item: &TokenConfigurationChangeItem, + ) -> AuthorizedActionTakers { + match self { + TokenConfiguration::V0(v0) => { + v0.authorized_action_takers_for_configuration_item(change_item) + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/v0/mod.rs new file mode 100644 index 00000000000..3549db93b15 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/v0/mod.rs @@ -0,0 +1,127 @@ +use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +impl TokenConfigurationV0 { + /// Returns the authorized action takers for a specific `TokenConfigurationChangeItem`. + /// + /// # Parameters + /// - `change_item`: The change item for which to retrieve the authorized action takers. + /// + /// # Returns + /// - `AuthorizedActionTakers`: The authorized action takers for the given change item. + pub fn authorized_action_takers_for_configuration_item( + &self, + change_item: &TokenConfigurationChangeItem, + ) -> AuthorizedActionTakers { + match change_item { + TokenConfigurationChangeItem::TokenConfigurationNoChange => { + AuthorizedActionTakers::NoOne + } + TokenConfigurationChangeItem::Conventions(_) => self + .conventions_change_rules + .authorized_to_make_change_action_takers() + .clone(), + TokenConfigurationChangeItem::ConventionsControlGroup(_) => { + self.conventions_change_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::ConventionsAdminGroup(_) => { + self.conventions_change_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::MaxSupply(_) => self + .max_supply_change_rules + .authorized_to_make_change_action_takers() + .clone(), + TokenConfigurationChangeItem::MaxSupplyControlGroup(_) => { + self.max_supply_change_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::MaxSupplyAdminGroup(_) => { + self.max_supply_change_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::PerpetualDistribution(_) => self + .distribution_rules + .perpetual_distribution_rules() + .authorized_to_make_change_action_takers() + .clone(), + TokenConfigurationChangeItem::PerpetualDistributionControlGroup(_) => self + .distribution_rules + .perpetual_distribution_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::PerpetualDistributionAdminGroup(_) => self + .distribution_rules + .perpetual_distribution_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::NewTokensDestinationIdentity(_) => self + .distribution_rules + .new_tokens_destination_identity_rules() + .authorized_to_make_change_action_takers() + .clone(), + TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup(_) => self + .distribution_rules + .new_tokens_destination_identity_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup(_) => self + .distribution_rules + .new_tokens_destination_identity_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::MintingAllowChoosingDestination(_) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .authorized_to_make_change_action_takers() + .clone(), + TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup(_) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup(_) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::ManualMinting(_) => { + self.manual_minting_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::ManualMintingAdminGroup(_) => { + self.manual_minting_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::ManualBurning(_) => { + self.manual_burning_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::ManualBurningAdminGroup(_) => { + self.manual_burning_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::Freeze(_) => { + self.freeze_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::FreezeAdminGroup(_) => { + self.freeze_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::Unfreeze(_) => { + self.unfreeze_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::UnfreezeAdminGroup(_) => { + self.unfreeze_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::DestroyFrozenFunds(_) => self + .destroy_frozen_funds_rules + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(_) => self + .destroy_frozen_funds_rules + .admin_action_takers() + .clone(), + TokenConfigurationChangeItem::EmergencyAction(_) => { + self.emergency_action_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::EmergencyActionAdminGroup(_) => { + self.emergency_action_rules.admin_action_takers().clone() + } + TokenConfigurationChangeItem::MainControlGroup(_) => AuthorizedActionTakers::NoOne, + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/mod.rs new file mode 100644 index 00000000000..8aa4d41a4ba --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/mod.rs @@ -0,0 +1,38 @@ +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use platform_value::Identifier; +use std::collections::BTreeMap; + +mod v0; + +impl TokenConfiguration { + /// Applies a `TokenConfigurationChangeItem` to this token configuration. + /// + /// # Parameters + /// - `change_item`: The change item to be applied. + /// + /// This method modifies the current `TokenConfigurationV0` instance in place. + pub fn can_apply_token_configuration_item( + &self, + change_item: &TokenConfigurationChangeItem, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match self { + TokenConfiguration::V0(v0) => v0.can_apply_token_configuration_item( + change_item, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/v0/mod.rs new file mode 100644 index 00000000000..d83cdc4b10e --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/v0/mod.rs @@ -0,0 +1,287 @@ +use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use platform_value::Identifier; +use std::collections::BTreeMap; + +impl TokenConfigurationV0 { + /// Determines whether a `TokenConfigurationChangeItem` can be applied to this token configuration. + /// + /// # Parameters + /// - `change_item`: The change item to evaluate. + /// - `contract_owner_id`: The ID of the contract owner. + /// - `main_group`: The main control group position, if any. + /// - `groups`: A map of group positions to their respective `Group` instances. + /// - `action_taker`: The entity attempting the action. + /// - `goal`: The goal of the action being attempted. + /// + /// Returns `true` if the change item can be applied, `false` otherwise. + pub fn can_apply_token_configuration_item( + &self, + change_item: &TokenConfigurationChangeItem, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match change_item { + TokenConfigurationChangeItem::TokenConfigurationNoChange => false, + TokenConfigurationChangeItem::Conventions(_) => self + .conventions_change_rules + .can_make_change(contract_owner_id, main_group, groups, action_taker, goal), + TokenConfigurationChangeItem::ConventionsControlGroup(control_group) => self + .conventions_change_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::ConventionsAdminGroup(admin_group) => self + .conventions_change_rules + .can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::MaxSupply(_) => self + .max_supply_change_rules + .can_make_change(contract_owner_id, main_group, groups, action_taker, goal), + TokenConfigurationChangeItem::MaxSupplyControlGroup(control_group) => self + .max_supply_change_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::MaxSupplyAdminGroup(admin_group) => { + self.max_supply_change_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::PerpetualDistribution(_) => self + .distribution_rules + .perpetual_distribution_rules() + .can_make_change(contract_owner_id, main_group, groups, action_taker, goal), + TokenConfigurationChangeItem::PerpetualDistributionControlGroup(control_group) => self + .distribution_rules + .perpetual_distribution_rules() + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::PerpetualDistributionAdminGroup(admin_group) => self + .distribution_rules + .perpetual_distribution_rules() + .can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::NewTokensDestinationIdentity(_) => self + .distribution_rules + .new_tokens_destination_identity_rules() + .can_make_change(contract_owner_id, main_group, groups, action_taker, goal), + TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + control_group, + ) => self + .distribution_rules + .new_tokens_destination_identity_rules() + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup(admin_group) => { + self.distribution_rules + .new_tokens_destination_identity_rules() + .can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::MintingAllowChoosingDestination(_) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .can_make_change(contract_owner_id, main_group, groups, action_taker, goal), + TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + control_group, + ) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + admin_group, + ) => self + .distribution_rules + .minting_allow_choosing_destination_rules() + .can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::ManualMinting(control_group) => self + .manual_minting_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::ManualMintingAdminGroup(admin_group) => { + self.manual_minting_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::ManualBurning(control_group) => self + .manual_burning_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::ManualBurningAdminGroup(admin_group) => { + self.manual_burning_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::Freeze(control_group) => { + self.freeze_rules.can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::FreezeAdminGroup(admin_group) => { + self.freeze_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::Unfreeze(control_group) => { + self.unfreeze_rules.can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::UnfreezeAdminGroup(admin_group) => { + self.unfreeze_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::DestroyFrozenFunds(control_group) => self + .destroy_frozen_funds_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(admin_group) => self + .destroy_frozen_funds_rules + .can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::EmergencyAction(control_group) => self + .emergency_action_rules + .can_change_authorized_action_takers( + control_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + TokenConfigurationChangeItem::EmergencyActionAdminGroup(admin_group) => { + self.emergency_action_rules.can_change_admin_action_takers( + admin_group, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + TokenConfigurationChangeItem::MainControlGroup(_) => false, // Main control group cannot be updated directly + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/mod.rs new file mode 100644 index 00000000000..85a371e7395 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/mod.rs @@ -0,0 +1,5 @@ +mod apply_token_configuration_item; +mod authorized_action_takers_for_configuration_item; +mod can_apply_token_configuration_item; +mod validate_token_configuration_groups_exist; +mod validate_token_configuration_update; diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/mod.rs new file mode 100644 index 00000000000..d4d5d285fe5 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/mod.rs @@ -0,0 +1,50 @@ +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; + +impl TokenConfiguration { + /// Validates that all group positions referenced in the token configuration exist in the provided groups map. + /// + /// # Parameters + /// - `groups`: A reference to a `BTreeMap` containing group positions as keys and their associated `Group` objects as values. + /// These represent the groups defined in the data contract. + /// - `platform_version`: A reference to the `PlatformVersion` object specifying the version of the function to call. + /// + /// # Returns + /// - `Ok(SimpleConsensusValidationResult)`: If the validation is successful, returns a result containing a validation result object, + /// which will be empty if no errors are found. + /// - `Err(ProtocolError)`: If an unknown or unsupported platform version is specified, an error indicating a version mismatch is returned. + /// + /// # Errors + /// - If a group position referenced in the token configuration does not exist in the provided `groups` map, the method will invoke the + /// version-specific validation logic, which will include any corresponding validation errors. + /// + /// # Versioning + /// - This function dispatches to version-specific validation logic based on the `platform_version`. + /// - Currently supports `validate_token_config_groups_exist_v0` for version `0`. + pub fn validate_token_config_groups_exist( + &self, + groups: &BTreeMap<GroupContractPosition, Group>, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + match platform_version + .dpp + .validation + .data_contract + .validate_token_config_groups_exist + { + 0 => Ok(self.validate_token_config_groups_exist_v0(groups)), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "validate_token_config_groups_exist".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/v0/mod.rs new file mode 100644 index 00000000000..e49571e07e7 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_groups_exist/v0/mod.rs @@ -0,0 +1,42 @@ +use crate::consensus::basic::data_contract::GroupPositionDoesNotExistError; +use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::validation::SimpleConsensusValidationResult; +use std::collections::BTreeMap; + +impl TokenConfiguration { + #[inline(always)] + pub(super) fn validate_token_config_groups_exist_v0( + &self, + groups: &BTreeMap<GroupContractPosition, Group>, + ) -> SimpleConsensusValidationResult { + // Initialize validation result + let validation_result = SimpleConsensusValidationResult::new(); + + // Collect all group positions used in the token configuration + let group_positions = self.all_used_group_positions(); + + // Check that all referenced group positions exist in the provided groups map + for group_position in group_positions { + if !groups.contains_key(&group_position) { + return SimpleConsensusValidationResult::new_with_error( + GroupPositionDoesNotExistError::new(group_position).into(), + ); + } + } + + // If a main group is defined in the token configuration, verify its existence + if let Some(main_group_position) = self.main_control_group() { + if !groups.contains_key(&main_group_position) { + return SimpleConsensusValidationResult::new_with_error( + GroupPositionDoesNotExistError::new(main_group_position).into(), + ); + } + } + + // If we reach here with no errors, return an empty result + validation_result + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/mod.rs new file mode 100644 index 00000000000..a0a12019fbf --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/mod.rs @@ -0,0 +1,43 @@ +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; + +impl TokenConfiguration { + pub fn validate_token_config_update( + &self, + new_config: &TokenConfiguration, + contract_owner_id: &Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + match platform_version + .dpp + .validation + .data_contract + .validate_token_config_update + { + 0 => Ok(self.validate_token_config_update_v0( + new_config, + contract_owner_id, + groups, + action_taker, + goal, + )), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "validate_token_config_update".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/v0/mod.rs new file mode 100644 index 00000000000..4a5f3681840 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/v0/mod.rs @@ -0,0 +1,361 @@ +use crate::consensus::basic::data_contract::DataContractTokenConfigurationUpdateError; +use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use crate::validation::SimpleConsensusValidationResult; +use platform_value::Identifier; +use std::collections::BTreeMap; + +impl TokenConfiguration { + #[inline(always)] + pub(super) fn validate_token_config_update_v0( + &self, + new_config: &TokenConfiguration, + contract_owner_id: &Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> SimpleConsensusValidationResult { + let old = self.as_cow_v0(); + let new = new_config.as_cow_v0(); + + // Check immutable fields: conventions + if old.conventions != new.conventions + || old.conventions_change_rules != new.conventions_change_rules + { + if !old.conventions_change_rules.can_change_to( + &new.conventions_change_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "conventions or conventionsRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check immutable fields: base_supply + if old.base_supply != new.base_supply { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "baseSupply".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + + // Check changes to max_supply and max_supply_change_rules + if old.max_supply != new.max_supply + || old.max_supply_change_rules != new.max_supply_change_rules + { + if !old.max_supply_change_rules.can_change_to( + &new.max_supply_change_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "maxSupply or maxSupplyChangeRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to new_tokens_destination_identity and rules + if old.distribution_rules.new_tokens_destination_identity() + != new.distribution_rules.new_tokens_destination_identity() + || old + .distribution_rules + .new_tokens_destination_identity_rules() + != new + .distribution_rules + .new_tokens_destination_identity_rules() + { + if !old + .distribution_rules + .new_tokens_destination_identity_rules() + .can_change_to( + &new.distribution_rules + .new_tokens_destination_identity_rules(), + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) + { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "newTokensDestinationIdentity or newTokensDestinationIdentityRules" + .to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to minting_allow_choosing_destination and its rules + if old.distribution_rules.minting_allow_choosing_destination() + != new.distribution_rules.minting_allow_choosing_destination() + || old + .distribution_rules + .minting_allow_choosing_destination_rules() + != new + .distribution_rules + .minting_allow_choosing_destination_rules() + { + if !old + .distribution_rules + .minting_allow_choosing_destination_rules() + .can_change_to( + &new.distribution_rules + .minting_allow_choosing_destination_rules(), + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) + { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "mintingAllowChoosingDestination or mintingAllowChoosingDestinationRules" + .to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to perpetual_distribution and its rules + if old.distribution_rules.perpetual_distribution() + != new.distribution_rules.perpetual_distribution() + || old.distribution_rules.perpetual_distribution_rules() + != new.distribution_rules.perpetual_distribution_rules() + { + if !old + .distribution_rules + .perpetual_distribution_rules() + .can_change_to( + &new.distribution_rules.perpetual_distribution_rules(), + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) + { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "perpetualDistribution or perpetualDistributionRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to manual_minting_rules + if old.manual_minting_rules != new.manual_minting_rules { + if !old.manual_minting_rules.can_change_to( + &new.manual_minting_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "manualMintingRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to manual_burning_rules + if old.manual_burning_rules != new.manual_burning_rules { + if !old.manual_burning_rules.can_change_to( + &new.manual_burning_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "manualBurningRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to freeze_rules + if old.freeze_rules != new.freeze_rules { + if !old.freeze_rules.can_change_to( + &new.freeze_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "freezeRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to unfreeze_rules + if old.unfreeze_rules != new.unfreeze_rules { + if !old.unfreeze_rules.can_change_to( + &new.unfreeze_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "unfreezeRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to destroy_frozen_funds_rules + if old.destroy_frozen_funds_rules != new.destroy_frozen_funds_rules { + if !old.destroy_frozen_funds_rules.can_change_to( + &new.destroy_frozen_funds_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "destroyFrozenFundsRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to emergency_action_rules + if old.emergency_action_rules != new.emergency_action_rules { + if !old.emergency_action_rules.can_change_to( + &new.emergency_action_rules, + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "emergencyActionRules".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to main_control_group + if old.main_control_group != new.main_control_group { + if !old + .main_control_group_can_be_modified + .allowed_for_action_taker( + contract_owner_id, + self.main_control_group(), + groups, + action_taker, + goal, + ) + { + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "mainControlGroup".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + } + + // Check changes to main_control_group_can_be_modified + if old.main_control_group_can_be_modified != new.main_control_group_can_be_modified { + // Assuming this is immutable + return SimpleConsensusValidationResult::new_with_error( + DataContractTokenConfigurationUpdateError::new( + "update".to_string(), + "mainControlGroupCanBeModified".to_string(), + self.clone(), + new_config.clone(), + ) + .into(), + ); + } + + // If we reach here with no errors, return an empty result + SimpleConsensusValidationResult::new() + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs new file mode 100644 index 00000000000..e5e34c66646 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/mod.rs @@ -0,0 +1,33 @@ +use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; +use bincode::{Decode, Encode}; +use derive_more::From; +use serde::{Deserialize, Serialize}; +use std::borrow::Cow; +use std::fmt; + +pub mod accessors; +mod methods; +pub mod v0; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)] +#[serde(tag = "$format_version")] +pub enum TokenConfiguration { + #[serde(rename = "0")] + V0(TokenConfigurationV0), +} + +impl TokenConfiguration { + pub fn as_cow_v0(&self) -> Cow<TokenConfigurationV0> { + match self { + TokenConfiguration::V0(v0) => Cow::Borrowed(v0), + } + } +} + +impl fmt::Display for TokenConfiguration { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenConfiguration::V0(v0) => write!(f, "{}", v0), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/accessors.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/accessors.rs new file mode 100644 index 00000000000..7a289badbde --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/accessors.rs @@ -0,0 +1,222 @@ +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration::accessors::v0::{ + TokenConfigurationV0Getters, TokenConfigurationV0Setters, +}; +use crate::data_contract::associated_token::token_configuration::v0::{ + TokenConfigurationConvention, TokenConfigurationV0, +}; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::ChangeControlRules; +use crate::data_contract::GroupContractPosition; +use std::collections::BTreeSet; + +/// Implementing `TokenConfigurationV0Getters` for `TokenConfigurationV0` +impl TokenConfigurationV0Getters for TokenConfigurationV0 { + /// Returns a reference to the conventions. + fn conventions(&self) -> &TokenConfigurationConvention { + &self.conventions + } + + /// Returns a mutable reference to the conventions. + fn conventions_mut(&mut self) -> &mut TokenConfigurationConvention { + &mut self.conventions + } + + /// Returns the conventions change rules. + fn conventions_change_rules(&self) -> &ChangeControlRules { + &self.conventions_change_rules + } + + /// Returns the base supply. + fn base_supply(&self) -> TokenAmount { + self.base_supply + } + + /// Returns if we keep history. + fn keeps_history(&self) -> bool { + self.keeps_history + } + + /// Returns if we start off as paused + fn start_as_paused(&self) -> bool { + self.start_as_paused + } + + /// Returns the maximum supply. + fn max_supply(&self) -> Option<TokenAmount> { + self.max_supply + } + + /// Returns the max supply change rules. + fn max_supply_change_rules(&self) -> &ChangeControlRules { + &self.max_supply_change_rules + } + + fn distribution_rules(&self) -> &TokenDistributionRules { + &self.distribution_rules + } + + fn distribution_rules_mut(&mut self) -> &mut TokenDistributionRules { + &mut self.distribution_rules + } + + /// Returns the manual minting rules. + fn manual_minting_rules(&self) -> &ChangeControlRules { + &self.manual_minting_rules + } + + /// Returns the manual burning rules. + fn manual_burning_rules(&self) -> &ChangeControlRules { + &self.manual_burning_rules + } + + /// Returns the freeze rules. + fn freeze_rules(&self) -> &ChangeControlRules { + &self.freeze_rules + } + + /// Returns the unfreeze rules. + fn unfreeze_rules(&self) -> &ChangeControlRules { + &self.unfreeze_rules + } + + /// Returns the `destroy frozen funds` rules. + fn destroy_frozen_funds_rules(&self) -> &ChangeControlRules { + &self.destroy_frozen_funds_rules + } + + /// Returns the emergency action rules. + fn emergency_action_rules(&self) -> &ChangeControlRules { + &self.emergency_action_rules + } + + /// Returns the main control group. + fn main_control_group(&self) -> Option<GroupContractPosition> { + self.main_control_group + } + + /// Returns the main control group can be modified. + fn main_control_group_can_be_modified(&self) -> &AuthorizedActionTakers { + &self.main_control_group_can_be_modified + } + + /// Returns all group positions used in the token configuration + fn all_used_group_positions(&self) -> BTreeSet<GroupContractPosition> { + let mut group_positions = BTreeSet::new(); + + // Add the main control group if it exists + if let Some(main_group_position) = self.main_control_group { + group_positions.insert(main_group_position); + } + + // Helper function to extract group positions from `AuthorizedActionTakers` + let mut add_from_authorized_action_takers = |authorized_takers: &AuthorizedActionTakers| { + if let AuthorizedActionTakers::Group(group_position) = authorized_takers { + group_positions.insert(*group_position); + } + }; + + // Add positions from change control rules + let mut add_from_change_control_rules = |rules: &ChangeControlRules| { + add_from_authorized_action_takers(rules.authorized_to_make_change_action_takers()); + add_from_authorized_action_takers(rules.admin_action_takers()); + }; + + // Apply the helper to all fields containing `ChangeControlRules` + add_from_change_control_rules(&self.max_supply_change_rules); + add_from_change_control_rules(&self.conventions_change_rules); + add_from_change_control_rules( + self.distribution_rules + .new_tokens_destination_identity_rules(), + ); + add_from_change_control_rules( + self.distribution_rules + .minting_allow_choosing_destination_rules(), + ); + add_from_change_control_rules(self.distribution_rules.perpetual_distribution_rules()); + add_from_change_control_rules(&self.manual_minting_rules); + add_from_change_control_rules(&self.manual_burning_rules); + add_from_change_control_rules(&self.freeze_rules); + add_from_change_control_rules(&self.unfreeze_rules); + add_from_change_control_rules(&self.destroy_frozen_funds_rules); + add_from_change_control_rules(&self.emergency_action_rules); + + // Add positions from the `main_control_group_can_be_modified` field + add_from_authorized_action_takers(&self.main_control_group_can_be_modified); + + group_positions + } +} + +/// Implementing `TokenConfigurationV0Setters` for `TokenConfigurationV0` +impl TokenConfigurationV0Setters for TokenConfigurationV0 { + /// Sets the conventions. + fn set_conventions(&mut self, conventions: TokenConfigurationConvention) { + self.conventions = conventions; + } + + /// Sets the new conventions change rules. + fn set_conventions_change_rules(&mut self, rules: ChangeControlRules) { + self.conventions_change_rules = rules; + } + + /// Sets the base supply. + fn set_base_supply(&mut self, base_supply: TokenAmount) { + self.base_supply = base_supply; + } + + /// Sets the maximum supply. + fn set_max_supply(&mut self, max_supply: Option<TokenAmount>) { + self.max_supply = max_supply; + } + + /// Sets the max supply change rules. + fn set_max_supply_change_rules(&mut self, rules: ChangeControlRules) { + self.max_supply_change_rules = rules; + } + + fn set_distribution_rules(&mut self, rules: TokenDistributionRules) { + self.distribution_rules = rules; + } + /// Sets the manual minting rules. + fn set_manual_minting_rules(&mut self, rules: ChangeControlRules) { + self.manual_minting_rules = rules; + } + + /// Sets the manual burning rules. + fn set_manual_burning_rules(&mut self, rules: ChangeControlRules) { + self.manual_burning_rules = rules; + } + + /// Sets the freeze rules. + fn set_freeze_rules(&mut self, rules: ChangeControlRules) { + self.freeze_rules = rules; + } + + /// Sets the unfreeze rules. + fn set_unfreeze_rules(&mut self, rules: ChangeControlRules) { + self.unfreeze_rules = rules; + } + + /// Sets the destroy frozen funds rules. + fn set_destroy_frozen_funds_rules(&mut self, rules: ChangeControlRules) { + self.destroy_frozen_funds_rules = rules; + } + + /// Sets the emergency action rules. + fn set_emergency_action_rules(&mut self, rules: ChangeControlRules) { + self.emergency_action_rules = rules; + } + + /// Sets the main control group. + fn set_main_control_group(&mut self, group: Option<GroupContractPosition>) { + self.main_control_group = group; + } + + /// Sets the main control group can be modified. + fn set_main_control_group_can_be_modified(&mut self, action_takers: AuthorizedActionTakers) { + self.main_control_group_can_be_modified = action_takers; + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/mod.rs new file mode 100644 index 00000000000..0c8ccb6dc3e --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/mod.rs @@ -0,0 +1,258 @@ +mod accessors; + +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationConventionV0; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::data_contract::associated_token::token_distribution_rules::v0::TokenDistributionRulesV0; +use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::v0::ChangeControlRulesV0; +use crate::data_contract::change_control_rules::ChangeControlRules; +use crate::data_contract::GroupContractPosition; +use bincode::{Decode, Encode}; +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TokenConfigurationV0 { + pub conventions: TokenConfigurationConvention, + /// Who can change the conventions + #[serde(default = "default_change_control_rules")] + pub conventions_change_rules: ChangeControlRules, + /// The supply at the creation of the token + pub base_supply: TokenAmount, + /// The maximum supply the token can ever have + #[serde(default)] + pub max_supply: Option<TokenAmount>, + /// Do we keep history, default is true. + #[serde(default = "default_keeps_history")] + pub keeps_history: bool, + /// Do we start off as paused, meaning that we can not transfer till we unpause. + #[serde(default = "default_starts_as_paused")] + pub start_as_paused: bool, + /// Who can change the max supply + /// Even if set no one can ever change this under the base supply + #[serde(default = "default_change_control_rules")] + pub max_supply_change_rules: ChangeControlRules, + /// The distribution rules for the token + #[serde(default = "default_token_distribution_rules")] + pub distribution_rules: TokenDistributionRules, + #[serde(default = "default_contract_owner_change_control_rules")] + pub manual_minting_rules: ChangeControlRules, + #[serde(default = "default_contract_owner_change_control_rules")] + pub manual_burning_rules: ChangeControlRules, + #[serde(default = "default_change_control_rules")] + pub freeze_rules: ChangeControlRules, + #[serde(default = "default_change_control_rules")] + pub unfreeze_rules: ChangeControlRules, + #[serde(default = "default_change_control_rules")] + pub destroy_frozen_funds_rules: ChangeControlRules, + #[serde(default = "default_change_control_rules")] + pub emergency_action_rules: ChangeControlRules, + #[serde(default)] + pub main_control_group: Option<GroupContractPosition>, + #[serde(default)] + pub main_control_group_can_be_modified: AuthorizedActionTakers, +} + +// Default function for `keeps_history` +fn default_keeps_history() -> bool { + true // Default to `true` for keeps_history +} + +// Default function for `starts_as_paused` +fn default_starts_as_paused() -> bool { + false +} + +fn default_token_distribution_rules() -> TokenDistributionRules { + TokenDistributionRules::V0(TokenDistributionRulesV0 { + perpetual_distribution: None, + perpetual_distribution_rules: ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + pre_programmed_distribution: None, + new_tokens_destination_identity: None, + new_tokens_destination_identity_rules: ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + minting_allow_choosing_destination: true, + minting_allow_choosing_destination_rules: ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + }) +} + +fn default_change_control_rules() -> ChangeControlRules { + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }) +} + +fn default_contract_owner_change_control_rules() -> ChangeControlRules { + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }) +} + +impl fmt::Display for TokenConfigurationV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "TokenConfigurationV0 {{\n conventions: {:?},\n conventions_change_rules: {:?},\n base_supply: {},\n max_supply: {:?},\n keeps_history: {},\n start_as_paused: {},\n max_supply_change_rules: {:?},\n distribution_rules: {},\n manual_minting_rules: {:?},\n manual_burning_rules: {:?},\n freeze_rules: {:?},\n unfreeze_rules: {:?},\n destroy_frozen_funds_rules: {:?},\n emergency_action_rules: {:?},\n main_control_group: {:?},\n main_control_group_can_be_modified: {:?}\n}}", + self.conventions, + self.conventions_change_rules, + self.base_supply, + self.max_supply, + self.keeps_history, + self.start_as_paused, + self.max_supply_change_rules, + self.distribution_rules, + self.manual_minting_rules, + self.manual_burning_rules, + self.freeze_rules, + self.unfreeze_rules, + self.destroy_frozen_funds_rules, + self.emergency_action_rules, + self.main_control_group, + self.main_control_group_can_be_modified + ) + } +} + +impl TokenConfigurationV0 { + pub fn default_most_restrictive() -> Self { + Self { + conventions: TokenConfigurationConvention::V0(TokenConfigurationConventionV0 { + localizations: Default::default(), + decimals: 8, + }), + conventions_change_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + base_supply: 100000, + max_supply: None, + keeps_history: true, + start_as_paused: false, + max_supply_change_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + distribution_rules: TokenDistributionRules::V0(TokenDistributionRulesV0 { + perpetual_distribution: None, + perpetual_distribution_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + pre_programmed_distribution: None, + new_tokens_destination_identity: None, + new_tokens_destination_identity_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + minting_allow_choosing_destination: true, + minting_allow_choosing_destination_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + }), + manual_minting_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + manual_burning_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + freeze_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + unfreeze_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + destroy_frozen_funds_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + emergency_action_rules: ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + } + .into(), + main_control_group: None, + main_control_group_can_be_modified: AuthorizedActionTakers::NoOne, + } + } + + pub fn with_base_supply(mut self, base_supply: TokenAmount) -> Self { + self.base_supply = base_supply; + self + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs new file mode 100644 index 00000000000..76a4ed1370c --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/mod.rs @@ -0,0 +1,25 @@ +use crate::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationConventionV0; +use bincode::{Decode, Encode}; +use derive_more::From; +use serde::{Deserialize, Serialize}; + +pub mod v0; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, PartialOrd, From)] +#[serde(tag = "$format_version")] +pub enum TokenConfigurationConvention { + #[serde(rename = "0")] + V0(TokenConfigurationConventionV0), +} + +use std::fmt; + +impl fmt::Display for TokenConfigurationConvention { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenConfigurationConvention::V0(v0) => { + write!(f, "{}", v0) //just pass through + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs new file mode 100644 index 00000000000..6ea538cc6e5 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_convention/v0/mod.rs @@ -0,0 +1,56 @@ +use bincode::Encode; +use platform_serialization::de::Decode; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd)] +#[serde(rename_all = "camelCase")] +pub struct TokenConfigurationLocalizationsV0 { + pub should_capitalize: bool, + pub singular_form: String, + pub plural_form: String, +} + +impl fmt::Display for TokenConfigurationLocalizationsV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "Capitalized: {}, Singular: '{}', Plural: '{}'", + self.should_capitalize, self.singular_form, self.plural_form + ) + } +} + +#[derive( + Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd, Default, +)] +#[serde(rename_all = "camelCase")] +pub struct TokenConfigurationConventionV0 { + #[serde(default)] + pub localizations: BTreeMap<String, TokenConfigurationLocalizationsV0>, + #[serde(default = "default_decimals")] + pub decimals: u16, +} + +// Default function for `decimals` +fn default_decimals() -> u16 { + 8 // Default value for decimals +} + +impl fmt::Display for TokenConfigurationConventionV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let localizations: Vec<String> = self + .localizations + .iter() + .map(|(key, value)| format!("{}: {}", key, value)) + .collect(); + + write!( + f, + "Decimals: {}, Localizations: [{}]", + self.decimals, + localizations.join(", ") + ) + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs new file mode 100644 index 00000000000..e91788708e9 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs @@ -0,0 +1,220 @@ +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::Encode; +use platform_serialization::de::Decode; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive( + Debug, + Clone, + Default, + PartialOrd, + Encode, + Decode, + PlatformSerialize, + PlatformDeserialize, + PartialEq, + Eq, +)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub enum TokenConfigurationChangeItem { + #[default] + TokenConfigurationNoChange, + Conventions(TokenConfigurationConvention), + ConventionsControlGroup(AuthorizedActionTakers), + ConventionsAdminGroup(AuthorizedActionTakers), + MaxSupply(Option<TokenAmount>), + MaxSupplyControlGroup(AuthorizedActionTakers), + MaxSupplyAdminGroup(AuthorizedActionTakers), + PerpetualDistribution(Option<TokenPerpetualDistribution>), + PerpetualDistributionControlGroup(AuthorizedActionTakers), + PerpetualDistributionAdminGroup(AuthorizedActionTakers), + NewTokensDestinationIdentity(Option<Identifier>), + NewTokensDestinationIdentityControlGroup(AuthorizedActionTakers), + NewTokensDestinationIdentityAdminGroup(AuthorizedActionTakers), + MintingAllowChoosingDestination(bool), + MintingAllowChoosingDestinationControlGroup(AuthorizedActionTakers), + MintingAllowChoosingDestinationAdminGroup(AuthorizedActionTakers), + ManualMinting(AuthorizedActionTakers), + ManualMintingAdminGroup(AuthorizedActionTakers), + ManualBurning(AuthorizedActionTakers), + ManualBurningAdminGroup(AuthorizedActionTakers), + Freeze(AuthorizedActionTakers), + FreezeAdminGroup(AuthorizedActionTakers), + Unfreeze(AuthorizedActionTakers), + UnfreezeAdminGroup(AuthorizedActionTakers), + DestroyFrozenFunds(AuthorizedActionTakers), + DestroyFrozenFundsAdminGroup(AuthorizedActionTakers), + EmergencyAction(AuthorizedActionTakers), + EmergencyActionAdminGroup(AuthorizedActionTakers), + MainControlGroup(Option<GroupContractPosition>), +} +impl TokenConfigurationChangeItem { + pub fn u8_item_index(&self) -> u8 { + match self { + TokenConfigurationChangeItem::TokenConfigurationNoChange => 0, + TokenConfigurationChangeItem::Conventions(_) => 1, + TokenConfigurationChangeItem::ConventionsControlGroup(_) => 2, + TokenConfigurationChangeItem::ConventionsAdminGroup(_) => 3, + TokenConfigurationChangeItem::MaxSupply(_) => 4, + TokenConfigurationChangeItem::MaxSupplyControlGroup(_) => 5, + TokenConfigurationChangeItem::MaxSupplyAdminGroup(_) => 6, + TokenConfigurationChangeItem::PerpetualDistribution(_) => 7, + TokenConfigurationChangeItem::PerpetualDistributionControlGroup(_) => 8, + TokenConfigurationChangeItem::PerpetualDistributionAdminGroup(_) => 9, + TokenConfigurationChangeItem::NewTokensDestinationIdentity(_) => 10, + TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup(_) => 11, + TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup(_) => 12, + TokenConfigurationChangeItem::MintingAllowChoosingDestination(_) => 13, + TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup(_) => 14, + TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup(_) => 15, + TokenConfigurationChangeItem::ManualMinting(_) => 16, + TokenConfigurationChangeItem::ManualMintingAdminGroup(_) => 17, + TokenConfigurationChangeItem::ManualBurning(_) => 18, + TokenConfigurationChangeItem::ManualBurningAdminGroup(_) => 19, + TokenConfigurationChangeItem::Freeze(_) => 20, + TokenConfigurationChangeItem::FreezeAdminGroup(_) => 21, + TokenConfigurationChangeItem::Unfreeze(_) => 22, + TokenConfigurationChangeItem::UnfreezeAdminGroup(_) => 23, + TokenConfigurationChangeItem::DestroyFrozenFunds(_) => 24, + TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(_) => 25, + TokenConfigurationChangeItem::EmergencyAction(_) => 26, + TokenConfigurationChangeItem::EmergencyActionAdminGroup(_) => 27, + TokenConfigurationChangeItem::MainControlGroup(_) => 28, + } + } +} + +impl fmt::Display for TokenConfigurationChangeItem { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenConfigurationChangeItem::TokenConfigurationNoChange => { + write!(f, "No Change in Token Configuration") + } + TokenConfigurationChangeItem::Conventions(convention) => { + write!(f, "Conventions: {}", convention) + } + TokenConfigurationChangeItem::ConventionsControlGroup(control_group) => { + write!(f, "Conventions Control Group: {}", control_group) + } + TokenConfigurationChangeItem::ConventionsAdminGroup(admin_group) => { + write!(f, "Conventions Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::MaxSupply(max_supply) => match max_supply { + Some(amount) => write!(f, "Max Supply: {}", amount), + None => write!(f, "Max Supply: No Limit"), + }, + TokenConfigurationChangeItem::MaxSupplyControlGroup(control_group) => { + write!(f, "Max Supply Control Group: {}", control_group) + } + TokenConfigurationChangeItem::MaxSupplyAdminGroup(admin_group) => { + write!(f, "Max Supply Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::PerpetualDistribution(distribution) => match distribution + { + Some(dist) => write!(f, "Perpetual Distribution: {}", dist), + None => write!(f, "Perpetual Distribution: None"), + }, + TokenConfigurationChangeItem::PerpetualDistributionControlGroup(control_group) => { + write!(f, "Perpetual Distribution Control Group: {}", control_group) + } + TokenConfigurationChangeItem::PerpetualDistributionAdminGroup(admin_group) => { + write!(f, "Perpetual Distribution Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::NewTokensDestinationIdentity(identity) => { + match identity { + Some(id) => write!(f, "New Tokens Destination Identity: {}", id), + None => write!(f, "New Tokens Destination Identity: None"), + } + } + TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + control_group, + ) => { + write!( + f, + "New Tokens Destination Identity Control Group: {}", + control_group + ) + } + TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup(admin_group) => { + write!( + f, + "New Tokens Destination Identity Admin Group: {}", + admin_group + ) + } + TokenConfigurationChangeItem::MintingAllowChoosingDestination(allow) => { + write!(f, "Minting Allow Choosing Destination: {}", allow) + } + TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + control_group, + ) => { + write!( + f, + "Minting Allow Choosing Destination Control Group: {}", + control_group + ) + } + TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + admin_group, + ) => { + write!( + f, + "Minting Allow Choosing Destination Admin Group: {}", + admin_group + ) + } + TokenConfigurationChangeItem::ManualMinting(control_group) => { + write!(f, "Manual Minting: {}", control_group) + } + TokenConfigurationChangeItem::ManualMintingAdminGroup(admin_group) => { + write!(f, "Manual Minting Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::ManualBurning(control_group) => { + write!(f, "Manual Burning: {}", control_group) + } + TokenConfigurationChangeItem::ManualBurningAdminGroup(admin_group) => { + write!(f, "Manual Burning Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::Freeze(control_group) => { + write!(f, "Freeze: {}", control_group) + } + TokenConfigurationChangeItem::FreezeAdminGroup(admin_group) => { + write!(f, "Freeze Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::Unfreeze(control_group) => { + write!(f, "Unfreeze: {}", control_group) + } + TokenConfigurationChangeItem::UnfreezeAdminGroup(admin_group) => { + write!(f, "Unfreeze Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::DestroyFrozenFunds(control_group) => { + write!(f, "Destroy Frozen Funds: {}", control_group) + } + TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(admin_group) => { + write!(f, "Destroy Frozen Funds Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::EmergencyAction(control_group) => { + write!(f, "Emergency Action: {}", control_group) + } + TokenConfigurationChangeItem::EmergencyActionAdminGroup(admin_group) => { + write!(f, "Emergency Action Admin Group: {}", admin_group) + } + TokenConfigurationChangeItem::MainControlGroup(position) => match position { + Some(pos) => write!(f, "Main Control Group: {}", pos), + None => write!(f, "Main Control Group: None"), + }, + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_key.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_key.rs new file mode 100644 index 00000000000..e3ae314754b --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_key.rs @@ -0,0 +1,31 @@ +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq)] +pub enum DistributionType { + PreProgrammed, + Perpetual, +} + +#[derive( + Serialize, + Deserialize, + Decode, + Encode, + PlatformSerialize, + PlatformDeserialize, + Debug, + Clone, + PartialEq, + Eq, +)] +#[platform_serialize(unversioned)] +pub struct TokenDistributionKey { + pub token_id: Identifier, + pub recipient: TokenDistributionRecipient, + pub distribution_type: DistributionType, +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/mod.rs new file mode 100644 index 00000000000..f189476244e --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/mod.rs @@ -0,0 +1,158 @@ +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::{ + TokenDistributionRulesV0Getters, TokenDistributionRulesV0Setters, +}; +use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules; +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use crate::data_contract::change_control_rules::ChangeControlRules; +use platform_value::Identifier; + +pub mod v0; +/// Implementing `TokenDistributionRulesV0Getters` for `TokenDistributionRules` +impl TokenDistributionRulesV0Getters for TokenDistributionRules { + /// Returns the perpetual distribution configuration. + fn perpetual_distribution(&self) -> Option<&TokenPerpetualDistribution> { + match self { + TokenDistributionRules::V0(v0) => v0.perpetual_distribution(), + } + } + + /// Returns the perpetual distribution configuration (mutable). + fn perpetual_distribution_mut(&mut self) -> Option<&mut TokenPerpetualDistribution> { + match self { + TokenDistributionRules::V0(v0) => v0.perpetual_distribution_mut(), + } + } + + /// Returns the perpetual distribution change rules. + fn perpetual_distribution_rules(&self) -> &ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.perpetual_distribution_rules(), + } + } + + /// Returns the perpetual distribution change rules (mutable). + fn perpetual_distribution_rules_mut(&mut self) -> &mut ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.perpetual_distribution_rules_mut(), + } + } + + /// Returns the pre-programmed distribution configuration. + fn pre_programmed_distribution(&self) -> Option<&TokenPreProgrammedDistribution> { + match self { + TokenDistributionRules::V0(v0) => v0.pre_programmed_distribution(), + } + } + + /// Returns the pre-programmed distribution configuration (mutable). + fn pre_programmed_distribution_mut(&mut self) -> Option<&mut TokenPreProgrammedDistribution> { + match self { + TokenDistributionRules::V0(v0) => v0.pre_programmed_distribution_mut(), + } + } + + /// Returns the new tokens destination identity. + fn new_tokens_destination_identity(&self) -> Option<&Identifier> { + match self { + TokenDistributionRules::V0(v0) => v0.new_tokens_destination_identity(), + } + } + + /// Returns the rules for changing the new tokens destination identity. + fn new_tokens_destination_identity_rules(&self) -> &ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.new_tokens_destination_identity_rules(), + } + } + + /// Returns the rules for changing the new tokens destination identity (mutable). + fn new_tokens_destination_identity_rules_mut(&mut self) -> &mut ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.new_tokens_destination_identity_rules_mut(), + } + } + + /// Returns whether minting allows choosing destination. + fn minting_allow_choosing_destination(&self) -> bool { + match self { + TokenDistributionRules::V0(v0) => v0.minting_allow_choosing_destination(), + } + } + + /// Returns the rules for changing the minting allow choosing destination setting. + fn minting_allow_choosing_destination_rules(&self) -> &ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.minting_allow_choosing_destination_rules(), + } + } + + /// Returns the rules for changing the minting allow choosing destination setting (mutable). + fn minting_allow_choosing_destination_rules_mut(&mut self) -> &mut ChangeControlRules { + match self { + TokenDistributionRules::V0(v0) => v0.minting_allow_choosing_destination_rules_mut(), + } + } +} + +/// Implementing `TokenDistributionRulesV0Setters` for `TokenDistributionRules` +impl TokenDistributionRulesV0Setters for TokenDistributionRules { + /// Sets the perpetual distribution configuration. + fn set_perpetual_distribution( + &mut self, + perpetual_distribution: Option<TokenPerpetualDistribution>, + ) { + match self { + TokenDistributionRules::V0(v0) => v0.set_perpetual_distribution(perpetual_distribution), + } + } + + /// Sets the perpetual distribution change rules. + fn set_perpetual_distribution_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenDistributionRules::V0(v0) => v0.set_perpetual_distribution_rules(rules), + } + } + + /// Sets the pre-programmed distribution configuration. + fn set_pre_programmed_distribution( + &mut self, + pre_programmed_distribution: Option<TokenPreProgrammedDistribution>, + ) { + match self { + TokenDistributionRules::V0(v0) => { + v0.set_pre_programmed_distribution(pre_programmed_distribution) + } + } + } + + /// Sets the new tokens destination identity. + fn set_new_tokens_destination_identity(&mut self, identity: Option<Identifier>) { + match self { + TokenDistributionRules::V0(v0) => v0.set_new_tokens_destination_identity(identity), + } + } + + /// Sets the rules for changing the new tokens destination identity. + fn set_new_tokens_destination_identity_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenDistributionRules::V0(v0) => v0.set_new_tokens_destination_identity_rules(rules), + } + } + + /// Sets whether minting allows choosing destination. + fn set_minting_allow_choosing_destination(&mut self, allow: bool) { + match self { + TokenDistributionRules::V0(v0) => v0.set_minting_allow_choosing_destination(allow), + } + } + + /// Sets the rules for changing the minting allow choosing destination setting. + fn set_minting_allow_choosing_destination_rules(&mut self, rules: ChangeControlRules) { + match self { + TokenDistributionRules::V0(v0) => { + v0.set_minting_allow_choosing_destination_rules(rules) + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/v0/mod.rs new file mode 100644 index 00000000000..5b7c5080ee7 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/accessors/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use crate::data_contract::change_control_rules::ChangeControlRules; +use platform_value::Identifier; + +/// Accessor trait for getters of `TokenDistributionRulesV0` +pub trait TokenDistributionRulesV0Getters { + /// Returns the perpetual distribution configuration. + fn perpetual_distribution(&self) -> Option<&TokenPerpetualDistribution>; + + /// Returns the perpetual distribution configuration. + fn perpetual_distribution_mut(&mut self) -> Option<&mut TokenPerpetualDistribution>; + + /// Returns the perpetual distribution change rules. + fn perpetual_distribution_rules(&self) -> &ChangeControlRules; + + /// Returns the perpetual distribution change rules. + fn perpetual_distribution_rules_mut(&mut self) -> &mut ChangeControlRules; + + /// Returns the pre-programmed distribution configuration. + fn pre_programmed_distribution(&self) -> Option<&TokenPreProgrammedDistribution>; + + /// Returns the pre-programmed distribution configuration. + fn pre_programmed_distribution_mut(&mut self) -> Option<&mut TokenPreProgrammedDistribution>; + + /// Returns the new tokens destination identity. + fn new_tokens_destination_identity(&self) -> Option<&Identifier>; + + /// Returns the rules for changing the new tokens destination identity. + fn new_tokens_destination_identity_rules(&self) -> &ChangeControlRules; + + /// Returns the rules for changing the new tokens destination identity. + fn new_tokens_destination_identity_rules_mut(&mut self) -> &mut ChangeControlRules; + + /// Returns whether minting allows choosing destination. + fn minting_allow_choosing_destination(&self) -> bool; + + /// Returns the rules for changing the minting allow choosing destination setting. + fn minting_allow_choosing_destination_rules(&self) -> &ChangeControlRules; + + /// Returns the rules for changing the minting allow choosing destination setting. + fn minting_allow_choosing_destination_rules_mut(&mut self) -> &mut ChangeControlRules; +} + +/// Accessor trait for setters of `TokenDistributionRulesV0` +pub trait TokenDistributionRulesV0Setters { + /// Sets the perpetual distribution configuration. + fn set_perpetual_distribution( + &mut self, + perpetual_distribution: Option<TokenPerpetualDistribution>, + ); + + /// Sets the perpetual distribution change rules. + fn set_perpetual_distribution_rules(&mut self, rules: ChangeControlRules); + + /// Sets the pre-programmed distribution configuration. + fn set_pre_programmed_distribution( + &mut self, + pre_programmed_distribution: Option<TokenPreProgrammedDistribution>, + ); + + /// Sets the new tokens destination identity. + fn set_new_tokens_destination_identity(&mut self, identity: Option<Identifier>); + + /// Sets the rules for changing the new tokens destination identity. + fn set_new_tokens_destination_identity_rules(&mut self, rules: ChangeControlRules); + + /// Sets whether minting allows choosing destination. + fn set_minting_allow_choosing_destination(&mut self, allow: bool); + + /// Sets the rules for changing the minting allow choosing destination setting. + fn set_minting_allow_choosing_destination_rules(&mut self, rules: ChangeControlRules); +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/mod.rs new file mode 100644 index 00000000000..df242893a79 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/mod.rs @@ -0,0 +1,26 @@ +use bincode::{Decode, Encode}; +use derive_more::From; +use serde::{Deserialize, Serialize}; + +pub mod accessors; +pub mod v0; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)] +#[serde(tag = "$format_version")] +pub enum TokenDistributionRules { + #[serde(rename = "0")] + V0(TokenDistributionRulesV0), +} + +use crate::data_contract::associated_token::token_distribution_rules::v0::TokenDistributionRulesV0; +use std::fmt; + +impl fmt::Display for TokenDistributionRules { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenDistributionRules::V0(v0) => { + write!(f, "{}", v0) //just pass through + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/accessors.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/accessors.rs new file mode 100644 index 00000000000..397e609525b --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/accessors.rs @@ -0,0 +1,114 @@ +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::{ + TokenDistributionRulesV0Getters, TokenDistributionRulesV0Setters, +}; +use crate::data_contract::associated_token::token_distribution_rules::v0::TokenDistributionRulesV0; +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use crate::data_contract::change_control_rules::ChangeControlRules; +use platform_value::Identifier; +/// Implementing `TokenDistributionRulesV0Getters` for `TokenDistributionRulesV0` +impl TokenDistributionRulesV0Getters for TokenDistributionRulesV0 { + /// Returns the perpetual distribution configuration. + fn perpetual_distribution(&self) -> Option<&TokenPerpetualDistribution> { + self.perpetual_distribution.as_ref() + } + + /// Returns the perpetual distribution configuration (mutable). + fn perpetual_distribution_mut(&mut self) -> Option<&mut TokenPerpetualDistribution> { + self.perpetual_distribution.as_mut() + } + + /// Returns the perpetual distribution change rules. + fn perpetual_distribution_rules(&self) -> &ChangeControlRules { + &self.perpetual_distribution_rules + } + + /// Returns the perpetual distribution change rules (mutable). + fn perpetual_distribution_rules_mut(&mut self) -> &mut ChangeControlRules { + &mut self.perpetual_distribution_rules + } + + /// Returns the pre-programmed distribution configuration. + fn pre_programmed_distribution(&self) -> Option<&TokenPreProgrammedDistribution> { + self.pre_programmed_distribution.as_ref() + } + + /// Returns the pre-programmed distribution configuration (mutable). + fn pre_programmed_distribution_mut(&mut self) -> Option<&mut TokenPreProgrammedDistribution> { + self.pre_programmed_distribution.as_mut() + } + + /// Returns the new tokens destination identity. + fn new_tokens_destination_identity(&self) -> Option<&Identifier> { + self.new_tokens_destination_identity.as_ref() + } + + /// Returns the rules for changing the new tokens destination identity. + fn new_tokens_destination_identity_rules(&self) -> &ChangeControlRules { + &self.new_tokens_destination_identity_rules + } + + /// Returns the rules for changing the new tokens destination identity (mutable). + fn new_tokens_destination_identity_rules_mut(&mut self) -> &mut ChangeControlRules { + &mut self.new_tokens_destination_identity_rules + } + + /// Returns whether minting allows choosing destination. + fn minting_allow_choosing_destination(&self) -> bool { + self.minting_allow_choosing_destination + } + + /// Returns the rules for changing the minting allow choosing destination setting. + fn minting_allow_choosing_destination_rules(&self) -> &ChangeControlRules { + &self.minting_allow_choosing_destination_rules + } + + /// Returns the rules for changing the minting allow choosing destination setting (mutable). + fn minting_allow_choosing_destination_rules_mut(&mut self) -> &mut ChangeControlRules { + &mut self.minting_allow_choosing_destination_rules + } +} + +/// Implementing `TokenDistributionRulesV0Setters` for `TokenDistributionRulesV0` +impl TokenDistributionRulesV0Setters for TokenDistributionRulesV0 { + /// Sets the perpetual distribution configuration. + fn set_perpetual_distribution( + &mut self, + perpetual_distribution: Option<TokenPerpetualDistribution>, + ) { + self.perpetual_distribution = perpetual_distribution; + } + + /// Sets the perpetual distribution change rules. + fn set_perpetual_distribution_rules(&mut self, rules: ChangeControlRules) { + self.perpetual_distribution_rules = rules; + } + + /// Sets the pre-programmed distribution configuration. + fn set_pre_programmed_distribution( + &mut self, + pre_programmed_distribution: Option<TokenPreProgrammedDistribution>, + ) { + self.pre_programmed_distribution = pre_programmed_distribution; + } + + /// Sets the new tokens destination identity. + fn set_new_tokens_destination_identity(&mut self, identity: Option<Identifier>) { + self.new_tokens_destination_identity = identity; + } + + /// Sets the rules for changing the new tokens destination identity. + fn set_new_tokens_destination_identity_rules(&mut self, rules: ChangeControlRules) { + self.new_tokens_destination_identity_rules = rules; + } + + /// Sets whether minting allows choosing destination. + fn set_minting_allow_choosing_destination(&mut self, allow: bool) { + self.minting_allow_choosing_destination = allow; + } + + /// Sets the rules for changing the minting allow choosing destination setting. + fn set_minting_allow_choosing_destination_rules(&mut self, rules: ChangeControlRules) { + self.minting_allow_choosing_destination_rules = rules; + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/mod.rs new file mode 100644 index 00000000000..ddcc549a4b3 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_distribution_rules/v0/mod.rs @@ -0,0 +1,79 @@ +mod accessors; + +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::v0::ChangeControlRulesV0; +use crate::data_contract::change_control_rules::ChangeControlRules; +use bincode::Encode; +use platform_serialization::de::Decode; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TokenDistributionRulesV0 { + #[serde(default)] + pub perpetual_distribution: Option<TokenPerpetualDistribution>, + #[serde(default = "default_change_control_rules")] + pub perpetual_distribution_rules: ChangeControlRules, + #[serde(default)] + pub pre_programmed_distribution: Option<TokenPreProgrammedDistribution>, + #[serde(default)] + pub new_tokens_destination_identity: Option<Identifier>, + #[serde(default = "default_change_control_rules")] + pub new_tokens_destination_identity_rules: ChangeControlRules, + #[serde(default = "default_minting_allow_choosing_destination")] + pub minting_allow_choosing_destination: bool, + #[serde(default = "default_change_control_rules")] + pub minting_allow_choosing_destination_rules: ChangeControlRules, +} + +// Default function for `minting_allow_choosing_destination` to return `true` +fn default_minting_allow_choosing_destination() -> bool { + true +} + +fn default_change_control_rules() -> ChangeControlRules { + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }) +} + +impl fmt::Display for TokenDistributionRulesV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "TokenDistributionRulesV0 {{\n \ + perpetual_distribution: {},\n \ + perpetual_distribution_rules: {},\n \ + pre_programmed_distribution: {},\n \ + new_tokens_destination_identity: {},\n \ + new_tokens_destination_identity_rules: {},\n \ + minting_allow_choosing_destination: {},\n \ + minting_allow_choosing_destination_rules: {}\n\ + }}", + match &self.perpetual_distribution { + Some(value) => format!("{}", value), + None => "None".to_string(), + }, + self.perpetual_distribution_rules, + match &self.pre_programmed_distribution { + Some(value) => format!("{}", value), + None => "None".to_string(), + }, + match &self.new_tokens_destination_identity { + Some(value) => format!("{}", value), + None => "None".to_string(), + }, + self.new_tokens_destination_identity_rules, + self.minting_allow_choosing_destination, + self.minting_allow_choosing_destination_rules, + ) + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/encode.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/encode.rs new file mode 100644 index 00000000000..2d693dd8ae8 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/encode.rs @@ -0,0 +1,208 @@ +use crate::balances::credits::{SignedTokenAmount, TokenAmount}; +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_function::DistributionFunction; +use bincode::{BorrowDecode, Decode, Encode}; +use ordered_float::NotNan; + +/// Helper function to decode a `NotNan<f64>` safely. +fn decode_not_nan<D: bincode::de::Decoder>( + decoder: &mut D, +) -> Result<NotNan<f64>, bincode::error::DecodeError> { + NotNan::new(f64::decode(decoder)?) + .map_err(|_| bincode::error::DecodeError::OtherString("Invalid float: NaN".into())) +} + +// Implement Encode for DistributionFunction +impl Encode for DistributionFunction { + fn encode<E: bincode::enc::Encoder>( + &self, + encoder: &mut E, + ) -> Result<(), bincode::error::EncodeError> { + match self { + DistributionFunction::FixedAmount { n } => { + 0u8.encode(encoder)?; + n.encode(encoder)?; + } + DistributionFunction::StepDecreasingAmount { + step_count, + decrease_per_interval, + n, + } => { + 1u8.encode(encoder)?; + step_count.encode(encoder)?; + decrease_per_interval.into_inner().encode(encoder)?; + n.encode(encoder)?; + } + DistributionFunction::LinearInteger { a, b } => { + 2u8.encode(encoder)?; + a.encode(encoder)?; + b.encode(encoder)?; + } + DistributionFunction::LinearFloat { a, b } => { + 3u8.encode(encoder)?; + a.into_inner().encode(encoder)?; + b.encode(encoder)?; + } + DistributionFunction::PolynomialInteger { a, n, b } => { + 4u8.encode(encoder)?; + a.encode(encoder)?; + n.encode(encoder)?; + b.encode(encoder)?; + } + DistributionFunction::PolynomialFloat { a, n, b } => { + 5u8.encode(encoder)?; + a.into_inner().encode(encoder)?; + n.into_inner().encode(encoder)?; + b.encode(encoder)?; + } + DistributionFunction::Exponential { a, b, c } => { + 6u8.encode(encoder)?; + a.into_inner().encode(encoder)?; + b.into_inner().encode(encoder)?; + c.encode(encoder)?; + } + DistributionFunction::Logarithmic { a, b, c } => { + 7u8.encode(encoder)?; + a.into_inner().encode(encoder)?; + b.into_inner().encode(encoder)?; + c.encode(encoder)?; + } + DistributionFunction::Stepwise(steps) => { + 8u8.encode(encoder)?; + steps.encode(encoder)?; + } + } + Ok(()) + } +} + +// Implement Decode for DistributionFunction +impl Decode for DistributionFunction { + fn decode<D: bincode::de::Decoder>( + decoder: &mut D, + ) -> Result<Self, bincode::error::DecodeError> { + let variant = u8::decode(decoder)?; + match variant { + 0 => { + let n = TokenAmount::decode(decoder)?; + Ok(Self::FixedAmount { n }) + } + 1 => { + let step_count = u64::decode(decoder)?; + let decrease_per_interval = decode_not_nan(decoder)?; + let n = TokenAmount::decode(decoder)?; + Ok(Self::StepDecreasingAmount { + step_count, + decrease_per_interval, + n, + }) + } + 2 => { + let a = i64::decode(decoder)?; + let b = SignedTokenAmount::decode(decoder)?; + Ok(Self::LinearInteger { a, b }) + } + 3 => { + let a = decode_not_nan(decoder)?; + let b = SignedTokenAmount::decode(decoder)?; + Ok(Self::LinearFloat { a, b }) + } + 4 => { + let a = i64::decode(decoder)?; + let n = i64::decode(decoder)?; + let b = SignedTokenAmount::decode(decoder)?; + Ok(Self::PolynomialInteger { a, n, b }) + } + 5 => { + let a = decode_not_nan(decoder)?; + let n = decode_not_nan(decoder)?; + let b = SignedTokenAmount::decode(decoder)?; + Ok(Self::PolynomialFloat { a, n, b }) + } + 6 => { + let a = decode_not_nan(decoder)?; + let b = decode_not_nan(decoder)?; + let c = SignedTokenAmount::decode(decoder)?; + Ok(Self::Exponential { a, b, c }) + } + 7 => { + let a = decode_not_nan(decoder)?; + let b = decode_not_nan(decoder)?; + let c = SignedTokenAmount::decode(decoder)?; + Ok(Self::Logarithmic { a, b, c }) + } + 8 => { + let steps = Vec::<(u64, TokenAmount)>::decode(decoder)?; + Ok(Self::Stepwise(steps)) + } + _ => Err(bincode::error::DecodeError::OtherString( + "Invalid variant".into(), + )), + } + } +} + +// Implement BorrowDecode for DistributionFunction +impl<'de> BorrowDecode<'de> for DistributionFunction { + fn borrow_decode<D: bincode::de::BorrowDecoder<'de>>( + decoder: &mut D, + ) -> Result<Self, bincode::error::DecodeError> { + let variant = u8::borrow_decode(decoder)?; + match variant { + 0 => { + let n = TokenAmount::borrow_decode(decoder)?; + Ok(Self::FixedAmount { n }) + } + 1 => { + let step_count = u64::borrow_decode(decoder)?; + let decrease_per_interval = decode_not_nan(decoder)?; + let n = TokenAmount::borrow_decode(decoder)?; + Ok(Self::StepDecreasingAmount { + step_count, + decrease_per_interval, + n, + }) + } + 2 => { + let a = i64::borrow_decode(decoder)?; + let b = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::LinearInteger { a, b }) + } + 3 => { + let a = decode_not_nan(decoder)?; + let b = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::LinearFloat { a, b }) + } + 4 => { + let a = i64::borrow_decode(decoder)?; + let n = i64::borrow_decode(decoder)?; + let b = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::PolynomialInteger { a, n, b }) + } + 5 => { + let a = decode_not_nan(decoder)?; + let n = decode_not_nan(decoder)?; + let b = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::PolynomialFloat { a, n, b }) + } + 6 => { + let a = decode_not_nan(decoder)?; + let b = decode_not_nan(decoder)?; + let c = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::Exponential { a, b, c }) + } + 7 => { + let a = decode_not_nan(decoder)?; + let b = decode_not_nan(decoder)?; + let c = SignedTokenAmount::borrow_decode(decoder)?; + Ok(Self::Logarithmic { a, b, c }) + } + 8 => { + let steps = Vec::<(u64, TokenAmount)>::borrow_decode(decoder)?; + Ok(Self::Stepwise(steps)) + } + _ => Err(bincode::error::DecodeError::OtherString( + "Invalid variant".into(), + )), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/mod.rs new file mode 100644 index 00000000000..134f906cf00 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_function/mod.rs @@ -0,0 +1,243 @@ +use crate::balances::credits::{SignedTokenAmount, TokenAmount}; +use ordered_float::NotNan; +use serde::{Deserialize, Serialize}; +use std::fmt; + +mod encode; + +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd)] +pub enum DistributionFunction { + /// A fixed amount of tokens is emitted for each period in the reward distribution type. + /// + /// # Formula + /// - `f(x) = n` + /// + /// # Use Case + /// - Simplicity + /// - Stable reward emissions + /// + /// # Example + /// - If we emit 5 tokens per block, and 3 blocks have passed, the `Release` call will release 15 tokens. + FixedAmount { n: TokenAmount }, + + /// The amount of tokens decreases in predefined steps at fixed intervals. + /// + /// # Formula + /// - `f(x) = n * (1 - decrease_per_interval)^(x / step_count)` + /// + /// # Use Case + /// - Mimics Bitcoin and Dash Core emission models + /// - Encourages early participation by providing higher rewards initially + /// + /// # Example + /// - Bitcoin: A 50% decrease every 210,000 blocks (~4 years) + /// - Dash: A ~7% decrease every 210,000 blocks (~1 year) + StepDecreasingAmount { + step_count: u64, + decrease_per_interval: NotNan<f64>, + n: TokenAmount, + }, + + /// A linear function emits tokens in increasing or decreasing amounts over time (integer precision). + /// + /// # Formula + /// - `f(x) = a * x + b` + /// - Where `a` is the slope (rate of change) and `b` is the initial value. + /// + /// # Description + /// - `a > 0`: Tokens increase over time. + /// - `a < 0`: Tokens decrease over time. + /// - `b` is the starting emission value. + /// + /// # Use Case + /// - Incentivize early adopters with higher rewards (`a < 0`). + /// - Gradually increase emissions to match ecosystem growth (`a > 0`). + /// + /// # Example + /// - Start with 50 tokens and increase by 10 tokens per epoch: `f(x) = 10x + 50`. + LinearInteger { a: i64, b: SignedTokenAmount }, + + /// A linear function emits tokens in increasing or decreasing amounts over time (floating-point precision). + /// + /// # Formula + /// - `f(x) = a * x + b` + /// - Where `a` is the slope (rate of change) and `b` is the initial value. + /// + /// # Description + /// - `a > 0`: Tokens increase over time. + /// - `a < 0`: Tokens decrease over time. + /// - `b` is the starting emission value. + /// + /// # Use Case + /// - Similar to `LinearInteger`, but supports fractional rates of change. + /// + /// # Example + /// - Start with 50 tokens and increase by 0.5 tokens per epoch: `f(x) = 0.5x + 50`. + LinearFloat { + a: NotNan<f64>, + b: SignedTokenAmount, + }, + + /// A polynomial function emits tokens according to a quadratic or cubic curve (integer precision). + /// + /// # Formula + /// - `f(x) = a * x^n + b` + /// - Where `n` is the degree of the polynomial, `a` is the scaling factor, and `b` is the base amount. + /// + /// # Description + /// - Higher-degree polynomials allow for flexible emission curves. + /// - Use for growth or decay patterns that aren't linear. + /// + /// # Use Case + /// - Reward systems with diminishing returns as time progresses. + /// + /// # Example + /// - Emit rewards based on a quadratic curve: `f(x) = 2x^2 + 20`. + PolynomialInteger { + a: i64, + n: i64, + b: SignedTokenAmount, + }, + + /// A polynomial function emits tokens according to a quadratic or cubic curve (floating-point precision). + /// + /// # Formula + /// - `f(x) = a * x^n + b` + /// - Where `n` is the degree of the polynomial, `a` is the scaling factor, and `b` is the base amount. + /// + /// # Description + /// - Similar to `PolynomialInteger`, but supports fractional scaling and degrees. + /// + /// # Example + /// - Emit rewards based on a cubic curve with fractional growth: `f(x) = 0.5x^3 + 20`. + PolynomialFloat { + a: NotNan<f64>, + n: NotNan<f64>, + b: SignedTokenAmount, + }, + + /// An exponential function emits tokens based on exponential growth or decay. + /// + /// # Formula + /// - `f(x) = a * e^(b * x) + c` + /// - Where `a` is the scaling factor, `b` controls the growth/decay rate, and `c` is an offset. + /// + /// # Description + /// - Exponential growth: `b > 0`, emissions increase rapidly. + /// - Exponential decay: `b < 0`, emissions decrease rapidly. + /// - Useful for early incentivization or ecosystem maturity. + /// + /// # Use Case + /// - Reward mechanisms where early contributors get larger rewards. + /// + /// # Example + /// - Start with 100 tokens and halve emissions every interval, with a minimum of 5 tokens: `f(x) = 100 * e^(-0.693 * x) + 5`. + Exponential { + a: NotNan<f64>, + b: NotNan<f64>, + c: SignedTokenAmount, + }, + + /// A logarithmic function emits tokens based on logarithmic growth. + /// + /// # Formula + /// - `f(x) = a * log_b(x) + c` + /// - Where `a` is the scaling factor, `b` is the logarithm base, and `c` is an offset. + /// + /// # Description + /// - Growth starts quickly but slows as `x` increases. + /// - Suitable for sustainable emissions over long periods. + /// + /// # Use Case + /// - Gradual emissions tapering to balance supply and demand. + /// + /// # Example + /// - Emit rewards using a log base-2 curve: `f(x) = 20 * log_2(x) + 5`. + Logarithmic { + a: NotNan<f64>, + b: NotNan<f64>, + c: SignedTokenAmount, + }, + + /// A stepwise function emits tokens in fixed amounts for predefined intervals. + /// + /// # Description + /// - Emissions remain constant within each step. + /// - Steps define specific time intervals or milestones. + /// + /// # Use Case + /// - Adjust rewards at specific milestones. + /// + /// # Example + /// - Emit 100 tokens per block for the first 1000 blocks, then 50 tokens thereafter. + Stepwise(Vec<(u64, TokenAmount)>), +} + +impl fmt::Display for DistributionFunction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + DistributionFunction::FixedAmount { n } => { + write!(f, "FixedAmount: {} tokens per period", n) + } + DistributionFunction::StepDecreasingAmount { + step_count, + decrease_per_interval, + n, + } => { + write!( + f, + "StepDecreasingAmount: {} tokens, decreasing by {:.3}% every {} steps", + n, + decrease_per_interval.into_inner() * 100.0, + step_count + ) + } + DistributionFunction::LinearInteger { a, b } => { + write!(f, "LinearInteger: f(x) = {} * x + {}", a, b) + } + DistributionFunction::LinearFloat { a, b } => { + write!(f, "LinearFloat: f(x) = {:.3} * x + {}", a.into_inner(), b) + } + DistributionFunction::PolynomialInteger { a, n, b } => { + write!(f, "PolynomialInteger: f(x) = {} * x^{} + {}", a, n, b) + } + DistributionFunction::PolynomialFloat { a, n, b } => { + write!( + f, + "PolynomialFloat: f(x) = {:.3} * x^{:.3} + {}", + a.into_inner(), + n.into_inner(), + b + ) + } + DistributionFunction::Exponential { a, b, c } => { + write!( + f, + "Exponential: f(x) = {:.3} * e^({:.3} * x) + {}", + a.into_inner(), + b.into_inner(), + c + ) + } + DistributionFunction::Logarithmic { a, b, c } => { + write!( + f, + "Logarithmic: f(x) = {:.3} * log_{:.3}(x) + {}", + a.into_inner(), + b.into_inner(), + c + ) + } + DistributionFunction::Stepwise(steps) => { + write!(f, "Stepwise: ")?; + for (index, (step, amount)) in steps.iter().enumerate() { + if index > 0 { + write!(f, ", ")?; + } + write!(f, "Step {} -> {}", step, amount)?; + } + Ok(()) + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_recipient.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_recipient.rs new file mode 100644 index 00000000000..1244588c6ae --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/distribution_recipient.rs @@ -0,0 +1,31 @@ +use bincode::{Decode, Encode}; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, Copy, PartialEq, Eq, PartialOrd)] +pub enum TokenDistributionRecipient { + /// Distribute to the contract Owner + ContractOwner, + /// Distribute to a single identity + Identity(Identifier), + /// Distribute tokens by participation + /// This distribution can only happen when choosing epoch based distribution + EvonodesByParticipation, +} + +impl fmt::Display for TokenDistributionRecipient { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenDistributionRecipient::ContractOwner => { + write!(f, "ContractOwner") + } + TokenDistributionRecipient::Identity(identifier) => { + write!(f, "Identity({})", identifier) + } + TokenDistributionRecipient::EvonodesByParticipation => { + write!(f, "EvonodesByParticipation") + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/mod.rs new file mode 100644 index 00000000000..027fc1ccf13 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/mod.rs @@ -0,0 +1,44 @@ +use v0::TokenPerpetualDistributionV0Methods; +use crate::block::block_info::BlockInfo; +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use crate::data_contract::associated_token::token_perpetual_distribution::methods::v0::TokenPerpetualDistributionV0Accessors; +use crate::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; +use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; + +pub mod v0; + +impl TokenPerpetualDistributionV0Accessors for TokenPerpetualDistribution { + fn distribution_type(&self) -> &RewardDistributionType { + match self { + TokenPerpetualDistribution::V0(v0) => &v0.distribution_type, + } + } + + fn set_distribution_type(&mut self, distribution_type: RewardDistributionType) { + match self { + TokenPerpetualDistribution::V0(v0) => v0.distribution_type = distribution_type, + } + } + + fn distribution_recipient(&self) -> TokenDistributionRecipient { + match self { + TokenPerpetualDistribution::V0(v0) => v0.distribution_recipient, + } + } + + fn set_distribution_recipient(&mut self, distribution_recipient: TokenDistributionRecipient) { + match self { + TokenPerpetualDistribution::V0(v0) => { + v0.distribution_recipient = distribution_recipient + } + } + } +} + +impl TokenPerpetualDistributionV0Methods for TokenPerpetualDistribution { + fn next_interval(&self, block_info: &BlockInfo) -> u64 { + match self { + TokenPerpetualDistribution::V0(v0) => v0.next_interval(block_info), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/v0/mod.rs new file mode 100644 index 00000000000..367f5c4a9d7 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/methods/v0/mod.rs @@ -0,0 +1,25 @@ +use crate::block::block_info::BlockInfo; +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use crate::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; + +/// Accessor trait for `TokenPerpetualDistribution`, providing getter and setter methods +/// for its distribution type and recipient. +pub trait TokenPerpetualDistributionV0Accessors { + /// Gets the distribution type used in the token distribution. + fn distribution_type(&self) -> &RewardDistributionType; + + /// Sets the distribution type for the token distribution. + fn set_distribution_type(&mut self, distribution_type: RewardDistributionType); + + /// Gets the distribution recipient for the token distribution. + fn distribution_recipient(&self) -> TokenDistributionRecipient; + + /// Sets the distribution recipient for the token distribution. + fn set_distribution_recipient(&mut self, distribution_recipient: TokenDistributionRecipient); +} + +/// Methods trait for `TokenPerpetualDistribution` +pub trait TokenPerpetualDistributionV0Methods { + /// we use u64 as a catch-all for any type of interval we might have, eg time, block or epoch + fn next_interval(&self, block_info: &BlockInfo) -> u64; +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/mod.rs new file mode 100644 index 00000000000..758ec8b3881 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/mod.rs @@ -0,0 +1,44 @@ +use crate::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use derive_more::From; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use serde::{Deserialize, Serialize}; +use std::fmt; + +pub mod distribution_function; +pub mod distribution_recipient; +pub mod methods; +pub mod reward_distribution_type; +pub mod v0; + +#[derive( + Serialize, + Deserialize, + Encode, + Decode, + PlatformSerialize, + PlatformDeserialize, + Debug, + Clone, + PartialEq, + Eq, + PartialOrd, + From, +)] +#[serde(tag = "$format_version")] +#[platform_serialize(unversioned)] +pub enum TokenPerpetualDistribution { + #[serde(rename = "0")] + V0(TokenPerpetualDistributionV0), +} + +impl fmt::Display for TokenPerpetualDistribution { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenPerpetualDistribution::V0(v0) => { + write!(f, "{}", v0) //just pass through + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_type/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_type/mod.rs new file mode 100644 index 00000000000..c95f8b0d0af --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/reward_distribution_type/mod.rs @@ -0,0 +1,44 @@ +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_function::DistributionFunction; +use crate::prelude::{BlockHeightInterval, EpochInterval, TimestampMillisInterval}; +use bincode::{Decode, Encode}; +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd)] +pub enum RewardDistributionType { + /// An amount of tokens is emitted every n blocks + BlockBasedDistribution(BlockHeightInterval, TokenAmount, DistributionFunction), + /// An amount of tokens is emitted every amount of time given + TimeBasedDistribution(TimestampMillisInterval, TokenAmount, DistributionFunction), + /// An amount of tokens is emitted every amount of epochs + EpochBasedDistribution(EpochInterval, TokenAmount, DistributionFunction), +} + +impl fmt::Display for RewardDistributionType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + RewardDistributionType::BlockBasedDistribution(interval, amount, function) => { + write!( + f, + "BlockBasedDistribution: {} tokens every {} blocks using {}", + amount, interval, function + ) + } + RewardDistributionType::TimeBasedDistribution(interval, amount, function) => { + write!( + f, + "TimeBasedDistribution: {} tokens every {} milliseconds using {}", + amount, interval, function + ) + } + RewardDistributionType::EpochBasedDistribution(interval, amount, function) => { + write!( + f, + "EpochBasedDistribution: {} tokens every {} epochs using {}", + amount, interval, function + ) + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/methods.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/methods.rs new file mode 100644 index 00000000000..9a321c593f2 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/methods.rs @@ -0,0 +1,26 @@ +use crate::block::block_info::BlockInfo; +use crate::data_contract::associated_token::token_perpetual_distribution::methods::v0::TokenPerpetualDistributionV0Methods; +use crate::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; +use crate::data_contract::associated_token::token_perpetual_distribution::v0::TokenPerpetualDistributionV0; + +impl TokenPerpetualDistributionV0Methods for TokenPerpetualDistributionV0 { + fn next_interval(&self, block_info: &BlockInfo) -> u64 { + match self.distribution_type { + // If the distribution is based on block height, return the next height where emissions occur. + RewardDistributionType::BlockBasedDistribution(interval, _, _) => { + (block_info.height - block_info.height % interval).saturating_add(interval) + } + + // If the distribution is based on time, return the next timestamp in milliseconds. + RewardDistributionType::TimeBasedDistribution(interval, _, _) => { + (block_info.time_ms - block_info.time_ms % interval).saturating_add(interval) + } + + // If the distribution is based on epochs, return the next epoch index. + RewardDistributionType::EpochBasedDistribution(interval, _, _) => { + (block_info.epoch.index - block_info.epoch.index % interval) + .saturating_add(interval) as u64 + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/mod.rs new file mode 100644 index 00000000000..004782c876f --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_perpetual_distribution/v0/mod.rs @@ -0,0 +1,27 @@ +mod methods; + +use bincode::{Encode, Decode}; +use serde::{Deserialize, Serialize}; +use std::fmt; +use crate::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use crate::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd)] +#[serde(rename_all = "camelCase")] +pub struct TokenPerpetualDistributionV0 { + /// The distribution type that the token will use + pub distribution_type: RewardDistributionType, + /// The recipient type + pub distribution_recipient: TokenDistributionRecipient, +} + +impl fmt::Display for TokenPerpetualDistributionV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "TokenPerpetualDistribution {{\n distribution_type: {},\n distribution_recipient: {}\n}}", + self.distribution_type, + self.distribution_recipient, + ) + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/mod.rs new file mode 100644 index 00000000000..0cd2875602a --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/mod.rs @@ -0,0 +1,41 @@ +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use crate::prelude::TimestampMillis; +use platform_value::Identifier; +use std::collections::BTreeMap; +use v0::TokenPreProgrammedDistributionV0Methods; + +pub mod v0; + +impl TokenPreProgrammedDistributionV0Methods for TokenPreProgrammedDistribution { + fn distributions(&self) -> &BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>> { + match self { + TokenPreProgrammedDistribution::V0(v0) => &v0.distributions, + } + } + + fn set_distributions( + &mut self, + distributions: BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, + ) { + match self { + TokenPreProgrammedDistribution::V0(v0) => v0.distributions = distributions, + } + } + + fn add_distribution( + &mut self, + time: TimestampMillis, + recipient: Identifier, + amount: TokenAmount, + ) { + match self { + TokenPreProgrammedDistribution::V0(v0) => { + v0.distributions + .entry(time) + .or_default() + .insert(recipient, amount); + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/v0/mod.rs new file mode 100644 index 00000000000..b93778844d0 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/methods/v0/mod.rs @@ -0,0 +1,24 @@ +use crate::balances::credits::TokenAmount; +use crate::prelude::TimestampMillis; +use platform_value::Identifier; +use std::collections::BTreeMap; + +/// Trait for managing pre-programmed token distributions. +pub trait TokenPreProgrammedDistributionV0Methods { + /// Gets the scheduled token distributions. + fn distributions(&self) -> &BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>; + + /// Sets the scheduled token distributions. + fn set_distributions( + &mut self, + distributions: BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, + ); + + /// Adds a new token distribution for a recipient at a specific time. + fn add_distribution( + &mut self, + time: TimestampMillis, + recipient: Identifier, + amount: TokenAmount, + ); +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/mod.rs new file mode 100644 index 00000000000..2edbf6ac4f0 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/mod.rs @@ -0,0 +1,25 @@ +use crate::data_contract::associated_token::token_pre_programmed_distribution::v0::TokenPreProgrammedDistributionV0; +use bincode::{Decode, Encode}; +use derive_more::From; +use serde::{Deserialize, Serialize}; +use std::fmt; + +pub mod methods; +pub mod v0; + +#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)] +#[serde(tag = "$format_version")] +pub enum TokenPreProgrammedDistribution { + #[serde(rename = "0")] + V0(TokenPreProgrammedDistributionV0), +} + +impl fmt::Display for TokenPreProgrammedDistribution { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TokenPreProgrammedDistribution::V0(v0) => { + write!(f, "{}", v0) //just pass through + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/v0/mod.rs b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/v0/mod.rs new file mode 100644 index 00000000000..b70a4a20ee6 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/associated_token/token_pre_programmed_distribution/v0/mod.rs @@ -0,0 +1,28 @@ +use crate::balances::credits::TokenAmount; +use crate::prelude::TimestampMillis; +use bincode::Encode; +use platform_serialization::de::Decode; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct TokenPreProgrammedDistributionV0 { + pub distributions: BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, +} + +/// Implementing `Display` for `TokenPreProgrammedDistributionV0` +impl fmt::Display for TokenPreProgrammedDistributionV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f, "TokenPreProgrammedDistributionV0 {{")?; + for (timestamp, distributions) in &self.distributions { + writeln!(f, " Timestamp: {}", timestamp)?; + for (identity, amount) in distributions { + writeln!(f, " Identity: {}, Amount: {}", identity, amount)?; + } + } + write!(f, "}}") + } +} diff --git a/packages/rs-dpp/src/data_contract/change_control_rules/authorized_action_takers.rs b/packages/rs-dpp/src/data_contract/change_control_rules/authorized_action_takers.rs new file mode 100644 index 00000000000..fc5c531bec2 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/change_control_rules/authorized_action_takers.rs @@ -0,0 +1,132 @@ +use crate::data_contract::group::accessors::v0::GroupV0Getters; +use crate::data_contract::group::{Group, GroupMemberPower}; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use bincode::{Decode, Encode}; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt; + +#[derive( + Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, PartialOrd, Default, +)] +pub enum AuthorizedActionTakers { + #[default] + NoOne, + ContractOwner, + Identity(Identifier), + MainGroup, + Group(GroupContractPosition), +} + +impl fmt::Display for AuthorizedActionTakers { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + AuthorizedActionTakers::NoOne => write!(f, "NoOne"), + AuthorizedActionTakers::ContractOwner => write!(f, "ContractOwner"), + AuthorizedActionTakers::MainGroup => write!(f, "MainGroup"), + AuthorizedActionTakers::Group(position) => write!(f, "Group(Position: {})", position), + AuthorizedActionTakers::Identity(identifier) => write!(f, "Identity({})", identifier), + } + } +} + +impl AuthorizedActionTakers { + pub fn allowed_for_action_taker( + &self, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match self { + // No one is allowed + AuthorizedActionTakers::NoOne => false, + + // Only the contract owner is allowed + AuthorizedActionTakers::ContractOwner => match action_taker { + ActionTaker::SingleIdentity(action_taker) => action_taker == contract_owner_id, + ActionTaker::SpecifiedIdentities(action_takers) => { + action_takers.contains(contract_owner_id) + } + }, + + // Only an identity is allowed + AuthorizedActionTakers::Identity(identity) => match action_taker { + ActionTaker::SingleIdentity(action_taker) => action_taker == identity, + ActionTaker::SpecifiedIdentities(action_takers) => action_takers.contains(identity), + }, + + // MainGroup allows multiparty actions with specific power requirements + AuthorizedActionTakers::MainGroup => { + if let Some(main_group_contract_position) = &main_group { + if let Some(group) = groups.get(main_group_contract_position) { + match goal { + ActionGoal::ActionCompletion => { + Self::is_action_taker_authorized(group, action_taker) + } + ActionGoal::ActionParticipation => { + Self::is_action_taker_participant(group, action_taker) + } + } + } else { + false + } + } else { + false + } + } + + // Group-specific permissions with power aggregation logic + AuthorizedActionTakers::Group(group_contract_position) => { + if let Some(group) = groups.get(group_contract_position) { + match goal { + ActionGoal::ActionCompletion => { + Self::is_action_taker_authorized(group, action_taker) + } + ActionGoal::ActionParticipation => { + Self::is_action_taker_participant(group, action_taker) + } + } + } else { + false + } + } + } + } + + /// Helper method to check if action takers meet the group's required power threshold. + fn is_action_taker_authorized(group: &Group, action_taker: &ActionTaker) -> bool { + match action_taker { + ActionTaker::SingleIdentity(member_id) => { + let power = group.members().get(member_id).cloned().unwrap_or_default(); + power >= group.required_power() + } + ActionTaker::SpecifiedIdentities(action_takers) => { + // Calculate the total power of action takers who are members of the group + let total_power: GroupMemberPower = group + .members() + .iter() + .filter(|(member_id, _)| action_takers.contains(*member_id)) + .map(|(_, power)| *power) + .sum(); + + // Compare total power to the group's required power + total_power >= group.required_power() as GroupMemberPower + } + } + } + + /// Helper method to check if action takers are participants. + fn is_action_taker_participant(group: &Group, action_taker: &ActionTaker) -> bool { + match action_taker { + ActionTaker::SingleIdentity(member_id) => group.members().get(member_id).is_some(), + ActionTaker::SpecifiedIdentities(_) => { + // this is made only for single identities + false + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/change_control_rules/mod.rs b/packages/rs-dpp/src/data_contract/change_control_rules/mod.rs new file mode 100644 index 00000000000..6bfa4c73f1f --- /dev/null +++ b/packages/rs-dpp/src/data_contract/change_control_rules/mod.rs @@ -0,0 +1,138 @@ +pub mod authorized_action_takers; +pub mod v0; + +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::change_control_rules::v0::ChangeControlRulesV0; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use bincode::{Decode, Encode}; +use derive_more::From; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, From)] +pub enum ChangeControlRules { + V0(ChangeControlRulesV0), +} + +impl ChangeControlRules { + pub fn admin_action_takers(&self) -> &AuthorizedActionTakers { + match self { + ChangeControlRules::V0(v0) => &v0.admin_action_takers, + } + } + pub fn authorized_to_make_change_action_takers(&self) -> &AuthorizedActionTakers { + match self { + ChangeControlRules::V0(v0) => &v0.authorized_to_make_change, + } + } + + pub fn set_admin_action_takers(&mut self, admin_action_takers: AuthorizedActionTakers) { + match self { + ChangeControlRules::V0(v0) => { + v0.admin_action_takers = admin_action_takers; + } + } + } + + pub fn set_authorized_to_make_change_action_takers( + &mut self, + authorized_to_make_change: AuthorizedActionTakers, + ) { + match self { + ChangeControlRules::V0(v0) => { + v0.authorized_to_make_change = authorized_to_make_change; + } + } + } + + pub fn can_make_change( + &self, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match self { + ChangeControlRules::V0(v0) => { + v0.can_make_change(contract_owner_id, main_group, groups, action_taker, goal) + } + } + } + + pub fn can_change_authorized_action_takers( + &self, + controlling_action_takers: &AuthorizedActionTakers, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match self { + ChangeControlRules::V0(v0) => v0.can_change_authorized_action_takers( + controlling_action_takers, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + } + } + + pub fn can_change_admin_action_takers( + &self, + admin_action_takers: &AuthorizedActionTakers, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match self { + ChangeControlRules::V0(v0) => v0.can_change_admin_action_takers( + admin_action_takers, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + } + } + pub fn can_change_to( + &self, + other: &ChangeControlRules, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + match (self, other) { + (ChangeControlRules::V0(v0), ChangeControlRules::V0(v0_other)) => v0.can_change_to( + v0_other, + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ), + } + } +} + +impl fmt::Display for ChangeControlRules { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ChangeControlRules::V0(v0) => { + write!(f, "{}", v0) //just pass through + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/change_control_rules/v0/mod.rs b/packages/rs-dpp/src/data_contract/change_control_rules/v0/mod.rs new file mode 100644 index 00000000000..d413470023e --- /dev/null +++ b/packages/rs-dpp/src/data_contract/change_control_rules/v0/mod.rs @@ -0,0 +1,181 @@ +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::group::action_taker::{ActionGoal, ActionTaker}; +use bincode::{Decode, Encode}; +use platform_value::Identifier; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fmt; + +#[derive(Serialize, Deserialize, Decode, Encode, Debug, Clone, PartialEq, Eq, Default)] +pub struct ChangeControlRulesV0 { + /// This is who is authorized to make such a change + pub authorized_to_make_change: AuthorizedActionTakers, + /// This is who is authorized to make such a change to the people authorized to make a change + pub admin_action_takers: AuthorizedActionTakers, + /// Are we allowed to change to None in the future + pub changing_authorized_action_takers_to_no_one_allowed: bool, + /// Are we allowed to change the admin action takers to no one in the future + pub changing_admin_action_takers_to_no_one_allowed: bool, + /// Can the admin action takers change themselves + pub self_changing_admin_action_takers_allowed: bool, +} + +impl ChangeControlRulesV0 { + pub fn can_make_change( + &self, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + self.authorized_to_make_change.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + pub fn can_change_authorized_action_takers( + &self, + controlling_action_takers: &AuthorizedActionTakers, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + if !self.changing_authorized_action_takers_to_no_one_allowed + && controlling_action_takers == &AuthorizedActionTakers::NoOne + { + return false; + } + self.admin_action_takers.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + + pub fn can_change_admin_action_takers( + &self, + admin_action_takers: &AuthorizedActionTakers, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + if !self.self_changing_admin_action_takers_allowed { + return false; + } + if !self.changing_admin_action_takers_to_no_one_allowed + && admin_action_takers == &AuthorizedActionTakers::NoOne + { + return false; + } + self.admin_action_takers.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) + } + + pub fn can_change_to( + &self, + other: &ChangeControlRulesV0, + contract_owner_id: &Identifier, + main_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_taker: &ActionTaker, + goal: ActionGoal, + ) -> bool { + // First, check if the action taker is allowed to make any changes at all + if !self.authorized_to_make_change.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) { + return false; + } + + // Check if authorized_to_make_change is being modified + if self.authorized_to_make_change != other.authorized_to_make_change { + // Changing the authorized action takers requires the action_taker to be allowed by + // authorized_to_change_authorized_action_takers in the current rules + if !self.admin_action_takers.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) { + return false; + } + + // If we are changing to NoOne, ensure it's allowed + if let AuthorizedActionTakers::NoOne = other.authorized_to_make_change { + if !self.changing_authorized_action_takers_to_no_one_allowed { + return false; + } + } + } + + // Check if authorized_to_change_authorized_action_takers is being modified + if self.admin_action_takers != other.admin_action_takers { + if !self.self_changing_admin_action_takers_allowed { + return false; + } + + // Must be allowed by the current authorized_to_change_authorized_action_takers + if !self.admin_action_takers.allowed_for_action_taker( + contract_owner_id, + main_group, + groups, + action_taker, + goal, + ) { + return false; + } + + // If we are changing to NoOne, ensure it's allowed + if let AuthorizedActionTakers::NoOne = other.admin_action_takers { + if !self.changing_admin_action_takers_to_no_one_allowed { + return false; + } + } + } + + // If we reach here, the changes are allowed + true + } +} + +impl fmt::Display for ChangeControlRulesV0 { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "ChangeControlRulesV0 {{\n \ + authorized_to_make_change: {},\n \ + admin_action_takers: {},\n \ + changing_authorized_action_takers_to_no_one_allowed: {},\n \ + changing_admin_action_takers_to_no_one_allowed: {},\n \ + self_changing_admin_action_takers_allowed: {}\n\ + }}", + self.authorized_to_make_change, + self.admin_action_takers, + self.changing_authorized_action_takers_to_no_one_allowed, + self.changing_admin_action_takers_to_no_one_allowed, + self.self_changing_admin_action_takers_allowed + ) + } +} diff --git a/packages/rs-dpp/src/data_contract/conversion/cbor/mod.rs b/packages/rs-dpp/src/data_contract/conversion/cbor/mod.rs index 541fabd5bae..8683b2dbb42 100644 --- a/packages/rs-dpp/src/data_contract/conversion/cbor/mod.rs +++ b/packages/rs-dpp/src/data_contract/conversion/cbor/mod.rs @@ -1,6 +1,7 @@ mod v0; use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; use crate::prelude::DataContract; use crate::util::cbor_value::CborCanonicalMap; use crate::version::PlatformVersion; @@ -27,9 +28,16 @@ impl DataContractCborConversionMethodsV0 for DataContract { platform_version, )? .into()), + 1 => Ok(DataContractV1::from_cbor_with_id( + cbor_bytes, + contract_id, + full_validation, + platform_version, + )? + .into()), version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::from_cbor_with_id".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -48,9 +56,12 @@ impl DataContractCborConversionMethodsV0 for DataContract { 0 => Ok( DataContractV0::from_cbor(cbor_bytes, full_validation, platform_version)?.into(), ), + 1 => Ok( + DataContractV1::from_cbor(cbor_bytes, full_validation, platform_version)?.into(), + ), version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::from_cbor".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -59,6 +70,7 @@ impl DataContractCborConversionMethodsV0 for DataContract { fn to_cbor(&self, platform_version: &PlatformVersion) -> Result<Vec<u8>, ProtocolError> { match self { DataContract::V0(v0) => v0.to_cbor(platform_version), + DataContract::V1(v1) => v1.to_cbor(platform_version), } } diff --git a/packages/rs-dpp/src/data_contract/conversion/json/mod.rs b/packages/rs-dpp/src/data_contract/conversion/json/mod.rs index b06f6ff2ff9..2e4147653cc 100644 --- a/packages/rs-dpp/src/data_contract/conversion/json/mod.rs +++ b/packages/rs-dpp/src/data_contract/conversion/json/mod.rs @@ -2,7 +2,7 @@ mod v0; pub use v0::*; use crate::data_contract::v0::DataContractV0; -use crate::data_contract::DataContract; +use crate::data_contract::{DataContract, DataContractV1}; use crate::version::PlatformVersion; use crate::ProtocolError; use serde_json::Value as JsonValue; @@ -24,9 +24,12 @@ impl DataContractJsonConversionMethodsV0 for DataContract { 0 => Ok( DataContractV0::from_json(json_value, full_validation, platform_version)?.into(), ), + 1 => Ok( + DataContractV1::from_json(json_value, full_validation, platform_version)?.into(), + ), version => Err(ProtocolError::UnknownVersionMismatch { - method: "DataContract::from_json_object".to_string(), - known_versions: vec![0], + method: "DataContract::from_json".to_string(), + known_versions: vec![0, 1], received: version, }), } @@ -35,6 +38,7 @@ impl DataContractJsonConversionMethodsV0 for DataContract { fn to_json(&self, platform_version: &PlatformVersion) -> Result<JsonValue, ProtocolError> { match self { DataContract::V0(v0) => v0.to_json(platform_version), + DataContract::V1(v1) => v1.to_json(platform_version), } } @@ -44,6 +48,7 @@ impl DataContractJsonConversionMethodsV0 for DataContract { ) -> Result<JsonValue, ProtocolError> { match self { DataContract::V0(v0) => v0.to_validating_json(platform_version), + DataContract::V1(v1) => v1.to_validating_json(platform_version), } } } diff --git a/packages/rs-dpp/src/data_contract/conversion/value/mod.rs b/packages/rs-dpp/src/data_contract/conversion/value/mod.rs index bc54e6e80a1..59d07245ca2 100644 --- a/packages/rs-dpp/src/data_contract/conversion/value/mod.rs +++ b/packages/rs-dpp/src/data_contract/conversion/value/mod.rs @@ -2,6 +2,7 @@ pub mod v0; use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; use crate::data_contract::DataContract; use crate::version::PlatformVersion; use crate::ProtocolError; @@ -21,9 +22,12 @@ impl DataContractValueConversionMethodsV0 for DataContract { 0 => Ok( DataContractV0::from_value(raw_object, full_validation, platform_version)?.into(), ), + 1 => Ok( + DataContractV1::from_value(raw_object, full_validation, platform_version)?.into(), + ), version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::from_object".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -32,12 +36,14 @@ impl DataContractValueConversionMethodsV0 for DataContract { fn to_value(&self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> { match self { DataContract::V0(v0) => v0.to_value(platform_version), + DataContract::V1(v1) => v1.to_value(platform_version), } } fn into_value(self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> { match self { DataContract::V0(v0) => v0.into_value(platform_version), + DataContract::V1(v1) => v1.into_value(platform_version), } } } diff --git a/packages/rs-dpp/src/data_contract/data_contract_facade.rs b/packages/rs-dpp/src/data_contract/data_contract_facade.rs index d1f606622e3..aa352c47699 100644 --- a/packages/rs-dpp/src/data_contract/data_contract_facade.rs +++ b/packages/rs-dpp/src/data_contract/data_contract_facade.rs @@ -57,10 +57,13 @@ impl DataContractFacade { pub fn create_from_object( &self, raw_data_contract: Value, - skip_validation: bool, + #[cfg(feature = "validation")] skip_validation: bool, ) -> Result<DataContract, ProtocolError> { - self.factory - .create_from_object(raw_data_contract, skip_validation) + self.factory.create_from_object( + raw_data_contract, + #[cfg(feature = "validation")] + skip_validation, + ) } /// Create Data Contract from buffer @@ -68,9 +71,13 @@ impl DataContractFacade { pub fn create_from_buffer( &self, buffer: Vec<u8>, - skip_validation: bool, + #[cfg(feature = "validation")] skip_validation: bool, ) -> Result<DataContract, ProtocolError> { - self.factory.create_from_buffer(buffer, skip_validation) + self.factory.create_from_buffer( + buffer, + #[cfg(feature = "validation")] + skip_validation, + ) } #[cfg(feature = "state-transitions")] diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs index c9c8ee76e92..cdd1666e026 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::data_contract::document_type::v0::DocumentTypeV0; use crate::data_contract::document_type::DocumentType; @@ -41,6 +42,7 @@ impl DocumentType { documents_mutable_contract_default: bool, documents_can_be_deleted_contract_default: bool, full_validation: bool, + has_tokens: bool, validation_operations: &mut Vec<ProtocolValidationOperation>, platform_version: &PlatformVersion, ) -> Result<BTreeMap<String, DocumentType>, ProtocolError> { @@ -62,9 +64,22 @@ impl DocumentType { validation_operations, platform_version, ), + // in v1 we add the ability to have contracts without documents and just tokens + 1 => DocumentTypeV0::create_document_types_from_document_schemas_v1( + data_contract_id, + document_schemas, + schema_defs, + documents_keep_history_contract_default, + documents_mutable_contract_default, + documents_can_be_deleted_contract_default, + full_validation, + has_tokens, + validation_operations, + platform_version, + ), version => Err(ProtocolError::UnknownVersionMismatch { method: "create_document_types_from_document_schemas".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs index 1050a4c2285..69b497eeeae 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v0/mod.rs @@ -88,6 +88,7 @@ mod tests { false, false, false, + false, &mut vec![], PlatformVersion::latest(), ); diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs new file mode 100644 index 00000000000..720dc9fe835 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/create_document_types_from_document_schemas/v1/mod.rs @@ -0,0 +1,66 @@ +use crate::consensus::basic::data_contract::DocumentTypesAreMissingError; +use crate::data_contract::document_type::class_methods::consensus_or_protocol_data_contract_error; +use crate::data_contract::document_type::v0::DocumentTypeV0; +use crate::data_contract::document_type::DocumentType; +use crate::data_contract::DocumentName; +use crate::validation::operations::ProtocolValidationOperation; +use crate::version::PlatformVersion; +use crate::ProtocolError; +use platform_value::{Identifier, Value}; +use std::collections::BTreeMap; + +impl DocumentTypeV0 { + pub(in crate::data_contract) fn create_document_types_from_document_schemas_v1( + data_contract_id: Identifier, + document_schemas: BTreeMap<DocumentName, Value>, + schema_defs: Option<&BTreeMap<String, Value>>, + documents_keep_history_contract_default: bool, + documents_mutable_contract_default: bool, + documents_can_be_deleted_contract_default: bool, + full_validation: bool, + has_tokens: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<String, DocumentType>, ProtocolError> { + let mut contract_document_types: BTreeMap<String, DocumentType> = BTreeMap::new(); + + if document_schemas.is_empty() && !has_tokens { + return Err(consensus_or_protocol_data_contract_error( + DocumentTypesAreMissingError::new(data_contract_id).into(), + )); + } + + for (name, schema) in document_schemas.into_iter() { + let document_type = match platform_version + .dpp + .contract_versions + .document_type_versions + .structure_version + { + 0 => DocumentType::try_from_schema( + data_contract_id, + &name, + schema, + schema_defs, + documents_keep_history_contract_default, + documents_mutable_contract_default, + documents_can_be_deleted_contract_default, + full_validation, + validation_operations, + platform_version, + )?, + version => { + return Err(ProtocolError::UnknownVersionMismatch { + method: "get_document_types_from_value_array_v0 inner document type" + .to_string(), + known_versions: vec![0], + received: version, + }) + } + }; + + contract_document_types.insert(name.to_string(), document_type); + } + Ok(contract_document_types) + } +} diff --git a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs index 57b3bffb37f..823bc68a831 100644 --- a/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/class_methods/try_from_schema/v0/mod.rs @@ -721,6 +721,8 @@ fn insert_values( Ok(()) } + +// TODO: This is quite big fn insert_values_nested( document_properties: &mut IndexMap<String, DocumentProperty>, known_required: &BTreeSet<String>, @@ -744,7 +746,53 @@ fn insert_values_nested( let is_transient = known_transient.contains(&property_key); let field_type = match type_value { - "integer" => DocumentPropertyType::I64, + "integer" => { + DocumentPropertyType::I64 + // todo: we might want to do the following in the future (must be versioned) + // let minimum = inner_properties.get_optional_integer::<i64>(property_names::MINIMUM)?; + // let maximum = inner_properties.get_optional_integer::<i64>(property_names::MAXIMUM)?; + // + // match (minimum, maximum) { + // (Some(min), Some(max)) => { + // if min >= 0 { + // if max <= u8::MAX as i64 { + // DocumentPropertyType::U8 + // } else if max <= u16::MAX as i64 { + // DocumentPropertyType::U16 + // } else if max <= u32::MAX as i64 { + // DocumentPropertyType::U32 + // } else { + // DocumentPropertyType::U64 + // } + // } else { + // if min >= i8::MIN as i64 && max <= i8::MAX as i64 { + // DocumentPropertyType::I8 + // } else if min >= i16::MIN as i64 && max <= i16::MAX as i64 { + // DocumentPropertyType::I16 + // } else if min >= i32::MIN as i64 && max <= i32::MAX as i64 { + // DocumentPropertyType::I32 + // } else { + // DocumentPropertyType::I64 + // } + // } + // } + // (Some(min), None) => { + // if min >= 0 { + // DocumentPropertyType::U64 + // } else { + // DocumentPropertyType::I64 + // } + // } + // (None, Some(max)) => { + // if max >= 0 { + // DocumentPropertyType::U64 + // } else { + // DocumentPropertyType::I64 + // } + // } + // (None, None) => DocumentPropertyType::I64, + // } + } "number" => DocumentPropertyType::F64, "string" => DocumentPropertyType::String(StringPropertySizes { min_length: inner_properties.get_optional_integer(property_names::MIN_LENGTH)?, diff --git a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs index a8768ed8f5d..70bb184aa2f 100644 --- a/packages/rs-dpp/src/data_contract/document_type/index/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/index/mod.rs @@ -25,6 +25,7 @@ use serde::de::{VariantAccess, Visitor}; use std::cmp::Ordering; #[cfg(feature = "index-serde-conversion")] use std::fmt; +use std::sync::OnceLock; use std::{collections::BTreeMap, convert::TryFrom}; pub mod random_index; @@ -53,10 +54,37 @@ impl TryFrom<u8> for ContestedIndexResolution { #[repr(u8)] #[derive(Debug)] pub enum ContestedIndexFieldMatch { - Regex(regex::Regex), + Regex(LazyRegex), PositiveIntegerMatch(u128), } +#[derive(Debug, Clone)] +pub struct LazyRegex { + regex: OnceLock<Regex>, + regex_str: String, +} + +impl LazyRegex { + pub fn new(regex_str: String) -> Self { + LazyRegex { + regex: OnceLock::new(), + regex_str, + } + } + + pub fn is_match(&self, string: &str) -> bool { + let regexp = self + .regex + .get_or_init(|| Regex::new(&self.regex_str).expect("valid regexp")); + + regexp.is_match(string) + } + + pub fn as_str(&self) -> &str { + self.regex_str.as_str() + } +} + #[cfg(feature = "index-serde-conversion")] impl Serialize for ContestedIndexFieldMatch { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> @@ -133,10 +161,9 @@ impl<'de> Deserialize<'de> for ContestedIndexFieldMatch { { match visitor.variant()? { (Field::Regex, v) => { - let regex_str: &str = v.newtype_variant()?; - Regex::new(regex_str) - .map(ContestedIndexFieldMatch::Regex) - .map_err(de::Error::custom) + let regex_str: String = v.newtype_variant()?; + + Ok(ContestedIndexFieldMatch::Regex(LazyRegex::new(regex_str))) } (Field::PositiveIntegerMatch, v) => { let num: u128 = v.newtype_variant()?; @@ -192,7 +219,7 @@ impl Clone for ContestedIndexFieldMatch { fn clone(&self) -> Self { match self { ContestedIndexFieldMatch::Regex(regex) => { - ContestedIndexFieldMatch::Regex(regex::Regex::new(regex.as_str()).unwrap()) + ContestedIndexFieldMatch::Regex(regex.clone()) } ContestedIndexFieldMatch::PositiveIntegerMatch(int) => { ContestedIndexFieldMatch::PositiveIntegerMatch(*int) @@ -494,15 +521,20 @@ impl TryFrom<&[(Value, Value)]> for Index { name = Some(field); } "regexPattern" => { - let regex = field_match_value.to_str()?.to_owned(); + let regex_str = + field_match_value.to_str()?.to_owned(); + + #[cfg(feature = "validation")] + Regex::new(&regex_str).map_err(|e| { + RegexError(format!( + "invalid field match regex: {}", + e.to_string() + )) + })?; + field_matches = Some(ContestedIndexFieldMatch::Regex( - Regex::new(&regex).map_err(|e| { - RegexError(format!( - "invalid field match regex: {}", - e.to_string() - )) - })?, + LazyRegex::new(regex_str), )); } key => { diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/estimated_size/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/estimated_size/v0/mod.rs index fcb8bfb81ad..55e6065f9ea 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/estimated_size/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/estimated_size/v0/mod.rs @@ -1,19 +1,32 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; - +use crate::ProtocolError; +use platform_version::version::PlatformVersion; // If another document type (like V1) ever were to exist we would need to implement estimated_size_v0 again impl DocumentTypeV0 { /// The estimated size uses the middle ceil size of all attributes - pub(in crate::data_contract::document_type) fn estimated_size_v0(&self) -> u16 { - let mut iter = self - .flattened_properties - .iter() - .filter_map(|(_, document_property)| { - document_property.property_type.middle_byte_size_ceil() - }); - let first = Some(iter.next().unwrap_or_default()); + pub(in crate::data_contract::document_type) fn estimated_size_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<u16, ProtocolError> { + let mut total_size = 0u16; + + for (_, document_property) in self.flattened_properties.iter() { + // This call now returns a Result<Option<u16>, ProtocolError>. + let maybe_size = document_property + .property_type + .middle_byte_size_ceil(platform_version)?; + + if let Some(size) = maybe_size { + total_size = match total_size.checked_add(size) { + Some(new_total) => new_total, + None => { + return Ok(u16::MAX); + } + }; + } + } - iter.fold(first, |acc, item| acc.and_then(|acc| acc.checked_add(item))) - .unwrap_or(u16::MAX) + Ok(total_size) } } diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/max_size/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/max_size/v0/mod.rs index ce8ffbd4394..346a7b5cf98 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/max_size/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/max_size/v0/mod.rs @@ -1,16 +1,30 @@ use crate::data_contract::document_type::v0::DocumentTypeV0; - +use crate::ProtocolError; +use platform_version::version::PlatformVersion; // If another document type (like V1) ever were to exist we would need to implement max_size_v0 again impl DocumentTypeV0 { - pub(in crate::data_contract::document_type) fn max_size_v0(&self) -> u16 { - let mut iter = self - .flattened_properties - .iter() - .filter_map(|(_, document_property)| document_property.property_type.max_byte_size()); - let first = Some(iter.next().unwrap_or_default()); + pub(in crate::data_contract::document_type) fn max_size_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<u16, ProtocolError> { + let mut total_size = 0u16; + + for (_, document_property) in self.flattened_properties.iter() { + let maybe_size = document_property + .property_type + .max_byte_size(platform_version)?; + + if let Some(size) = maybe_size { + total_size = match total_size.checked_add(size) { + Some(new_total) => new_total, + None => { + return Ok(u16::MAX); + } + }; + } + } - iter.fold(first, |acc, item| acc.and_then(|acc| acc.checked_add(item))) - .unwrap_or(u16::MAX) + Ok(total_size) } } diff --git a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs index 1c05a453046..d158336994f 100644 --- a/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/methods/mod.rs @@ -222,7 +222,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { .methods .max_size { - 0 => Ok(self.max_size_v0()), + 0 => self.max_size_v0(platform_version), version => Err(ProtocolError::UnknownVersionMismatch { method: "max_size".to_string(), known_versions: vec![0], @@ -239,7 +239,7 @@ impl DocumentTypeV0Methods for DocumentTypeV0 { .methods .estimated_size { - 0 => Ok(self.estimated_size_v0()), + 0 => self.estimated_size_v0(platform_version), version => Err(ProtocolError::UnknownVersionMismatch { method: "estimated_size".to_string(), known_versions: vec![0], diff --git a/packages/rs-dpp/src/data_contract/document_type/mod.rs b/packages/rs-dpp/src/data_contract/document_type/mod.rs index a87ceb3c9cc..23382dab535 100644 --- a/packages/rs-dpp/src/data_contract/document_type/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/mod.rs @@ -53,6 +53,8 @@ mod property_names { pub const CREATED_AT: &str = "$createdAt"; pub const UPDATED_AT: &str = "$updatedAt"; pub const TRANSFERRED_AT: &str = "$transferredAt"; + pub const MINIMUM: &str = "minimum"; + pub const MAXIMUM: &str = "maximum"; pub const MIN_ITEMS: &str = "minItems"; pub const MAX_ITEMS: &str = "maxItems"; pub const MIN_LENGTH: &str = "minLength"; diff --git a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs index 927fb561a1a..fd144701bcf 100644 --- a/packages/rs-dpp/src/data_contract/document_type/property/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/property/mod.rs @@ -12,6 +12,7 @@ use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; use indexmap::IndexMap; use integer_encoding::{VarInt, VarIntReader}; use platform_value::{Identifier, Value}; +use platform_version::version::PlatformVersion; use rand::distributions::{Alphanumeric, Standard}; use rand::rngs::StdRng; use rand::Rng; @@ -159,69 +160,93 @@ impl DocumentPropertyType { } } - pub fn min_byte_size(&self) -> Option<u16> { + pub fn min_byte_size( + &self, + platform_version: &PlatformVersion, + ) -> Result<Option<u16>, ProtocolError> { match self { - DocumentPropertyType::U128 => Some(16), - DocumentPropertyType::I128 => Some(16), - DocumentPropertyType::U64 => Some(8), - DocumentPropertyType::I64 => Some(8), - DocumentPropertyType::U32 => Some(4), - DocumentPropertyType::I32 => Some(4), - DocumentPropertyType::U16 => Some(2), - DocumentPropertyType::I16 => Some(2), - DocumentPropertyType::U8 => Some(1), - DocumentPropertyType::I8 => Some(1), - DocumentPropertyType::F64 => Some(8), + DocumentPropertyType::U128 => Ok(Some(16)), + DocumentPropertyType::I128 => Ok(Some(16)), + DocumentPropertyType::U64 => Ok(Some(8)), + DocumentPropertyType::I64 => Ok(Some(8)), + DocumentPropertyType::U32 => Ok(Some(4)), + DocumentPropertyType::I32 => Ok(Some(4)), + DocumentPropertyType::U16 => Ok(Some(2)), + DocumentPropertyType::I16 => Ok(Some(2)), + DocumentPropertyType::U8 => Ok(Some(1)), + DocumentPropertyType::I8 => Ok(Some(1)), + DocumentPropertyType::F64 => Ok(Some(8)), DocumentPropertyType::String(sizes) => match sizes.min_length { - None => Some(0), - Some(size) => Some(size * 4), + None => Ok(Some(0)), + Some(size) => { + if platform_version.protocol_version > 8 { + match size.checked_mul(4) { + Some(mul) => Ok(Some(mul)), + None => Err(ProtocolError::Overflow("min_byte_size overflow")), + } + } else { + Ok(Some(size.wrapping_mul(4))) + } + } }, DocumentPropertyType::ByteArray(sizes) => match sizes.min_size { - None => Some(0), - Some(size) => Some(size), + None => Ok(Some(0)), + Some(size) => Ok(Some(size)), }, - DocumentPropertyType::Boolean => Some(1), - DocumentPropertyType::Date => Some(8), + DocumentPropertyType::Boolean => Ok(Some(1)), + DocumentPropertyType::Date => Ok(Some(8)), DocumentPropertyType::Object(sub_fields) => sub_fields .iter() - .map(|(_, sub_field)| sub_field.property_type.min_byte_size()) + .map(|(_, sub_field)| sub_field.property_type.min_byte_size(platform_version)) .sum(), - DocumentPropertyType::Array(_) => None, - DocumentPropertyType::VariableTypeArray(_) => None, - DocumentPropertyType::Identifier => Some(32), + DocumentPropertyType::Array(_) => Ok(None), + DocumentPropertyType::VariableTypeArray(_) => Ok(None), + DocumentPropertyType::Identifier => Ok(Some(32)), } } - pub fn max_byte_size(&self) -> Option<u16> { + pub fn max_byte_size( + &self, + platform_version: &PlatformVersion, + ) -> Result<Option<u16>, ProtocolError> { match self { - DocumentPropertyType::U128 => Some(16), - DocumentPropertyType::I128 => Some(16), - DocumentPropertyType::U64 => Some(8), - DocumentPropertyType::I64 => Some(8), - DocumentPropertyType::U32 => Some(4), - DocumentPropertyType::I32 => Some(4), - DocumentPropertyType::U16 => Some(2), - DocumentPropertyType::I16 => Some(2), - DocumentPropertyType::U8 => Some(1), - DocumentPropertyType::I8 => Some(1), - DocumentPropertyType::F64 => Some(8), + DocumentPropertyType::U128 => Ok(Some(16)), + DocumentPropertyType::I128 => Ok(Some(16)), + DocumentPropertyType::U64 => Ok(Some(8)), + DocumentPropertyType::I64 => Ok(Some(8)), + DocumentPropertyType::U32 => Ok(Some(4)), + DocumentPropertyType::I32 => Ok(Some(4)), + DocumentPropertyType::U16 => Ok(Some(2)), + DocumentPropertyType::I16 => Ok(Some(2)), + DocumentPropertyType::U8 => Ok(Some(1)), + DocumentPropertyType::I8 => Ok(Some(1)), + DocumentPropertyType::F64 => Ok(Some(8)), DocumentPropertyType::String(sizes) => match sizes.max_length { - None => Some(u16::MAX), - Some(size) => Some(size * 4), + None => Ok(Some(u16::MAX)), + Some(size) => { + if platform_version.protocol_version > 8 { + match size.checked_mul(4) { + Some(mul) => Ok(Some(mul)), + None => Err(ProtocolError::Overflow("max_byte_size overflow")), + } + } else { + Ok(Some(size.wrapping_mul(4))) + } + } }, DocumentPropertyType::ByteArray(sizes) => match sizes.max_size { - None => Some(u16::MAX), - Some(size) => Some(size), + None => Ok(Some(u16::MAX)), + Some(size) => Ok(Some(size)), }, - DocumentPropertyType::Boolean => Some(1), - DocumentPropertyType::Date => Some(8), + DocumentPropertyType::Boolean => Ok(Some(1)), + DocumentPropertyType::Date => Ok(Some(8)), DocumentPropertyType::Object(sub_fields) => sub_fields .iter() - .map(|(_, sub_field)| sub_field.property_type.max_byte_size()) + .map(|(_, sub_field)| sub_field.property_type.max_byte_size(platform_version)) .sum(), - DocumentPropertyType::Array(_) => None, - DocumentPropertyType::VariableTypeArray(_) => None, - DocumentPropertyType::Identifier => Some(32), + DocumentPropertyType::Array(_) => Ok(None), + DocumentPropertyType::VariableTypeArray(_) => Ok(None), + DocumentPropertyType::Identifier => Ok(Some(32)), } } @@ -259,60 +284,66 @@ impl DocumentPropertyType { } /// The middle size rounded down halfway between min and max size - pub fn middle_size(&self) -> Option<u16> { - match self { - DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { - return None - } - _ => {} + pub fn middle_size(&self, platform_version: &PlatformVersion) -> Option<u16> { + let min_size = self.min_size()?; + let max_size = self.max_size()?; + if platform_version.protocol_version > 8 { + Some(((min_size as u32 + max_size as u32) / 2) as u16) + } else { + Some(min_size.wrapping_add(max_size) / 2) } - let min_size = self.min_size().unwrap(); - let max_size = self.max_size().unwrap(); - Some((min_size + max_size) / 2) } /// The middle size rounded up halfway between min and max size - pub fn middle_size_ceil(&self) -> Option<u16> { - match self { - DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { - return None - } - _ => {} + pub fn middle_size_ceil(&self, platform_version: &PlatformVersion) -> Option<u16> { + let min_size = self.min_size()?; + let max_size = self.max_size()?; + if platform_version.protocol_version > 8 { + Some(((min_size as u32 + max_size as u32 + 1) / 2) as u16) + } else { + Some(min_size.wrapping_add(max_size).wrapping_add(1) / 2) } - let min_size = self.min_size().unwrap(); - let max_size = self.max_size().unwrap(); - Some((min_size + max_size + 1) / 2) } /// The middle size rounded down halfway between min and max byte size - pub fn middle_byte_size(&self) -> Option<u16> { - match self { - DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { - return None - } - _ => {} + pub fn middle_byte_size( + &self, + platform_version: &PlatformVersion, + ) -> Result<Option<u16>, ProtocolError> { + let Some(min_size) = self.min_byte_size(platform_version)? else { + return Ok(None); + }; + let Some(max_size) = self.max_byte_size(platform_version)? else { + return Ok(None); + }; + if platform_version.protocol_version > 8 { + Ok(Some(((min_size as u32 + max_size as u32) / 2) as u16)) + } else { + Ok(Some(min_size.wrapping_add(max_size) / 2)) } - let min_size = self.min_byte_size().unwrap(); - let max_size = self.max_byte_size().unwrap(); - Some((min_size + max_size) / 2) } /// The middle size rounded up halfway between min and max byte size - pub fn middle_byte_size_ceil(&self) -> Option<u16> { - match self { - DocumentPropertyType::Array(_) | DocumentPropertyType::VariableTypeArray(_) => { - return None - } - _ => {} + pub fn middle_byte_size_ceil( + &self, + platform_version: &PlatformVersion, + ) -> Result<Option<u16>, ProtocolError> { + let Some(min_size) = self.min_byte_size(platform_version)? else { + return Ok(None); + }; + let Some(max_size) = self.max_byte_size(platform_version)? else { + return Ok(None); + }; + if platform_version.protocol_version > 8 { + Ok(Some(((min_size as u32 + max_size as u32 + 1) / 2) as u16)) + } else { + Ok(Some(min_size.wrapping_add(max_size).wrapping_add(1) / 2)) } - let min_size = self.min_byte_size().unwrap() as u32; - let max_size = self.max_byte_size().unwrap() as u32; - Some(((min_size + max_size + 1) / 2) as u16) } pub fn random_size(&self, rng: &mut StdRng) -> u16 { - let min_size = self.min_size().unwrap(); - let max_size = self.max_size().unwrap(); + let min_size = self.min_size().unwrap_or_default(); + let max_size = self.max_size().unwrap_or_default(); rng.gen_range(min_size..=max_size) } @@ -1730,6 +1761,7 @@ impl DocumentPropertyType { } pub fn encode_u16(val: u16) -> Vec<u8> { + //todo this should just be to_be_bytes (and for all unsigned integers) // Positive integers are represented in binary with the signed bit set to 0 // Negative integers are represented in 2's complement form @@ -1754,7 +1786,7 @@ impl DocumentPropertyType { wtr } - /// Decodes an unsigned integer on 32 bits. + /// Decodes an unsigned integer on 16 bits. pub fn decode_u16(val: &[u8]) -> Option<u16> { // Flip the sign bit // to deal with interaction between the domains diff --git a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs index 81194382f46..e875a6fe2c4 100644 --- a/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/restricted_creation/mod.rs @@ -1,8 +1,8 @@ use crate::consensus::basic::data_contract::UnknownDocumentCreationRestrictionModeError; use crate::consensus::basic::BasicError; use crate::consensus::ConsensusError; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::ProtocolError; +use bincode::{Decode, Encode}; use std::fmt; use std::fmt::{Display, Formatter}; diff --git a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs index 3560e2b9308..620fb154974 100644 --- a/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/document_type/schema/enrich_with_base_schema/v0/mod.rs @@ -1,11 +1,14 @@ use crate::data_contract::document_type::property_names; use crate::data_contract::errors::DataContractError; -use crate::data_contract::serialized_version::v0::property_names as contract_property_names; +use crate::data_contract::serialized_version::property_names as contract_property_names; use platform_value::{Value, ValueMapHelper}; pub const DATA_CONTRACT_SCHEMA_URI_V0: &str = "https://github.com/dashpay/platform/blob/master/packages/rs-dpp/schema/meta_schemas/document/v0/document-meta.json"; +pub const TOKEN_SCHEMA_URI_V0: &str = + "https://github.com/dashpay/platform/blob/master/packages/rs-dpp/schema/meta_schemas/document/v0/token-meta.json"; + pub const PROPERTY_SCHEMA: &str = "$schema"; const SYSTEM_GENERATED_FIELDS: [&str; 9] = [ diff --git a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs index beafe720de4..67ab7eb8569 100644 --- a/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs +++ b/packages/rs-dpp/src/data_contract/extra/drive_api_tests.rs @@ -107,7 +107,6 @@ mod test { let data_contract = DataContract::from_cbor(cbor_bytes, true, platform_version) .expect("contract should be deserialized"); - assert_eq!(0, data_contract.feature_version()); assert_eq!(expect_id, data_contract.id().as_bytes()); assert_eq!(expect_owner_id, data_contract.owner_id().as_bytes()); @@ -143,7 +142,7 @@ mod test { platform_version, ) .expect("expected to get a contract") - .into_v0() + .into_latest() .unwrap(); assert!(contract.config.documents_mutable_contract_default()); @@ -196,6 +195,58 @@ mod test { assert!(contact_info_indices[1].properties[0].ascending); } + #[test] + #[cfg(feature = "data-contract-cbor-conversion")] + fn mutability_properties_should_be_stored_and_restored_during_cbor_serialization_contract_v0() { + let platform_version = PlatformVersion::get(7).expect("expected version 7"); + + let mut contract = json_document_to_contract( + "../rs-drive/tests/supporting_files/contract/dashpay/dashpay-contract.json", + false, + platform_version, + ) + .expect("expected to get a cbor document") + .into_v0() + .unwrap(); + + assert!(!contract.config().readonly()); + assert!(!contract.config.keeps_history()); + assert!(contract.config.documents_mutable_contract_default()); + assert!(!contract.config.documents_keep_history_contract_default()); + + contract.config.set_readonly(true); + contract.config.set_keeps_history(true); + contract + .config + .set_documents_mutable_contract_default(false); + contract + .config + .set_documents_can_be_deleted_contract_default(false); + contract + .config + .set_documents_keep_history_contract_default(true); + + let contract_cbor = contract + .to_cbor(platform_version) + .expect("serialization shouldn't fail"); + let deserialized_contract = DataContract::from_cbor(contract_cbor, true, platform_version) + .expect("deserialization shouldn't fail"); + + assert_matches!( + deserialized_contract.config(), + DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: true, + keeps_history: true, + documents_mutable_contract_default: false, + documents_keep_history_contract_default: true, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }) + ); + } + #[test] #[cfg(feature = "data-contract-cbor-conversion")] fn mutability_properties_should_be_stored_and_restored_during_cbor_serialization() { @@ -207,7 +258,7 @@ mod test { platform_version, ) .expect("expected to get a cbor document") - .into_v0() + .into_v1() .unwrap(); assert!(!contract.config().readonly()); @@ -259,7 +310,7 @@ mod test { ) .expect("expected to decode a contract"); - let contract_v0 = contract.as_v0_mut().unwrap(); + let contract_v0 = contract.as_latest_mut().unwrap(); assert!(!contract_v0.config().readonly()); assert!(!contract_v0.config.keeps_history()); @@ -286,7 +337,7 @@ mod test { .expect("deserialization shouldn't fail"); assert_eq!( - deserialized_contract.as_v0().unwrap().config, + deserialized_contract.as_latest().unwrap().config, DataContractConfig::V0(DataContractConfigV0 { can_be_deleted: false, readonly: true, diff --git a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs index 7b9949e5f88..0c07d25a614 100644 --- a/packages/rs-dpp/src/data_contract/factory/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/factory/v0/mod.rs @@ -9,10 +9,10 @@ use crate::data_contract::config::DataContractConfig; #[cfg(feature = "data-contract-value-conversion")] use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; use crate::data_contract::created_data_contract::CreatedDataContract; -#[cfg(feature = "data-contract-value-conversion")] -use crate::data_contract::data_contract::DataContractV0; use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +#[cfg(feature = "data-contract-value-conversion")] +use crate::data_contract::v0::DataContractV0; use crate::data_contract::{DataContract, INITIAL_DATA_CONTRACT_VERSION}; use crate::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; #[cfg(feature = "state-transitions")] @@ -20,6 +20,7 @@ use crate::state_transition::data_contract_create_transition::DataContractCreate #[cfg(feature = "state-transitions")] use crate::state_transition::data_contract_update_transition::DataContractUpdateTransition; +use crate::data_contract::v1::DataContractV1; use crate::prelude::IdentityNonce; use crate::version::PlatformVersion; use crate::{errors::ProtocolError, prelude::Identifier}; @@ -117,9 +118,15 @@ impl DataContractFactoryV0 { platform_version, )? .into()), + 1 => Ok(DataContractV1::from_value( + data_contract_object, + full_validation, + platform_version, + )? + .into()), version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContractFactoryV0::create_from_object".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } diff --git a/packages/rs-dpp/src/data_contract/group/accessors/mod.rs b/packages/rs-dpp/src/data_contract/group/accessors/mod.rs new file mode 100644 index 00000000000..2d24cd45f58 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/accessors/mod.rs @@ -0,0 +1 @@ +pub mod v0; diff --git a/packages/rs-dpp/src/data_contract/group/accessors/v0/mod.rs b/packages/rs-dpp/src/data_contract/group/accessors/v0/mod.rs new file mode 100644 index 00000000000..55353dd047b --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/accessors/v0/mod.rs @@ -0,0 +1,33 @@ +use crate::data_contract::group::GroupRequiredPower; +use crate::ProtocolError; +use platform_value::Identifier; +use std::collections::BTreeMap; + +/// Getters for GroupV0 +pub trait GroupV0Getters { + /// Returns the member power + fn member_power(&self, member_id: Identifier) -> Result<u32, ProtocolError>; + /// Returns the members map of the group + fn members(&self) -> &BTreeMap<Identifier, u32>; + + /// Returns a mutable reference to the members map of the group + fn members_mut(&mut self) -> &mut BTreeMap<Identifier, u32>; + + /// Returns the required power of the group + fn required_power(&self) -> GroupRequiredPower; +} + +/// Setters for GroupV0 +pub trait GroupV0Setters { + /// Sets the members of the group + fn set_members(&mut self, members: BTreeMap<Identifier, u32>); + + /// Inserts or updates a member with a specific power + fn set_member_power(&mut self, member_id: Identifier, power: u32); + + /// Removes a member from the group + fn remove_member(&mut self, member_id: &Identifier) -> bool; + + /// Sets the required power of the group + fn set_required_power(&mut self, required_power: GroupRequiredPower); +} diff --git a/packages/rs-dpp/src/data_contract/group/methods/mod.rs b/packages/rs-dpp/src/data_contract/group/methods/mod.rs new file mode 100644 index 00000000000..2d24cd45f58 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/methods/mod.rs @@ -0,0 +1 @@ +pub mod v0; diff --git a/packages/rs-dpp/src/data_contract/group/methods/v0/mod.rs b/packages/rs-dpp/src/data_contract/group/methods/v0/mod.rs new file mode 100644 index 00000000000..c57a7ad2279 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/methods/v0/mod.rs @@ -0,0 +1,10 @@ +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; + +pub trait GroupMethodsV0 { + fn validate( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError>; +} diff --git a/packages/rs-dpp/src/data_contract/group/mod.rs b/packages/rs-dpp/src/data_contract/group/mod.rs new file mode 100644 index 00000000000..9f8f4cc97b9 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/mod.rs @@ -0,0 +1,99 @@ +use crate::data_contract::group::accessors::v0::{GroupV0Getters, GroupV0Setters}; +use crate::data_contract::group::methods::v0::GroupMethodsV0; +use crate::data_contract::group::v0::GroupV0; +use crate::errors::ProtocolError; +use crate::validation::SimpleConsensusValidationResult; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +pub mod accessors; +pub(crate) mod methods; +pub mod v0; + +pub type RequiredSigners = u8; + +pub type GroupMemberPower = u32; +pub type GroupSumPower = u32; +pub type GroupRequiredPower = u32; +#[derive( + Serialize, + Deserialize, + Decode, + Encode, + PlatformSerialize, + PlatformDeserialize, + Debug, + Clone, + PartialEq, + Eq, +)] +#[platform_serialize(unversioned)] +pub enum Group { + V0(GroupV0), +} + +impl GroupV0Getters for Group { + fn member_power(&self, member_id: Identifier) -> Result<u32, ProtocolError> { + match self { + Group::V0(group_v0) => group_v0.member_power(member_id), + } + } + fn members(&self) -> &BTreeMap<Identifier, u32> { + match self { + Group::V0(group_v0) => group_v0.members(), + } + } + + fn members_mut(&mut self) -> &mut BTreeMap<Identifier, u32> { + match self { + Group::V0(group_v0) => group_v0.members_mut(), + } + } + + fn required_power(&self) -> GroupRequiredPower { + match self { + Group::V0(group_v0) => group_v0.required_power(), + } + } +} + +impl GroupV0Setters for Group { + fn set_members(&mut self, members: BTreeMap<Identifier, u32>) { + match self { + Group::V0(group_v0) => group_v0.set_members(members), + } + } + + fn set_member_power(&mut self, member_id: Identifier, power: u32) { + match self { + Group::V0(group_v0) => group_v0.set_member_power(member_id, power), + } + } + + fn remove_member(&mut self, member_id: &Identifier) -> bool { + match self { + Group::V0(group_v0) => group_v0.remove_member(member_id), + } + } + + fn set_required_power(&mut self, required_power: GroupRequiredPower) { + match self { + Group::V0(group_v0) => group_v0.set_required_power(required_power), + } + } +} + +impl GroupMethodsV0 for Group { + fn validate( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + match self { + Group::V0(group_v0) => group_v0.validate(platform_version), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/group/v0/mod.rs b/packages/rs-dpp/src/data_contract/group/v0/mod.rs new file mode 100644 index 00000000000..c4b04befcc0 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/group/v0/mod.rs @@ -0,0 +1,155 @@ +use crate::consensus::basic::data_contract::{ + GroupExceedsMaxMembersError, GroupMemberHasPowerOfZeroError, GroupMemberHasPowerOverLimitError, + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, + GroupTotalPowerLessThanRequiredError, +}; +use crate::data_contract::group::accessors::v0::{GroupV0Getters, GroupV0Setters}; +use crate::data_contract::group::methods::v0::GroupMethodsV0; +use crate::data_contract::group::{GroupMemberPower, GroupRequiredPower}; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive( + Serialize, + Deserialize, + Decode, + Encode, + PlatformSerialize, + PlatformDeserialize, + Debug, + Clone, + PartialEq, + Eq, +)] +#[platform_serialize(unversioned)] +pub struct GroupV0 { + pub members: BTreeMap<Identifier, GroupMemberPower>, + pub required_power: GroupRequiredPower, +} + +impl GroupV0Getters for GroupV0 { + fn member_power(&self, member_id: Identifier) -> Result<u32, ProtocolError> { + self.members + .get(&member_id) + .cloned() + .ok_or(ProtocolError::GroupMemberNotFound(format!( + "Group member {} not found", + member_id + ))) + } + + fn members(&self) -> &BTreeMap<Identifier, u32> { + &self.members + } + + fn members_mut(&mut self) -> &mut BTreeMap<Identifier, u32> { + &mut self.members + } + + fn required_power(&self) -> GroupRequiredPower { + self.required_power + } +} + +impl GroupV0Setters for GroupV0 { + fn set_members(&mut self, members: BTreeMap<Identifier, u32>) { + self.members = members; + } + + fn set_member_power(&mut self, member_id: Identifier, power: u32) { + self.members.insert(member_id, power); + } + + fn remove_member(&mut self, member_id: &Identifier) -> bool { + self.members.remove(member_id).is_some() + } + + fn set_required_power(&mut self, required_power: GroupRequiredPower) { + self.required_power = required_power; + } +} + +impl GroupMethodsV0 for GroupV0 { + /// Validates the group to ensure: + /// - The sum of all group member powers is equal to or greater than the required power. + /// - No group member has a power of 0. + /// - The group does not exceed the maximum allowed members (256). + /// + /// # Returns + /// - `Ok(SimpleConsensusValidationResult)` if the group is valid. + /// - `Err(ProtocolError)` if validation fails due to an invalid group configuration. + fn validate( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + let max_group_members = platform_version.system_limits.max_contract_group_size; + const GROUP_POWER_LIMIT: GroupMemberPower = u16::MAX as GroupMemberPower; + + // Check the number of members does not exceed the maximum allowed + if self.members.len() as u32 > max_group_members { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupExceedsMaxMembersError::new(max_group_members).into(), + )); + } + + let mut total_power: GroupMemberPower = 0; + + let mut total_power_without_unilateral_members: GroupMemberPower = 0; + + // Iterate over members to validate their power and calculate the total power + for (&member, &power) in &self.members { + if power == 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupMemberHasPowerOfZeroError::new(member).into(), + )); + } + if power > GROUP_POWER_LIMIT { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupMemberHasPowerOverLimitError::new(member, power, GROUP_POWER_LIMIT).into(), + )); + } + if power > self.required_power { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupMemberHasPowerOverLimitError::new(member, power, self.required_power) + .into(), + )); + } + total_power = total_power + .checked_add(power) + .ok_or_else(|| ProtocolError::Overflow("Total power overflowed"))?; + + if power < self.required_power { + total_power_without_unilateral_members = total_power_without_unilateral_members + .checked_add(power) + .ok_or_else(|| ProtocolError::Overflow("Total power overflowed"))?; + } + } + + // Check if the total power meets the required power + if total_power < self.required_power { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupTotalPowerLessThanRequiredError::new(total_power, self.required_power).into(), + )); + } + + // Check if the total power without unilateral members meets the required power + if total_power_without_unilateral_members < self.required_power { + return Ok(SimpleConsensusValidationResult::new_with_error( + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError::new( + total_power_without_unilateral_members, + self.required_power, + ) + .into(), + )); + } + + // If all validations pass, return an empty validation result + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-dpp/src/data_contract/methods/mod.rs b/packages/rs-dpp/src/data_contract/methods/mod.rs index d9bde273a7d..20b64863c06 100644 --- a/packages/rs-dpp/src/data_contract/methods/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/mod.rs @@ -2,4 +2,6 @@ pub mod schema; #[cfg(feature = "validation")] pub mod validate_document; #[cfg(feature = "validation")] +pub mod validate_groups; +#[cfg(feature = "validation")] pub mod validate_update; diff --git a/packages/rs-dpp/src/data_contract/methods/schema/mod.rs b/packages/rs-dpp/src/data_contract/methods/schema/mod.rs index 63748fb45f8..b048cd44ffe 100644 --- a/packages/rs-dpp/src/data_contract/methods/schema/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/schema/mod.rs @@ -26,6 +26,13 @@ impl DataContractSchemaMethodsV0 for DataContract { validation_operations, platform_version, ), + DataContract::V1(v1) => v1.set_document_schemas( + schemas, + defs, + full_validation, + validation_operations, + platform_version, + ), } } @@ -45,18 +52,27 @@ impl DataContractSchemaMethodsV0 for DataContract { validation_operations, platform_version, ), + DataContract::V1(v1) => v1.set_document_schema( + name, + schema, + full_validation, + validation_operations, + platform_version, + ), } } fn document_schemas(&self) -> BTreeMap<DocumentName, &Value> { match self { DataContract::V0(v0) => v0.document_schemas(), + DataContract::V1(v1) => v1.document_schemas(), } } fn schema_defs(&self) -> Option<&BTreeMap<DefinitionName, Value>> { match self { DataContract::V0(v0) => v0.schema_defs(), + DataContract::V1(v1) => v1.schema_defs(), } } @@ -74,6 +90,12 @@ impl DataContractSchemaMethodsV0 for DataContract { validation_operations, platform_version, ), + DataContract::V1(v1) => v1.set_schema_defs( + defs, + full_validation, + validation_operations, + platform_version, + ), } } } diff --git a/packages/rs-dpp/src/data_contract/methods/validate_groups/mod.rs b/packages/rs-dpp/src/data_contract/methods/validate_groups/mod.rs new file mode 100644 index 00000000000..d6a6bef8a87 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/methods/validate_groups/mod.rs @@ -0,0 +1,58 @@ +use crate::data_contract::group::Group; +use crate::data_contract::GroupContractPosition; +use crate::prelude::DataContract; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; + +impl DataContract { + /// Validates the provided groups to ensure they meet the requirements for data contracts. + /// + /// # Parameters + /// - `groups`: A reference to a `BTreeMap` of group contract positions (`GroupContractPosition`) + /// mapped to their corresponding `Group` objects. These represent the groups associated with + /// the data contract. + /// - `platform_version`: A reference to the [`PlatformVersion`](crate::version::PlatformVersion) + /// object specifying the version of the platform and determining which validation method to use. + /// + /// # Returns + /// - `Ok(SimpleConsensusValidationResult)` if all the groups pass validation: + /// - Group contract positions must be contiguous, i.e., no gaps between positions. + /// - Each group must meet its individual validation criteria. + /// - `Err(ProtocolError)` if: + /// - An unknown or unsupported platform version is provided. + /// - Validation of any group fails. + /// + /// # Behavior + /// - Delegates the actual validation logic to the appropriate versioned implementation + /// (`validate_groups_v0`) based on the provided platform version. + /// - If an unknown platform version is encountered, a `ProtocolError::UnknownVersionMismatch` + /// is returned. + /// + /// # Errors + /// - Returns a `ProtocolError::UnknownVersionMismatch` if the platform version is not recognized. + /// - Returns validation errors for: + /// - Non-contiguous group contract positions (`NonContiguousContractGroupPositionsError`). + /// - Invalid individual group configurations (e.g., power-related errors or exceeding member limits). + pub fn validate_groups( + groups: &BTreeMap<GroupContractPosition, Group>, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + match platform_version + .dpp + .contract_versions + .methods + .validate_groups + { + 0 => Self::validate_groups_v0(groups, platform_version), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DataContract::validate_groups".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/data_contract/methods/validate_groups/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validate_groups/v0/mod.rs new file mode 100644 index 00000000000..b6f4fc27536 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/methods/validate_groups/v0/mod.rs @@ -0,0 +1,39 @@ +use crate::consensus::basic::data_contract::NonContiguousContractGroupPositionsError; +use crate::data_contract::group::methods::v0::GroupMethodsV0; +use crate::data_contract::group::Group; +use crate::data_contract::{DataContract, GroupContractPosition}; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl DataContract { + #[inline(always)] + pub(super) fn validate_groups_v0( + groups: &BTreeMap<GroupContractPosition, Group>, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + // Check for gaps in the group contract positions + let mut expected_position = 0; + for &position in groups.keys() { + if position != expected_position { + return Ok(SimpleConsensusValidationResult::new_with_error( + NonContiguousContractGroupPositionsError::new(expected_position, position) + .into(), + )); + } + expected_position += 1; + } + + // Validate each group individually + for group in groups.values() { + let validation_result = group.validate(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + } + + // If we reach here, everything is valid + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs b/packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs index fed077b7128..21b9fc6183b 100644 --- a/packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/methods/validate_update/v0/mod.rs @@ -3,8 +3,10 @@ use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::consensus::basic::data_contract::{ IncompatibleDataContractSchemaError, InvalidDataContractVersionError, }; +use crate::consensus::state::data_contract::data_contract_update_action_not_allowed_error::DataContractUpdateActionNotAllowedError; use crate::consensus::state::data_contract::data_contract_update_permission_error::DataContractUpdatePermissionError; use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; +use crate::data_contract::accessors::v1::DataContractV1Getters; use crate::data_contract::document_type::schema::validate_schema_compatibility; use crate::data_contract::schema::DataContractSchemaMethodsV0; use crate::data_contract::DataContract; @@ -164,6 +166,86 @@ impl DataContract { return Ok(SimpleConsensusValidationResult::new_with_errors(errors)); } } + + if self.groups() != new_data_contract.groups() { + // No groups can have been removed + for old_group_position in self.groups().keys() { + if !new_data_contract.groups().contains_key(old_group_position) { + return Ok(SimpleConsensusValidationResult::new_with_error( + DataContractUpdateActionNotAllowedError::new( + self.id(), + "remove group".to_string(), + ) + .into(), + )); + } + } + + // Ensure no group has been changed + for (old_group_position, old_group) in self.groups() { + if let Some(new_group) = new_data_contract.groups().get(old_group_position) { + if old_group != new_group { + return Ok(SimpleConsensusValidationResult::new_with_error( + DataContractUpdateActionNotAllowedError::new( + self.id(), + format!( + "change group at position {} is not allowed", + old_group_position + ), + ) + .into(), + )); + } + } + } + + let valid = + DataContract::validate_groups(new_data_contract.groups(), platform_version)?; + if !valid.is_valid() { + return Ok(valid); + } + } + + if self.tokens() != new_data_contract.tokens() { + for (token_position, old_token_config) in self.tokens() { + // Check if a token has been removed + if !new_data_contract.tokens().contains_key(token_position) { + return Ok(SimpleConsensusValidationResult::new_with_error( + DataContractUpdateActionNotAllowedError::new( + self.id(), + format!("remove token at position {}", token_position), + ) + .into(), + )); + } + + // Check if a token configuration has been changed + if let Some(new_token_config) = new_data_contract.tokens().get(token_position) { + if old_token_config != new_token_config { + return Ok(SimpleConsensusValidationResult::new_with_error( + DataContractUpdateActionNotAllowedError::new( + self.id(), + format!("update token at position {}", token_position), + ) + .into(), + )); + } + } + } + + // Check if a token has been added + for token_position in new_data_contract.tokens().keys() { + if !self.tokens().contains_key(token_position) { + return Ok(SimpleConsensusValidationResult::new_with_error( + DataContractUpdateActionNotAllowedError::new( + self.id(), + format!("add token at position {}", token_position), + ) + .into(), + )); + } + } + } } Ok(SimpleConsensusValidationResult::new()) diff --git a/packages/rs-dpp/src/data_contract/mod.rs b/packages/rs-dpp/src/data_contract/mod.rs index 5fd8f7b56f5..9b4d5d880a2 100644 --- a/packages/rs-dpp/src/data_contract/mod.rs +++ b/packages/rs-dpp/src/data_contract/mod.rs @@ -3,10 +3,12 @@ use crate::serialization::{ PlatformDeserializableWithPotentialValidationFromVersionedStructure, PlatformLimitDeserializableFromVersionedStructure, PlatformSerializableWithPlatformVersion, }; +use std::collections::BTreeMap; use derive_more::From; use bincode::config::{BigEndian, Configuration}; +use once_cell::sync::Lazy; pub mod errors; pub mod extra; @@ -17,12 +19,18 @@ mod generate_data_contract; pub mod created_data_contract; pub mod document_type; -mod v0; +pub mod v0; +pub mod v1; #[cfg(feature = "factories")] pub mod factory; #[cfg(feature = "factories")] pub use factory::*; +#[cfg(any( + feature = "data-contract-value-conversion", + feature = "data-contract-cbor-conversion", + feature = "data-contract-json-conversion" +))] pub mod conversion; #[cfg(feature = "client")] mod data_contract_facade; @@ -32,11 +40,12 @@ mod methods; pub mod serialized_version; pub use methods::*; pub mod accessors; +pub mod associated_token; +pub mod change_control_rules; pub mod config; +pub mod group; pub mod storage_requirements; -pub use v0::*; - use crate::data_contract::serialized_version::{ DataContractInSerializationFormat, CONTRACT_DESERIALIZATION_LIMIT, }; @@ -46,6 +55,10 @@ use crate::version::{FeatureVersion, PlatformVersion}; use crate::ProtocolError; use crate::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; +pub use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; use platform_version::TryIntoPlatformVersioned; use platform_versioning::PlatformVersioned; pub use serde_json::Value as JsonValue; @@ -53,10 +66,18 @@ pub use serde_json::Value as JsonValue; type JsonSchema = JsonValue; type DefinitionName = String; pub type DocumentName = String; +pub type TokenName = String; +pub type GroupContractPosition = u16; +pub type TokenContractPosition = u16; type PropertyPath = String; pub const INITIAL_DATA_CONTRACT_VERSION: u32 = 1; +// Define static empty BTreeMaps +static EMPTY_GROUPS: Lazy<BTreeMap<GroupContractPosition, Group>> = Lazy::new(|| BTreeMap::new()); +static EMPTY_TOKENS: Lazy<BTreeMap<TokenContractPosition, TokenConfiguration>> = + Lazy::new(|| BTreeMap::new()); + /// Understanding Data Contract versioning /// Data contract versioning is both for the code structure and for serialization. /// @@ -85,6 +106,7 @@ pub const INITIAL_DATA_CONTRACT_VERSION: u32 = 1; #[derive(Debug, Clone, PartialEq, From, PlatformVersioned)] pub enum DataContract { V0(DataContractV0), + V1(DataContractV1), } impl PlatformSerializableWithPlatformVersion for DataContract { @@ -214,18 +236,66 @@ impl DataContract { pub fn as_v0(&self) -> Option<&DataContractV0> { match self { DataContract::V0(v0) => Some(v0), + _ => None, } } pub fn as_v0_mut(&mut self) -> Option<&mut DataContractV0> { match self { DataContract::V0(v0) => Some(v0), + _ => None, } } pub fn into_v0(self) -> Option<DataContractV0> { match self { DataContract::V0(v0) => Some(v0), + _ => None, + } + } + + pub fn as_v1(&self) -> Option<&DataContractV1> { + match self { + DataContract::V1(v1) => Some(v1), + _ => None, + } + } + + pub fn as_v1_mut(&mut self) -> Option<&mut DataContractV1> { + match self { + DataContract::V1(v1) => Some(v1), + _ => None, + } + } + + pub fn into_v1(self) -> Option<DataContractV1> { + match self { + DataContract::V1(v1) => Some(v1), + _ => None, + } + } + + /// This should only ever be used in tests, as it will change + #[cfg(test)] + pub fn into_latest(self) -> Option<DataContractV1> { + self.into_v1() + } + + /// This should only ever be used in tests, as it will change + #[cfg(test)] + pub fn as_latest(&self) -> Option<&DataContractV1> { + match self { + DataContract::V1(v1) => Some(v1), + _ => None, + } + } + + /// This should only ever be used in tests, as it will change + #[cfg(test)] + pub fn as_latest_mut(&mut self) -> Option<&mut DataContractV1> { + match self { + DataContract::V1(v1) => Some(v1), + _ => None, } } diff --git a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs index 150bc6a28bf..a88d93413bb 100644 --- a/packages/rs-dpp/src/data_contract/serialized_version/mod.rs +++ b/packages/rs-dpp/src/data_contract/serialized_version/mod.rs @@ -1,9 +1,16 @@ -use crate::data_contract::data_contract::DataContractV0; use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; -use crate::data_contract::{DataContract, DefinitionName, DocumentName}; +use crate::data_contract::{ + DataContract, DefinitionName, DocumentName, GroupContractPosition, TokenContractPosition, + EMPTY_GROUPS, EMPTY_TOKENS, +}; use crate::version::PlatformVersion; use std::collections::BTreeMap; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1; +use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; use crate::validation::operations::ProtocolValidationOperation; use crate::ProtocolError; use bincode::{Decode, Encode}; @@ -15,6 +22,14 @@ use platform_versioning::PlatformVersioned; use serde::{Deserialize, Serialize}; pub(in crate::data_contract) mod v0; +pub(in crate::data_contract) mod v1; + +pub mod property_names { + pub const ID: &str = "id"; + pub const OWNER_ID: &str = "ownerId"; + pub const VERSION: &str = "version"; + pub const DEFINITIONS: &str = "$defs"; +} pub const CONTRACT_DESERIALIZATION_LIMIT: usize = 15000; @@ -27,6 +42,8 @@ pub const CONTRACT_DESERIALIZATION_LIMIT: usize = 15000; pub enum DataContractInSerializationFormat { #[cfg_attr(feature = "data-contract-serde-conversion", serde(rename = "0"))] V0(DataContractInSerializationFormatV0), + #[cfg_attr(feature = "data-contract-serde-conversion", serde(rename = "1"))] + V1(DataContractInSerializationFormatV1), } impl DataContractInSerializationFormat { @@ -34,6 +51,7 @@ impl DataContractInSerializationFormat { pub fn id(&self) -> Identifier { match self { DataContractInSerializationFormat::V0(v0) => v0.id, + DataContractInSerializationFormat::V1(v1) => v1.id, } } @@ -41,24 +59,41 @@ impl DataContractInSerializationFormat { pub fn owner_id(&self) -> Identifier { match self { DataContractInSerializationFormat::V0(v0) => v0.owner_id, + DataContractInSerializationFormat::V1(v1) => v1.owner_id, } } pub fn document_schemas(&self) -> &BTreeMap<DocumentName, Value> { match self { DataContractInSerializationFormat::V0(v0) => &v0.document_schemas, + DataContractInSerializationFormat::V1(v1) => &v1.document_schemas, } } pub fn schema_defs(&self) -> Option<&BTreeMap<DefinitionName, Value>> { match self { DataContractInSerializationFormat::V0(v0) => v0.schema_defs.as_ref(), + DataContractInSerializationFormat::V1(v1) => v1.schema_defs.as_ref(), } } pub fn version(&self) -> u32 { match self { DataContractInSerializationFormat::V0(v0) => v0.version, + DataContractInSerializationFormat::V1(v1) => v1.version, + } + } + + pub fn groups(&self) -> &BTreeMap<GroupContractPosition, Group> { + match self { + DataContractInSerializationFormat::V0(_) => &EMPTY_GROUPS, + DataContractInSerializationFormat::V1(v1) => &v1.groups, + } + } + pub fn tokens(&self) -> &BTreeMap<TokenContractPosition, TokenConfiguration> { + match self { + DataContractInSerializationFormat::V0(_) => &EMPTY_TOKENS, + DataContractInSerializationFormat::V1(v1) => &v1.tokens, } } } @@ -80,9 +115,13 @@ impl TryFromPlatformVersioned<DataContractV0> for DataContractInSerializationFor let v0_format: DataContractInSerializationFormatV0 = DataContract::V0(value).into(); Ok(v0_format.into()) } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = DataContract::V0(value).into(); + Ok(v1_format.into()) + } version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::serialize_to_default_current_version".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -107,9 +146,76 @@ impl TryFromPlatformVersioned<&DataContractV0> for DataContractInSerializationFo DataContract::V0(value.to_owned()).into(); Ok(v0_format.into()) } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = + DataContract::V0(value.to_owned()).into(); + Ok(v1_format.into()) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DataContract::serialize_to_default_current_version".to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } +} + +impl TryFromPlatformVersioned<DataContractV1> for DataContractInSerializationFormat { + type Error = ProtocolError; + + fn try_from_platform_versioned( + value: DataContractV1, + platform_version: &PlatformVersion, + ) -> Result<Self, Self::Error> { + match platform_version + .dpp + .contract_versions + .contract_serialization_version + .default_current_version + { + 0 => { + let v0_format: DataContractInSerializationFormatV0 = DataContract::V1(value).into(); + Ok(v0_format.into()) + } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = DataContract::V1(value).into(); + Ok(v1_format.into()) + } version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::serialize_to_default_current_version".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], + received: version, + }), + } + } +} + +impl TryFromPlatformVersioned<&DataContractV1> for DataContractInSerializationFormat { + type Error = ProtocolError; + + fn try_from_platform_versioned( + value: &DataContractV1, + platform_version: &PlatformVersion, + ) -> Result<Self, Self::Error> { + match platform_version + .dpp + .contract_versions + .contract_serialization_version + .default_current_version + { + 0 => { + let v0_format: DataContractInSerializationFormatV0 = + DataContract::V1(value.to_owned()).into(); + Ok(v0_format.into()) + } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = + DataContract::V1(value.to_owned()).into(); + Ok(v1_format.into()) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DataContract::serialize_to_default_current_version".to_string(), + known_versions: vec![0, 1], received: version, }), } @@ -133,9 +239,13 @@ impl TryFromPlatformVersioned<&DataContract> for DataContractInSerializationForm let v0_format: DataContractInSerializationFormatV0 = value.clone().into(); Ok(v0_format.into()) } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = value.clone().into(); + Ok(v1_format.into()) + } version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::serialize_to_default_current_version".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -159,9 +269,13 @@ impl TryFromPlatformVersioned<DataContract> for DataContractInSerializationForma let v0_format: DataContractInSerializationFormatV0 = value.into(); Ok(v0_format.into()) } + 1 => { + let v1_format: DataContractInSerializationFormatV1 = value.into(); + Ok(v1_format.into()) + } version => Err(ProtocolError::UnknownVersionMismatch { method: "DataContract::serialize_consume_to_default_current_version".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, }), } @@ -175,29 +289,30 @@ impl DataContract { validation_operations: &mut Vec<ProtocolValidationOperation>, platform_version: &PlatformVersion, ) -> Result<Self, ProtocolError> { - match value { - DataContractInSerializationFormat::V0(serialization_format_v0) => { - match platform_version - .dpp - .contract_versions - .contract_structure_version - { - 0 => { - let data_contract = DataContractV0::try_from_platform_versioned_v0( - serialization_format_v0, - full_validation, - validation_operations, - platform_version, - )?; - Ok(data_contract.into()) - } - version => Err(ProtocolError::UnknownVersionMismatch { - method: "DataContract::from_serialization_format".to_string(), - known_versions: vec![0], - received: version, - }), - } - } + match platform_version + .dpp + .contract_versions + .contract_structure_version + { + 0 => DataContractV0::try_from_platform_versioned( + value, + full_validation, + validation_operations, + platform_version, + ) + .map(|contract| contract.into()), + 1 => DataContractV1::try_from_platform_versioned( + value, + full_validation, + validation_operations, + platform_version, + ) + .map(|contract| contract.into()), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DataContract::try_from_platform_versioned".to_string(), + known_versions: vec![0, 1], + received: version, + }), } } } diff --git a/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs index 085b1d2a829..6cd119e3bf0 100644 --- a/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs +++ b/packages/rs-dpp/src/data_contract/serialized_version/v0/mod.rs @@ -3,19 +3,13 @@ use crate::data_contract::config::DataContractConfig; use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; use crate::data_contract::{DataContract, DefinitionName, DocumentName}; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; +use bincode::{Decode, Encode}; use platform_value::{Identifier, Value}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; -pub mod property_names { - pub const ID: &str = "id"; - pub const OWNER_ID: &str = "ownerId"; - pub const VERSION: &str = "version"; - pub const DEFINITIONS: &str = "$defs"; -} - #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] #[serde(rename_all = "camelCase")] pub struct DataContractInSerializationFormatV0 { @@ -53,6 +47,29 @@ impl From<DataContract> for DataContractInSerializationFormatV0 { .. } = v0; + DataContractInSerializationFormatV0 { + id, + config, + version, + owner_id, + document_schemas: document_types + .into_iter() + .map(|(key, document_type)| (key, document_type.schema_owned())) + .collect(), + schema_defs, + } + } + DataContract::V1(v1) => { + let DataContractV1 { + id, + config, + version, + owner_id, + schema_defs, + document_types, + .. + } = v1; + DataContractInSerializationFormatV0 { id, config, diff --git a/packages/rs-dpp/src/data_contract/serialized_version/v1/mod.rs b/packages/rs-dpp/src/data_contract/serialized_version/v1/mod.rs new file mode 100644 index 00000000000..d24ed1402cd --- /dev/null +++ b/packages/rs-dpp/src/data_contract/serialized_version/v1/mod.rs @@ -0,0 +1,136 @@ +use crate::data_contract::config::v0::DataContractConfigV0; +use crate::data_contract::config::DataContractConfig; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; + +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::group::Group; +use crate::data_contract::v0::DataContractV0; +use crate::data_contract::v1::DataContractV1; +use crate::data_contract::{ + DataContract, DefinitionName, DocumentName, GroupContractPosition, TokenContractPosition, +}; +use bincode::{Decode, Encode}; +use platform_value::{Identifier, Value}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Encode, Decode)] +#[serde(rename_all = "camelCase")] +pub struct DataContractInSerializationFormatV1 { + /// A unique identifier for the data contract. + pub id: Identifier, + + /// Internal configuration for the contract. + #[serde(default = "DataContractConfigV0::default_with_version")] + pub config: DataContractConfig, + + /// The version of this data contract. + pub version: u32, + + /// The identifier of the contract owner. + pub owner_id: Identifier, + + /// Shared subschemas to reuse across documents as $defs object + pub schema_defs: Option<BTreeMap<DefinitionName, Value>>, + + /// Document JSON Schemas per type + pub document_schemas: BTreeMap<DocumentName, Value>, + + /// Groups that allow for specific multiparty actions on the contract + #[serde(default, deserialize_with = "deserialize_u16_group_map")] + pub groups: BTreeMap<GroupContractPosition, Group>, + + /// The tokens on the contract. + #[serde(default, deserialize_with = "deserialize_u16_token_configuration_map")] + pub tokens: BTreeMap<TokenContractPosition, TokenConfiguration>, +} + +fn deserialize_u16_group_map<'de, D>( + deserializer: D, +) -> Result<BTreeMap<GroupContractPosition, Group>, D::Error> +where + D: serde::Deserializer<'de>, +{ + let map: BTreeMap<String, Group> = BTreeMap::deserialize(deserializer)?; + map.into_iter() + .map(|(k, v)| { + k.parse::<GroupContractPosition>() + .map_err(serde::de::Error::custom) + .map(|key| (key, v)) + }) + .collect() +} +fn deserialize_u16_token_configuration_map<'de, D>( + deserializer: D, +) -> Result<BTreeMap<TokenContractPosition, TokenConfiguration>, D::Error> +where + D: serde::Deserializer<'de>, +{ + let map: BTreeMap<String, TokenConfiguration> = BTreeMap::deserialize(deserializer)?; + map.into_iter() + .map(|(k, v)| { + k.parse::<TokenContractPosition>() + .map_err(serde::de::Error::custom) + .map(|key| (key, v)) + }) + .collect() +} + +impl From<DataContract> for DataContractInSerializationFormatV1 { + fn from(value: DataContract) -> Self { + match value { + DataContract::V0(v0) => { + let DataContractV0 { + id, + config, + version, + owner_id, + schema_defs, + document_types, + .. + } = v0; + + DataContractInSerializationFormatV1 { + id, + config, + version, + owner_id, + schema_defs, + document_schemas: document_types + .into_iter() + .map(|(key, document_type)| (key, document_type.schema_owned())) + .collect(), + groups: Default::default(), + tokens: Default::default(), + } + } + DataContract::V1(v1) => { + let DataContractV1 { + id, + config, + version, + owner_id, + schema_defs, + document_types, + groups, + tokens, + .. + } = v1; + + DataContractInSerializationFormatV1 { + id, + config, + version, + owner_id, + schema_defs, + document_schemas: document_types + .into_iter() + .map(|(key, document_type)| (key, document_type.schema_owned())) + .collect(), + groups, + tokens, + } + } + } + } +} diff --git a/packages/rs-dpp/src/data_contract/v0/conversion/cbor.rs b/packages/rs-dpp/src/data_contract/v0/conversion/cbor.rs index af497027fd3..c2aba05b124 100644 --- a/packages/rs-dpp/src/data_contract/v0/conversion/cbor.rs +++ b/packages/rs-dpp/src/data_contract/v0/conversion/cbor.rs @@ -1,6 +1,6 @@ use crate::data_contract::conversion::cbor::DataContractCborConversionMethodsV0; use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; -use crate::data_contract::data_contract::DataContractV0; +use crate::data_contract::v0::DataContractV0; use crate::util::cbor_value::CborCanonicalMap; use crate::version::PlatformVersion; diff --git a/packages/rs-dpp/src/data_contract/v0/conversion/value.rs b/packages/rs-dpp/src/data_contract/v0/conversion/value.rs index 3ed0a987135..db16bc497d7 100644 --- a/packages/rs-dpp/src/data_contract/v0/conversion/value.rs +++ b/packages/rs-dpp/src/data_contract/v0/conversion/value.rs @@ -1,9 +1,8 @@ use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; -use crate::data_contract::data_contract::DataContractV0; -use crate::data_contract::serialized_version::v0::{ - property_names, DataContractInSerializationFormatV0, -}; +use crate::data_contract::serialized_version::property_names; +use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::data_contract::v0::DataContractV0; use crate::version::PlatformVersion; use crate::ProtocolError; use platform_value::{ReplacementType, Value}; diff --git a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs index d97cb54045c..dddd285a6c3 100644 --- a/packages/rs-dpp/src/data_contract/v0/methods/schema.rs +++ b/packages/rs-dpp/src/data_contract/v0/methods/schema.rs @@ -27,6 +27,7 @@ impl DataContractSchemaMethodsV0 for DataContractV0 { self.config.documents_mutable_contract_default(), self.config.documents_can_be_deleted_contract_default(), full_validation, + false, validation_operations, platform_version, )?; diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs b/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs deleted file mode 100644 index 65d78beaa1a..00000000000 --- a/packages/rs-dpp/src/data_contract/v0/serialization/bincode.rs +++ /dev/null @@ -1,31 +0,0 @@ -#[cfg(test)] -mod tests { - use crate::data_contract::DataContract; - use crate::identity::accessors::IdentityGettersV0; - use crate::identity::Identity; - use crate::serialization::{ - PlatformDeserializableWithPotentialValidationFromVersionedStructure, - PlatformSerializableWithPlatformVersion, - }; - use crate::tests::fixtures::get_data_contract_fixture; - use crate::version::PlatformVersion; - use platform_version::version::LATEST_PLATFORM_VERSION; - - #[test] - #[cfg(feature = "random-identities")] - fn data_contract_ser_de() { - let platform_version = PlatformVersion::latest(); - let identity = Identity::random_identity(5, Some(5), platform_version) - .expect("expected a random identity"); - let contract = - get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version) - .data_contract_owned(); - let bytes = contract - .serialize_to_bytes_with_platform_version(LATEST_PLATFORM_VERSION) - .expect("expected to serialize"); - let recovered_contract = - DataContract::versioned_deserialize(&bytes, false, platform_version) - .expect("expected to deserialize state transition"); - assert_eq!(contract, recovered_contract); - } -} diff --git a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs index 104ede8844f..2a79edd3627 100644 --- a/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs +++ b/packages/rs-dpp/src/data_contract/v0/serialization/mod.rs @@ -7,11 +7,10 @@ use crate::data_contract::DataContract; use crate::version::{PlatformVersion, PlatformVersionCurrentVersion}; use crate::ProtocolError; +use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1; use crate::validation::operations::ProtocolValidationOperation; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -pub mod bincode; - impl Serialize for DataContractV0 { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where @@ -51,27 +50,24 @@ impl DataContractV0 { ) -> Result<Self, ProtocolError> { match value { DataContractInSerializationFormat::V0(serialization_format_v0) => { - match platform_version - .dpp - .contract_versions - .contract_structure_version - { - 0 => { - let data_contract = DataContractV0::try_from_platform_versioned_v0( - serialization_format_v0, - full_validation, - validation_operations, - platform_version, - )?; - - Ok(data_contract) - } - version => Err(ProtocolError::UnknownVersionMismatch { - method: "DataContractV0::from_serialization_format".to_string(), - known_versions: vec![0], - received: version, - }), - } + let data_contract = DataContractV0::try_from_platform_versioned_v0( + serialization_format_v0, + full_validation, + validation_operations, + platform_version, + )?; + + Ok(data_contract) + } + DataContractInSerializationFormat::V1(serialization_format_v1) => { + let data_contract = DataContractV0::try_from_platform_versioned_v1( + serialization_format_v1, + full_validation, + validation_operations, + platform_version, + )?; + + Ok(data_contract) } } } @@ -99,6 +95,7 @@ impl DataContractV0 { config.documents_mutable_contract_default(), config.documents_can_be_deleted_contract_default(), full_validation, + false, validation_operations, platform_version, )?; @@ -115,4 +112,78 @@ impl DataContractV0 { Ok(data_contract) } + + pub(in crate::data_contract) fn try_from_platform_versioned_v1( + data_contract_data: DataContractInSerializationFormatV1, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + let DataContractInSerializationFormatV1 { + id, + config, + version, + owner_id, + document_schemas, + schema_defs, + .. + } = data_contract_data; + + let document_types = DocumentType::create_document_types_from_document_schemas( + id, + document_schemas, + schema_defs.as_ref(), + config.documents_keep_history_contract_default(), + config.documents_mutable_contract_default(), + config.documents_can_be_deleted_contract_default(), + full_validation, + false, + validation_operations, + platform_version, + )?; + + let data_contract = DataContractV0 { + id, + version, + owner_id, + document_types, + metadata: None, + config, + schema_defs, + }; + + Ok(data_contract) + } +} + +#[cfg(test)] +mod tests { + use crate::data_contract::DataContract; + use crate::identity::accessors::IdentityGettersV0; + use crate::identity::Identity; + use crate::serialization::{ + PlatformDeserializableWithPotentialValidationFromVersionedStructure, + PlatformSerializableWithPlatformVersion, + }; + use crate::tests::fixtures::get_data_contract_fixture; + use crate::version::PlatformVersion; + use platform_version::version::LATEST_PLATFORM_VERSION; + + #[test] + #[cfg(feature = "random-identities")] + fn data_contract_ser_de() { + let platform_version = PlatformVersion::first(); + let identity = Identity::random_identity(5, Some(5), platform_version) + .expect("expected a random identity"); + let contract = + get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version) + .data_contract_owned(); + let bytes = contract + .serialize_to_bytes_with_platform_version(LATEST_PLATFORM_VERSION) + .expect("expected to serialize"); + let recovered_contract = + DataContract::versioned_deserialize(&bytes, false, platform_version) + .expect("expected to deserialize state transition"); + assert_eq!(contract, recovered_contract); + } } diff --git a/packages/rs-dpp/src/data_contract/v1/accessors/mod.rs b/packages/rs-dpp/src/data_contract/v1/accessors/mod.rs new file mode 100644 index 00000000000..d62a46ddfd0 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/accessors/mod.rs @@ -0,0 +1,225 @@ +use crate::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; +use crate::data_contract::config::DataContractConfig; +use crate::data_contract::document_type::{DocumentType, DocumentTypeRef}; +use crate::data_contract::errors::DataContractError; + +use crate::data_contract::v1::DataContractV1; +use crate::data_contract::{DocumentName, GroupContractPosition, TokenContractPosition}; +use crate::metadata::Metadata; + +use crate::data_contract::accessors::v1::{DataContractV1Getters, DataContractV1Setters}; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::group::Group; +use crate::tokens::calculate_token_id; +use crate::tokens::errors::TokenError; +use crate::ProtocolError; +use platform_value::Identifier; +use std::collections::BTreeMap; + +impl DataContractV0Getters for DataContractV1 { + fn id(&self) -> Identifier { + self.id + } + + fn id_ref(&self) -> &Identifier { + &self.id + } + + fn version(&self) -> u32 { + self.version + } + + fn owner_id(&self) -> Identifier { + self.owner_id + } + + fn document_type_cloned_for_name(&self, name: &str) -> Result<DocumentType, DataContractError> { + self.document_type_cloned_optional_for_name(name) + .ok_or_else(|| { + DataContractError::DocumentTypeNotFound( + "can not get document type from contract".to_string(), + ) + }) + } + + fn document_type_borrowed_for_name( + &self, + name: &str, + ) -> Result<&DocumentType, DataContractError> { + self.document_types.get(name).ok_or_else(|| { + DataContractError::DocumentTypeNotFound( + "can not get document type from contract".to_string(), + ) + }) + } + + fn document_type_for_name(&self, name: &str) -> Result<DocumentTypeRef, DataContractError> { + self.document_type_optional_for_name(name).ok_or_else(|| { + DataContractError::DocumentTypeNotFound( + "can not get document type from contract".to_string(), + ) + }) + } + + fn document_type_optional_for_name(&self, name: &str) -> Option<DocumentTypeRef> { + self.document_types + .get(name) + .map(|document_type| document_type.as_ref()) + } + + fn document_type_cloned_optional_for_name(&self, name: &str) -> Option<DocumentType> { + self.document_types.get(name).cloned() + } + + fn has_document_type_for_name(&self, name: &str) -> bool { + self.document_types.get(name).is_some() + } + + fn document_types_with_contested_indexes(&self) -> BTreeMap<&DocumentName, &DocumentType> { + self.document_types + .iter() + .filter(|(_, document_type)| { + document_type + .indexes() + .iter() + .any(|(_, index)| index.contested_index.is_some()) + }) + .collect() + } + + fn document_types(&self) -> &BTreeMap<DocumentName, DocumentType> { + &self.document_types + } + + fn document_types_mut(&mut self) -> &mut BTreeMap<DocumentName, DocumentType> { + &mut self.document_types + } + + fn metadata(&self) -> Option<&Metadata> { + self.metadata.as_ref() + } + + fn metadata_mut(&mut self) -> Option<&mut Metadata> { + self.metadata.as_mut() + } + + fn config(&self) -> &DataContractConfig { + &self.config + } + + fn config_mut(&mut self) -> &mut DataContractConfig { + &mut self.config + } +} + +impl DataContractV0Setters for DataContractV1 { + fn set_id(&mut self, id: Identifier) { + self.id = id; + + self.document_types + .iter_mut() + .for_each(|(_, document_type)| match document_type { + DocumentType::V0(v0) => v0.data_contract_id = id, + }) + } + + fn set_version(&mut self, version: u32) { + self.version = version; + } + + fn increment_version(&mut self) { + self.version += 1; + } + + fn set_owner_id(&mut self, owner_id: Identifier) { + self.owner_id = owner_id; + } + + fn set_metadata(&mut self, metadata: Option<Metadata>) { + self.metadata = metadata; + } + + fn set_config(&mut self, config: DataContractConfig) { + self.config = config; + } +} + +impl DataContractV1Getters for DataContractV1 { + fn group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError> { + self.groups + .get(&position) + .ok_or(ProtocolError::GroupNotFound(format!( + "Group not found in contract {} at position {}", + self.id(), + position + ))) + } + + fn groups(&self) -> &BTreeMap<GroupContractPosition, Group> { + &self.groups + } + + fn groups_mut(&mut self) -> Option<&mut BTreeMap<GroupContractPosition, Group>> { + Some(&mut self.groups) + } + + fn expected_group(&self, position: GroupContractPosition) -> Result<&Group, ProtocolError> { + self.groups + .get(&position) + .ok_or(ProtocolError::GroupNotFound(format!( + "Group not found at position {} in contract {}", + position, + self.id() + ))) + } + + fn tokens(&self) -> &BTreeMap<TokenContractPosition, TokenConfiguration> { + &self.tokens + } + + fn tokens_mut(&mut self) -> Option<&mut BTreeMap<TokenContractPosition, TokenConfiguration>> { + Some(&mut self.tokens) + } + + fn expected_token_configuration( + &self, + position: TokenContractPosition, + ) -> Result<&TokenConfiguration, ProtocolError> { + self.tokens.get(&position).ok_or(ProtocolError::Token( + TokenError::TokenNotFoundAtPositionError.into(), + )) + } + + fn token_configuration_mut( + &mut self, + position: TokenContractPosition, + ) -> Option<&mut TokenConfiguration> { + self.tokens.get_mut(&position) + } + + /// Returns the token id if a token exists at that position + fn token_id(&self, position: TokenContractPosition) -> Option<Identifier> { + self.tokens + .get(&position) + .map(|_| calculate_token_id(self.id.as_bytes(), position).into()) + } +} + +impl DataContractV1Setters for DataContractV1 { + fn set_groups(&mut self, groups: BTreeMap<GroupContractPosition, Group>) { + self.groups = groups; + } + + fn set_tokens(&mut self, tokens: BTreeMap<TokenContractPosition, TokenConfiguration>) { + self.tokens = tokens; + } + + fn add_group(&mut self, group_position: GroupContractPosition, group: Group) { + self.groups.insert(group_position, group); + } + + fn add_token(&mut self, name: TokenContractPosition, token: TokenConfiguration) { + self.tokens.insert(name, token); + } +} diff --git a/packages/rs-dpp/src/data_contract/v1/conversion/cbor.rs b/packages/rs-dpp/src/data_contract/v1/conversion/cbor.rs new file mode 100644 index 00000000000..08e5e700819 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/conversion/cbor.rs @@ -0,0 +1,98 @@ +use crate::data_contract::conversion::cbor::DataContractCborConversionMethodsV0; +use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; +use crate::util::cbor_value::CborCanonicalMap; + +use crate::data_contract::DataContractV1; +use crate::version::PlatformVersion; +use crate::ProtocolError; +use ciborium::Value as CborValue; +use platform_value::{Identifier, Value}; +use std::convert::TryFrom; + +impl DataContractCborConversionMethodsV0 for DataContractV1 { + // TODO: Do we need to use this? + fn from_cbor_with_id( + cbor_bytes: impl AsRef<[u8]>, + contract_id: Option<Identifier>, + full_validation: bool, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + let mut data_contract = Self::from_cbor(cbor_bytes, full_validation, platform_version)?; + if let Some(id) = contract_id { + data_contract.id = id; + } + Ok(data_contract) + } + + fn from_cbor( + cbor_bytes: impl AsRef<[u8]>, + full_validation: bool, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + let data_contract_cbor_value: CborValue = ciborium::de::from_reader(cbor_bytes.as_ref()) + .map_err(|_| { + ProtocolError::DecodingError("unable to decode contract from cbor".to_string()) + })?; + + let data_contract_value: Value = + Value::try_from(data_contract_cbor_value).map_err(ProtocolError::ValueError)?; + + Self::from_value(data_contract_value, full_validation, platform_version) + } + + fn to_cbor(&self, platform_version: &PlatformVersion) -> Result<Vec<u8>, ProtocolError> { + let value = self.to_value(platform_version)?; + + let mut buf: Vec<u8> = Vec::new(); + + ciborium::ser::into_writer(&value, &mut buf) + .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; + + Ok(buf) + } + + // /// Returns Data Contract as a Buffer + // fn to_cbor_buffer(&self) -> Result<Vec<u8>, ProtocolError> { + // let mut object = self.to_object()?; + // if self.defs.is_none() { + // object.remove(property_names::DEFINITIONS)?; + // } + // object + // .to_map_mut() + // .unwrap() + // .sort_by_lexicographical_byte_ordering_keys_and_inner_maps(); + // + // // we are on version 0 here + // cbor_serializer::serializable_value_to_cbor(&object, Some(0)) + // } + + // TODO: Revisit + fn to_cbor_canonical_map( + &self, + _platform_version: &PlatformVersion, + ) -> Result<CborCanonicalMap, ProtocolError> { + unimplemented!(); + + // let mut contract_cbor_map = CborCanonicalMap::new(); + // + // contract_cbor_map.insert(property_names::ID, self.id.to_buffer().to_vec()); + // contract_cbor_map.insert(property_names::SCHEMA, self.schema.as_str()); + // contract_cbor_map.insert(property_names::VERSION, self.version); + // contract_cbor_map.insert(property_names::OWNER_ID, self.owner_id.to_buffer().to_vec()); + // + // let docs = CborValue::serialized(&self.documents) + // .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; + // + // contract_cbor_map.insert(property_names::DOCUMENTS, docs); + // + // if let Some(_defs) = &self.defs { + // contract_cbor_map.insert( + // property_names::DEFINITIONS, + // CborValue::serialized(&self.defs) + // .map_err(|e| ProtocolError::EncodingError(e.to_string()))?, + // ); + // }; + // + // Ok(contract_cbor_map) + } +} diff --git a/packages/rs-dpp/src/data_contract/v1/conversion/json.rs b/packages/rs-dpp/src/data_contract/v1/conversion/json.rs new file mode 100644 index 00000000000..56478ddb8ff --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/conversion/json.rs @@ -0,0 +1,38 @@ +use crate::data_contract::conversion::json::DataContractJsonConversionMethodsV0; +use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; + +use crate::version::PlatformVersion; +use crate::ProtocolError; + +use crate::data_contract::DataContractV1; +use serde_json::Value as JsonValue; +use std::convert::TryInto; + +impl DataContractJsonConversionMethodsV0 for DataContractV1 { + fn from_json( + json_value: JsonValue, + full_validation: bool, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + Self::from_value(json_value.into(), full_validation, platform_version) + } + + /// Returns Data Contract as a JSON Value + fn to_json(&self, platform_version: &PlatformVersion) -> Result<JsonValue, ProtocolError> { + self.to_value(platform_version)? + .try_into() + .map_err(ProtocolError::ValueError) + + // TODO: I guess we should convert the binary fields back to base64/base58? + } + + /// Returns Data Contract as a JSON Value that can be used for validation + fn to_validating_json( + &self, + platform_version: &PlatformVersion, + ) -> Result<JsonValue, ProtocolError> { + self.to_value(platform_version)? + .try_into_validating_json() + .map_err(ProtocolError::ValueError) + } +} diff --git a/packages/rs-dpp/src/data_contract/v1/conversion/mod.rs b/packages/rs-dpp/src/data_contract/v1/conversion/mod.rs new file mode 100644 index 00000000000..eb58a91c438 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/conversion/mod.rs @@ -0,0 +1,8 @@ +#[cfg(feature = "data-contract-cbor-conversion")] +mod cbor; +#[cfg(feature = "data-contract-json-conversion")] +mod json; +#[cfg(feature = "data-contract-value-conversion")] +mod value; + +// TODO: We need from_* / from_*_value / to_* / to_*_value methods for all types: cbor, json, platform_value (value?) diff --git a/packages/rs-dpp/src/data_contract/v1/conversion/value.rs b/packages/rs-dpp/src/data_contract/v1/conversion/value.rs new file mode 100644 index 00000000000..ab8452716cf --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/conversion/value.rs @@ -0,0 +1,78 @@ +use crate::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; + +use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; +use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1; +use crate::data_contract::serialized_version::{property_names, DataContractInSerializationFormat}; +use crate::data_contract::DataContractV1; +use crate::version::PlatformVersion; +use crate::ProtocolError; +use platform_value::{ReplacementType, Value}; +use platform_version::TryFromPlatformVersioned; + +pub const DATA_CONTRACT_IDENTIFIER_FIELDS_V0: [&str; 2] = + [property_names::ID, property_names::OWNER_ID]; + +impl DataContractValueConversionMethodsV0 for DataContractV1 { + fn from_value( + mut value: Value, + full_validation: bool, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + value.replace_at_paths( + DATA_CONTRACT_IDENTIFIER_FIELDS_V0, + ReplacementType::Identifier, + )?; + let format_version = value.get_str("$format_version")?; + match format_version { + "0" => { + let data_contract_data: DataContractInSerializationFormatV0 = + platform_value::from_value(value).map_err(ProtocolError::ValueError)?; + + DataContractV1::try_from_platform_versioned( + data_contract_data.into(), + full_validation, + &mut vec![], // this is not used in consensus code + platform_version, + ) + } + "1" => { + let data_contract_data: DataContractInSerializationFormatV1 = + platform_value::from_value(value).map_err(ProtocolError::ValueError)?; + + DataContractV1::try_from_platform_versioned( + data_contract_data.into(), + full_validation, + &mut vec![], // this is not used in consensus code + platform_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DataContractV1::from_value".to_string(), + known_versions: vec![0, 1], + received: version + .parse() + .map_err(|_| ProtocolError::Generic("Conversion error".to_string()))?, + }), + } + } + + fn to_value(&self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> { + let data_contract_data = + DataContractInSerializationFormat::try_from_platform_versioned(self, platform_version)?; + + let value = + platform_value::to_value(data_contract_data).map_err(ProtocolError::ValueError)?; + + Ok(value) + } + + fn into_value(self, platform_version: &PlatformVersion) -> Result<Value, ProtocolError> { + let data_contract_data = + DataContractInSerializationFormat::try_from_platform_versioned(self, platform_version)?; + + let value = + platform_value::to_value(data_contract_data).map_err(ProtocolError::ValueError)?; + + Ok(value) + } +} diff --git a/packages/rs-dpp/src/data_contract/v1/data_contract.rs b/packages/rs-dpp/src/data_contract/v1/data_contract.rs new file mode 100644 index 00000000000..60a6527fd07 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/data_contract.rs @@ -0,0 +1,75 @@ +use std::collections::BTreeMap; + +use platform_value::Identifier; +use platform_value::Value; + +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::config::DataContractConfig; +use crate::data_contract::document_type::DocumentType; +use crate::data_contract::group::Group; +use crate::data_contract::{ + DefinitionName, DocumentName, GroupContractPosition, TokenContractPosition, +}; +use crate::metadata::Metadata; + +/// `DataContractV1` represents a data contract in a decentralized platform. +/// +/// It contains information about the contract, such as its protocol version, unique identifier, +/// schema, version, and owner identifier. The struct also includes details about the document +/// types, metadata, configuration, and document schemas associated with the contract. +/// +/// Additionally, `DataContractV1` holds definitions for JSON schemas, entropy, and binary properties +/// of the documents. +/// +/// # Changes from `DataContractV0` to `DataContractV1` +/// +/// In `DataContractV1`, two significant features were introduced to enhance contract governance +/// and support token-related operations: +/// +/// 1. **Groups** (`groups: BTreeMap<GroupContractPosition, Group>`) +/// - Groups allow for specific multiparty actions on the contract. Each group is defined with a +/// set of members (`Identifier`) and their corresponding member power (`u32`). +/// - Groups facilitate fine-grained access control and decision-making processes by enabling +/// required power thresholds for group actions. +/// - This is particularly useful for contracts where multiple parties are involved in controlling +/// or managing contract-specific features. +/// +/// 2. **Tokens** (`tokens: BTreeMap<TokenName, TokenConfiguration>`) +/// - Tokens introduce configurable token-related functionality within the contract, such as +/// base supply, maximum supply, and manual minting/burning rules. +/// - Token configurations include change control rules, ensuring proper governance for +/// modifying supply limits and token-related settings. +/// - This addition enables contracts to define and manage tokens while ensuring compliance +/// with governance rules (e.g., who can mint or burn tokens). +/// +#[derive(Debug, Clone, PartialEq)] +pub struct DataContractV1 { + /// A unique identifier for the data contract. + /// This field must always present in all versions. + pub id: Identifier, + + /// The version of this data contract. + pub version: u32, + + /// The identifier of the contract owner. + pub owner_id: Identifier, + + /// A mapping of document names to their corresponding document types. + pub document_types: BTreeMap<DocumentName, DocumentType>, + + // TODO: Move metadata from here + /// Optional metadata associated with the contract. + pub metadata: Option<Metadata>, + + /// Internal configuration for the contract. + pub config: DataContractConfig, + + /// Shared subschemas to reuse across documents (see $defs) + pub schema_defs: Option<BTreeMap<DefinitionName, Value>>, + + /// Groups that allow for specific multiparty actions on the contract + pub groups: BTreeMap<GroupContractPosition, Group>, + + /// The tokens on the contract. + pub tokens: BTreeMap<TokenContractPosition, TokenConfiguration>, +} diff --git a/packages/rs-dpp/src/data_contract/v1/methods/mod.rs b/packages/rs-dpp/src/data_contract/v1/methods/mod.rs new file mode 100644 index 00000000000..6bde67a2b14 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/methods/mod.rs @@ -0,0 +1 @@ +mod schema; diff --git a/packages/rs-dpp/src/data_contract/v1/methods/schema.rs b/packages/rs-dpp/src/data_contract/v1/methods/schema.rs new file mode 100644 index 00000000000..901813af168 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/methods/schema.rs @@ -0,0 +1,198 @@ +use crate::data_contract::config::v0::DataContractConfigGettersV0; +use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; +use crate::data_contract::document_type::DocumentType; +use crate::data_contract::schema::DataContractSchemaMethodsV0; +use crate::data_contract::{DataContractV1, DefinitionName, DocumentName}; +use crate::validation::operations::ProtocolValidationOperation; +use crate::ProtocolError; +use platform_value::Value; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl DataContractSchemaMethodsV0 for DataContractV1 { + fn set_document_schemas( + &mut self, + schemas: BTreeMap<DocumentName, Value>, + defs: Option<BTreeMap<DefinitionName, Value>>, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), ProtocolError> { + self.document_types = DocumentType::create_document_types_from_document_schemas( + self.id, + schemas, + defs.as_ref(), + self.config.documents_keep_history_contract_default(), + self.config.documents_mutable_contract_default(), + self.config.documents_can_be_deleted_contract_default(), + full_validation, + !self.tokens.is_empty(), + validation_operations, + platform_version, + )?; + + Ok(()) + } + + fn set_document_schema( + &mut self, + name: &str, + schema: Value, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), ProtocolError> { + let document_type = DocumentType::try_from_schema( + self.id, + name, + schema, + self.schema_defs.as_ref(), + self.config.documents_keep_history_contract_default(), + self.config.documents_mutable_contract_default(), + self.config.documents_mutable_contract_default(), + full_validation, + validation_operations, + platform_version, + )?; + + self.document_types + .insert(document_type.name().clone(), document_type); + + Ok(()) + } + + fn document_schemas(&self) -> BTreeMap<DocumentName, &Value> { + self.document_types + .iter() + .map(|(name, document_type)| (name.to_owned(), document_type.schema())) + .collect() + } + + fn schema_defs(&self) -> Option<&BTreeMap<DefinitionName, Value>> { + self.schema_defs.as_ref() + } + + fn set_schema_defs( + &mut self, + defs: Option<BTreeMap<DefinitionName, Value>>, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), ProtocolError> { + let document_schemas = self + .document_types + .iter() + .map(|(name, document_type)| (name.to_owned(), document_type.schema().to_owned())) + .collect(); + + self.set_document_schemas( + document_schemas, + defs.clone(), + full_validation, + validation_operations, + platform_version, + )?; + + self.schema_defs = defs; + + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::data_contract::config::DataContractConfig; + use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; + use crate::data_contract::v1::DataContractV1; + use platform_value::{platform_value, Identifier}; + + #[test] + fn should_set_a_new_schema_defs() { + let platform_version = PlatformVersion::latest(); + + let config = DataContractConfig::default_for_version(platform_version) + .expect("should create a default config"); + + let schema = platform_value!({ + "type": "object", + "properties": { + "a": { + "type": "string", + "maxLength": 10, + "position": 0 + } + }, + "additionalProperties": false, + }); + + let serialization_format = DataContractInSerializationFormatV0 { + id: Identifier::random(), + config, + version: 0, + owner_id: Default::default(), + schema_defs: None, + document_schemas: BTreeMap::from([("document_type_name".to_string(), schema.clone())]), + }; + + let mut data_contract = DataContractV1::try_from_platform_versioned( + serialization_format.into(), + true, + &mut vec![], + platform_version, + ) + .expect("should create a contract from serialization format"); + + let defs = platform_value!({ + "test": { + "type": "string", + }, + }); + + let defs_map = Some(defs.into_btree_string_map().expect("should convert to map")); + + data_contract + .set_schema_defs(defs_map.clone(), true, &mut vec![], platform_version) + .expect("should set defs"); + + assert_eq!(defs_map.as_ref(), data_contract.schema_defs()) + } + + fn should_set_empty_schema_defs() { + let platform_version = PlatformVersion::latest(); + + let config = DataContractConfig::default_for_version(platform_version) + .expect("should create a default config"); + + let defs = platform_value!({ + "test": { + "type": "string", + }, + }); + + let defs_map = Some(defs.into_btree_string_map().expect("should convert to map")); + + let serialization_format = DataContractInSerializationFormatV0 { + id: Identifier::random(), + config, + version: 0, + owner_id: Default::default(), + schema_defs: defs_map, + document_schemas: Default::default(), + }; + + let mut data_contract = DataContractV1::try_from_platform_versioned( + serialization_format.into(), + true, + &mut vec![], + platform_version, + ) + .expect("should create a contract from serialization format"); + + data_contract + .set_schema_defs(None, true, &mut vec![], platform_version) + .expect("should set defs"); + + assert_eq!(None, data_contract.schema_defs()) + } +} diff --git a/packages/rs-dpp/src/data_contract/v1/mod.rs b/packages/rs-dpp/src/data_contract/v1/mod.rs new file mode 100644 index 00000000000..c814a35c4bf --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/mod.rs @@ -0,0 +1,7 @@ +mod accessors; +mod conversion; +pub mod data_contract; +mod methods; +pub mod serialization; + +pub use data_contract::*; diff --git a/packages/rs-dpp/src/data_contract/v1/serialization/mod.rs b/packages/rs-dpp/src/data_contract/v1/serialization/mod.rs new file mode 100644 index 00000000000..87825f6c692 --- /dev/null +++ b/packages/rs-dpp/src/data_contract/v1/serialization/mod.rs @@ -0,0 +1,194 @@ +use crate::data_contract::config::v0::DataContractConfigGettersV0; +use crate::data_contract::document_type::DocumentType; +use crate::data_contract::serialized_version::v0::DataContractInSerializationFormatV0; +use crate::data_contract::serialized_version::DataContractInSerializationFormat; +use crate::data_contract::{DataContract, DataContractV1}; +use crate::version::{PlatformVersion, PlatformVersionCurrentVersion}; +use crate::ProtocolError; + +use crate::data_contract::serialized_version::v1::DataContractInSerializationFormatV1; +use crate::validation::operations::ProtocolValidationOperation; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +impl Serialize for DataContractV1 { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + let data_contract: DataContract = self.clone().into(); + let serialization_format = DataContractInSerializationFormatV1::from(data_contract); + serialization_format.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for DataContractV1 { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + let serialization_format = DataContractInSerializationFormatV1::deserialize(deserializer)?; + let current_version = + PlatformVersion::get_current().map_err(|e| serde::de::Error::custom(e.to_string()))?; + // when deserializing from json/platform_value/cbor we always want to validate (as this is not coming from the state) + DataContractV1::try_from_platform_versioned_v1( + serialization_format, + true, + &mut vec![], + current_version, + ) + .map_err(serde::de::Error::custom) + } +} + +impl DataContractV1 { + pub(in crate::data_contract) fn try_from_platform_versioned( + value: DataContractInSerializationFormat, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + match value { + DataContractInSerializationFormat::V0(serialization_format_v0) => { + let data_contract = DataContractV1::try_from_platform_versioned_v0( + serialization_format_v0, + full_validation, + validation_operations, + platform_version, + )?; + + Ok(data_contract) + } + DataContractInSerializationFormat::V1(serialization_format_v1) => { + let data_contract = DataContractV1::try_from_platform_versioned_v1( + serialization_format_v1, + full_validation, + validation_operations, + platform_version, + )?; + + Ok(data_contract) + } + } + } + + pub(in crate::data_contract) fn try_from_platform_versioned_v0( + data_contract_data: DataContractInSerializationFormatV0, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + let DataContractInSerializationFormatV0 { + id, + config, + version, + owner_id, + document_schemas, + schema_defs, + } = data_contract_data; + + let document_types = DocumentType::create_document_types_from_document_schemas( + id, + document_schemas, + schema_defs.as_ref(), + config.documents_keep_history_contract_default(), + config.documents_mutable_contract_default(), + config.documents_can_be_deleted_contract_default(), + full_validation, + false, + validation_operations, + platform_version, + )?; + + let data_contract = DataContractV1 { + id, + version, + owner_id, + document_types, + metadata: None, + config, + schema_defs, + groups: Default::default(), + tokens: Default::default(), + }; + + Ok(data_contract) + } + + pub(in crate::data_contract) fn try_from_platform_versioned_v1( + data_contract_data: DataContractInSerializationFormatV1, + full_validation: bool, + validation_operations: &mut Vec<ProtocolValidationOperation>, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> { + let DataContractInSerializationFormatV1 { + id, + config, + version, + owner_id, + document_schemas, + schema_defs, + groups, + tokens, + } = data_contract_data; + + let document_types = DocumentType::create_document_types_from_document_schemas( + id, + document_schemas, + schema_defs.as_ref(), + config.documents_keep_history_contract_default(), + config.documents_mutable_contract_default(), + config.documents_can_be_deleted_contract_default(), + full_validation, + !tokens.is_empty(), + validation_operations, + platform_version, + )?; + + let data_contract = DataContractV1 { + id, + version, + owner_id, + document_types, + metadata: None, + config, + schema_defs, + groups, + tokens, + }; + + Ok(data_contract) + } +} + +#[cfg(test)] +mod tests { + use crate::data_contract::DataContract; + use crate::identity::accessors::IdentityGettersV0; + use crate::identity::Identity; + use crate::serialization::{ + PlatformDeserializableWithPotentialValidationFromVersionedStructure, + PlatformSerializableWithPlatformVersion, + }; + use crate::tests::fixtures::get_data_contract_fixture; + use crate::version::PlatformVersion; + use platform_version::version::LATEST_PLATFORM_VERSION; + + #[test] + #[cfg(feature = "random-identities")] + fn data_contract_ser_de() { + // V1 of the contract is first present in protocol version 7 + let platform_version = PlatformVersion::get(7).expect("expected protocol version 7"); + let identity = Identity::random_identity(5, Some(5), platform_version) + .expect("expected a random identity"); + let contract = + get_data_contract_fixture(Some(identity.id()), 0, platform_version.protocol_version) + .data_contract_owned(); + let bytes = contract + .serialize_to_bytes_with_platform_version(LATEST_PLATFORM_VERSION) + .expect("expected to serialize"); + let recovered_contract = + DataContract::versioned_deserialize(&bytes, false, platform_version) + .expect("expected to deserialize state transition"); + assert_eq!(contract, recovered_contract); + } +} diff --git a/packages/rs-dpp/src/document/document_factory/mod.rs b/packages/rs-dpp/src/document/document_factory/mod.rs index 75db720fd59..158daf9488f 100644 --- a/packages/rs-dpp/src/document/document_factory/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/mod.rs @@ -13,8 +13,9 @@ use crate::document::Document; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; #[cfg(feature = "state-transitions")] -use crate::state_transition::documents_batch_transition::{ - document_transition::action_type::DocumentTransitionActionType, DocumentsBatchTransition, +use crate::state_transition::batch_transition::{ + batched_transition::document_transition_action_type::DocumentTransitionActionType, + BatchTransition, }; use crate::util::entropy_generator::EntropyGenerator; pub use v0::DocumentFactoryV0; @@ -120,7 +121,7 @@ impl DocumentFactory { ), >, nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransition, ProtocolError> { + ) -> Result<BatchTransition, ProtocolError> { match self { DocumentFactory::V0(v0) => v0.create_state_transition(documents_iter, nonce_counter), } diff --git a/packages/rs-dpp/src/document/document_factory/v0/mod.rs b/packages/rs-dpp/src/document/document_factory/v0/mod.rs index 58fc96de91a..5fa252dc973 100644 --- a/packages/rs-dpp/src/document/document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/document_factory/v0/mod.rs @@ -20,18 +20,20 @@ use crate::document::document_methods::DocumentMethodsV0; #[cfg(feature = "extended-document")] use crate::document::{ extended_document::v0::ExtendedDocumentV0, - serialization_traits::DocumentPlatformConversionMethodsV0, ExtendedDocument, + ExtendedDocument, serialization_traits::DocumentPlatformConversionMethodsV0, }; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] -use crate::state_transition::documents_batch_transition::{ - document_transition::{ - action_type::DocumentTransitionActionType, DocumentCreateTransition, - DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransition, +use crate::state_transition::batch_transition::{ + batched_transition::{ + document_transition_action_type::DocumentTransitionActionType, DocumentCreateTransition, + DocumentDeleteTransition, DocumentReplaceTransition, }, - DocumentsBatchTransition, DocumentsBatchTransitionV0, + BatchTransition, BatchTransitionV0, }; use itertools::Itertools; +#[cfg(feature = "state-transitions")] +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; const PROPERTY_FEATURE_VERSION: &str = "$version"; const PROPERTY_ENTROPY: &str = "$entropy"; @@ -210,7 +212,7 @@ impl DocumentFactoryV0 { ), >, nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransition, ProtocolError> { + ) -> Result<BatchTransition, ProtocolError> { let platform_version = PlatformVersion::get(self.protocol_version)?; let documents: Vec<( DocumentTransitionActionType, @@ -275,7 +277,7 @@ impl DocumentFactoryV0 { return Err(DocumentError::NoDocumentsSuppliedError.into()); } - Ok(DocumentsBatchTransitionV0 { + Ok(BatchTransitionV0 { owner_id, transitions, user_fee_increase: 0, diff --git a/packages/rs-dpp/src/document/errors.rs b/packages/rs-dpp/src/document/errors.rs index d16ca16f1ea..9df0c53b500 100644 --- a/packages/rs-dpp/src/document/errors.rs +++ b/packages/rs-dpp/src/document/errors.rs @@ -6,7 +6,7 @@ use crate::errors::consensus::ConsensusError; use crate::document::accessors::v0::DocumentV0Getters; use crate::document::Document; #[cfg(feature = "state-transitions")] -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; #[derive(Error, Debug)] pub enum DocumentError { diff --git a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs index 8a9c438804a..0d7a25b3dcd 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/mod.rs @@ -13,8 +13,9 @@ use crate::document::Document; #[cfg(feature = "extended-document")] use crate::document::ExtendedDocument; #[cfg(feature = "state-transitions")] -use crate::state_transition::documents_batch_transition::{ - document_transition::action_type::DocumentTransitionActionType, DocumentsBatchTransition, +use crate::state_transition::batch_transition::{ + batched_transition::document_transition_action_type::DocumentTransitionActionType, + BatchTransition, }; use crate::util::entropy_generator::EntropyGenerator; pub use v0::SpecializedDocumentFactoryV0; @@ -123,7 +124,7 @@ impl SpecializedDocumentFactory { ), >, nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransition, ProtocolError> { + ) -> Result<BatchTransition, ProtocolError> { match self { SpecializedDocumentFactory::V0(v0) => { v0.create_state_transition(documents_iter, nonce_counter) diff --git a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs index e482d3822a7..c89c7e34485 100644 --- a/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs +++ b/packages/rs-dpp/src/document/specialized_document_factory/v0/mod.rs @@ -19,18 +19,20 @@ use crate::data_contract::document_type::methods::DocumentTypeV0Methods; #[cfg(feature = "extended-document")] use crate::document::{ extended_document::v0::ExtendedDocumentV0, - serialization_traits::DocumentPlatformConversionMethodsV0, ExtendedDocument, + ExtendedDocument, serialization_traits::DocumentPlatformConversionMethodsV0, }; use crate::prelude::{BlockHeight, CoreBlockHeight, TimestampMillis}; #[cfg(feature = "state-transitions")] -use crate::state_transition::documents_batch_transition::{ - document_transition::{ - action_type::DocumentTransitionActionType, DocumentCreateTransition, - DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransition, +use crate::state_transition::batch_transition::{ + batched_transition::{ + document_transition_action_type::DocumentTransitionActionType, DocumentCreateTransition, + DocumentDeleteTransition, DocumentReplaceTransition, }, - DocumentsBatchTransition, DocumentsBatchTransitionV0, + BatchTransition, BatchTransitionV0, }; use itertools::Itertools; +#[cfg(feature = "state-transitions")] +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; const PROPERTY_FEATURE_VERSION: &str = "$version"; const PROPERTY_ENTROPY: &str = "$entropy"; @@ -218,7 +220,7 @@ impl SpecializedDocumentFactoryV0 { ), >, nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransition, ProtocolError> { + ) -> Result<BatchTransition, ProtocolError> { let platform_version = PlatformVersion::get(self.protocol_version)?; let documents: Vec<( DocumentTransitionActionType, @@ -283,7 +285,7 @@ impl SpecializedDocumentFactoryV0 { return Err(DocumentError::NoDocumentsSuppliedError.into()); } - Ok(DocumentsBatchTransitionV0 { + Ok(BatchTransitionV0 { owner_id, transitions, user_fee_increase: 0, diff --git a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs index 2b24a1e2801..552a96a9490 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/basic_error.rs @@ -9,15 +9,20 @@ use crate::consensus::basic::data_contract::InvalidJsonSchemaRefError; use crate::consensus::basic::data_contract::{ ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, DataContractHaveNewUniqueIndexError, DataContractImmutablePropertiesUpdateError, - DataContractInvalidIndexDefinitionUpdateError, DataContractUniqueIndicesChangedError, - DuplicateIndexError, DuplicateIndexNameError, IncompatibleDataContractSchemaError, + DataContractInvalidIndexDefinitionUpdateError, DataContractTokenConfigurationUpdateError, + DataContractUniqueIndicesChangedError, DuplicateIndexError, DuplicateIndexNameError, + GroupExceedsMaxMembersError, GroupMemberHasPowerOfZeroError, GroupMemberHasPowerOverLimitError, + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, GroupPositionDoesNotExistError, + GroupTotalPowerLessThanRequiredError, IncompatibleDataContractSchemaError, IncompatibleDocumentTypeSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError, InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError, - InvalidIndexedPropertyConstraintError, SystemPropertyIndexAlreadyPresentError, - UndefinedIndexPropertyError, UniqueIndicesLimitReachedError, - UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, - UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError, + InvalidIndexedPropertyConstraintError, InvalidTokenBaseSupplyError, + NonContiguousContractGroupPositionsError, NonContiguousContractTokenPositionsError, + SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError, + UniqueIndicesLimitReachedError, UnknownDocumentCreationRestrictionModeError, + UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, + UnknownTransferableTypeError, }; use crate::consensus::basic::decode::{ ProtocolVersionParsingError, SerializedObjectParsingError, VersionError, @@ -64,7 +69,13 @@ use crate::consensus::basic::{ }; use crate::consensus::ConsensusError; +use crate::consensus::basic::group::GroupActionNotAllowedOnTransitionError; use crate::consensus::basic::overflow_error::OverflowError; +use crate::consensus::basic::token::{ + ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError, + DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError, + InvalidTokenPositionError, TokenTransferToOurselfError, +}; use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError; use crate::consensus::basic::value_error::ValueError; #[cfg(feature = "json-schema-validation")] @@ -402,6 +413,62 @@ pub enum BasicError { #[error(transparent)] ContestedDocumentsTemporarilyNotAllowedError(ContestedDocumentsTemporarilyNotAllowedError), + + #[error(transparent)] + DataContractTokenConfigurationUpdateError(DataContractTokenConfigurationUpdateError), + + #[error(transparent)] + NonContiguousContractTokenPositionsError(NonContiguousContractTokenPositionsError), + + #[error(transparent)] + NonContiguousContractGroupPositionsError(NonContiguousContractGroupPositionsError), + + #[error(transparent)] + InvalidTokenBaseSupplyError(InvalidTokenBaseSupplyError), + + #[error(transparent)] + InvalidTokenIdError(InvalidTokenIdError), + + #[error(transparent)] + InvalidTokenPositionError(InvalidTokenPositionError), + + #[error(transparent)] + TokenTransferToOurselfError(TokenTransferToOurselfError), + + #[error(transparent)] + ContractHasNoTokensError(ContractHasNoTokensError), + + #[error(transparent)] + GroupPositionDoesNotExistError(GroupPositionDoesNotExistError), + + #[error(transparent)] + InvalidActionIdError(InvalidActionIdError), + + #[error(transparent)] + DestinationIdentityForTokenMintingNotSetError(DestinationIdentityForTokenMintingNotSetError), + + #[error(transparent)] + ChoosingTokenMintRecipientNotAllowedError(ChoosingTokenMintRecipientNotAllowedError), + + #[error(transparent)] + GroupActionNotAllowedOnTransitionError(GroupActionNotAllowedOnTransitionError), + + #[error(transparent)] + GroupExceedsMaxMembersError(GroupExceedsMaxMembersError), + + #[error(transparent)] + GroupMemberHasPowerOfZeroError(GroupMemberHasPowerOfZeroError), + + #[error(transparent)] + GroupMemberHasPowerOverLimitError(GroupMemberHasPowerOverLimitError), + + #[error(transparent)] + GroupTotalPowerLessThanRequiredError(GroupTotalPowerLessThanRequiredError), + + #[error(transparent)] + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError( + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, + ), } impl From<BasicError> for ConsensusError { diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_token_configuration_update_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_token_configuration_update_error.rs new file mode 100644 index 00000000000..a367fb8ad20 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/data_contract_token_configuration_update_error.rs @@ -0,0 +1,63 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use bincode::{Decode, Encode}; + +#[derive( + Error, Debug, Clone, PartialEq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Forbidden operation '{operation}' on '{field_path}', old config is {old_config}, new config is {new_config}")] +#[platform_serialize(unversioned)] +pub struct DataContractTokenConfigurationUpdateError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + operation: String, + field_path: String, + old_config: TokenConfiguration, + new_config: TokenConfiguration, +} + +impl DataContractTokenConfigurationUpdateError { + pub fn new( + operation: String, + field_path: String, + old_config: TokenConfiguration, + new_config: TokenConfiguration, + ) -> Self { + Self { + operation, + field_path, + old_config, + new_config, + } + } + + pub fn operation(&self) -> String { + self.operation.clone() + } + + pub fn field_path(&self) -> String { + self.field_path.clone() + } + + pub fn old_config(&self) -> TokenConfiguration { + self.old_config.clone() + } + + pub fn new_config(&self) -> TokenConfiguration { + self.new_config.clone() + } +} + +impl From<DataContractTokenConfigurationUpdateError> for ConsensusError { + fn from(err: DataContractTokenConfigurationUpdateError) -> Self { + Self::BasicError(BasicError::DataContractTokenConfigurationUpdateError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_exceeds_max_members_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_exceeds_max_members_error.rs new file mode 100644 index 00000000000..adc124655ad --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_exceeds_max_members_error.rs @@ -0,0 +1,31 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Group exceeds the maximum allowed number of members: {max_members}")] +#[platform_serialize(unversioned)] +pub struct GroupExceedsMaxMembersError { + max_members: u32, +} + +impl GroupExceedsMaxMembersError { + pub fn new(max_members: u32) -> Self { + Self { max_members } + } + + pub fn max_members(&self) -> u32 { + self.max_members + } +} + +impl From<GroupExceedsMaxMembersError> for ConsensusError { + fn from(err: GroupExceedsMaxMembersError) -> Self { + Self::BasicError(BasicError::GroupExceedsMaxMembersError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_of_zero_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_of_zero_error.rs new file mode 100644 index 00000000000..4d3b9c37d8f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_of_zero_error.rs @@ -0,0 +1,32 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use crate::identifier::Identifier; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Member {member_id} has a power of 0, which is not allowed")] +#[platform_serialize(unversioned)] +pub struct GroupMemberHasPowerOfZeroError { + member_id: Identifier, +} + +impl GroupMemberHasPowerOfZeroError { + pub fn new(member_id: Identifier) -> Self { + Self { member_id } + } + + pub fn member_id(&self) -> Identifier { + self.member_id + } +} + +impl From<GroupMemberHasPowerOfZeroError> for ConsensusError { + fn from(err: GroupMemberHasPowerOfZeroError) -> Self { + Self::BasicError(BasicError::GroupMemberHasPowerOfZeroError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_over_limit_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_over_limit_error.rs new file mode 100644 index 00000000000..40bbd70a607 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_member_has_power_over_limit_error.rs @@ -0,0 +1,57 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::group::GroupMemberPower; +use crate::errors::ProtocolError; +use crate::identifier::Identifier; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Member {member_id} has a power of {power}, which exceeds the allowed limit of {max_power}" +)] +#[platform_serialize(unversioned)] +pub struct GroupMemberHasPowerOverLimitError { + member_id: Identifier, + power: GroupMemberPower, + max_power: GroupMemberPower, +} + +impl GroupMemberHasPowerOverLimitError { + /// Creates a new `GroupMemberHasPowerOverLimitError`. + pub fn new( + member_id: Identifier, + power: GroupMemberPower, + max_power: GroupMemberPower, + ) -> Self { + Self { + member_id, + power, + max_power, + } + } + + /// Returns the identifier of the member. + pub fn member_id(&self) -> Identifier { + self.member_id + } + + /// Returns the power of the member. + pub fn power(&self) -> GroupMemberPower { + self.power + } + + /// Returns the maximum allowed power. + pub fn max_power(&self) -> GroupMemberPower { + self.max_power + } +} + +impl From<GroupMemberHasPowerOverLimitError> for ConsensusError { + fn from(err: GroupMemberHasPowerOverLimitError) -> Self { + Self::BasicError(BasicError::GroupMemberHasPowerOverLimitError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_non_unilateral_member_power_has_less_than_required_power_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_non_unilateral_member_power_has_less_than_required_power_error.rs new file mode 100644 index 00000000000..7d8632fc533 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_non_unilateral_member_power_has_less_than_required_power_error.rs @@ -0,0 +1,49 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::group::GroupMemberPower; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("The collective power of non-unilateral members {total_power} is less than the required power {required_power}")] +#[platform_serialize(unversioned)] +pub struct GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { + total_power: GroupMemberPower, + required_power: GroupMemberPower, +} + +impl GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError { + /// Creates a new `GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError`. + /// + /// # Parameters + /// - `total_power`: The total power of non-unilateral members. + /// - `required_power`: The required power to meet the threshold. + pub fn new(total_power: GroupMemberPower, required_power: GroupMemberPower) -> Self { + Self { + total_power, + required_power, + } + } + + /// Returns the total power of non-unilateral members. + pub fn total_power(&self) -> GroupMemberPower { + self.total_power + } + + /// Returns the required power to meet the threshold. + pub fn required_power(&self) -> GroupMemberPower { + self.required_power + } +} + +impl From<GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError> for ConsensusError { + fn from(err: GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError) -> Self { + Self::BasicError( + BasicError::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(err), + ) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_position_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_position_does_not_exist_error.rs new file mode 100644 index 00000000000..7f525489363 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_position_does_not_exist_error.rs @@ -0,0 +1,46 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +/// Error raised when a group position does not exist in the data contract. +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Group position {} does not exist", missing_group_position)] +#[platform_serialize(unversioned)] +pub struct GroupPositionDoesNotExistError { + missing_group_position: GroupContractPosition, +} + +impl GroupPositionDoesNotExistError { + /// Creates a new instance of `GroupPositionDoesNotExistError`. + /// + /// # Parameters + /// - `missing_group_position`: The group position that does not exist. + /// + /// # Returns + /// A new `GroupPositionDoesNotExistError` instance. + pub fn new(missing_group_position: GroupContractPosition) -> Self { + Self { + missing_group_position, + } + } + + /// Gets the missing group position that caused this error. + /// + /// # Returns + /// The missing group position. + pub fn missing_group_position(&self) -> GroupContractPosition { + self.missing_group_position + } +} + +impl From<GroupPositionDoesNotExistError> for ConsensusError { + fn from(err: GroupPositionDoesNotExistError) -> Self { + Self::BasicError(BasicError::GroupPositionDoesNotExistError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_total_power_has_less_than_required_power_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_total_power_has_less_than_required_power_error.rs new file mode 100644 index 00000000000..6559f20e5c0 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/group_total_power_has_less_than_required_power_error.rs @@ -0,0 +1,40 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::group::GroupMemberPower; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Group total power {total_power} is less than the required power {required_power}")] +#[platform_serialize(unversioned)] +pub struct GroupTotalPowerLessThanRequiredError { + total_power: GroupMemberPower, + required_power: GroupMemberPower, +} + +impl GroupTotalPowerLessThanRequiredError { + pub fn new(total_power: GroupMemberPower, required_power: GroupMemberPower) -> Self { + Self { + total_power, + required_power, + } + } + + pub fn total_power(&self) -> GroupMemberPower { + self.total_power + } + + pub fn required_power(&self) -> GroupMemberPower { + self.required_power + } +} + +impl From<GroupTotalPowerLessThanRequiredError> for ConsensusError { + fn from(err: GroupTotalPowerLessThanRequiredError) -> Self { + Self::BasicError(BasicError::GroupTotalPowerLessThanRequiredError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_token_base_supply_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_token_base_supply_error.rs new file mode 100644 index 00000000000..738be8b2223 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/invalid_token_base_supply_error.rs @@ -0,0 +1,41 @@ +use crate::consensus::basic::BasicError; +use crate::errors::ProtocolError; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +use crate::consensus::ConsensusError; + +use bincode::{Decode, Encode}; +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Invalid token base supply. Given base supply: {}, Max allowed base supply: {}", + base_supply, + i64::MAX +)] +#[platform_serialize(unversioned)] +pub struct InvalidTokenBaseSupplyError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + base_supply: u64, +} + +impl InvalidTokenBaseSupplyError { + pub fn new(base_supply: u64) -> Self { + Self { base_supply } + } + + pub fn base_supply(&self) -> u64 { + self.base_supply + } +} + +impl From<InvalidTokenBaseSupplyError> for ConsensusError { + fn from(err: InvalidTokenBaseSupplyError) -> Self { + Self::BasicError(BasicError::InvalidTokenBaseSupplyError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs index 9e7bedab0d9..529edda651b 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/mod.rs @@ -4,10 +4,17 @@ mod data_contract_have_new_unique_index_error; mod data_contract_immutable_properties_update_error; mod data_contract_invalid_index_definition_update_error; pub mod data_contract_max_depth_exceed_error; +mod data_contract_token_configuration_update_error; mod data_contract_unique_indices_changed_error; mod document_types_are_missing_error; mod duplicate_index_error; mod duplicate_index_name_error; +mod group_exceeds_max_members_error; +mod group_member_has_power_of_zero_error; +mod group_member_has_power_over_limit_error; +mod group_non_unilateral_member_power_has_less_than_required_power_error; +mod group_position_does_not_exist_error; +mod group_total_power_has_less_than_required_power_error; mod incompatible_data_contract_schema_error; mod incompatible_document_type_schema_error; mod incompatible_re2_pattern_error; @@ -20,6 +27,9 @@ mod invalid_index_property_type_error; mod invalid_indexed_property_constraint_error; #[cfg(feature = "json-schema-validation")] mod invalid_json_schema_ref_error; +mod invalid_token_base_supply_error; +mod non_contiguous_contract_group_positions_error; +mod non_contiguous_contract_token_positions_error; mod system_property_index_already_present_error; mod undefined_index_property_error; mod unique_indices_limit_reached_error; @@ -32,6 +42,7 @@ mod unknown_transferable_type_error; pub use data_contract_have_new_unique_index_error::*; pub use data_contract_immutable_properties_update_error::*; pub use data_contract_invalid_index_definition_update_error::*; +pub use data_contract_token_configuration_update_error::*; pub use data_contract_unique_indices_changed_error::*; pub use document_types_are_missing_error::*; pub use duplicate_index_error::*; @@ -53,8 +64,17 @@ pub use unique_indices_limit_reached_error::*; pub use contested_unique_index_on_mutable_document_type_error::*; pub use contested_unique_index_with_unique_index_error::*; +pub use group_exceeds_max_members_error::*; +pub use group_member_has_power_of_zero_error::*; +pub use group_member_has_power_over_limit_error::*; +pub use group_non_unilateral_member_power_has_less_than_required_power_error::*; +pub use group_position_does_not_exist_error::*; +pub use group_total_power_has_less_than_required_power_error::*; pub use incompatible_document_type_schema_error::*; pub use invalid_document_type_name_error::*; +pub use invalid_token_base_supply_error::*; +pub use non_contiguous_contract_group_positions_error::*; +pub use non_contiguous_contract_token_positions_error::*; pub use unknown_document_creation_restriction_mode_error::*; pub use unknown_security_level_error::*; pub use unknown_storage_key_requirements_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_group_positions_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_group_positions_error.rs new file mode 100644 index 00000000000..3409e866f8c --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_group_positions_error.rs @@ -0,0 +1,52 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Contract Group Positions are not contiguous. Missing position: {}, Followed position: {}", + missing_position, + followed_position +)] +#[platform_serialize(unversioned)] +pub struct NonContiguousContractGroupPositionsError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + missing_position: GroupContractPosition, + followed_position: GroupContractPosition, +} + +impl NonContiguousContractGroupPositionsError { + pub fn new( + missing_position: GroupContractPosition, + followed_position: GroupContractPosition, + ) -> Self { + Self { + missing_position, + followed_position, + } + } + + pub fn missing_position(&self) -> u16 { + self.missing_position + } + + pub fn followed_position(&self) -> u16 { + self.followed_position + } +} + +impl From<NonContiguousContractGroupPositionsError> for ConsensusError { + fn from(err: NonContiguousContractGroupPositionsError) -> Self { + Self::BasicError(BasicError::NonContiguousContractGroupPositionsError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_token_positions_error.rs b/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_token_positions_error.rs new file mode 100644 index 00000000000..2875f2bb420 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/data_contract/non_contiguous_contract_token_positions_error.rs @@ -0,0 +1,52 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::TokenContractPosition; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Contract Token Positions are not contiguous. Missing position: {}, Followed position: {}", + missing_position, + followed_position +)] +#[platform_serialize(unversioned)] +pub struct NonContiguousContractTokenPositionsError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + missing_position: TokenContractPosition, + followed_position: TokenContractPosition, +} + +impl NonContiguousContractTokenPositionsError { + pub fn new( + missing_position: TokenContractPosition, + followed_position: TokenContractPosition, + ) -> Self { + Self { + missing_position, + followed_position, + } + } + + pub fn missing_position(&self) -> u16 { + self.missing_position + } + + pub fn followed_position(&self) -> u16 { + self.followed_position + } +} + +impl From<NonContiguousContractTokenPositionsError> for ConsensusError { + fn from(err: NonContiguousContractTokenPositionsError) -> Self { + Self::BasicError(BasicError::NonContiguousContractTokenPositionsError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/group/group_action_not_allowed_on_transition_error.rs b/packages/rs-dpp/src/errors/consensus/basic/group/group_action_not_allowed_on_transition_error.rs new file mode 100644 index 00000000000..8f2862fa9ab --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/group/group_action_not_allowed_on_transition_error.rs @@ -0,0 +1,31 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Group action is not allowed during transition: {}", transition_type)] +#[platform_serialize(unversioned)] +pub struct GroupActionNotAllowedOnTransitionError { + transition_type: String, +} + +impl GroupActionNotAllowedOnTransitionError { + pub fn new(transition_type: String) -> Self { + Self { transition_type } + } + + pub fn transition_type(&self) -> &str { + &self.transition_type + } +} + +impl From<GroupActionNotAllowedOnTransitionError> for ConsensusError { + fn from(err: GroupActionNotAllowedOnTransitionError) -> Self { + Self::BasicError(BasicError::GroupActionNotAllowedOnTransitionError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/group/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/group/mod.rs new file mode 100644 index 00000000000..32c6ce2d357 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/group/mod.rs @@ -0,0 +1,3 @@ +mod group_action_not_allowed_on_transition_error; + +pub use group_action_not_allowed_on_transition_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs index 61aaa959d29..b4d39d261c3 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/identity/identity_asset_lock_transaction_is_not_found_error.rs @@ -44,15 +44,3 @@ impl From<IdentityAssetLockTransactionIsNotFoundError> for ConsensusError { Self::BasicError(BasicError::IdentityAssetLockTransactionIsNotFoundError(err)) } } - -#[cfg(test)] -mod test { - use crate::consensus::basic::identity::IdentityAssetLockTransactionIsNotFoundError; - - #[test] - pub fn test_message() { - let error = IdentityAssetLockTransactionIsNotFoundError::new([1; 32]); - - println!("{}", error); - } -} diff --git a/packages/rs-dpp/src/errors/consensus/basic/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/mod.rs index b96be4629b0..b05ec735e6b 100644 --- a/packages/rs-dpp/src/errors/consensus/basic/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/basic/mod.rs @@ -9,9 +9,11 @@ pub mod decode; pub mod document; pub mod identity; pub mod incompatible_protocol_version_error; +pub mod token; pub mod unsupported_protocol_version_error; pub mod basic_error; +pub mod group; pub mod invalid_identifier_error; #[cfg(feature = "json-schema-validation")] pub mod json_schema_compilation_error; diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/choosing_token_mint_recipient_not_allowed_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/choosing_token_mint_recipient_not_allowed_error.rs new file mode 100644 index 00000000000..9d5f2dfc901 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/choosing_token_mint_recipient_not_allowed_error.rs @@ -0,0 +1,31 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Choosing token mint recipient not allowed for token {}", token_id)] +#[platform_serialize(unversioned)] +pub struct ChoosingTokenMintRecipientNotAllowedError { + token_id: Identifier, +} + +impl ChoosingTokenMintRecipientNotAllowedError { + pub fn new(token_id: Identifier) -> Self { + Self { token_id } + } + pub fn token_id(&self) -> Identifier { + self.token_id + } +} + +impl From<ChoosingTokenMintRecipientNotAllowedError> for ConsensusError { + fn from(err: ChoosingTokenMintRecipientNotAllowedError) -> Self { + Self::BasicError(BasicError::ChoosingTokenMintRecipientNotAllowedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/contract_has_no_tokens_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/contract_has_no_tokens_error.rs new file mode 100644 index 00000000000..3fc49a2600a --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/contract_has_no_tokens_error.rs @@ -0,0 +1,31 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Contract {} has no tokens", contract_id)] +#[platform_serialize(unversioned)] +pub struct ContractHasNoTokensError { + contract_id: Identifier, +} + +impl ContractHasNoTokensError { + pub fn new(contract_id: Identifier) -> Self { + Self { contract_id } + } + pub fn contract_id(&self) -> Identifier { + self.contract_id + } +} + +impl From<ContractHasNoTokensError> for ConsensusError { + fn from(err: ContractHasNoTokensError) -> Self { + Self::BasicError(BasicError::ContractHasNoTokensError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/destination_identity_for_token_minting_not_set_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/destination_identity_for_token_minting_not_set_error.rs new file mode 100644 index 00000000000..7136a46e66f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/destination_identity_for_token_minting_not_set_error.rs @@ -0,0 +1,33 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Destination identity for minting not set for token {}", token_id)] +#[platform_serialize(unversioned)] +pub struct DestinationIdentityForTokenMintingNotSetError { + token_id: Identifier, +} + +impl DestinationIdentityForTokenMintingNotSetError { + pub fn new(token_id: Identifier) -> Self { + Self { token_id } + } + pub fn token_id(&self) -> Identifier { + self.token_id + } +} + +impl From<DestinationIdentityForTokenMintingNotSetError> for ConsensusError { + fn from(err: DestinationIdentityForTokenMintingNotSetError) -> Self { + Self::BasicError(BasicError::DestinationIdentityForTokenMintingNotSetError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/invalid_action_id_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_action_id_error.rs new file mode 100644 index 00000000000..51587ab3926 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_action_id_error.rs @@ -0,0 +1,43 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::prelude::Identifier; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Invalid action id {}, expected {}", + invalid_action_id, + expected_action_id +)] +#[platform_serialize(unversioned)] +pub struct InvalidActionIdError { + expected_action_id: Identifier, + invalid_action_id: Identifier, +} + +impl InvalidActionIdError { + pub fn new(expected_action_id: Identifier, invalid_action_id: Identifier) -> Self { + Self { + expected_action_id, + invalid_action_id, + } + } + + pub fn expected_action_id(&self) -> Identifier { + self.expected_action_id + } + + pub fn invalid_action_id(&self) -> Identifier { + self.invalid_action_id + } +} + +impl From<InvalidActionIdError> for ConsensusError { + fn from(err: InvalidActionIdError) -> Self { + Self::BasicError(BasicError::InvalidActionIdError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_id_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_id_error.rs new file mode 100644 index 00000000000..635f126158f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_id_error.rs @@ -0,0 +1,43 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::prelude::Identifier; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Invalid token id {}, expected {}", + invalid_token_id, + expected_token_id +)] +#[platform_serialize(unversioned)] +pub struct InvalidTokenIdError { + expected_token_id: Identifier, + invalid_token_id: Identifier, +} + +impl InvalidTokenIdError { + pub fn new(expected_token_id: Identifier, invalid_token_id: Identifier) -> Self { + Self { + expected_token_id, + invalid_token_id, + } + } + + pub fn expected_token_id(&self) -> Identifier { + self.expected_token_id + } + + pub fn invalid_token_id(&self) -> Identifier { + self.invalid_token_id + } +} + +impl From<InvalidTokenIdError> for ConsensusError { + fn from(err: InvalidTokenIdError) -> Self { + Self::BasicError(BasicError::InvalidTokenIdError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_position_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_position_error.rs new file mode 100644 index 00000000000..ac157f4193b --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/invalid_token_position_error.rs @@ -0,0 +1,47 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::data_contract::TokenContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Invalid token position {}, max {}", + invalid_token_position, + max_token_position +)] +#[platform_serialize(unversioned)] +pub struct InvalidTokenPositionError { + max_token_position: TokenContractPosition, + invalid_token_position: TokenContractPosition, +} + +impl InvalidTokenPositionError { + pub fn new( + max_token_position: TokenContractPosition, + invalid_token_position: TokenContractPosition, + ) -> Self { + Self { + max_token_position, + invalid_token_position, + } + } + + pub fn max_token_position(&self) -> TokenContractPosition { + self.max_token_position + } + + pub fn invalid_token_position(&self) -> TokenContractPosition { + self.invalid_token_position + } +} + +impl From<InvalidTokenPositionError> for ConsensusError { + fn from(err: InvalidTokenPositionError) -> Self { + Self::BasicError(BasicError::InvalidTokenPositionError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs b/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs new file mode 100644 index 00000000000..d77dfff6fab --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/mod.rs @@ -0,0 +1,15 @@ +mod choosing_token_mint_recipient_not_allowed_error; +mod contract_has_no_tokens_error; +mod destination_identity_for_token_minting_not_set_error; +mod invalid_action_id_error; +mod invalid_token_id_error; +mod invalid_token_position_error; +mod token_transfer_to_ourselves_error; + +pub use choosing_token_mint_recipient_not_allowed_error::*; +pub use contract_has_no_tokens_error::*; +pub use destination_identity_for_token_minting_not_set_error::*; +pub use invalid_action_id_error::*; +pub use invalid_token_id_error::*; +pub use invalid_token_position_error::*; +pub use token_transfer_to_ourselves_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/basic/token/token_transfer_to_ourselves_error.rs b/packages/rs-dpp/src/errors/consensus/basic/token/token_transfer_to_ourselves_error.rs new file mode 100644 index 00000000000..dbd1ee747c1 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/basic/token/token_transfer_to_ourselves_error.rs @@ -0,0 +1,44 @@ +use crate::consensus::basic::BasicError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Token transfer to the same identity is not allowed. Token ID: {}, Identity ID: {}", + token_id, + identity_id +)] +#[platform_serialize(unversioned)] +pub struct TokenTransferToOurselfError { + token_id: Identifier, + identity_id: Identifier, +} + +impl TokenTransferToOurselfError { + pub fn new(token_id: Identifier, identity_id: Identifier) -> Self { + Self { + token_id, + identity_id, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } +} + +impl From<TokenTransferToOurselfError> for ConsensusError { + fn from(err: TokenTransferToOurselfError) -> Self { + Self::BasicError(BasicError::TokenTransferToOurselfError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/codes.rs b/packages/rs-dpp/src/errors/consensus/codes.rs index b238f55c028..67177be3766 100644 --- a/packages/rs-dpp/src/errors/consensus/codes.rs +++ b/packages/rs-dpp/src/errors/consensus/codes.rs @@ -98,8 +98,21 @@ impl ErrorWithCode for BasicError { Self::ContractError(DataContractError::RegexError(_)) => 10247, Self::ContestedUniqueIndexOnMutableDocumentTypeError(_) => 10248, Self::ContestedUniqueIndexWithUniqueIndexError(_) => 10249, + Self::DataContractTokenConfigurationUpdateError { .. } => 10250, + Self::InvalidTokenBaseSupplyError(_) => 10251, + Self::NonContiguousContractGroupPositionsError(_) => 10252, + Self::NonContiguousContractTokenPositionsError(_) => 10253, - // Document Errors: 10400-10499 + // Group Errors: 10350-10399 + Self::GroupPositionDoesNotExistError(_) => 10350, + Self::GroupActionNotAllowedOnTransitionError(_) => 10351, + Self::GroupTotalPowerLessThanRequiredError(_) => 10352, + Self::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(_) => 10353, + Self::GroupExceedsMaxMembersError(_) => 10354, + Self::GroupMemberHasPowerOfZeroError(_) => 10355, + Self::GroupMemberHasPowerOverLimitError(_) => 10356, + + // Document Errors: 10400-10449 Self::DataContractNotPresentError { .. } => 10400, Self::DuplicateDocumentTransitionsWithIdsError { .. } => 10401, Self::DuplicateDocumentTransitionsWithIndicesError { .. } => 10402, @@ -120,6 +133,15 @@ impl ErrorWithCode for BasicError { Self::DocumentFieldMaxSizeExceededError(_) => 10417, Self::ContestedDocumentsTemporarilyNotAllowedError(_) => 10418, + // Token Errors: 10450-10499 + Self::InvalidTokenIdError(_) => 10450, + Self::InvalidTokenPositionError(_) => 10451, + Self::InvalidActionIdError(_) => 10452, + Self::ContractHasNoTokensError(_) => 10453, + Self::DestinationIdentityForTokenMintingNotSetError(_) => 10454, + Self::ChoosingTokenMintRecipientNotAllowedError(_) => 10455, + Self::TokenTransferToOurselfError(_) => 10456, + // Identity Errors: 10500-10599 Self::DuplicatedIdentityPublicKeyBasicError(_) => 10500, Self::DuplicatedIdentityPublicKeyIdBasicError(_) => 10501, @@ -200,8 +222,10 @@ impl ErrorWithCode for StateError { Self::DataContractAlreadyPresentError { .. } => 40000, Self::DataContractIsReadonlyError { .. } => 40001, Self::DataContractConfigUpdateError { .. } => 40002, + Self::DataContractUpdatePermissionError(_) => 40003, + Self::DataContractUpdateActionNotAllowedError(_) => 40004, - // Document Errors: 40100-40199 + // Document Errors: 40100-40149 Self::DocumentAlreadyPresentError { .. } => 40100, Self::DocumentNotFoundError { .. } => 40101, Self::DocumentOwnerIdMismatchError { .. } => 40102, @@ -218,6 +242,23 @@ impl ErrorWithCode for StateError { Self::DocumentContestDocumentWithSameIdAlreadyPresentError(_) => 40113, Self::DocumentContestNotPaidForError(_) => 40114, + // Token errors: 40150-40199 + Self::IdentityDoesNotHaveEnoughTokenBalanceError(_) => 40150, + Self::UnauthorizedTokenActionError(_) => 40151, + Self::IdentityTokenAccountFrozenError(_) => 40152, + Self::IdentityTokenAccountNotFrozenError(_) => 40153, + Self::TokenSettingMaxSupplyToLessThanCurrentSupplyError(_) => 40154, + Self::TokenMintPastMaxSupplyError(_) => 40155, + Self::NewTokensDestinationIdentityDoesNotExistError(_) => 40156, + Self::NewAuthorizedActionTakerIdentityDoesNotExistError(_) => 40157, + Self::NewAuthorizedActionTakerGroupDoesNotExistError(_) => 40158, + Self::NewAuthorizedActionTakerMainGroupNotSetError(_) => 40159, + Self::InvalidGroupPositionError(_) => 40160, + Self::TokenIsPausedError(_) => 40161, + Self::IdentityTokenAccountAlreadyFrozenError(_) => 40162, + Self::TokenAlreadyPausedError(_) => 40163, + Self::TokenNotPausedError(_) => 40164, + // Identity Errors: 40200-40299 Self::IdentityAlreadyExistsError(_) => 40200, Self::IdentityPublicKeyIsReadOnlyError { .. } => 40201, @@ -232,9 +273,9 @@ impl ErrorWithCode for StateError { Self::IdentityInsufficientBalanceError(_) => 40210, Self::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError(_) => 40211, Self::DocumentTypeUpdateError(_) => 40212, - Self::DataContractUpdatePermissionError(_) => 40213, Self::MissingTransferKeyError(_) => 40214, Self::NoTransferKeyForCoreWithdrawalAvailableError(_) => 40215, + Self::RecipientIdentityDoesNotExistError(_) => 40216, // Voting Errors: 40300-40399 Self::MasternodeNotFoundError(_) => 40300, @@ -252,6 +293,12 @@ impl ErrorWithCode for StateError { // Data trigger errors: 40500-40799 #[cfg(feature = "state-transition-validation")] Self::DataTriggerError(ref e) => e.code(), + + // Group errors: 40800-40899 + Self::IdentityNotMemberOfGroupError(_) => 40800, + Self::GroupActionDoesNotExistError(_) => 40801, + Self::GroupActionAlreadyCompletedError(_) => 40802, + Self::GroupActionAlreadySignedByIdentityError(_) => 40803, } } } diff --git a/packages/rs-dpp/src/errors/consensus/state/data_contract/data_contract_update_action_not_allowed_error.rs b/packages/rs-dpp/src/errors/consensus/state/data_contract/data_contract_update_action_not_allowed_error.rs new file mode 100644 index 00000000000..0064bc5923a --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/data_contract/data_contract_update_action_not_allowed_error.rs @@ -0,0 +1,45 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::errors::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Action '{action}' is not allowed on Data Contract {data_contract_id}")] +#[platform_serialize(unversioned)] +pub struct DataContractUpdateActionNotAllowedError { + /* + + DO NOT CHANGE ORDER OF FIELDS WITHOUT INTRODUCING OF NEW VERSION + + */ + data_contract_id: Identifier, + action: String, +} + +impl DataContractUpdateActionNotAllowedError { + pub fn new(data_contract_id: Identifier, action: impl Into<String>) -> Self { + Self { + data_contract_id, + action: action.into(), + } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<DataContractUpdateActionNotAllowedError> for ConsensusError { + fn from(err: DataContractUpdateActionNotAllowedError) -> Self { + Self::StateError(StateError::DataContractUpdateActionNotAllowedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs b/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs index 563596603d6..c06986bb44e 100644 --- a/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/data_contract/mod.rs @@ -1,5 +1,6 @@ pub mod data_contract_already_present_error; pub mod data_contract_config_update_error; pub mod data_contract_is_readonly_error; +pub mod data_contract_update_action_not_allowed_error; pub mod data_contract_update_permission_error; pub mod document_type_update_error; diff --git a/packages/rs-dpp/src/errors/consensus/state/data_trigger/mod.rs b/packages/rs-dpp/src/errors/consensus/state/data_trigger/mod.rs index a753c9ccd62..e43de444588 100644 --- a/packages/rs-dpp/src/errors/consensus/state/data_trigger/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/data_trigger/mod.rs @@ -4,7 +4,7 @@ use crate::consensus::state::data_trigger::data_trigger_invalid_result_error::Da use crate::consensus::state::state_error::StateError; use crate::consensus::ConsensusError; use crate::errors::ProtocolError; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; +use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use thiserror::Error; diff --git a/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_completed_error.rs b/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_completed_error.rs new file mode 100644 index 00000000000..2d700d72a3f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_completed_error.rs @@ -0,0 +1,55 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( +"Group action has already been completed for data contract {} at group position {} with action ID {}", + data_contract_id, + group_contract_position, + action_id +)] +#[platform_serialize(unversioned)] +pub struct GroupActionAlreadyCompletedError { + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, +} + +impl GroupActionAlreadyCompletedError { + pub fn new( + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + ) -> Self { + Self { + data_contract_id, + group_contract_position, + action_id, + } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn group_contract_position(&self) -> &GroupContractPosition { + &self.group_contract_position + } + + pub fn action_id(&self) -> Identifier { + self.action_id + } +} + +impl From<GroupActionAlreadyCompletedError> for ConsensusError { + fn from(err: GroupActionAlreadyCompletedError) -> Self { + Self::StateError(StateError::GroupActionAlreadyCompletedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_signed_by_identity_error.rs b/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_signed_by_identity_error.rs new file mode 100644 index 00000000000..1fcdbf0419c --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/group/group_action_already_signed_by_identity_error.rs @@ -0,0 +1,64 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( +"Group action with action ID {} has already been signed by identity {} for data contract {} at group position {}", + action_id, + identity_id, + data_contract_id, + group_contract_position +)] +#[platform_serialize(unversioned)] +pub struct GroupActionAlreadySignedByIdentityError { + identity_id: Identifier, + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, +} + +impl GroupActionAlreadySignedByIdentityError { + pub fn new( + identity_id: Identifier, + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + ) -> Self { + Self { + identity_id, + data_contract_id, + group_contract_position, + action_id, + } + } + + pub fn identity_id(&self) -> Identifier { + self.identity_id + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn group_contract_position(&self) -> GroupContractPosition { + self.group_contract_position + } + + pub fn action_id(&self) -> Identifier { + self.action_id + } +} + +impl From<GroupActionAlreadySignedByIdentityError> for ConsensusError { + fn from(err: GroupActionAlreadySignedByIdentityError) -> Self { + Self::StateError(StateError::GroupActionAlreadySignedByIdentityError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/group/group_action_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/state/group/group_action_does_not_exist_error.rs new file mode 100644 index 00000000000..c57af3cc4d2 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/group/group_action_does_not_exist_error.rs @@ -0,0 +1,56 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Group action does not exist for data contract {} at group position {} with action ID {}", + data_contract_id, + group_contract_position, + action_id +)] +#[platform_serialize(unversioned)] +pub struct GroupActionDoesNotExistError { + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, +} + +impl GroupActionDoesNotExistError { + pub fn new( + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + ) -> Self { + Self { + data_contract_id, + group_contract_position, + action_id, + } + } + + pub fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + pub fn group_contract_position(&self) -> &GroupContractPosition { + &self.group_contract_position + } + + pub fn action_id(&self) -> Identifier { + self.action_id + } +} + +impl From<GroupActionDoesNotExistError> for ConsensusError { + fn from(err: GroupActionDoesNotExistError) -> Self { + Self::StateError(StateError::GroupActionDoesNotExistError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/group/identity_not_member_of_group_error.rs b/packages/rs-dpp/src/errors/consensus/state/group/identity_not_member_of_group_error.rs new file mode 100644 index 00000000000..afd5bf06ffb --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/group/identity_not_member_of_group_error.rs @@ -0,0 +1,56 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {} is not a member of the group for data contract {} at position {}", + identity_id, + data_contract_id, + group_contract_position +)] +#[platform_serialize(unversioned)] +pub struct IdentityNotMemberOfGroupError { + identity_id: Identifier, + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, +} + +impl IdentityNotMemberOfGroupError { + pub fn new( + identity_id: Identifier, + data_contract_id: Identifier, + group_contract_position: GroupContractPosition, + ) -> Self { + Self { + identity_id, + data_contract_id, + group_contract_position, + } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn data_contract_id(&self) -> &Identifier { + &self.data_contract_id + } + + pub fn group_contract_position(&self) -> GroupContractPosition { + self.group_contract_position + } +} + +impl From<IdentityNotMemberOfGroupError> for ConsensusError { + fn from(err: IdentityNotMemberOfGroupError) -> Self { + Self::StateError(StateError::IdentityNotMemberOfGroupError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/group/mod.rs b/packages/rs-dpp/src/errors/consensus/state/group/mod.rs new file mode 100644 index 00000000000..133ee7e1a5a --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/group/mod.rs @@ -0,0 +1,9 @@ +mod group_action_already_completed_error; +mod group_action_already_signed_by_identity_error; +mod group_action_does_not_exist_error; +mod identity_not_member_of_group_error; + +pub use group_action_already_completed_error::*; +pub use group_action_already_signed_by_identity_error::*; +pub use group_action_does_not_exist_error::*; +pub use identity_not_member_of_group_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs index 35e6f7f79a8..072bbda4ac3 100644 --- a/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/identity/mod.rs @@ -16,3 +16,6 @@ pub mod max_identity_public_key_limit_reached_error; pub mod missing_identity_public_key_ids_error; pub mod missing_transfer_key_error; pub mod no_transfer_key_for_core_withdrawal_available_error; + +mod recipient_identity_does_not_exist_error; +pub use recipient_identity_does_not_exist_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/state/identity/recipient_identity_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/state/identity/recipient_identity_does_not_exist_error.rs new file mode 100644 index 00000000000..dc6a838f76f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/identity/recipient_identity_does_not_exist_error.rs @@ -0,0 +1,31 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Recipient identity {} does not exist", recipient_id)] +#[platform_serialize(unversioned)] +pub struct RecipientIdentityDoesNotExistError { + recipient_id: Identifier, +} + +impl RecipientIdentityDoesNotExistError { + pub fn new(recipient_id: Identifier) -> Self { + Self { recipient_id } + } + pub fn recipient_id(&self) -> Identifier { + self.recipient_id + } +} + +impl From<RecipientIdentityDoesNotExistError> for ConsensusError { + fn from(err: RecipientIdentityDoesNotExistError) -> Self { + Self::StateError(StateError::RecipientIdentityDoesNotExistError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/mod.rs b/packages/rs-dpp/src/errors/consensus/state/mod.rs index 118ca4b10c0..ee10b800d11 100644 --- a/packages/rs-dpp/src/errors/consensus/state/mod.rs +++ b/packages/rs-dpp/src/errors/consensus/state/mod.rs @@ -2,7 +2,9 @@ pub mod data_contract; #[cfg(feature = "state-transition-validation")] pub mod data_trigger; pub mod document; +pub mod group; pub mod identity; pub mod prefunded_specialized_balances; pub mod state_error; +pub mod token; pub mod voting; diff --git a/packages/rs-dpp/src/errors/consensus/state/state_error.rs b/packages/rs-dpp/src/errors/consensus/state/state_error.rs index 8b0ac2b26bb..9e5a73ae66c 100644 --- a/packages/rs-dpp/src/errors/consensus/state/state_error.rs +++ b/packages/rs-dpp/src/errors/consensus/state/state_error.rs @@ -23,10 +23,9 @@ use crate::consensus::state::identity::invalid_identity_public_key_id_error::Inv use crate::consensus::state::identity::invalid_identity_revision_error::InvalidIdentityRevisionError; use crate::consensus::state::identity::max_identity_public_key_limit_reached_error::MaxIdentityPublicKeyLimitReachedError; use crate::consensus::state::identity::missing_identity_public_key_ids_error::MissingIdentityPublicKeyIdsError; -use crate::consensus::state::identity::{ - IdentityAlreadyExistsError, IdentityInsufficientBalanceError, -}; +use crate::consensus::state::identity::{IdentityAlreadyExistsError, IdentityInsufficientBalanceError, RecipientIdentityDoesNotExistError}; use crate::consensus::ConsensusError; +use crate::consensus::state::data_contract::data_contract_update_action_not_allowed_error::DataContractUpdateActionNotAllowedError; use crate::consensus::state::data_contract::data_contract_update_permission_error::DataContractUpdatePermissionError; use crate::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use crate::consensus::state::document::document_contest_currently_locked_error::DocumentContestCurrentlyLockedError; @@ -36,12 +35,16 @@ use crate::consensus::state::document::document_contest_not_joinable_error::Docu use crate::consensus::state::document::document_contest_not_paid_for_error::DocumentContestNotPaidForError; use crate::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; use crate::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; +use crate::consensus::state::group::{GroupActionAlreadyCompletedError, GroupActionAlreadySignedByIdentityError, GroupActionDoesNotExistError, IdentityNotMemberOfGroupError}; use crate::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use crate::consensus::state::identity::invalid_identity_contract_nonce_error::InvalidIdentityNonceError; use crate::consensus::state::identity::missing_transfer_key_error::MissingTransferKeyError; use crate::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError; use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_insufficient_error::PrefundedSpecializedBalanceInsufficientError; use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_not_found_error::PrefundedSpecializedBalanceNotFoundError; +use crate::consensus::state::token::{IdentityDoesNotHaveEnoughTokenBalanceError, IdentityTokenAccountFrozenError, IdentityTokenAccountNotFrozenError, InvalidGroupPositionError, NewAuthorizedActionTakerGroupDoesNotExistError, NewAuthorizedActionTakerIdentityDoesNotExistError, NewAuthorizedActionTakerMainGroupNotSetError, NewTokensDestinationIdentityDoesNotExistError, TokenMintPastMaxSupplyError, TokenSettingMaxSupplyToLessThanCurrentSupplyError, UnauthorizedTokenActionError, IdentityTokenAccountAlreadyFrozenError, TokenAlreadyPausedError, TokenIsPausedError, + TokenNotPausedError, +}; use crate::consensus::state::voting::masternode_incorrect_voter_identity_id_error::MasternodeIncorrectVoterIdentityIdError; use crate::consensus::state::voting::masternode_incorrect_voting_address_error::MasternodeIncorrectVotingAddressError; use crate::consensus::state::voting::masternode_not_found_error::MasternodeNotFoundError; @@ -199,6 +202,73 @@ pub enum StateError { #[error(transparent)] MasternodeVoteAlreadyPresentError(MasternodeVoteAlreadyPresentError), + + #[error(transparent)] + RecipientIdentityDoesNotExistError(RecipientIdentityDoesNotExistError), + + #[error(transparent)] + IdentityDoesNotHaveEnoughTokenBalanceError(IdentityDoesNotHaveEnoughTokenBalanceError), + + #[error(transparent)] + UnauthorizedTokenActionError(UnauthorizedTokenActionError), + + #[error(transparent)] + IdentityTokenAccountFrozenError(IdentityTokenAccountFrozenError), + + #[error(transparent)] + IdentityTokenAccountNotFrozenError(IdentityTokenAccountNotFrozenError), + + #[error(transparent)] + IdentityNotMemberOfGroupError(IdentityNotMemberOfGroupError), + + #[error(transparent)] + GroupActionDoesNotExistError(GroupActionDoesNotExistError), + + #[error(transparent)] + GroupActionAlreadyCompletedError(GroupActionAlreadyCompletedError), + + #[error(transparent)] + GroupActionAlreadySignedByIdentityError(GroupActionAlreadySignedByIdentityError), + + #[error(transparent)] + DataContractUpdateActionNotAllowedError(DataContractUpdateActionNotAllowedError), + + #[error(transparent)] + TokenSettingMaxSupplyToLessThanCurrentSupplyError( + TokenSettingMaxSupplyToLessThanCurrentSupplyError, + ), + + #[error(transparent)] + TokenMintPastMaxSupplyError(TokenMintPastMaxSupplyError), + + #[error(transparent)] + NewTokensDestinationIdentityDoesNotExistError(NewTokensDestinationIdentityDoesNotExistError), + + #[error(transparent)] + NewAuthorizedActionTakerIdentityDoesNotExistError( + NewAuthorizedActionTakerIdentityDoesNotExistError, + ), + + #[error(transparent)] + NewAuthorizedActionTakerGroupDoesNotExistError(NewAuthorizedActionTakerGroupDoesNotExistError), + + #[error(transparent)] + NewAuthorizedActionTakerMainGroupNotSetError(NewAuthorizedActionTakerMainGroupNotSetError), + + #[error(transparent)] + InvalidGroupPositionError(InvalidGroupPositionError), + + #[error(transparent)] + TokenIsPausedError(TokenIsPausedError), + + #[error(transparent)] + IdentityTokenAccountAlreadyFrozenError(IdentityTokenAccountAlreadyFrozenError), + + #[error(transparent)] + TokenAlreadyPausedError(TokenAlreadyPausedError), + + #[error(transparent)] + TokenNotPausedError(TokenNotPausedError), } impl From<StateError> for ConsensusError { diff --git a/packages/rs-dpp/src/errors/consensus/state/token/identity_does_not_have_enough_token_balance_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/identity_does_not_have_enough_token_balance_error.rs new file mode 100644 index 00000000000..ba1c5b7fd61 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/identity_does_not_have_enough_token_balance_error.rs @@ -0,0 +1,70 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {} does not have enough balance for token {}: required {}, actual {}, action: {}", + identity_id, + token_id, + required_balance, + actual_balance, + action +)] +#[platform_serialize(unversioned)] +pub struct IdentityDoesNotHaveEnoughTokenBalanceError { + token_id: Identifier, + identity_id: Identifier, + required_balance: u64, + actual_balance: u64, + action: String, +} + +impl IdentityDoesNotHaveEnoughTokenBalanceError { + pub fn new( + token_id: Identifier, + identity_id: Identifier, + required_balance: u64, + actual_balance: u64, + action: String, + ) -> Self { + Self { + token_id, + identity_id, + required_balance, + actual_balance, + action, + } + } + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn required_balance(&self) -> u64 { + self.required_balance + } + + pub fn actual_balance(&self) -> u64 { + self.actual_balance + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<IdentityDoesNotHaveEnoughTokenBalanceError> for ConsensusError { + fn from(err: IdentityDoesNotHaveEnoughTokenBalanceError) -> Self { + Self::StateError(StateError::IdentityDoesNotHaveEnoughTokenBalanceError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_already_frozen_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_already_frozen_error.rs new file mode 100644 index 00000000000..c894e465b70 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_already_frozen_error.rs @@ -0,0 +1,51 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {} account is already frozen for token {}. Action attempted: {}", + identity_id, + token_id, + action +)] +#[platform_serialize(unversioned)] +pub struct IdentityTokenAccountAlreadyFrozenError { + token_id: Identifier, + identity_id: Identifier, + action: String, +} + +impl IdentityTokenAccountAlreadyFrozenError { + pub fn new(token_id: Identifier, identity_id: Identifier, action: String) -> Self { + Self { + token_id, + identity_id, + action, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<IdentityTokenAccountAlreadyFrozenError> for ConsensusError { + fn from(err: IdentityTokenAccountAlreadyFrozenError) -> Self { + Self::StateError(StateError::IdentityTokenAccountAlreadyFrozenError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_frozen_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_frozen_error.rs new file mode 100644 index 00000000000..6d4a55e6092 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_frozen_error.rs @@ -0,0 +1,51 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {} account is frozen for token {}. Action attempted: {}", + identity_id, + token_id, + action +)] +#[platform_serialize(unversioned)] +pub struct IdentityTokenAccountFrozenError { + token_id: Identifier, + identity_id: Identifier, + action: String, +} + +impl IdentityTokenAccountFrozenError { + pub fn new(token_id: Identifier, identity_id: Identifier, action: String) -> Self { + Self { + token_id, + identity_id, + action, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<IdentityTokenAccountFrozenError> for ConsensusError { + fn from(err: IdentityTokenAccountFrozenError) -> Self { + Self::StateError(StateError::IdentityTokenAccountFrozenError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_not_frozen_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_not_frozen_error.rs new file mode 100644 index 00000000000..479fcc1a500 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/identity_token_account_not_frozen_error.rs @@ -0,0 +1,51 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {} account is not frozen for token {}. Action attempted: {}", + identity_id, + token_id, + action +)] +#[platform_serialize(unversioned)] +pub struct IdentityTokenAccountNotFrozenError { + token_id: Identifier, + identity_id: Identifier, + action: String, +} + +impl IdentityTokenAccountNotFrozenError { + pub fn new(token_id: Identifier, identity_id: Identifier, action: String) -> Self { + Self { + token_id, + identity_id, + action, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<IdentityTokenAccountNotFrozenError> for ConsensusError { + fn from(err: IdentityTokenAccountNotFrozenError) -> Self { + Self::StateError(StateError::IdentityTokenAccountNotFrozenError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/invalid_group_position_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/invalid_group_position_error.rs new file mode 100644 index 00000000000..e93459d0365 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/invalid_group_position_error.rs @@ -0,0 +1,50 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Invalid group position: {invalid_group_position}. {max_group_message}", + max_group_message = if let Some(max) = self.max_group_position { + format!("The maximum allowed group position is {}", max) + } else { + "No maximum group position limit is set.".to_string() + } +)] +#[platform_serialize(unversioned)] +pub struct InvalidGroupPositionError { + max_group_position: Option<GroupContractPosition>, + invalid_group_position: GroupContractPosition, +} + +impl InvalidGroupPositionError { + pub fn new( + max_group_position: Option<GroupContractPosition>, + invalid_group_position: GroupContractPosition, + ) -> Self { + Self { + max_group_position, + invalid_group_position, + } + } + + pub fn max_group_position(&self) -> Option<GroupContractPosition> { + self.max_group_position + } + + pub fn invalid_group_position(&self) -> GroupContractPosition { + self.invalid_group_position + } +} + +impl From<InvalidGroupPositionError> for ConsensusError { + fn from(err: InvalidGroupPositionError) -> Self { + Self::StateError(StateError::InvalidGroupPositionError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/mod.rs b/packages/rs-dpp/src/errors/consensus/state/token/mod.rs new file mode 100644 index 00000000000..fe7b71a5329 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/mod.rs @@ -0,0 +1,31 @@ +mod identity_does_not_have_enough_token_balance_error; +mod identity_token_account_already_frozen_error; +mod identity_token_account_frozen_error; +mod identity_token_account_not_frozen_error; +mod invalid_group_position_error; +mod new_authorized_action_taker_group_does_not_exist_error; +mod new_authorized_action_taker_identity_does_not_exist_error; +mod new_authorized_action_taker_main_group_not_set_error; +mod new_tokens_destination_identity_does_not_exist_error; +mod token_already_paused_error; +mod token_is_paused_error; +mod token_mint_past_max_supply_error; +mod token_not_paused_error; +mod token_setting_max_supply_to_less_than_current_supply_error; +mod unauthorized_token_action_error; + +pub use identity_does_not_have_enough_token_balance_error::*; +pub use identity_token_account_already_frozen_error::*; +pub use identity_token_account_frozen_error::*; +pub use identity_token_account_not_frozen_error::*; +pub use invalid_group_position_error::*; +pub use new_authorized_action_taker_group_does_not_exist_error::*; +pub use new_authorized_action_taker_identity_does_not_exist_error::*; +pub use new_authorized_action_taker_main_group_not_set_error::*; +pub use new_tokens_destination_identity_does_not_exist_error::*; +pub use token_already_paused_error::*; +pub use token_is_paused_error::*; +pub use token_mint_past_max_supply_error::*; +pub use token_not_paused_error::*; +pub use token_setting_max_supply_to_less_than_current_supply_error::*; +pub use unauthorized_token_action_error::*; diff --git a/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_group_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_group_does_not_exist_error.rs new file mode 100644 index 00000000000..2ea523ddbbf --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_group_does_not_exist_error.rs @@ -0,0 +1,36 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::GroupContractPosition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("The specified new authorized action taker group {group_contract_position} does not exist")] +#[platform_serialize(unversioned)] +pub struct NewAuthorizedActionTakerGroupDoesNotExistError { + group_contract_position: GroupContractPosition, +} + +impl NewAuthorizedActionTakerGroupDoesNotExistError { + pub fn new(group_contract_position: GroupContractPosition) -> Self { + Self { + group_contract_position, + } + } + + pub fn group_contract_position(&self) -> GroupContractPosition { + self.group_contract_position + } +} + +impl From<NewAuthorizedActionTakerGroupDoesNotExistError> for ConsensusError { + fn from(err: NewAuthorizedActionTakerGroupDoesNotExistError) -> Self { + Self::StateError(StateError::NewAuthorizedActionTakerGroupDoesNotExistError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_identity_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_identity_does_not_exist_error.rs new file mode 100644 index 00000000000..9f02bc0117c --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_identity_does_not_exist_error.rs @@ -0,0 +1,32 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("The specified new authorized action taker identity {identity_id} does not exist")] +#[platform_serialize(unversioned)] +pub struct NewAuthorizedActionTakerIdentityDoesNotExistError { + identity_id: Identifier, +} + +impl NewAuthorizedActionTakerIdentityDoesNotExistError { + pub fn new(identity_id: Identifier) -> Self { + Self { identity_id } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } +} + +impl From<NewAuthorizedActionTakerIdentityDoesNotExistError> for ConsensusError { + fn from(err: NewAuthorizedActionTakerIdentityDoesNotExistError) -> Self { + Self::StateError(StateError::NewAuthorizedActionTakerIdentityDoesNotExistError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_main_group_not_set_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_main_group_not_set_error.rs new file mode 100644 index 00000000000..bc585884c28 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/new_authorized_action_taker_main_group_not_set_error.rs @@ -0,0 +1,29 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "The specified new authorized action taker main group is not set in the token configuration" +)] +#[platform_serialize(unversioned)] +pub struct NewAuthorizedActionTakerMainGroupNotSetError {} + +impl NewAuthorizedActionTakerMainGroupNotSetError { + pub fn new() -> Self { + Self {} + } +} + +impl From<NewAuthorizedActionTakerMainGroupNotSetError> for ConsensusError { + fn from(err: NewAuthorizedActionTakerMainGroupNotSetError) -> Self { + Self::StateError(StateError::NewAuthorizedActionTakerMainGroupNotSetError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/new_tokens_destination_identity_does_not_exist_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/new_tokens_destination_identity_does_not_exist_error.rs new file mode 100644 index 00000000000..ae18548891a --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/new_tokens_destination_identity_does_not_exist_error.rs @@ -0,0 +1,34 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("The specified new tokens destination identity {identity_id} does not exist")] +#[platform_serialize(unversioned)] +pub struct NewTokensDestinationIdentityDoesNotExistError { + identity_id: Identifier, +} + +impl NewTokensDestinationIdentityDoesNotExistError { + pub fn new(identity_id: Identifier) -> Self { + Self { identity_id } + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } +} + +impl From<NewTokensDestinationIdentityDoesNotExistError> for ConsensusError { + fn from(err: NewTokensDestinationIdentityDoesNotExistError) -> Self { + Self::StateError(StateError::NewTokensDestinationIdentityDoesNotExistError( + err, + )) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/token_already_paused_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/token_already_paused_error.rs new file mode 100644 index 00000000000..4560e3fc4de --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/token_already_paused_error.rs @@ -0,0 +1,37 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Token {} is already paused. Action attempted: {}", token_id, action)] +#[platform_serialize(unversioned)] +pub struct TokenAlreadyPausedError { + token_id: Identifier, + action: String, +} + +impl TokenAlreadyPausedError { + pub fn new(token_id: Identifier, action: String) -> Self { + Self { token_id, action } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<TokenAlreadyPausedError> for ConsensusError { + fn from(err: TokenAlreadyPausedError) -> Self { + Self::StateError(StateError::TokenAlreadyPausedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/token_is_paused_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/token_is_paused_error.rs new file mode 100644 index 00000000000..5681940847f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/token_is_paused_error.rs @@ -0,0 +1,32 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Token {} is paused.", token_id)] +#[platform_serialize(unversioned)] +pub struct TokenIsPausedError { + token_id: Identifier, +} + +impl TokenIsPausedError { + pub fn new(token_id: Identifier) -> Self { + Self { token_id } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } +} + +impl From<TokenIsPausedError> for ConsensusError { + fn from(err: TokenIsPausedError) -> Self { + Self::StateError(StateError::TokenIsPausedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/token_mint_past_max_supply_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/token_mint_past_max_supply_error.rs new file mode 100644 index 00000000000..c97a2d0830e --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/token_mint_past_max_supply_error.rs @@ -0,0 +1,60 @@ +use crate::balances::credits::TokenAmount; +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Token {token_id} attempted to mint {amount}, which exceeds the max supply {max_supply}, current supply is {current_supply}" +)] +#[platform_serialize(unversioned)] +pub struct TokenMintPastMaxSupplyError { + token_id: Identifier, + amount: TokenAmount, + current_supply: TokenAmount, + max_supply: TokenAmount, +} + +impl TokenMintPastMaxSupplyError { + pub fn new( + token_id: Identifier, + amount: TokenAmount, + current_supply: TokenAmount, + max_supply: TokenAmount, + ) -> Self { + Self { + token_id, + amount, + current_supply, + max_supply, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn amount(&self) -> TokenAmount { + self.amount + } + + pub fn current_supply(&self) -> TokenAmount { + self.current_supply + } + + pub fn max_supply(&self) -> TokenAmount { + self.max_supply + } +} + +impl From<TokenMintPastMaxSupplyError> for ConsensusError { + fn from(err: TokenMintPastMaxSupplyError) -> Self { + Self::StateError(StateError::TokenMintPastMaxSupplyError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/token_not_paused_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/token_not_paused_error.rs new file mode 100644 index 00000000000..63cf71d4f10 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/token_not_paused_error.rs @@ -0,0 +1,37 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error("Token {} is not paused. Action attempted: {}", token_id, action)] +#[platform_serialize(unversioned)] +pub struct TokenNotPausedError { + token_id: Identifier, + action: String, +} + +impl TokenNotPausedError { + pub fn new(token_id: Identifier, action: String) -> Self { + Self { token_id, action } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn action(&self) -> &str { + &self.action + } +} + +impl From<TokenNotPausedError> for ConsensusError { + fn from(err: TokenNotPausedError) -> Self { + Self::StateError(StateError::TokenNotPausedError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/token_setting_max_supply_to_less_than_current_supply_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/token_setting_max_supply_to_less_than_current_supply_error.rs new file mode 100644 index 00000000000..511263c695f --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/token_setting_max_supply_to_less_than_current_supply_error.rs @@ -0,0 +1,48 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Token {token_id} attempted to set max supply to {max_supply}, which is less than the current supply {current_supply}" +)] +#[platform_serialize(unversioned)] +pub struct TokenSettingMaxSupplyToLessThanCurrentSupplyError { + token_id: Identifier, + max_supply: u64, + current_supply: u64, +} + +impl TokenSettingMaxSupplyToLessThanCurrentSupplyError { + pub fn new(token_id: Identifier, max_supply: u64, current_supply: u64) -> Self { + Self { + token_id, + max_supply, + current_supply, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn max_supply(&self) -> u64 { + self.max_supply + } + + pub fn current_supply(&self) -> u64 { + self.current_supply + } +} + +impl From<TokenSettingMaxSupplyToLessThanCurrentSupplyError> for ConsensusError { + fn from(err: TokenSettingMaxSupplyToLessThanCurrentSupplyError) -> Self { + Self::StateError(StateError::TokenSettingMaxSupplyToLessThanCurrentSupplyError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/consensus/state/token/unauthorized_token_action_error.rs b/packages/rs-dpp/src/errors/consensus/state/token/unauthorized_token_action_error.rs new file mode 100644 index 00000000000..ac5dca1ef05 --- /dev/null +++ b/packages/rs-dpp/src/errors/consensus/state/token/unauthorized_token_action_error.rs @@ -0,0 +1,60 @@ +use crate::consensus::state::state_error::StateError; +use crate::consensus::ConsensusError; +use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use thiserror::Error; + +#[derive( + Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize, +)] +#[error( + "Identity {identity_id} is not authorized to perform action: {action} on token: {token_id}. Authorized action takers: {authorized_action_takers:?}", +)] +#[platform_serialize(unversioned)] +pub struct UnauthorizedTokenActionError { + token_id: Identifier, + identity_id: Identifier, + action: String, + authorized_action_takers: AuthorizedActionTakers, +} + +impl UnauthorizedTokenActionError { + pub fn new( + token_id: Identifier, + identity_id: Identifier, + action: String, + authorized_action_takers: AuthorizedActionTakers, + ) -> Self { + Self { + token_id, + identity_id, + action, + authorized_action_takers, + } + } + + pub fn token_id(&self) -> &Identifier { + &self.token_id + } + + pub fn identity_id(&self) -> &Identifier { + &self.identity_id + } + + pub fn action(&self) -> &str { + &self.action + } + + pub fn authorized_action_takers(&self) -> &AuthorizedActionTakers { + &self.authorized_action_takers + } +} + +impl From<UnauthorizedTokenActionError> for ConsensusError { + fn from(err: UnauthorizedTokenActionError) -> Self { + Self::StateError(StateError::UnauthorizedTokenActionError(err)) + } +} diff --git a/packages/rs-dpp/src/errors/protocol_error.rs b/packages/rs-dpp/src/errors/protocol_error.rs index 1ed9888821a..048e1b558d7 100644 --- a/packages/rs-dpp/src/errors/protocol_error.rs +++ b/packages/rs-dpp/src/errors/protocol_error.rs @@ -41,6 +41,7 @@ use crate::{ use dashcore::consensus::encode::Error as DashCoreError; +use crate::tokens::errors::TokenError; use crate::version::FeatureVersion; use platform_value::{Error as ValueError, Value}; use platform_version::error::PlatformVersionError; @@ -135,6 +136,9 @@ pub enum ProtocolError { #[error(transparent)] Document(Box<DocumentError>), + #[error(transparent)] + Token(Box<TokenError>), + #[error("Generic Error: {0}")] Generic(String), @@ -233,6 +237,12 @@ pub enum ProtocolError { #[error("Public key generation error {0}")] PublicKeyGenerationError(String), + #[error("group member not found in contract: {0}")] + GroupMemberNotFound(String), + + #[error("group not found in contract: {0}")] + GroupNotFound(String), + #[error("corrupted code execution: {0}")] CorruptedCodeExecution(String), @@ -288,6 +298,12 @@ impl From<DocumentError> for ProtocolError { } } +impl From<TokenError> for ProtocolError { + fn from(e: TokenError) -> Self { + ProtocolError::Token(Box::new(e)) + } +} + impl From<SerdeParsingError> for ProtocolError { fn from(e: SerdeParsingError) -> Self { ProtocolError::ParsingError(e.to_string()) diff --git a/packages/rs-dpp/src/group/action_event.rs b/packages/rs-dpp/src/group/action_event.rs new file mode 100644 index 00000000000..54cb5a950f5 --- /dev/null +++ b/packages/rs-dpp/src/group/action_event.rs @@ -0,0 +1,12 @@ +use crate::tokens::token_event::TokenEvent; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; + +#[derive( + Debug, PartialEq, PartialOrd, Clone, Eq, Encode, Decode, PlatformDeserialize, PlatformSerialize, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub enum GroupActionEvent { + TokenEvent(TokenEvent), +} diff --git a/packages/rs-dpp/src/group/action_taker.rs b/packages/rs-dpp/src/group/action_taker.rs new file mode 100644 index 00000000000..61e5d10c1b1 --- /dev/null +++ b/packages/rs-dpp/src/group/action_taker.rs @@ -0,0 +1,13 @@ +use platform_value::Identifier; +use std::collections::BTreeSet; +#[derive(Debug, PartialEq, PartialOrd, Clone, Copy, Eq)] +pub enum ActionGoal { + ActionCompletion, + ActionParticipation, +} + +#[derive(Debug, PartialEq, PartialOrd, Clone, Eq)] +pub enum ActionTaker { + SingleIdentity(Identifier), + SpecifiedIdentities(BTreeSet<Identifier>), +} diff --git a/packages/rs-dpp/src/group/group_action/mod.rs b/packages/rs-dpp/src/group/group_action/mod.rs new file mode 100644 index 00000000000..7e39ab631cf --- /dev/null +++ b/packages/rs-dpp/src/group/group_action/mod.rs @@ -0,0 +1,14 @@ +pub mod v0; + +use crate::group::group_action::v0::GroupActionV0; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; + +#[derive( + Debug, PartialEq, PartialOrd, Clone, Eq, Encode, Decode, PlatformDeserialize, PlatformSerialize, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub enum GroupAction { + V0(GroupActionV0), +} diff --git a/packages/rs-dpp/src/group/group_action/v0/mod.rs b/packages/rs-dpp/src/group/group_action/v0/mod.rs new file mode 100644 index 00000000000..5f90ce0788b --- /dev/null +++ b/packages/rs-dpp/src/group/group_action/v0/mod.rs @@ -0,0 +1,12 @@ +use crate::group::action_event::GroupActionEvent; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; + +#[derive( + Debug, PartialEq, PartialOrd, Clone, Eq, Encode, Decode, PlatformDeserialize, PlatformSerialize, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub struct GroupActionV0 { + pub event: GroupActionEvent, +} diff --git a/packages/rs-dpp/src/group/group_action_status.rs b/packages/rs-dpp/src/group/group_action_status.rs new file mode 100644 index 00000000000..95a7e54dc11 --- /dev/null +++ b/packages/rs-dpp/src/group/group_action_status.rs @@ -0,0 +1,29 @@ +use anyhow::bail; + +#[derive(Debug, PartialEq, PartialOrd, Clone, Eq)] +pub enum GroupActionStatus { + ActionActive, + ActionClosed, +} + +impl TryFrom<u8> for GroupActionStatus { + type Error = anyhow::Error; + fn try_from(value: u8) -> Result<Self, Self::Error> { + match value { + 0 => Ok(Self::ActionActive), + 1 => Ok(Self::ActionClosed), + value => bail!("unrecognized action status: {}", value), + } + } +} + +impl TryFrom<i32> for GroupActionStatus { + type Error = anyhow::Error; + fn try_from(value: i32) -> Result<Self, Self::Error> { + match value { + 0 => Ok(Self::ActionActive), + 1 => Ok(Self::ActionClosed), + value => bail!("unrecognized action status: {}", value), + } + } +} diff --git a/packages/rs-dpp/src/group/mod.rs b/packages/rs-dpp/src/group/mod.rs new file mode 100644 index 00000000000..427b62c7757 --- /dev/null +++ b/packages/rs-dpp/src/group/mod.rs @@ -0,0 +1,69 @@ +use crate::data_contract::group::{Group, GroupMemberPower}; +use crate::data_contract::GroupContractPosition; +use bincode::{Decode, Encode}; +use derive_more::Display; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +pub mod action_event; +pub mod action_taker; +pub mod group_action; +pub mod group_action_status; + +#[derive(Debug, Clone, Copy, Encode, Decode, PartialEq)] +pub enum GroupStateTransitionInfoStatus { + GroupStateTransitionInfoProposer(GroupContractPosition), + GroupStateTransitionInfoOtherSigner(GroupStateTransitionInfo), +} + +impl From<GroupStateTransitionInfoStatus> for GroupStateTransitionInfo { + fn from(value: GroupStateTransitionInfoStatus) -> Self { + match value { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => GroupStateTransitionInfo { + group_contract_position, + action_id: Default::default(), + action_is_proposer: true, + }, + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => info, + } + } +} + +#[derive(Debug, Clone, Copy, Encode, Decode, Default, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display("ID: {}, Action ID: {}", "id", "action_id")] +pub struct GroupStateTransitionInfo { + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$groupContractPosition") + )] + pub group_contract_position: GroupContractPosition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$groupActionId") + )] + pub action_id: Identifier, + /// This is true if we are the proposer, otherwise we are just voting on a previous action. + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$groupActionIsProposer") + )] + pub action_is_proposer: bool, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct GroupStateTransitionResolvedInfo { + pub group_contract_position: GroupContractPosition, + pub group: Group, + pub action_id: Identifier, + /// This is true if we are the proposer, otherwise we are just voting on a previous action. + pub action_is_proposer: bool, + pub signer_power: GroupMemberPower, +} diff --git a/packages/rs-dpp/src/identity/identity_facade.rs b/packages/rs-dpp/src/identity/identity_facade.rs index eecdf45e6e2..323fea838dd 100644 --- a/packages/rs-dpp/src/identity/identity_facade.rs +++ b/packages/rs-dpp/src/identity/identity_facade.rs @@ -56,9 +56,13 @@ impl IdentityFacade { pub fn create_from_buffer( &self, buffer: Vec<u8>, - skip_validation: bool, + #[cfg(feature = "validation")] skip_validation: bool, ) -> Result<Identity, ProtocolError> { - self.factory.create_from_buffer(buffer, skip_validation) + self.factory.create_from_buffer( + buffer, + #[cfg(feature = "validation")] + skip_validation, + ) } pub fn create_instant_lock_proof( diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs index 0a7b020cc1a..6829ea6eaf3 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/chain/chain_asset_lock_proof.rs @@ -4,7 +4,6 @@ use std::convert::TryFrom; use crate::util::hash::hash_double; use crate::{identifier::Identifier, ProtocolError}; -pub use bincode::{Decode, Encode}; use dashcore::OutPoint; /// Instant Asset Lock Proof is a part of Identity Create and Identity Topup diff --git a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 2e97ad74808..a25ded9547e 100644 --- a/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/rs-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -4,7 +4,7 @@ use dashcore::{OutPoint, Transaction}; use serde::{Deserialize, Deserializer, Serialize}; -pub use bincode::{Decode, Encode}; +use bincode::{Decode, Encode}; pub use instant::*; use platform_value::Value; diff --git a/packages/rs-dpp/src/lib.rs b/packages/rs-dpp/src/lib.rs index 27932329aa9..adde634d896 100644 --- a/packages/rs-dpp/src/lib.rs +++ b/packages/rs-dpp/src/lib.rs @@ -24,7 +24,6 @@ pub mod version; pub mod errors; -pub mod schema; pub mod validation; #[cfg(feature = "client")] @@ -51,10 +50,15 @@ pub mod serialization; pub mod signing; #[cfg(feature = "system_contracts")] pub mod system_data_contracts; + +pub mod tokens; + pub mod voting; #[cfg(feature = "core-types")] pub mod core_types; + +pub mod group; pub mod withdrawal; pub use async_trait; @@ -74,15 +78,32 @@ pub mod prelude { #[cfg(feature = "validation")] pub use crate::validation::ConsensusValidationResult; + pub type EpochInterval = u16; + pub type BlockHeight = u64; + pub type BlockHeightInterval = u64; + pub type CoreBlockHeight = u32; pub type TimestampMillis = u64; + pub type TimestampMillisInterval = u64; + + pub type StartAtIncluded = bool; + pub type TimestampIncluded = bool; pub type Revision = u64; pub type IdentityNonce = u64; + pub type SenderKeyIndex = u32; + pub type RecipientKeyIndex = u32; + + /// The index of the user's key that is used to derive keys that will be used to encrypt the contact's user id in encToUserId and the private data. + pub type RootEncryptionKeyIndex = u32; + + /// The index at which to derive the root encryption key. + pub type DerivationEncryptionKeyIndex = u32; + /// UserFeeIncrease is the additional percentage of the processing fee. /// A 1 here means we pay 1% more in processing fees. A 100 means we pay 100% more. pub type UserFeeIncrease = u16; diff --git a/packages/rs-dpp/src/nft/mod.rs b/packages/rs-dpp/src/nft/mod.rs index 884906fb1e8..bec8e4742a3 100644 --- a/packages/rs-dpp/src/nft/mod.rs +++ b/packages/rs-dpp/src/nft/mod.rs @@ -4,7 +4,6 @@ use crate::consensus::ConsensusError; use crate::ProtocolError; use std::fmt; use std::fmt::{Display, Formatter}; - #[derive(Debug, PartialEq, Clone, Copy)] pub enum TradeMode { None = 0, diff --git a/packages/rs-dpp/src/state_transition/mod.rs b/packages/rs-dpp/src/state_transition/mod.rs index cd97cae4ae9..88a3eddcfe2 100644 --- a/packages/rs-dpp/src/state_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/mod.rs @@ -1,8 +1,7 @@ use derive_more::From; -use documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use documents_batch_transition::document_transition::DocumentTransition; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; +use state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; pub use abstract_state_transition::state_transition_helpers; @@ -72,19 +71,16 @@ use crate::identity::Purpose; use crate::identity::{IdentityPublicKey, KeyType}; use crate::identity::{KeyID, SecurityLevel}; use crate::prelude::{AssetLockProof, UserFeeIncrease}; -use crate::state_transition::masternode_vote_transition::MasternodeVoteTransitionSignable; -pub use state_transitions::*; - use crate::serialization::Signable; +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::batched_transition::BatchedTransitionRef; +use crate::state_transition::batch_transition::{BatchTransition, BatchTransitionSignable}; use crate::state_transition::data_contract_create_transition::{ DataContractCreateTransition, DataContractCreateTransitionSignable, }; use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransition, DataContractUpdateTransitionSignable, }; -use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionSignable, -}; #[cfg(feature = "state-transition-signing")] use crate::state_transition::errors::InvalidSignaturePublicKeyError; #[cfg(feature = "state-transition-signing")] @@ -108,11 +104,14 @@ use crate::state_transition::identity_topup_transition::{ use crate::state_transition::identity_update_transition::{ IdentityUpdateTransition, IdentityUpdateTransitionSignable, }; +use crate::state_transition::masternode_vote_transition::MasternodeVoteTransitionSignable; +use state_transitions::document::batch_transition::batched_transition::token_transition::TokenTransition; +pub use state_transitions::*; use crate::state_transition::masternode_vote_transition::MasternodeVoteTransition; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::state_transitions::document::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use crate::state_transition::state_transitions::document::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; pub type GetDataContractSecurityLevelRequirementFn = fn(Identifier, String) -> Result<SecurityLevel, ProtocolError>; @@ -122,7 +121,7 @@ macro_rules! call_method { match $state_transition { StateTransition::DataContractCreate(st) => st.$method($args), StateTransition::DataContractUpdate(st) => st.$method($args), - StateTransition::DocumentsBatch(st) => st.$method($args), + StateTransition::Batch(st) => st.$method($args), StateTransition::IdentityCreate(st) => st.$method($args), StateTransition::IdentityTopUp(st) => st.$method($args), StateTransition::IdentityCreditWithdrawal(st) => st.$method($args), @@ -135,7 +134,7 @@ macro_rules! call_method { match $state_transition { StateTransition::DataContractCreate(st) => st.$method(), StateTransition::DataContractUpdate(st) => st.$method(), - StateTransition::DocumentsBatch(st) => st.$method(), + StateTransition::Batch(st) => st.$method(), StateTransition::IdentityCreate(st) => st.$method(), StateTransition::IdentityTopUp(st) => st.$method(), StateTransition::IdentityCreditWithdrawal(st) => st.$method(), @@ -151,7 +150,7 @@ macro_rules! call_getter_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => Some(st.$method($args)), StateTransition::DataContractUpdate(st) => Some(st.$method($args)), - StateTransition::DocumentsBatch(st) => Some(st.$method($args)), + StateTransition::Batch(st) => Some(st.$method($args)), StateTransition::IdentityCreate(_) => None, StateTransition::IdentityTopUp(_) => None, StateTransition::IdentityCreditWithdrawal(st) => Some(st.$method($args)), @@ -164,7 +163,7 @@ macro_rules! call_getter_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => Some(st.$method()), StateTransition::DataContractUpdate(st) => Some(st.$method()), - StateTransition::DocumentsBatch(st) => Some(st.$method()), + StateTransition::Batch(st) => Some(st.$method()), StateTransition::IdentityCreate(_) => None, StateTransition::IdentityTopUp(_) => None, StateTransition::IdentityCreditWithdrawal(st) => Some(st.$method()), @@ -180,7 +179,7 @@ macro_rules! call_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => st.$method($args), StateTransition::DataContractUpdate(st) => st.$method($args), - StateTransition::DocumentsBatch(st) => st.$method($args), + StateTransition::Batch(st) => st.$method($args), StateTransition::IdentityCreate(_st) => {} StateTransition::IdentityTopUp(_st) => {} StateTransition::IdentityCreditWithdrawal(st) => st.$method($args), @@ -193,7 +192,7 @@ macro_rules! call_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => st.$method(), StateTransition::DataContractUpdate(st) => st.$method(), - StateTransition::DocumentsBatch(st) => st.$method(), + StateTransition::Batch(st) => st.$method(), StateTransition::IdentityCreate(st) => {} StateTransition::IdentityTopUp(st) => {} StateTransition::IdentityCreditWithdrawal(st) => st.$method(), @@ -210,7 +209,7 @@ macro_rules! call_errorable_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => st.$method($args), StateTransition::DataContractUpdate(st) => st.$method($args), - StateTransition::DocumentsBatch(st) => st.$method($args), + StateTransition::Batch(st) => st.$method($args), StateTransition::IdentityCreate(_st) => Err(ProtocolError::CorruptedCodeExecution( "identity create can not be called for identity signing".to_string(), )), @@ -227,7 +226,7 @@ macro_rules! call_errorable_method_identity_signed { match $state_transition { StateTransition::DataContractCreate(st) => st.$method(), StateTransition::DataContractUpdate(st) => st.$method(), - StateTransition::DocumentsBatch(st) => st.$method(), + StateTransition::Batch(st) => st.$method(), StateTransition::IdentityCreate(st) => Err(ProtocolError::CorruptedCodeExecution( "identity create can not be called for identity signing".to_string(), )), @@ -242,27 +241,6 @@ macro_rules! call_errorable_method_identity_signed { }; } -// TODO unused macros below -// macro_rules! call_static_method { -// ($state_transition:expr, $method:ident ) => { -// match $state_transition { -// StateTransition::DataContractCreate(_) => DataContractCreateTransition::$method(), -// StateTransition::DataContractUpdate(_) => DataContractUpdateTransition::$method(), -// StateTransition::DocumentsBatch(_) => DocumentsBatchTransition::$method(), -// StateTransition::IdentityCreate(_) => IdentityCreateTransition::$method(), -// StateTransition::IdentityTopUp(_) => IdentityTopUpTransition::$method(), -// StateTransition::IdentityCreditWithdrawal(_) => { -// IdentityCreditWithdrawalTransition::$method() -// } -// StateTransition::IdentityUpdate(_) => IdentityUpdateTransition::$method(), -// StateTransition::IdentityCreditTransfer(_) => { -// IdentityCreditTransferTransition::$method() -// } -// StateTransition::MasternodeVote(_) => MasternodeVote::$method(), -// } -// }; -// } - #[derive( Debug, Clone, @@ -284,7 +262,7 @@ macro_rules! call_errorable_method_identity_signed { pub enum StateTransition { DataContractCreate(DataContractCreateTransition), DataContractUpdate(DataContractUpdateTransition), - DocumentsBatch(DocumentsBatchTransition), + Batch(BatchTransition), IdentityCreate(IdentityCreateTransition), IdentityTopUp(IdentityTopUpTransition), IdentityCreditWithdrawal(IdentityCreditWithdrawalTransition), @@ -349,22 +327,42 @@ impl StateTransition { match self { Self::DataContractCreate(_) => "DataContractCreate".to_string(), Self::DataContractUpdate(_) => "DataContractUpdate".to_string(), - Self::DocumentsBatch(documents_batch_transition) => { + Self::Batch(batch_transition) => { let mut document_transition_types = vec![]; - match documents_batch_transition { - DocumentsBatchTransition::V0(documents_batch_transition_v0) => { - for transition in documents_batch_transition_v0.transitions().iter() { - let document_transition_name = match transition { - DocumentTransition::Create(_) => "Create", - DocumentTransition::Replace(_) => "Replace", - DocumentTransition::Delete(_) => "Delete", - DocumentTransition::Transfer(_) => "Transfer", - DocumentTransition::UpdatePrice(_) => "UpdatePrice", - DocumentTransition::Purchase(_) => "Purchase", - }; - document_transition_types.push(document_transition_name); + for transition in batch_transition.transitions_iter() { + let document_transition_name = match transition { + BatchedTransitionRef::Document(DocumentTransition::Create(_)) => "Create", + BatchedTransitionRef::Document(DocumentTransition::Replace(_)) => "Replace", + BatchedTransitionRef::Document(DocumentTransition::Delete(_)) => "Delete", + BatchedTransitionRef::Document(DocumentTransition::Transfer(_)) => { + "Transfer" + } + BatchedTransitionRef::Document(DocumentTransition::UpdatePrice(_)) => { + "UpdatePrice" + } + BatchedTransitionRef::Document(DocumentTransition::Purchase(_)) => { + "Purchase" + } + BatchedTransitionRef::Token(TokenTransition::Transfer(_)) => { + "TokenTransfer" + } + BatchedTransitionRef::Token(TokenTransition::Mint(_)) => "TokenMint", + BatchedTransitionRef::Token(TokenTransition::Burn(_)) => "TokenBurn", + BatchedTransitionRef::Token(TokenTransition::Freeze(_)) => "TokenFreeze", + BatchedTransitionRef::Token(TokenTransition::Unfreeze(_)) => { + "TokenUnfreeze" + } + BatchedTransitionRef::Token(TokenTransition::DestroyFrozenFunds(_)) => { + "TokenDestroyFrozenFunds" + } + BatchedTransitionRef::Token(TokenTransition::EmergencyAction(_)) => { + "TokenEmergencyAction" + } + BatchedTransitionRef::Token(TokenTransition::ConfigUpdate(_)) => { + "TokenConfigUpdate" } - } + }; + document_transition_types.push(document_transition_name); } format!("DocumentsBatch([{}])", document_transition_types.join(", ")) } @@ -452,7 +450,7 @@ impl StateTransition { st.verify_public_key_level_and_purpose(identity_public_key)?; st.verify_public_key_is_enabled(identity_public_key)?; } - StateTransition::DocumentsBatch(st) => { + StateTransition::Batch(st) => { if identity_public_key.purpose() != Purpose::AUTHENTICATION { return Err(ProtocolError::WrongPublicKeyPurposeError( WrongPublicKeyPurposeError::new( @@ -745,93 +743,3 @@ impl StateTransition { }) } } -// -// impl StateTransition { -// fn signature_property_paths(&self) -> Vec<&'static str> { -// call_static_method!(self, signature_property_paths) -// } -// -// fn identifiers_property_paths(&self) -> Vec<&'static str> { -// call_static_method!(self, identifiers_property_paths) -// } -// -// fn binary_property_paths(&self) -> Vec<&'static str> { -// call_static_method!(self, binary_property_paths) -// } -// -// pub fn get_owner_id(&self) -> &Identifier { -// call_method!(self, get_owner_id) -// } -// } -// -// impl StateTransitionFieldTypes for StateTransition { -// fn hash(&self, skip_signature: bool) -> Result<Vec<u8>, ProtocolError> { -// if skip_signature { -// Ok(hash::hash_to_vec(self.signable_bytes()?)) -// } else { -// Ok(hash::hash_to_vec(PlatformSerializable::serialize_to_bytes(self)?)) -// } -// } -// -// #[cfg(feature = "state-transition-cbor-conversion")] -// fn to_cbor_buffer(&self, _skip_signature: bool) -> Result<Vec<u8>, crate::ProtocolError> { -// call_method!(self, to_cbor_buffer, true) -// } -// -// #[cfg(feature = "state-transition-json-conversion")] -// fn to_json(&self, skip_signature: bool) -> Result<serde_json::Value, crate::ProtocolError> { -// call_method!(self, to_json, skip_signature) -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_object( -// &self, -// skip_signature: bool, -// ) -> Result<platform_value::Value, crate::ProtocolError> { -// call_method!(self, to_object, skip_signature) -// } -// -// fn signature_property_paths() -> Vec<&'static str> { -// panic!("Static call is not supported") -// } -// -// fn identifiers_property_paths() -> Vec<&'static str> { -// panic!("Static call is not supported") -// } -// -// fn binary_property_paths() -> Vec<&'static str> { -// panic!("Static call is not supported") -// } -// -// #[cfg(feature = "state-transition-value-conversion")] -// fn to_cleaned_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { -// call_method!(self, to_cleaned_object, skip_signature) -// } -// } -// -// impl StateTransitionLike for StateTransition { -// fn state_transition_protocol_version(&self) -> FeatureVersion { -// call_method!(self, state_transition_protocol_version) -// } -// /// returns the type of State Transition -// fn state_transition_type(&self) -> StateTransitionType { -// call_method!(self, state_transition_type) -// } -// /// returns the signature as a byte-array -// fn signature(&self) -> &BinaryData { -// call_method!(self, signature) -// } -// -// /// set a new signature -// fn set_signature(&mut self, signature: BinaryData) { -// call_method!(self, set_signature, signature) -// } -// -// fn set_signature_bytes(&mut self, signature: Vec<u8>) { -// call_method!(self, set_signature_bytes, signature) -// } -// -// fn modified_data_ids(&self) -> Vec<crate::prelude::Identifier> { -// call_method!(self, modified_data_ids) -// } -// } diff --git a/packages/rs-dpp/src/state_transition/proof_result.rs b/packages/rs-dpp/src/state_transition/proof_result.rs index 012326ac300..b20938b49de 100644 --- a/packages/rs-dpp/src/state_transition/proof_result.rs +++ b/packages/rs-dpp/src/state_transition/proof_result.rs @@ -1,6 +1,9 @@ +use crate::balances::credits::TokenAmount; use crate::data_contract::DataContract; use crate::document::Document; use crate::identity::{Identity, PartialIdentity}; +use crate::tokens::info::IdentityTokenInfo; +use crate::tokens::status::TokenStatus; use crate::voting::votes::Vote; use platform_value::Identifier; use std::collections::BTreeMap; @@ -9,8 +12,14 @@ use std::collections::BTreeMap; pub enum StateTransitionProofResult { VerifiedDataContract(DataContract), VerifiedIdentity(Identity), + VerifiedTokenBalanceAbsence(Identifier), + VerifiedTokenBalance(Identifier, TokenAmount), + VerifiedTokenIdentityInfo(Identifier, IdentityTokenInfo), + VerifiedTokenStatus(TokenStatus), + VerifiedTokenIdentitiesBalances(BTreeMap<Identifier, TokenAmount>), VerifiedPartialIdentity(PartialIdentity), VerifiedBalanceTransfer(PartialIdentity, PartialIdentity), //from/to VerifiedDocuments(BTreeMap<Identifier, Option<Document>>), + VerifiedTokenActionWithDocument(Document), VerifiedMasternodeVote(Vote), } diff --git a/packages/rs-dpp/src/state_transition/serialization.rs b/packages/rs-dpp/src/state_transition/serialization.rs index c36ae53db4f..ff55d2653ab 100644 --- a/packages/rs-dpp/src/state_transition/serialization.rs +++ b/packages/rs-dpp/src/state_transition/serialization.rs @@ -27,9 +27,9 @@ mod tests { use crate::state_transition::data_contract_update_transition::{ DataContractUpdateTransition, DataContractUpdateTransitionV0, }; - use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; - use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionV0, + use crate::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionType; + use crate::state_transition::batch_transition::{ + BatchTransition, BatchTransitionV1, }; use crate::state_transition::identity_create_transition::v0::IdentityCreateTransitionV0; use crate::state_transition::identity_create_transition::IdentityCreateTransition; @@ -39,7 +39,7 @@ mod tests { use crate::state_transition::public_key_in_creation::accessors::IdentityPublicKeyInCreationV0Setters; use crate::state_transition::StateTransition; use crate::tests::fixtures::{ - get_data_contract_fixture, get_document_transitions_fixture, + get_data_contract_fixture, get_batched_transitions_fixture, get_extended_documents_fixture_with_owner_id_from_contract, raw_instant_asset_lock_proof_fixture, }; @@ -338,11 +338,11 @@ mod tests { ) }) .collect::<Vec<_>>(); - let transitions = get_document_transitions_fixture( + let transitions = get_batched_transitions_fixture( [(DocumentTransitionActionType::Create, documents)], &mut nonces, ); - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV1 { owner_id: data_contract.owner_id(), transitions, ..Default::default() diff --git a/packages/rs-dpp/src/state_transition/state_transition_types.rs b/packages/rs-dpp/src/state_transition/state_transition_types.rs index 246f4620631..574d18521ab 100644 --- a/packages/rs-dpp/src/state_transition/state_transition_types.rs +++ b/packages/rs-dpp/src/state_transition/state_transition_types.rs @@ -21,7 +21,7 @@ use serde_repr::{Deserialize_repr, Serialize_repr}; pub enum StateTransitionType { #[default] DataContractCreate = 0, - DocumentsBatch = 1, + Batch = 1, IdentityCreate = 2, IdentityTopUp = 3, DataContractUpdate = 4, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/mod.rs new file mode 100644 index 00000000000..fe3a6bef7e0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/mod.rs @@ -0,0 +1,99 @@ +mod v0; + +use std::slice::Iter; +use crate::state_transition::batch_transition::batched_transition::{BatchedTransition, BatchedTransitionMutRef, BatchedTransitionRef}; +use crate::state_transition::batch_transition::BatchTransition; +pub use v0::*; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; + +/// Iterator enum for `BatchTransition` that can handle both V0 and V1. +pub enum DocumentBatchIterator<'a> { + V0(Iter<'a, DocumentTransition>), + V1(DocumentBatchV1Iterator<'a>), +} + +/// Iterator for version 1, yielding `BatchedTransitionRef<'a>` items. +pub struct DocumentBatchV1Iterator<'a> { + pub(crate) inner: Iter<'a, BatchedTransition>, +} + +impl<'a> Iterator for DocumentBatchV1Iterator<'a> { + type Item = BatchedTransitionRef<'a>; + + fn next(&mut self) -> Option<Self::Item> { + self.inner + .next() + .map(|batched_transition| match batched_transition { + BatchedTransition::Document(doc) => BatchedTransitionRef::Document(doc), + BatchedTransition::Token(tok) => BatchedTransitionRef::Token(tok), + }) + } +} + +impl<'a> Iterator for DocumentBatchIterator<'a> { + type Item = BatchedTransitionRef<'a>; + + fn next(&mut self) -> Option<Self::Item> { + match self { + DocumentBatchIterator::V0(iter) => iter.next().map(BatchedTransitionRef::Document), + DocumentBatchIterator::V1(iter) => iter.next(), + } + } +} + +impl DocumentsBatchTransitionAccessorsV0 for BatchTransition { + type IterType<'a> + = DocumentBatchIterator<'a> + where + Self: 'a; + + /// Iterator for `BatchedTransitionRef` items. + fn transitions_iter<'a>(&'a self) -> Self::IterType<'a> { + match self { + BatchTransition::V0(v0) => DocumentBatchIterator::V0(v0.transitions.iter()), + BatchTransition::V1(v1) => DocumentBatchIterator::V1(DocumentBatchV1Iterator { + inner: v1.transitions.iter(), + }), + } + } + + fn transitions_len(&self) -> usize { + match self { + BatchTransition::V0(v0) => v0.transitions.len(), + BatchTransition::V1(v1) => v1.transitions.len(), + } + } + + fn transitions_are_empty(&self) -> bool { + match self { + BatchTransition::V0(v0) => v0.transitions.is_empty(), + BatchTransition::V1(v1) => v1.transitions.is_empty(), + } + } + + fn first_transition(&self) -> Option<BatchedTransitionRef> { + match self { + BatchTransition::V0(v0) => v0 + .transitions + .first() + .map(|document_transition| BatchedTransitionRef::Document(document_transition)), + BatchTransition::V1(v1) => v1 + .transitions + .first() + .map(|batch_transition| batch_transition.borrow_as_ref()), + } + } + + fn first_transition_mut(&mut self) -> Option<BatchedTransitionMutRef> { + match self { + BatchTransition::V0(v0) => v0 + .transitions + .first_mut() + .map(|document_transition| BatchedTransitionMutRef::Document(document_transition)), + BatchTransition::V1(v1) => v1 + .transitions + .first_mut() + .map(|batch_transition| batch_transition.borrow_as_mut()), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/v0/mod.rs new file mode 100644 index 00000000000..767cff29930 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/accessors/v0/mod.rs @@ -0,0 +1,19 @@ +use crate::state_transition::batch_transition::batched_transition::{ + BatchedTransitionMutRef, BatchedTransitionRef, +}; +pub trait DocumentsBatchTransitionAccessorsV0 { + /// Associated type for the iterator. + type IterType<'a>: Iterator<Item = BatchedTransitionRef<'a>> + where + Self: 'a; + + /// Returns an iterator over the `BatchedTransitionRef` items. + fn transitions_iter<'a>(&'a self) -> Self::IterType<'a>; + + fn transitions_len(&self) -> usize; + fn transitions_are_empty(&self) -> bool; + + fn first_transition(&self) -> Option<BatchedTransitionRef>; + + fn first_transition_mut(&mut self) -> Option<BatchedTransitionMutRef>; +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/document_base_transition_trait.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/document_base_transition_trait.rs new file mode 100644 index 00000000000..d9344985342 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/document_base_transition_trait.rs @@ -0,0 +1,16 @@ +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; + +pub trait DocumentBaseTransitionAccessors { + /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base(&self) -> &DocumentBaseTransition; + + /// Returns a mut reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + + /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. + /// + /// # Arguments + /// + /// * `base` - A value of type `DocumentBaseTransition` to set. + fn set_base(&mut self, base: DocumentBaseTransition); +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/fields.rs similarity index 75% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/fields.rs index b7e0135ed04..df730f10f96 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/fields.rs @@ -1,4 +1,4 @@ -pub(in crate::state_transition::state_transitions::document::documents_batch_transition) mod property_names { +pub(in crate::state_transition::state_transitions::document::batch_transition) mod property_names { pub const ID: &str = "$id"; pub const DATA_CONTRACT_ID: &str = "$dataContractId"; pub const DOCUMENT_TYPE: &str = "$type"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/from_document.rs similarity index 84% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/from_document.rs index e500bbd5bd5..88c136d585c 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/from_document.rs @@ -1,8 +1,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; use crate::prelude::IdentityNonce; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/mod.rs similarity index 96% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/mod.rs index 6d80cc2d872..d430a12ba79 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/mod.rs @@ -1,3 +1,4 @@ +pub mod document_base_transition_trait; mod fields; mod from_document; pub mod v0; @@ -8,7 +9,7 @@ mod v0_methods; feature = "state-transition-json-conversion" ))] use crate::data_contract::DataContract; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::{ +use crate::state_transition::batch_transition::document_base_transition::v0::{ DocumentBaseTransitionV0, DocumentTransitionObjectLike, }; #[cfg(any( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/from_document.rs similarity index 77% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/from_document.rs index 7d3e6ef348b..b067edad06d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/from_document.rs @@ -2,10 +2,10 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0Getters}; use crate::prelude::IdentityNonce; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; impl DocumentBaseTransitionV0 { - pub(in crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_base_transition) fn from_document( + pub(in crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_base_transition) fn from_document( document: &Document, document_type: DocumentTypeRef, identity_contract_nonce: IdentityNonce, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/mod.rs similarity index 98% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/mod.rs index f5b245bece7..9477075d480 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/mod.rs @@ -21,7 +21,7 @@ use crate::data_contract::accessors::v0::DataContractV0Getters; use crate::identifier::Identifier; use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-value-conversion")] -use crate::state_transition::documents_batch_transition::document_base_transition::property_names; +use crate::state_transition::batch_transition::document_base_transition::property_names; #[cfg(any( feature = "state-transition-json-conversion", feature = "state-transition-value-conversion" diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/v0_methods.rs similarity index 94% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/v0_methods.rs index c332648a547..f3c6beb7ee1 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0/v0_methods.rs @@ -1,4 +1,4 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use crate::prelude::IdentityNonce; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0_methods.rs similarity index 87% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0_methods.rs index c7a543b5551..053865b0568 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_base_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_base_transition/v0_methods.rs @@ -1,6 +1,6 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::prelude::IdentityNonce; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/convertible.rs similarity index 90% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/convertible.rs index bca79958bad..b1d5a81ed0e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/convertible.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/convertible.rs @@ -7,24 +7,24 @@ use crate::data_contract::document_type::accessors::DocumentTypeV0Getters; feature = "state-transition-value-conversion" ))] use crate::prelude::DataContract; -#[cfg(feature = "state-transition-json-conversion")] -use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; #[cfg(any( feature = "state-transition-json-conversion", feature = "state-transition-value-conversion" ))] -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; #[cfg(feature = "state-transition-json-conversion")] -use crate::state_transition::documents_batch_transition::document_create_transition::v0::BINARY_FIELDS; +use crate::state_transition::batch_transition::document_create_transition::v0::BINARY_FIELDS; #[cfg(any( feature = "state-transition-json-conversion", feature = "state-transition-value-conversion" ))] -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; #[cfg(feature = "state-transition-value-conversion")] -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; #[cfg(feature = "state-transition-value-conversion")] -use crate::state_transition::documents_batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; +use crate::state_transition::batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; +#[cfg(feature = "state-transition-json-conversion")] +use crate::state_transition::data_contract_update_transition::IDENTIFIER_FIELDS; #[cfg(any( feature = "state-transition-json-conversion", feature = "state-transition-value-conversion" diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/from_document.rs similarity index 86% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/from_document.rs index e275f726479..7ade005e6cf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/from_document.rs @@ -1,8 +1,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; use crate::prelude::IdentityNonce; -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; -use crate::state_transition::documents_batch_transition::document_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::batched_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs similarity index 97% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs index cde6d5ae296..dfc46828724 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/mod.rs @@ -6,7 +6,7 @@ mod v0_methods; use crate::block::block_info::BlockInfo; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::Document; -use crate::state_transition::documents_batch_transition::document_create_transition::v0::DocumentFromCreateTransitionV0; +use crate::state_transition::batch_transition::document_create_transition::v0::DocumentFromCreateTransitionV0; use crate::ProtocolError; use bincode::{Decode, Encode}; use derive_more::{Display, From}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/from_document.rs similarity index 84% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/from_document.rs index 3132a4ba07f..633c72ffccd 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/from_document.rs @@ -2,8 +2,8 @@ use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0Getters}; use crate::prelude::IdentityNonce; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs similarity index 97% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs index 27c968b20bb..7296c503821 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/mod.rs @@ -24,17 +24,17 @@ use crate::data_contract::document_type::methods::DocumentTypeV0Methods; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::{Document, DocumentV0}; use crate::fee::Credits; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; #[cfg(feature = "state-transition-value-conversion")] -use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use derive_more::Display; #[cfg(feature = "state-transition-value-conversion")] use platform_value::btreemap_extensions::BTreeValueRemoveTupleFromMapHelper; use platform_version::version::PlatformVersion; #[cfg(feature = "state-transition-value-conversion")] -use crate::state_transition::documents_batch_transition; +use crate::state_transition::batch_transition; mod property_names { pub const ENTROPY: &str = "$entropy"; @@ -86,7 +86,9 @@ impl DocumentCreateTransitionV0 { data_contract: DataContract, ) -> Result<Self, ProtocolError> { let identity_contract_nonce = map - .remove_integer(documents_batch_transition::document_base_transition::property_names::IDENTITY_CONTRACT_NONCE) + .remove_integer( + batch_transition::document_base_transition::property_names::IDENTITY_CONTRACT_NONCE, + ) .map_err(ProtocolError::ValueError)?; Ok(Self { base: DocumentBaseTransition::V0(DocumentBaseTransitionV0::from_value_map_consume( @@ -386,8 +388,8 @@ impl DocumentFromCreateTransitionV0 for Document { #[cfg(test)] mod test { - use crate::data_contract::data_contract::DataContractV0; - use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; + use crate::data_contract::v0::DataContractV0; + use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; use platform_value::btreemap_extensions::BTreeValueMapHelper; use platform_value::{platform_value, BinaryData, Bytes32, Identifier}; use platform_version::version::LATEST_PLATFORM_VERSION; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/v0_methods.rs similarity index 76% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/v0_methods.rs index e5e2aa8710b..e19bcb8ec8b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0/v0_methods.rs @@ -1,25 +1,13 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; use platform_value::Value; use crate::fee::Credits; use std::collections::BTreeMap; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; -pub trait DocumentCreateTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - - /// Returns a mut reference to the `base` field of the `DocumentCreateTransitionV0`. - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. - /// - /// # Arguments - /// - /// * `base` - A value of type `DocumentBaseTransition` to set. - fn set_base(&mut self, base: DocumentBaseTransition); - +pub trait DocumentCreateTransitionV0Methods: DocumentBaseTransitionAccessors { /// Returns a reference to the `entropy` field of the `DocumentCreateTransitionV0`. fn entropy(&self) -> [u8; 32]; @@ -48,7 +36,7 @@ pub trait DocumentCreateTransitionV0Methods { fn clear_prefunded_voting_balance(&mut self); } -impl DocumentCreateTransitionV0Methods for DocumentCreateTransitionV0 { +impl DocumentBaseTransitionAccessors for DocumentCreateTransitionV0 { fn base(&self) -> &DocumentBaseTransition { &self.base } @@ -60,7 +48,9 @@ impl DocumentCreateTransitionV0Methods for DocumentCreateTransitionV0 { fn set_base(&mut self, base: DocumentBaseTransition) { self.base = base; } +} +impl DocumentCreateTransitionV0Methods for DocumentCreateTransitionV0 { fn entropy(&self) -> [u8; 32] { self.entropy } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0_methods.rs similarity index 80% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0_methods.rs index 11d349f56ca..da248d53934 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_create_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_create_transition/v0_methods.rs @@ -1,11 +1,12 @@ use std::collections::BTreeMap; use platform_value::{Value}; use crate::fee::Credits; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; -use crate::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -impl DocumentCreateTransitionV0Methods for DocumentCreateTransition { +impl DocumentBaseTransitionAccessors for DocumentCreateTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentCreateTransition::V0(v0) => &v0.base, @@ -23,7 +24,9 @@ impl DocumentCreateTransitionV0Methods for DocumentCreateTransition { DocumentCreateTransition::V0(v0) => v0.base = base, } } +} +impl DocumentCreateTransitionV0Methods for DocumentCreateTransition { fn entropy(&self) -> [u8; 32] { match self { DocumentCreateTransition::V0(v0) => v0.entropy, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/from_document.rs similarity index 85% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/from_document.rs index 3c6dfa6b80a..a3eafe8c329 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/from_document.rs @@ -4,8 +4,8 @@ use crate::prelude::IdentityNonce; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition}; -use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; +use crate::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; +use crate::state_transition::batch_transition::batched_transition::DocumentDeleteTransition; impl DocumentDeleteTransition { pub fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/from_document.rs similarity index 69% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/from_document.rs index 4fac1aff9f4..9a939350289 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/from_document.rs @@ -1,10 +1,10 @@ -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document}; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentDeleteTransitionV0 { pub(crate) fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/mod.rs similarity index 85% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/mod.rs index 34d4ac98554..633c7d83818 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/mod.rs @@ -1,7 +1,7 @@ mod from_document; pub mod v0_methods; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use bincode::{Decode, Encode}; use derive_more::Display; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..861334a6027 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0/v0_methods.rs @@ -0,0 +1,17 @@ +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; + +impl DocumentBaseTransitionAccessors for DocumentDeleteTransitionV0 { + fn base(&self) -> &DocumentBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut DocumentBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: DocumentBaseTransition) { + self.base = base + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0_methods.rs similarity index 51% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0_methods.rs index 099c95e8f34..8fd1b1f31cf 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_delete_transition/v0_methods.rs @@ -1,8 +1,8 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentDeleteTransition; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::DocumentDeleteTransition; -impl DocumentDeleteTransitionV0Methods for DocumentDeleteTransition { +impl DocumentBaseTransitionAccessors for DocumentDeleteTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentDeleteTransition::V0(v0) => &v0.base, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/from_document.rs similarity index 85% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/from_document.rs index d4b913405f0..b7f24dc3d1e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/from_document.rs @@ -5,8 +5,8 @@ use crate::prelude::IdentityNonce; use crate::ProtocolError; use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::state_transition::documents_batch_transition::document_transition::{DocumentPurchaseTransition}; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use crate::state_transition::batch_transition::batched_transition::DocumentPurchaseTransition; impl DocumentPurchaseTransition { pub fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/from_document.rs similarity index 79% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/from_document.rs index 80bfc2115c5..9c2eb59f76e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/from_document.rs @@ -1,12 +1,12 @@ -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document, DocumentV0Getters}; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::errors::DocumentError; +use crate::document::{Document, DocumentV0Getters}; use crate::fee::Credits; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentPurchaseTransitionV0 { pub(crate) fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/mod.rs similarity index 90% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/mod.rs index 5a4ca1e8ba4..3b798177be8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/mod.rs @@ -1,7 +1,7 @@ mod from_document; pub mod v0_methods; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use bincode::{Decode, Encode}; use derive_more::Display; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/v0_methods.rs similarity index 53% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/v0_methods.rs index 95333296e41..41f6b423aff 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0/v0_methods.rs @@ -1,20 +1,10 @@ use crate::fee::Credits; use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; - -pub trait DocumentPurchaseTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. - /// - /// # Arguments - /// - /// * `base` - A value of type `DocumentBaseTransition` to set. - fn set_base(&mut self, base: DocumentBaseTransition); +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +pub trait DocumentPurchaseTransitionV0Methods: DocumentBaseTransitionAccessors { /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. fn revision(&self) -> Revision; @@ -23,7 +13,7 @@ pub trait DocumentPurchaseTransitionV0Methods { fn price(&self) -> Credits; } -impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { +impl DocumentBaseTransitionAccessors for DocumentPurchaseTransitionV0 { fn base(&self) -> &DocumentBaseTransition { &self.base } @@ -33,9 +23,11 @@ impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { } fn set_base(&mut self, base: DocumentBaseTransition) { - self.base = base + self.base = base; } +} +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransitionV0 { fn revision(&self) -> Revision { self.revision } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0_methods.rs similarity index 65% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0_methods.rs index 86c2fe8f193..8918323373d 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_purchase_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_purchase_transition/v0_methods.rs @@ -1,10 +1,11 @@ use crate::fee::Credits; use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::DocumentPurchaseTransition; -impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { +impl DocumentBaseTransitionAccessors for DocumentPurchaseTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentPurchaseTransition::V0(v0) => &v0.base, @@ -22,7 +23,9 @@ impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { DocumentPurchaseTransition::V0(v0) => v0.base = base, } } +} +impl DocumentPurchaseTransitionV0Methods for DocumentPurchaseTransition { fn revision(&self) -> Revision { match self { DocumentPurchaseTransition::V0(v0) => v0.revision, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/from_document.rs similarity index 79% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/from_document.rs index 059da81c223..1d2923a1f34 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/from_document.rs @@ -1,10 +1,10 @@ -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document}; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; +use crate::state_transition::batch_transition::batched_transition::DocumentReplaceTransition; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_transition::{DocumentReplaceTransition}; -use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentReplaceTransition { pub fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/from_document.rs similarity index 79% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/from_document.rs index 5fbd783eb67..4b5903c87ab 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/from_document.rs @@ -1,11 +1,11 @@ -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document, DocumentV0Getters}; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::errors::DocumentError; +use crate::document::{Document, DocumentV0Getters}; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentReplaceTransitionV0 { pub(crate) fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs similarity index 98% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs index 13833cabaf7..1aae0624bfe 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/mod.rs @@ -18,8 +18,8 @@ use platform_version::version::PlatformVersion; use std::collections::BTreeMap; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { pub const REVISION: &str = "$revision"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/v0_methods.rs similarity index 68% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/v0_methods.rs index 9bee325bb1b..61dec36af22 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0/v0_methods.rs @@ -3,20 +3,11 @@ use platform_value::Value; use std::collections::BTreeMap; use crate::prelude::Revision; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; - -use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; - -pub trait DocumentReplaceTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - /// Returns a mut reference to the `base` field of the `DocumentReplaceTransitionV0`. - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentReplaceTransitionV0`. - fn set_base(&mut self, base: DocumentBaseTransition); - +pub trait DocumentReplaceTransitionV0Methods: DocumentBaseTransitionAccessors { /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. fn revision(&self) -> Revision; @@ -33,7 +24,7 @@ pub trait DocumentReplaceTransitionV0Methods { fn set_data(&mut self, data: BTreeMap<String, Value>); } -impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransitionV0 { +impl DocumentBaseTransitionAccessors for DocumentReplaceTransitionV0 { fn base(&self) -> &DocumentBaseTransition { &self.base } @@ -45,7 +36,9 @@ impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransitionV0 { fn set_base(&mut self, base: DocumentBaseTransition) { self.base = base; } +} +impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransitionV0 { fn revision(&self) -> Revision { self.revision } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0_methods.rs similarity index 71% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0_methods.rs index 29f79a05e22..ad52fdadd07 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_replace_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_replace_transition/v0_methods.rs @@ -1,11 +1,12 @@ use std::collections::BTreeMap; use platform_value::Value; use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::DocumentReplaceTransition; -impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransition { +impl DocumentBaseTransitionAccessors for DocumentReplaceTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentReplaceTransition::V0(v0) => &v0.base, @@ -23,7 +24,9 @@ impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransition { DocumentReplaceTransition::V0(v0) => v0.base = base, } } +} +impl DocumentReplaceTransitionV0Methods for DocumentReplaceTransition { fn revision(&self) -> Revision { match self { DocumentReplaceTransition::V0(v0) => v0.revision, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/from_document.rs similarity index 84% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/from_document.rs index abfbf806df5..17d0166f09f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/from_document.rs @@ -1,10 +1,12 @@ -use platform_value::Identifier; -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document}; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_transfer_transition::{ + DocumentTransferTransition, DocumentTransferTransitionV0, +}; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::{DocumentTransferTransition, DocumentTransferTransitionV0}; +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentTransferTransition { pub fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/from_document.rs similarity index 79% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/from_document.rs index 77a4d59c6d3..7f182eb46a6 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/from_document.rs @@ -1,12 +1,12 @@ -use platform_value::Identifier; -use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::data_contract::document_type::{DocumentTypeRef}; -use crate::document::{Document, DocumentV0Getters}; +use crate::data_contract::document_type::DocumentTypeRef; use crate::document::errors::DocumentError; +use crate::document::{Document, DocumentV0Getters}; use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_transfer_transition::DocumentTransferTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; +use platform_value::Identifier; +use platform_version::version::{FeatureVersion, PlatformVersion}; impl DocumentTransferTransitionV0 { pub(crate) fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/mod.rs similarity index 92% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/mod.rs index 3708794cf7d..d8a7e7e41fb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/mod.rs @@ -10,7 +10,7 @@ use platform_value::Identifier; use serde::{Deserialize, Serialize}; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { pub const REVISION: &str = "$revision"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/v0_methods.rs similarity index 69% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/v0_methods.rs index 6e4b8331155..2dd4b95d4e5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0/v0_methods.rs @@ -1,20 +1,11 @@ use platform_value::Identifier; use crate::prelude::Revision; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_transfer_transition::DocumentTransferTransitionV0; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; - -use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; - -pub trait DocumentTransferTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentReplaceTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - /// Returns a mut reference to the `base` field of the `DocumentReplaceTransitionV0`. - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentReplaceTransitionV0`. - fn set_base(&mut self, base: DocumentBaseTransition); - +pub trait DocumentTransferTransitionV0Methods: DocumentBaseTransitionAccessors { /// Returns a reference to the `revision` field of the `DocumentReplaceTransitionV0`. fn revision(&self) -> Revision; @@ -31,7 +22,7 @@ pub trait DocumentTransferTransitionV0Methods { fn set_recipient_owner_id(&mut self, recipient_owner_id: Identifier); } -impl DocumentTransferTransitionV0Methods for DocumentTransferTransitionV0 { +impl DocumentBaseTransitionAccessors for DocumentTransferTransitionV0 { fn base(&self) -> &DocumentBaseTransition { &self.base } @@ -43,7 +34,9 @@ impl DocumentTransferTransitionV0Methods for DocumentTransferTransitionV0 { fn set_base(&mut self, base: DocumentBaseTransition) { self.base = base; } +} +impl DocumentTransferTransitionV0Methods for DocumentTransferTransitionV0 { fn revision(&self) -> Revision { self.revision } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0_methods.rs similarity index 72% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0_methods.rs index adeff540c05..e4dc722b788 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_transfer_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transfer_transition/v0_methods.rs @@ -1,10 +1,11 @@ use platform_value::Identifier; use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::DocumentTransferTransition; -impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { +impl DocumentBaseTransitionAccessors for DocumentTransferTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentTransferTransition::V0(v0) => &v0.base, @@ -22,7 +23,9 @@ impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { DocumentTransferTransition::V0(v0) => v0.base = base, } } +} +impl DocumentTransferTransitionV0Methods for DocumentTransferTransition { fn revision(&self) -> Revision { match self { DocumentTransferTransition::V0(v0) => v0.revision, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition.rs similarity index 71% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition.rs index 448dffcfea4..85abbe5c682 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition.rs @@ -1,74 +1,21 @@ +use platform_value::{Identifier, Value}; use std::collections::BTreeMap; - -use bincode::{Decode, Encode}; -use derive_more::From; +use derive_more::{Display, From}; #[cfg(feature = "state-transition-serde-conversion")] use serde::{Deserialize, Serialize}; - -use crate::prelude::{Identifier, IdentityNonce}; -use document_base_transition::DocumentBaseTransition; - -pub mod action_type; -pub mod document_base_transition; -pub mod document_create_transition; -pub mod document_delete_transition; -pub mod document_purchase_transition; -pub mod document_replace_transition; -pub mod document_transfer_transition; -pub mod document_update_price_transition; - -use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use derive_more::Display; -pub use document_create_transition::DocumentCreateTransition; -pub use document_delete_transition::DocumentDeleteTransition; -pub use document_replace_transition::DocumentReplaceTransition; -pub use document_transfer_transition::DocumentTransferTransition; -pub use document_purchase_transition::DocumentPurchaseTransition; -pub use document_update_price_transition::DocumentUpdatePriceTransition; -use platform_value::Value; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; - -use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; -use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; -use crate::state_transition::state_transitions::document::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; - -pub const PROPERTY_ACTION: &str = "$action"; - -pub trait DocumentTransitionV0Methods { - fn base(&self) -> &DocumentBaseTransition; - /// returns the value of dynamic property. The dynamic property is a property that is not specified in protocol - /// the `path` supports dot-syntax: i.e: property.internal_property - fn get_dynamic_property(&self, path: &str) -> Option<&Value>; - /// get the id - fn get_id(&self) -> Identifier; - /// get the document type - fn document_type_name(&self) -> &String; - /// get the data contract id - fn data_contract_id(&self) -> Identifier; - /// get the data of the transition if exits - fn data(&self) -> Option<&BTreeMap<String, Value>>; - /// get the revision of transition if exits - fn revision(&self) -> Option<Revision>; - - /// get the identity contract nonce - fn identity_contract_nonce(&self) -> IdentityNonce; - #[cfg(test)] - /// Inserts the dynamic property into the document - fn insert_dynamic_property(&mut self, property_name: String, value: Value); - /// set data contract's ID - fn set_data_contract_id(&mut self, id: Identifier); - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - fn data_mut(&mut self) -> Option<&mut BTreeMap<String, Value>>; - - // sets revision of the transition - fn set_revision(&mut self, revision: Revision); - - // sets identity contract nonce - fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce); -} +use bincode::{Encode, Decode}; +use crate::prelude::{IdentityNonce, Revision}; +use crate::state_transition::batch_transition::{DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, TokenBurnTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, TokenFreezeTransition, TokenMintTransition, TokenTransferTransition, TokenUnfreezeTransition}; +use crate::state_transition::batch_transition::batched_transition::{DocumentPurchaseTransition, DocumentTransferTransition, DocumentUpdatePriceTransition}; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use crate::state_transition::batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use crate::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; #[derive(Debug, Clone, Encode, Decode, From, PartialEq, Display)] #[cfg_attr( @@ -95,15 +42,15 @@ pub enum DocumentTransition { Purchase(DocumentPurchaseTransition), } -impl DocumentTransition { - pub fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { +impl BatchTransitionResolversV0 for DocumentTransition { + fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { if let Self::Create(ref t) = self { Some(t) } else { None } } - pub fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition> { + fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition> { if let Self::Replace(ref t) = self { Some(t) } else { @@ -111,7 +58,7 @@ impl DocumentTransition { } } - pub fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition> { + fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition> { if let Self::Delete(ref t) = self { Some(t) } else { @@ -119,7 +66,7 @@ impl DocumentTransition { } } - pub fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { if let Self::Transfer(ref t) = self { Some(t) } else { @@ -127,13 +74,77 @@ impl DocumentTransition { } } - pub fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { if let Self::Purchase(ref t) = self { Some(t) } else { None } } + + fn as_transition_token_burn(&self) -> Option<&TokenBurnTransition> { + None + } + + fn as_transition_token_mint(&self) -> Option<&TokenMintTransition> { + None + } + + fn as_transition_token_transfer(&self) -> Option<&TokenTransferTransition> { + None + } + + fn as_transition_token_freeze(&self) -> Option<&TokenFreezeTransition> { + None + } + + fn as_transition_token_unfreeze(&self) -> Option<&TokenUnfreezeTransition> { + None + } + + fn as_transition_token_destroy_frozen_funds( + &self, + ) -> Option<&TokenDestroyFrozenFundsTransition> { + None + } + + fn as_transition_token_emergency_action(&self) -> Option<&TokenEmergencyActionTransition> { + None + } +} + +pub trait DocumentTransitionV0Methods { + fn base(&self) -> &DocumentBaseTransition; + /// returns the value of dynamic property. The dynamic property is a property that is not specified in protocol + /// the `path` supports dot-syntax: i.e: property.internal_property + fn get_dynamic_property(&self, path: &str) -> Option<&Value>; + /// get the id + fn get_id(&self) -> Identifier; + /// get the entropy + fn entropy(&self) -> Option<Vec<u8>>; + fn document_type_name(&self) -> &String; + /// get the data contract id + fn data_contract_id(&self) -> Identifier; + /// get the data of the transition if exits + fn data(&self) -> Option<&BTreeMap<String, Value>>; + /// get the revision of transition if exits + fn revision(&self) -> Option<Revision>; + + /// get the identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; + #[cfg(test)] + /// Inserts the dynamic property into the document + fn insert_dynamic_property(&mut self, property_name: String, value: Value); + /// set data contract's ID + fn set_data_contract_id(&mut self, id: Identifier); + fn base_mut(&mut self) -> &mut DocumentBaseTransition; + fn data_mut(&mut self) -> Option<&mut BTreeMap<String, Value>>; + + // sets revision of the transition + fn set_revision(&mut self, revision: Revision); + + // sets identity contract nonce + fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce); } impl DocumentTransitionV0Methods for DocumentTransition { @@ -167,6 +178,17 @@ impl DocumentTransitionV0Methods for DocumentTransition { self.base().document_type_name() } + fn entropy(&self) -> Option<Vec<u8>> { + match self { + DocumentTransition::Create(t) => Some(Vec::from(t.entropy())), + DocumentTransition::Replace(_) => None, + DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, + } + } + fn data_contract_id(&self) -> Identifier { self.base().data_contract_id() } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition_action_type.rs similarity index 78% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition_action_type.rs index fd7c376f7b9..2fadc908381 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/action_type.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_transition_action_type.rs @@ -1,4 +1,4 @@ -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; use crate::ProtocolError; // @append-only @@ -13,11 +13,11 @@ pub enum DocumentTransitionActionType { IgnoreWhileBumpingRevision, } -pub trait TransitionActionTypeGetter { +pub trait DocumentTransitionActionTypeGetter { fn action_type(&self) -> DocumentTransitionActionType; } -impl TransitionActionTypeGetter for DocumentTransition { +impl DocumentTransitionActionTypeGetter for DocumentTransition { fn action_type(&self) -> DocumentTransitionActionType { match self { DocumentTransition::Create(_) => DocumentTransitionActionType::Create, @@ -39,6 +39,8 @@ impl TryFrom<&str> for DocumentTransitionActionType { "replace" => Ok(DocumentTransitionActionType::Replace), "delete" => Ok(DocumentTransitionActionType::Delete), "transfer" => Ok(DocumentTransitionActionType::Transfer), + "updatePrice" | "update_price" => Ok(DocumentTransitionActionType::UpdatePrice), + "purchase" => Ok(DocumentTransitionActionType::Purchase), action_type => Err(ProtocolError::Generic(format!( "unknown action type {action_type}" ))), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/from_document.rs similarity index 85% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/from_document.rs index 4f26ff90bd7..39e2877d601 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/from_document.rs @@ -4,8 +4,8 @@ use crate::document::{Document}; use crate::fee::Credits; use crate::prelude::IdentityNonce; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; +use crate::state_transition::batch_transition::batched_transition::DocumentUpdatePriceTransition; +use crate::state_transition::batch_transition::batched_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; impl DocumentUpdatePriceTransition { pub fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/from_document.rs similarity index 82% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/from_document.rs index 570a3fb5610..2a6c7785872 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/from_document.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/from_document.rs @@ -5,8 +5,8 @@ use crate::document::errors::DocumentError; use crate::fee::Credits; use crate::prelude::IdentityNonce; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; impl DocumentUpdatePriceTransitionV0 { pub(crate) fn from_document( diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/mod.rs similarity index 99% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/mod.rs index 8e264bba978..fbca7eb6773 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/mod.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; use crate::fee::Credits; pub use super::super::document_base_transition::IDENTIFIER_FIELDS; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; mod property_names { pub const REVISION: &str = "$revision"; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/v0_methods.rs similarity index 62% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/v0_methods.rs index 74b27a3589d..aa96cdc5ccb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0/v0_methods.rs @@ -1,19 +1,10 @@ use crate::fee::Credits; use crate::prelude::Revision; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; - -use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; - -pub trait DocumentUpdatePriceTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - /// Returns a mut reference to the `base` field of the `DocumentUpdatePriceTransitionV0`. - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentUpdatePriceTransitionV0`. - fn set_base(&mut self, base: DocumentBaseTransition); - +pub trait DocumentUpdatePriceTransitionV0Methods: DocumentBaseTransitionAccessors { /// Returns a reference to the `revision` field of the `DocumentUpdatePriceTransitionV0`. fn revision(&self) -> Revision; @@ -27,7 +18,7 @@ pub trait DocumentUpdatePriceTransitionV0Methods { fn set_price(&mut self, price: Credits); } -impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransitionV0 { +impl DocumentBaseTransitionAccessors for DocumentUpdatePriceTransitionV0 { fn base(&self) -> &DocumentBaseTransition { &self.base } @@ -39,7 +30,9 @@ impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransitionV0 fn set_base(&mut self, base: DocumentBaseTransition) { self.base = base; } +} +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransitionV0 { fn revision(&self) -> Revision { self.revision } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0_methods.rs similarity index 68% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0_methods.rs index 3b605d7431c..bc97724dfcb 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_update_price_transition/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/document_update_price_transition/v0_methods.rs @@ -1,10 +1,11 @@ use crate::fee::Credits; use crate::prelude::Revision; -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use crate::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use crate::state_transition::batch_transition::batched_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::DocumentUpdatePriceTransition; -impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransition { +impl DocumentBaseTransitionAccessors for DocumentUpdatePriceTransition { fn base(&self) -> &DocumentBaseTransition { match self { DocumentUpdatePriceTransition::V0(v0) => &v0.base, @@ -22,7 +23,9 @@ impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransition { DocumentUpdatePriceTransition::V0(v0) => v0.base = base, } } +} +impl DocumentUpdatePriceTransitionV0Methods for DocumentUpdatePriceTransition { fn revision(&self) -> Revision { match self { DocumentUpdatePriceTransition::V0(v0) => v0.revision, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/mod.rs new file mode 100644 index 00000000000..39d0c5e2ff3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/mod.rs @@ -0,0 +1,141 @@ +use bincode::{Decode, Encode}; +use derive_more::From; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +pub mod document_base_transition; +pub mod document_create_transition; +pub mod document_delete_transition; +pub mod document_purchase_transition; +pub mod document_replace_transition; +pub mod document_transfer_transition; +pub mod document_transition; +pub mod document_transition_action_type; +pub mod document_update_price_transition; +pub mod multi_party_action; +mod resolvers; +pub mod token_base_transition; +pub mod token_burn_transition; +pub mod token_config_update_transition; +pub mod token_destroy_frozen_funds_transition; +pub mod token_emergency_action_transition; +pub mod token_freeze_transition; +pub mod token_mint_transition; +pub mod token_transfer_transition; +pub mod token_transition; +pub mod token_transition_action_type; +pub mod token_unfreeze_transition; + +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::token_transition::TokenTransitionV0Methods; +use derive_more::Display; +pub use document_create_transition::DocumentCreateTransition; +pub use document_delete_transition::DocumentDeleteTransition; +pub use document_purchase_transition::DocumentPurchaseTransition; +pub use document_replace_transition::DocumentReplaceTransition; +pub use document_transfer_transition::DocumentTransferTransition; +use document_transition::DocumentTransition; +pub use document_update_price_transition::DocumentUpdatePriceTransition; +use platform_value::Identifier; +use token_transition::TokenTransition; + +pub const PROPERTY_ACTION: &str = "$action"; + +#[derive(Debug, Clone, Encode, Decode, From, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum BatchedTransition { + #[display("DocumentTransition({})", "_0")] + Document(DocumentTransition), + #[display("TokenTransition({})", "_0")] + Token(TokenTransition), +} + +#[derive(Debug, From, Clone, Copy, PartialEq, Display)] +pub enum BatchedTransitionRef<'a> { + #[display("DocumentTransition({})", "_0")] + Document(&'a DocumentTransition), + #[display("TokenTransition({})", "_0")] + Token(&'a TokenTransition), +} + +#[derive(Debug, From, PartialEq, Display)] +pub enum BatchedTransitionMutRef<'a> { + #[display("DocumentTransition({})", "_0")] + Document(&'a mut DocumentTransition), + #[display("TokenTransition({})", "_0")] + Token(&'a mut TokenTransition), +} + +impl<'a> BatchedTransitionRef<'a> { + pub fn to_owned_transition(&self) -> BatchedTransition { + match self { + BatchedTransitionRef::Document(doc_ref) => { + BatchedTransition::Document((*doc_ref).clone()) + } + BatchedTransitionRef::Token(tok_ref) => BatchedTransition::Token((*tok_ref).clone()), + } + } + + pub fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + BatchedTransitionRef::Document(document_transition) => { + document_transition.identity_contract_nonce() + } + BatchedTransitionRef::Token(token_transition) => { + token_transition.identity_contract_nonce() + } + } + } + + pub fn data_contract_id(&self) -> Identifier { + match self { + BatchedTransitionRef::Document(document_transition) => { + document_transition.data_contract_id() + } + BatchedTransitionRef::Token(token_transition) => token_transition.data_contract_id(), + } + } +} + +impl BatchedTransition { + pub fn borrow_as_ref(&self) -> BatchedTransitionRef { + match self { + BatchedTransition::Document(doc) => { + // Create a reference to a DocumentTransition + BatchedTransitionRef::Document(doc) + } + BatchedTransition::Token(tok) => { + // Create a reference to a TokenTransition + BatchedTransitionRef::Token(tok) + } + } + } + + pub fn borrow_as_mut(&mut self) -> BatchedTransitionMutRef { + match self { + BatchedTransition::Document(doc) => { + // Create a reference to a DocumentTransition + BatchedTransitionMutRef::Document(doc) + } + BatchedTransition::Token(tok) => { + // Create a reference to a TokenTransition + BatchedTransitionMutRef::Token(tok) + } + } + } + + pub fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + match self { + BatchedTransition::Document(document_transition) => { + document_transition.set_identity_contract_nonce(identity_contract_nonce) + } + BatchedTransition::Token(token_transition) => { + token_transition.set_identity_contract_nonce(identity_contract_nonce) + } + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/multi_party_action.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/multi_party_action.rs new file mode 100644 index 00000000000..52f7cf4e7f4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/multi_party_action.rs @@ -0,0 +1,5 @@ +use platform_value::Identifier; + +pub trait AllowedAsMultiPartyAction { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier; +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/resolvers.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/resolvers.rs new file mode 100644 index 00000000000..bf1d555544f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/resolvers.rs @@ -0,0 +1,185 @@ +use crate::state_transition::batch_transition::batched_transition::{ + BatchedTransition, BatchedTransitionRef, DocumentPurchaseTransition, DocumentTransferTransition, +}; +use crate::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; +use crate::state_transition::batch_transition::{ + DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, + TokenBurnTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, + TokenFreezeTransition, TokenMintTransition, TokenTransferTransition, TokenUnfreezeTransition, +}; + +impl BatchTransitionResolversV0 for BatchedTransition { + fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { + match self { + BatchedTransition::Document(document) => document.as_transition_create(), + BatchedTransition::Token(_) => None, + } + } + + fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition> { + match self { + BatchedTransition::Document(document) => document.as_transition_replace(), + BatchedTransition::Token(_) => None, + } + } + + fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition> { + match self { + BatchedTransition::Document(document) => document.as_transition_delete(), + BatchedTransition::Token(_) => None, + } + } + + fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + match self { + BatchedTransition::Document(document) => document.as_transition_transfer(), + BatchedTransition::Token(_) => None, + } + } + + fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + match self { + BatchedTransition::Document(document) => document.as_transition_purchase(), + BatchedTransition::Token(_) => None, + } + } + + fn as_transition_token_burn(&self) -> Option<&TokenBurnTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_burn(), + } + } + + fn as_transition_token_mint(&self) -> Option<&TokenMintTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_mint(), + } + } + + fn as_transition_token_transfer(&self) -> Option<&TokenTransferTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_transfer(), + } + } + + fn as_transition_token_freeze(&self) -> Option<&TokenFreezeTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_freeze(), + } + } + + fn as_transition_token_unfreeze(&self) -> Option<&TokenUnfreezeTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_unfreeze(), + } + } + + fn as_transition_token_destroy_frozen_funds( + &self, + ) -> Option<&TokenDestroyFrozenFundsTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_destroy_frozen_funds(), + } + } + + fn as_transition_token_emergency_action(&self) -> Option<&TokenEmergencyActionTransition> { + match self { + BatchedTransition::Document(_) => None, + BatchedTransition::Token(token) => token.as_transition_token_emergency_action(), + } + } +} + +impl<'a> BatchTransitionResolversV0 for BatchedTransitionRef<'a> { + fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { + match self { + BatchedTransitionRef::Document(document) => document.as_transition_create(), + BatchedTransitionRef::Token(_) => None, + } + } + + fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition> { + match self { + BatchedTransitionRef::Document(document) => document.as_transition_replace(), + BatchedTransitionRef::Token(_) => None, + } + } + + fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition> { + match self { + BatchedTransitionRef::Document(document) => document.as_transition_delete(), + BatchedTransitionRef::Token(_) => None, + } + } + + fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + match self { + BatchedTransitionRef::Document(document) => document.as_transition_transfer(), + BatchedTransitionRef::Token(_) => None, + } + } + + fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + match self { + BatchedTransitionRef::Document(document) => document.as_transition_purchase(), + BatchedTransitionRef::Token(_) => None, + } + } + + fn as_transition_token_burn(&self) -> Option<&TokenBurnTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_burn(), + } + } + + fn as_transition_token_mint(&self) -> Option<&TokenMintTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_mint(), + } + } + + fn as_transition_token_transfer(&self) -> Option<&TokenTransferTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_transfer(), + } + } + + fn as_transition_token_freeze(&self) -> Option<&TokenFreezeTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_freeze(), + } + } + + fn as_transition_token_unfreeze(&self) -> Option<&TokenUnfreezeTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_unfreeze(), + } + } + + fn as_transition_token_destroy_frozen_funds( + &self, + ) -> Option<&TokenDestroyFrozenFundsTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_destroy_frozen_funds(), + } + } + + fn as_transition_token_emergency_action(&self) -> Option<&TokenEmergencyActionTransition> { + match self { + BatchedTransitionRef::Document(_) => None, + BatchedTransitionRef::Token(token) => token.as_transition_token_emergency_action(), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/fields.rs new file mode 100644 index 00000000000..02391e0be6f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/fields.rs @@ -0,0 +1,12 @@ +pub(in crate::state_transition::state_transitions::document::batch_transition) mod property_names { + pub const DATA_CONTRACT_ID: &str = "$dataContractId"; + pub const TOKEN_CONTRACT_POSITION: &str = "$tokenContractPosition"; + pub const TOKEN_ID: &str = "$tokenId"; + pub const GROUP_CONTRACT_POSITION: &str = "$groupContractPosition"; + pub const GROUP_ACTION_ID: &str = "$groupActionId"; + pub const GROUP_ACTION_IS_PROPOSER: &str = "$groupActionIsProposer"; + pub const ACTION: &str = "$action"; + pub const IDENTITY_CONTRACT_NONCE: &str = "$identityContractNonce"; +} + +pub const IDENTIFIER_FIELDS: [&str; 1] = [property_names::DATA_CONTRACT_ID]; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/mod.rs new file mode 100644 index 00000000000..4b4602e72dd --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/mod.rs @@ -0,0 +1,106 @@ +mod fields; +pub mod token_base_transition_accessors; +pub mod v0; +mod v0_methods; + +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] +use crate::data_contract::DataContract; +use crate::state_transition::batch_transition::document_base_transition::v0::DocumentTransitionObjectLike; +use crate::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +pub use fields::*; +#[cfg(any( + feature = "state-transition-value-conversion", + feature = "state-transition-json-conversion" +))] +use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +#[cfg(feature = "state-transition-json-conversion")] +use serde_json::Value as JsonValue; +#[cfg(feature = "state-transition-value-conversion")] +use std::collections::BTreeMap; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenBaseTransition { + #[display("V0({})", "_0")] + V0(TokenBaseTransitionV0), +} + +impl Default for TokenBaseTransition { + fn default() -> Self { + TokenBaseTransition::V0(TokenBaseTransitionV0::default()) // since only v0 + } +} + +impl DocumentTransitionObjectLike for TokenBaseTransition { + #[cfg(feature = "state-transition-json-conversion")] + fn from_json_object( + json_str: JsonValue, + data_contract: DataContract, + ) -> Result<Self, ProtocolError> + where + Self: Sized, + { + let value: Value = json_str.into(); + Self::from_object(value, data_contract) + } + #[cfg(feature = "state-transition-value-conversion")] + fn from_object( + raw_transition: Value, + _data_contract: DataContract, + ) -> Result<Self, ProtocolError> + where + Self: Sized, + { + platform_value::from_value(raw_transition).map_err(ProtocolError::ValueError) + } + #[cfg(feature = "state-transition-value-conversion")] + fn from_value_map( + map: BTreeMap<String, Value>, + _data_contract: DataContract, + ) -> Result<Self, ProtocolError> + where + Self: Sized, + { + let value: Value = map.into(); + platform_value::from_value(value).map_err(ProtocolError::ValueError) + } + + #[cfg(feature = "state-transition-value-conversion")] + fn to_object(&self) -> Result<Value, ProtocolError> { + platform_value::to_value(self).map_err(ProtocolError::ValueError) + } + #[cfg(feature = "state-transition-value-conversion")] + fn to_value_map(&self) -> Result<BTreeMap<String, Value>, ProtocolError> { + let value = platform_value::to_value(self)?; + value + .into_btree_string_map() + .map_err(ProtocolError::ValueError) + } + + #[cfg(feature = "state-transition-json-conversion")] + fn to_json(&self) -> Result<JsonValue, ProtocolError> { + self.to_object()? + .try_into() + .map_err(ProtocolError::ValueError) + } + + #[cfg(feature = "state-transition-value-conversion")] + fn to_cleaned_object(&self) -> Result<Value, ProtocolError> { + Ok(self.to_value_map()?.into()) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/token_base_transition_accessors.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/token_base_transition_accessors.rs new file mode 100644 index 00000000000..2813dc755de --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/token_base_transition_accessors.rs @@ -0,0 +1,16 @@ +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; + +pub trait TokenBaseTransitionAccessors { + /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base(&self) -> &TokenBaseTransition; + + /// Returns a mut reference to the `base` field of the `DocumentCreateTransitionV0`. + fn base_mut(&mut self) -> &mut TokenBaseTransition; + + /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. + /// + /// # Arguments + /// + /// * `base` - A value of type `DocumentBaseTransition` to set. + fn set_base(&mut self, base: TokenBaseTransition); +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/mod.rs new file mode 100644 index 00000000000..c3b8595dcca --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/mod.rs @@ -0,0 +1,117 @@ +pub mod v0_methods; + +#[cfg(feature = "state-transition-value-conversion")] +use std::collections::BTreeMap; + +use bincode::{Decode, Encode}; +use derive_more::Display; + +#[cfg(feature = "state-transition-value-conversion")] +use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; +#[cfg(feature = "state-transition-value-conversion")] +use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "state-transition-value-conversion")] +use crate::data_contract::accessors::v0::DataContractV0Getters; +#[cfg(feature = "state-transition-value-conversion")] +use crate::data_contract::accessors::v1::DataContractV1Getters; +use crate::group::GroupStateTransitionInfo; +use crate::identifier::Identifier; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-value-conversion")] +use crate::state_transition::batch_transition::token_base_transition::property_names; +#[cfg(feature = "state-transition-value-conversion")] +use crate::tokens::errors::TokenError; +#[cfg(any( + feature = "state-transition-json-conversion", + feature = "state-transition-value-conversion" +))] +use crate::{data_contract::DataContract, errors::ProtocolError}; + +#[derive(Debug, Clone, Encode, Decode, Default, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display( + "ID: {}, Type: {}, Contract ID: {}", + "id", + "token_id", + "data_contract_id" +)] +pub struct TokenBaseTransitionV0 { + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$identity-contract-nonce") + )] + pub identity_contract_nonce: IdentityNonce, + /// ID of the token within the contract + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$tokenContractPosition") + )] + pub token_contract_position: u16, + /// Data contract ID generated from the data contract's `owner_id` and `entropy` + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$dataContractId") + )] + pub data_contract_id: Identifier, + /// Token ID generated from the data contract ID and the token position + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$tokenId") + )] + pub token_id: Identifier, + /// Using group multi party rules for authentication + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub using_group_info: Option<GroupStateTransitionInfo>, +} + +impl TokenBaseTransitionV0 { + #[cfg(feature = "state-transition-value-conversion")] + pub fn from_value_map_consume( + map: &mut BTreeMap<String, Value>, + data_contract: DataContract, + identity_contract_nonce: IdentityNonce, + ) -> Result<TokenBaseTransitionV0, ProtocolError> { + let token_contract_position = map + .remove_integer(property_names::TOKEN_CONTRACT_POSITION) + .map_err(ProtocolError::ValueError)?; + Ok(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id: Identifier::new( + map.remove_optional_hash256_bytes(property_names::DATA_CONTRACT_ID) + .map_err(ProtocolError::ValueError)? + .unwrap_or(data_contract.id().to_buffer()), + ), + token_id: map + .remove_optional_hash256_bytes(property_names::TOKEN_ID) + .map_err(ProtocolError::ValueError)? + .map(Identifier::new) + .unwrap_or(data_contract.token_id(token_contract_position).ok_or( + ProtocolError::Token(TokenError::TokenNotFoundAtPositionError.into()), + )?), + using_group_info: map + .remove_optional_integer(property_names::GROUP_CONTRACT_POSITION) + .map_err(ProtocolError::ValueError)? + .map(|group_contract_position| { + Ok::<GroupStateTransitionInfo, ProtocolError>(GroupStateTransitionInfo { + group_contract_position, + action_id: map + .remove_hash256_bytes(property_names::GROUP_ACTION_ID) + .map_err(ProtocolError::ValueError)? + .into(), + action_is_proposer: map + .remove_bool(property_names::GROUP_ACTION_IS_PROPOSER) + .map_err(ProtocolError::ValueError)?, + }) + }) + .transpose()?, + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..40369689bd3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0/v0_methods.rs @@ -0,0 +1,102 @@ +use crate::data_contract::GroupContractPosition; +use crate::group::GroupStateTransitionInfo; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; +use crate::tokens::calculate_token_id; +use platform_value::Identifier; + +/// A trait that contains getter and setter methods for `TokenBaseTransitionV0` +pub trait TokenBaseTransitionV0Methods { + /// Returns the document type name. + fn token_contract_position(&self) -> u16; + + /// Sets the token id. + fn set_token_contract_position(&mut self, token_id: u16); + + /// Returns the data contract ID. + fn data_contract_id(&self) -> Identifier; + fn data_contract_id_ref(&self) -> &Identifier; + + /// Calculates the token ID. + fn calculate_token_id(&self) -> Identifier { + calculate_token_id( + self.data_contract_id().as_bytes(), + self.token_contract_position(), + ) + .into() + } + + /// Returns the token ID. + fn token_id(&self) -> Identifier; + fn token_id_ref(&self) -> &Identifier; + + fn set_token_id(&mut self, token_id: Identifier); + + /// Returns the group ID. + fn group_position(&self) -> Option<GroupContractPosition>; + + fn using_group_info(&self) -> Option<GroupStateTransitionInfo>; + + fn set_using_group_info(&mut self, group_info: Option<GroupStateTransitionInfo>); + + /// Sets the data contract ID. + fn set_data_contract_id(&mut self, data_contract_id: Identifier); + fn identity_contract_nonce(&self) -> IdentityNonce; + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); +} + +impl TokenBaseTransitionV0Methods for TokenBaseTransitionV0 { + fn token_contract_position(&self) -> u16 { + self.token_contract_position + } + + fn set_token_contract_position(&mut self, token_contract_position: u16) { + self.token_contract_position = token_contract_position; + } + + fn data_contract_id(&self) -> Identifier { + self.data_contract_id + } + + fn data_contract_id_ref(&self) -> &Identifier { + &self.data_contract_id + } + + fn token_id(&self) -> Identifier { + self.token_id + } + + fn token_id_ref(&self) -> &Identifier { + &self.token_id + } + + fn set_data_contract_id(&mut self, data_contract_id: Identifier) { + self.data_contract_id = data_contract_id; + } + + fn set_token_id(&mut self, token_id: Identifier) { + self.token_id = token_id; + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + self.identity_contract_nonce + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + self.identity_contract_nonce = identity_contract_nonce; + } + + fn group_position(&self) -> Option<GroupContractPosition> { + self.using_group_info + .as_ref() + .map(|info| info.group_contract_position) + } + + fn set_using_group_info(&mut self, group_info: Option<GroupStateTransitionInfo>) { + self.using_group_info = group_info; + } + + fn using_group_info(&self) -> Option<GroupStateTransitionInfo> { + self.using_group_info + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0_methods.rs new file mode 100644 index 00000000000..5eeffbf6ff0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_base_transition/v0_methods.rs @@ -0,0 +1,86 @@ +use crate::data_contract::GroupContractPosition; +use crate::group::GroupStateTransitionInfo; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use platform_value::Identifier; + +impl TokenBaseTransitionV0Methods for TokenBaseTransition { + fn token_contract_position(&self) -> u16 { + match self { + TokenBaseTransition::V0(v0) => v0.token_contract_position(), + } + } + + fn set_token_contract_position(&mut self, token_id: u16) { + match self { + TokenBaseTransition::V0(v0) => v0.set_token_contract_position(token_id), + } + } + + fn data_contract_id(&self) -> Identifier { + match self { + TokenBaseTransition::V0(v0) => v0.data_contract_id(), + } + } + + fn data_contract_id_ref(&self) -> &Identifier { + match self { + TokenBaseTransition::V0(v0) => v0.data_contract_id_ref(), + } + } + + fn token_id(&self) -> Identifier { + match self { + TokenBaseTransition::V0(v0) => v0.token_id(), + } + } + + fn token_id_ref(&self) -> &Identifier { + match self { + TokenBaseTransition::V0(v0) => v0.token_id_ref(), + } + } + + fn set_token_id(&mut self, token_id: Identifier) { + match self { + TokenBaseTransition::V0(v0) => v0.set_token_id(token_id), + } + } + + fn group_position(&self) -> Option<GroupContractPosition> { + match self { + TokenBaseTransition::V0(v0) => v0.group_position(), + } + } + + fn using_group_info(&self) -> Option<GroupStateTransitionInfo> { + match self { + TokenBaseTransition::V0(v0) => v0.using_group_info(), + } + } + + fn set_using_group_info(&mut self, group_info: Option<GroupStateTransitionInfo>) { + match self { + TokenBaseTransition::V0(v0) => v0.set_using_group_info(group_info), + } + } + + fn set_data_contract_id(&mut self, data_contract_id: Identifier) { + match self { + TokenBaseTransition::V0(v0) => v0.set_data_contract_id(data_contract_id), + } + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + TokenBaseTransition::V0(v0) => v0.identity_contract_nonce, + } + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + match self { + TokenBaseTransition::V0(v0) => v0.identity_contract_nonce = identity_contract_nonce, + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/mod.rs new file mode 100644 index 00000000000..5c07e9a97de --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/mod.rs @@ -0,0 +1,24 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenBurnTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenBurnTransition { + #[display("V0({})", "_0")] + V0(TokenBurnTransitionV0), +} + +impl Default for TokenBurnTransition { + fn default() -> Self { + TokenBurnTransition::V0(TokenBurnTransitionV0::default()) // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/mod.rs new file mode 100644 index 00000000000..dc07a538271 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/mod.rs @@ -0,0 +1,38 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use derive_more::Display; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +mod property_names { + pub const AMOUNT: &str = "$amount"; +} +/// The Identifier fields in [`TokenBurnTransition`] +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display("Base: {base}, Amount: {burn_amount}")] +pub struct TokenBurnTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "burnAmount") + )] + /// How much should we burn + pub burn_amount: u64, + /// The public note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "publicNote") + )] + pub public_note: Option<String>, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..ee24438ecf4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0/v0_methods.rs @@ -0,0 +1,75 @@ +use platform_value::Identifier; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_burn_transition::TokenBurnTransitionV0; +use crate::state_transition::batch_transition::TokenBurnTransition; + +impl TokenBaseTransitionAccessors for TokenBurnTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenBurnTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + fn burn_amount(&self) -> u64; + + fn set_burn_amount(&mut self, amount: u64); + + /// Returns the `public_note` field of the `TokenBurnTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenBurnTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the `public_note` field in the `TokenBurnTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenBurnTransitionV0Methods for TokenBurnTransitionV0 { + fn burn_amount(&self) -> u64 { + self.burn_amount + } + + fn set_burn_amount(&mut self, amount: u64) { + self.burn_amount = amount; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} + +impl AllowedAsMultiPartyAction for TokenBurnTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenBurnTransitionV0 { + base, burn_amount, .. + } = self; + + TokenBurnTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + *burn_amount, + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0_methods.rs new file mode 100644 index 00000000000..d37a08463fe --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_burn_transition/v0_methods.rs @@ -0,0 +1,86 @@ +use platform_value::Identifier; +use crate::balances::credits::TokenAmount; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_burn_transition::TokenBurnTransition; +use crate::state_transition::batch_transition::token_burn_transition::v0::v0_methods::TokenBurnTransitionV0Methods; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenBurnTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenBurnTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenBurnTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenBurnTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenBurnTransitionV0Methods for TokenBurnTransition { + fn burn_amount(&self) -> u64 { + match self { + TokenBurnTransition::V0(v0) => v0.burn_amount(), + } + } + + fn set_burn_amount(&mut self, burn_amount: u64) { + match self { + TokenBurnTransition::V0(v0) => v0.set_burn_amount(burn_amount), + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenBurnTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenBurnTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenBurnTransition::V0(v0) => v0.set_public_note(public_note), + } + } +} + +impl AllowedAsMultiPartyAction for TokenBurnTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenBurnTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenBurnTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + burn_amount: TokenAmount, + ) -> Identifier { + let mut bytes = b"action_token_burn".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(&burn_amount.to_be_bytes()); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/mod.rs new file mode 100644 index 00000000000..f9e937cb3d3 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/mod.rs @@ -0,0 +1,25 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenConfigUpdateTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenConfigUpdateTransition { + #[display("V0({})", "_0")] + V0(TokenConfigUpdateTransitionV0), +} + +impl Default for TokenConfigUpdateTransition { + fn default() -> Self { + TokenConfigUpdateTransition::V0(TokenConfigUpdateTransitionV0::default()) + // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/mod.rs new file mode 100644 index 00000000000..e49ba00050b --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/mod.rs @@ -0,0 +1,27 @@ +pub mod v0_methods; + +/// The Identifier fields in [`TokenConfigUpdateTransition`] +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use derive_more::Display; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display("Base: {base}, change: {update_token_configuration_item}")] +pub struct TokenConfigUpdateTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + /// Updated token configuration item + pub update_token_configuration_item: TokenConfigurationChangeItem, + /// The public note + pub public_note: Option<String>, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..a9e24acc377 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0/v0_methods.rs @@ -0,0 +1,86 @@ +use platform_value::Identifier; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_config_update_transition::TokenConfigUpdateTransitionV0; +use crate::state_transition::batch_transition::TokenConfigUpdateTransition; + +impl TokenBaseTransitionAccessors for TokenConfigUpdateTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenConfigUpdateTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + /// Returns the `update_token_configuration_item` + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem; + + /// Sets the `update_token_configuration_item` + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ); + + /// Returns the `public_note` field of the `TokenConfigUpdateTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenConfigUpdateTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the `public_note` field in the `TokenConfigUpdateTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenConfigUpdateTransitionV0Methods for TokenConfigUpdateTransitionV0 { + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem { + &self.update_token_configuration_item + } + + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ) { + self.update_token_configuration_item = update_token_configuration_item; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} + +impl AllowedAsMultiPartyAction for TokenConfigUpdateTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenConfigUpdateTransitionV0 { + base, + update_token_configuration_item, + .. + } = self; + + TokenConfigUpdateTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + update_token_configuration_item.u8_item_index(), + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0_methods.rs new file mode 100644 index 00000000000..b16720f136c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_config_update_transition/v0_methods.rs @@ -0,0 +1,91 @@ +use platform_value::Identifier; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_config_update_transition::TokenConfigUpdateTransition; +use crate::state_transition::batch_transition::token_config_update_transition::v0::v0_methods::TokenConfigUpdateTransitionV0Methods; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenConfigUpdateTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenConfigUpdateTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenConfigUpdateTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenConfigUpdateTransitionV0Methods for TokenConfigUpdateTransition { + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.update_token_configuration_item(), + } + } + + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ) { + match self { + TokenConfigUpdateTransition::V0(v0) => { + v0.set_update_token_configuration_item(update_token_configuration_item) + } + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.set_public_note(public_note), + } + } +} + +impl AllowedAsMultiPartyAction for TokenConfigUpdateTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenConfigUpdateTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenConfigUpdateTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + update_token_config_item: u8, + ) -> Identifier { + let mut bytes = b"action_token_config_update".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(&[update_token_config_item]); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/mod.rs new file mode 100644 index 00000000000..5d1cd01d774 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/mod.rs @@ -0,0 +1,25 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenDestroyFrozenFundsTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenDestroyFrozenFundsTransition { + #[display("V0({})", "_0")] + V0(TokenDestroyFrozenFundsTransitionV0), +} + +impl Default for TokenDestroyFrozenFundsTransition { + fn default() -> Self { + TokenDestroyFrozenFundsTransition::V0(TokenDestroyFrozenFundsTransitionV0::default()) + // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/mod.rs new file mode 100644 index 00000000000..251ff821914 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/mod.rs @@ -0,0 +1,25 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use derive_more::Display; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display("Base: {base}, Destroyed Account Identity ID: {frozen_identity_id}")] +pub struct TokenDestroyFrozenFundsTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + /// The identity id of the account whose balance should be destroyed + pub frozen_identity_id: Identifier, + /// The public note + pub public_note: Option<String>, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..ccd6c0b24ce --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0/v0_methods.rs @@ -0,0 +1,78 @@ +use platform_value::Identifier; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransitionV0; +use crate::state_transition::batch_transition::TokenDestroyFrozenFundsTransition; + +impl TokenBaseTransitionAccessors for TokenDestroyFrozenFundsTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenDestroyFrozenFundsTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + /// Returns the `public_note` field of the `TokenDestroyFrozenFundsTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenDestroyFrozenFundsTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the `public_note` field in the `TokenDestroyFrozenFundsTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `frozen_identity_id` field of the `TokenFreezeTransitionV0`. + fn frozen_identity_id(&self) -> Identifier; + + /// Sets the value of the `frozen_identity_id` field in the `TokenFreezeTransitionV0`. + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier); +} + +impl TokenDestroyFrozenFundsTransitionV0Methods for TokenDestroyFrozenFundsTransitionV0 { + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn frozen_identity_id(&self) -> Identifier { + self.frozen_identity_id + } + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + self.frozen_identity_id = frozen_identity_id; + } +} + +impl AllowedAsMultiPartyAction for TokenDestroyFrozenFundsTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenDestroyFrozenFundsTransitionV0 { + base, + frozen_identity_id, + .. + } = self; + + TokenDestroyFrozenFundsTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + frozen_identity_id.as_bytes(), + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0_methods.rs new file mode 100644 index 00000000000..e0560b49498 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_destroy_frozen_funds_transition/v0_methods.rs @@ -0,0 +1,87 @@ +use platform_value::Identifier; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransition; +use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::v0::v0_methods::TokenDestroyFrozenFundsTransitionV0Methods; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenDestroyFrozenFundsTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenDestroyFrozenFundsTransitionV0Methods for TokenDestroyFrozenFundsTransition { + fn public_note(&self) -> Option<&String> { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.set_public_note(public_note), + } + } + + fn frozen_identity_id(&self) -> Identifier { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.frozen_identity_id(), + } + } + + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => { + v0.set_frozen_identity_id(frozen_identity_id) + } + } + } +} + +impl AllowedAsMultiPartyAction for TokenDestroyFrozenFundsTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenDestroyFrozenFundsTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenDestroyFrozenFundsTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + target_id: &[u8; 32], + ) -> Identifier { + let mut bytes = b"action_token_destroy".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(target_id); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/mod.rs new file mode 100644 index 00000000000..b338e9e75eb --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/mod.rs @@ -0,0 +1,25 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenEmergencyActionTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenEmergencyActionTransition { + #[display("V0({})", "_0")] + V0(TokenEmergencyActionTransitionV0), +} + +impl Default for TokenEmergencyActionTransition { + fn default() -> Self { + TokenEmergencyActionTransition::V0(TokenEmergencyActionTransitionV0::default()) + // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/mod.rs new file mode 100644 index 00000000000..18ea3f89b6d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/mod.rs @@ -0,0 +1,30 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::tokens::emergency_action::TokenEmergencyAction; +use bincode::{Decode, Encode}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::fmt; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct TokenEmergencyActionTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + /// The emergency action + pub emergency_action: TokenEmergencyAction, + /// The public note + pub public_note: Option<String>, +} + +impl fmt::Display for TokenEmergencyActionTransitionV0 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Base: {}", self.base) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..02abb8e415e --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0/v0_methods.rs @@ -0,0 +1,80 @@ +use platform_value::Identifier; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::batched_transition::token_emergency_action_transition::TokenEmergencyActionTransitionV0; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::TokenEmergencyActionTransition; +use crate::tokens::emergency_action::TokenEmergencyAction; + +impl TokenBaseTransitionAccessors for TokenEmergencyActionTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenEmergencyActionTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + /// Returns the `public_note` field of the `TokenEmergencyActionTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenEmergencyActionTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenEmergencyActionTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `emergency_action` field of the `TokenEmergencyActionTransitionV0`. + fn emergency_action(&self) -> TokenEmergencyAction; + + /// Sets the value of the `emergency_action` field in the `TokenEmergencyActionTransitionV0`. + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction); +} + +impl TokenEmergencyActionTransitionV0Methods for TokenEmergencyActionTransitionV0 { + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn emergency_action(&self) -> TokenEmergencyAction { + self.emergency_action + } + + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction) { + self.emergency_action = emergency_action; + } +} + +impl AllowedAsMultiPartyAction for TokenEmergencyActionTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenEmergencyActionTransitionV0 { + base, + emergency_action, + .. + } = self; + + TokenEmergencyActionTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + *emergency_action, + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0_methods.rs new file mode 100644 index 00000000000..c57cf214ae2 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_emergency_action_transition/v0_methods.rs @@ -0,0 +1,86 @@ +use platform_value::Identifier; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::batched_transition::token_emergency_action_transition::v0::v0_methods::TokenEmergencyActionTransitionV0Methods; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::TokenEmergencyActionTransition; +use crate::tokens::emergency_action::TokenEmergencyAction; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenEmergencyActionTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenEmergencyActionTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenEmergencyActionTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenEmergencyActionTransitionV0Methods for TokenEmergencyActionTransition { + fn public_note(&self) -> Option<&String> { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.set_public_note(public_note), + } + } + + fn emergency_action(&self) -> TokenEmergencyAction { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.emergency_action(), + } + } + + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction) { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.set_emergency_action(emergency_action), + } + } +} + +impl AllowedAsMultiPartyAction for TokenEmergencyActionTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenEmergencyActionTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenEmergencyActionTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + emergency_action: TokenEmergencyAction, + ) -> Identifier { + let mut bytes = b"action_token_emergency_action".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(&[emergency_action as u8]); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/mod.rs new file mode 100644 index 00000000000..844454a6610 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/mod.rs @@ -0,0 +1,24 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenFreezeTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenFreezeTransition { + #[display("V0({})", "_0")] + V0(TokenFreezeTransitionV0), +} + +impl Default for TokenFreezeTransition { + fn default() -> Self { + TokenFreezeTransition::V0(TokenFreezeTransitionV0::default()) // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/mod.rs new file mode 100644 index 00000000000..63ac477933e --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/mod.rs @@ -0,0 +1,46 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::fmt; + +/// The Identifier fields in [`TokenFreezeTransition`] +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct TokenFreezeTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + /// The identity that we are freezing + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "frozenIdentityId") + )] + pub identity_to_freeze_id: Identifier, + /// The public note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "publicNote") + )] + pub public_note: Option<String>, +} + +impl fmt::Display for TokenFreezeTransitionV0 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Format the base transition (assuming `TokenBaseTransition` implements Display) + write!( + f, + "Base: {}, Froze: {}", + self.base, self.identity_to_freeze_id + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..78a9555038c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0/v0_methods.rs @@ -0,0 +1,78 @@ +use platform_value::Identifier; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_freeze_transition::TokenFreezeTransitionV0; +use crate::state_transition::batch_transition::TokenFreezeTransition; + +impl TokenBaseTransitionAccessors for TokenFreezeTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenFreezeTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + /// Returns the `public_note` field of the `TokenFreezeTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenFreezeTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenFreezeTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `frozen_identity_id` field of the `TokenFreezeTransitionV0`. + fn frozen_identity_id(&self) -> Identifier; + + /// Sets the value of the `frozen_identity_id` field in the `TokenFreezeTransitionV0`. + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier); +} + +impl TokenFreezeTransitionV0Methods for TokenFreezeTransitionV0 { + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn frozen_identity_id(&self) -> Identifier { + self.identity_to_freeze_id + } + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + self.identity_to_freeze_id = frozen_identity_id; + } +} + +impl AllowedAsMultiPartyAction for TokenFreezeTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenFreezeTransitionV0 { + base, + identity_to_freeze_id: frozen_identity_id, + .. + } = self; + + TokenFreezeTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + frozen_identity_id.as_bytes(), + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0_methods.rs new file mode 100644 index 00000000000..fc4642abefb --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_freeze_transition/v0_methods.rs @@ -0,0 +1,85 @@ +use platform_value::Identifier; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_freeze_transition::v0::v0_methods::TokenFreezeTransitionV0Methods; +use crate::state_transition::batch_transition::TokenFreezeTransition; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenFreezeTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenFreezeTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenFreezeTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenFreezeTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenFreezeTransitionV0Methods for TokenFreezeTransition { + fn public_note(&self) -> Option<&String> { + match self { + TokenFreezeTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenFreezeTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenFreezeTransition::V0(v0) => v0.set_public_note(public_note), + } + } + + fn frozen_identity_id(&self) -> Identifier { + match self { + TokenFreezeTransition::V0(v0) => v0.frozen_identity_id(), + } + } + + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + match self { + TokenFreezeTransition::V0(v0) => v0.set_frozen_identity_id(frozen_identity_id), + } + } +} + +impl AllowedAsMultiPartyAction for TokenFreezeTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenFreezeTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenFreezeTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + target_id: &[u8; 32], + ) -> Identifier { + let mut bytes = b"action_token_freeze".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(target_id); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/mod.rs new file mode 100644 index 00000000000..a37fe199c3a --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/mod.rs @@ -0,0 +1,24 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenMintTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenMintTransition { + #[display("V0({})", "_0")] + V0(TokenMintTransitionV0), +} + +impl Default for TokenMintTransition { + fn default() -> Self { + TokenMintTransition::V0(TokenMintTransitionV0::default()) // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/mod.rs new file mode 100644 index 00000000000..da8079655a5 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/mod.rs @@ -0,0 +1,59 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use platform_value::string_encoding::Encoding; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::fmt; + +mod property_names { + pub const AMOUNT: &str = "$amount"; +} +/// The Identifier fields in [`TokenMintTransition`] +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct TokenMintTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "issuedToIdentityId") + )] + /// Who should we issue the token to? If this is not set then we issue to the identity set in + /// contract settings. If such an operation is allowed. + pub issued_to_identity_id: Option<Identifier>, + + /// How much should we issue + pub amount: u64, + /// The public note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "publicNote") + )] + pub public_note: Option<String>, +} + +impl fmt::Display for TokenMintTransitionV0 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Format the base transition (assuming `TokenBaseTransition` implements Display) + write!( + f, + "Base: {}, Amount: {}, To: {}", + self.base, // Assuming `TokenBaseTransition` implements `Display` + self.amount, + self.issued_to_identity_id + .as_ref() + .map_or("(Identity Set By Contract)".to_string(), |id| id + .to_string(Encoding::Base58)) + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..3b3694a442d --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0/v0_methods.rs @@ -0,0 +1,112 @@ +use platform_value::Identifier; +use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::ProtocolError; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_mint_transition::TokenMintTransitionV0; +use crate::state_transition::batch_transition::TokenMintTransition; +use crate::tokens::errors::TokenError; + +impl TokenBaseTransitionAccessors for TokenMintTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenMintTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + fn amount(&self) -> u64; + + fn set_amount(&mut self, amount: u64); + + /// Returns the `public_note` field of the `TokenMintTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenMintTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenMintTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `issued_to_identity_id` field of the `TokenMintTransitionV0`. + fn issued_to_identity_id(&self) -> Option<Identifier>; + fn recipient_id( + &self, + token_configuration: &TokenConfiguration, + ) -> Result<Identifier, ProtocolError>; + + /// Sets the value of the `issued_to_identity_id` field in the `TokenMintTransitionV0`. + fn set_issued_to_identity_id(&mut self, issued_to_identity_id: Option<Identifier>); +} + +impl TokenMintTransitionV0Methods for TokenMintTransitionV0 { + fn amount(&self) -> u64 { + self.amount + } + + fn set_amount(&mut self, amount: u64) { + self.amount = amount; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn issued_to_identity_id(&self) -> Option<Identifier> { + self.issued_to_identity_id + } + + fn recipient_id( + &self, + token_configuration: &TokenConfiguration, + ) -> Result<Identifier, ProtocolError> { + match self.issued_to_identity_id() { + None => token_configuration + .distribution_rules() + .new_tokens_destination_identity() + .copied() + .ok_or(ProtocolError::Token( + TokenError::TokenNoMintingRecipient.into(), + )), + Some(recipient) => Ok(recipient), + } + } + + fn set_issued_to_identity_id(&mut self, issued_to_identity_id: Option<Identifier>) { + self.issued_to_identity_id = issued_to_identity_id; + } +} + +impl AllowedAsMultiPartyAction for TokenMintTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenMintTransitionV0 { base, amount, .. } = self; + + TokenMintTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + *amount, + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0_methods.rs new file mode 100644 index 00000000000..b956f1f71c4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_mint_transition/v0_methods.rs @@ -0,0 +1,109 @@ +use platform_value::Identifier; +use crate::balances::credits::TokenAmount; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_mint_transition::TokenMintTransition; +use crate::state_transition::batch_transition::token_mint_transition::v0::v0_methods::TokenMintTransitionV0Methods; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenMintTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenMintTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenMintTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenMintTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenMintTransitionV0Methods for TokenMintTransition { + fn amount(&self) -> u64 { + match self { + TokenMintTransition::V0(v0) => v0.amount(), + } + } + + fn set_amount(&mut self, amount: u64) { + match self { + TokenMintTransition::V0(v0) => v0.set_amount(amount), + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenMintTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenMintTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenMintTransition::V0(v0) => v0.set_public_note(public_note), + } + } + + fn issued_to_identity_id(&self) -> Option<Identifier> { + match self { + TokenMintTransition::V0(v0) => v0.issued_to_identity_id(), + } + } + + fn recipient_id( + &self, + token_configuration: &TokenConfiguration, + ) -> Result<Identifier, ProtocolError> { + match self { + TokenMintTransition::V0(v0) => v0.recipient_id(token_configuration), + } + } + + fn set_issued_to_identity_id(&mut self, issued_to_identity_id: Option<Identifier>) { + match self { + TokenMintTransition::V0(v0) => v0.set_issued_to_identity_id(issued_to_identity_id), + } + } +} + +impl AllowedAsMultiPartyAction for TokenMintTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenMintTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenMintTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + mint_amount: TokenAmount, + ) -> Identifier { + let mut bytes = b"action_token_mint".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(&mint_amount.to_be_bytes()); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/mod.rs new file mode 100644 index 00000000000..39c8a54695f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/mod.rs @@ -0,0 +1,18 @@ +pub mod v0; +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::*; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenTransferTransition { + #[display("V0({})", "_0")] + V0(TokenTransferTransitionV0), +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs new file mode 100644 index 00000000000..de433c3510f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/mod.rs @@ -0,0 +1,61 @@ +pub mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::Display; + +pub use super::super::token_base_transition::IDENTIFIER_FIELDS; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +mod property_names { + pub const AMOUNT: &str = "$amount"; + pub const RECIPIENT_OWNER_ID: &str = "recipientOwnerId"; +} + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +#[display( + "Base: {}, Amount: {}, Recipient: {:?}", + "base", + "amount", + "recipient_owner_id" +)] +pub struct TokenTransferTransitionV0 { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "$amount") + )] + pub amount: u64, + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "recipientId") + )] + pub recipient_id: Identifier, + /// The public note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "publicNote") + )] + pub public_note: Option<String>, + /// An optional shared encrypted note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "sharedEncryptedNote") + )] + pub shared_encrypted_note: Option<SharedEncryptedNote>, + /// An optional private encrypted note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "privateEncryptedNote") + )] + pub private_encrypted_note: Option<PrivateEncryptedNote>, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..710f4cfdb04 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0/v0_methods.rs @@ -0,0 +1,199 @@ +use platform_value::Identifier; +use crate::prelude::{DerivationEncryptionKeyIndex, RecipientKeyIndex, RootEncryptionKeyIndex, SenderKeyIndex}; +use crate::state_transition::batch_transition::batched_transition::token_transfer_transition::TokenTransferTransitionV0; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; + +impl TokenBaseTransitionAccessors for TokenTransferTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenTransferTransitionV0Methods: TokenBaseTransitionAccessors { + /// Returns the `amount` field of the `TokenTransferTransitionV0`. + fn amount(&self) -> u64; + + /// Sets the value of the `amount` field in the `TokenTransferTransitionV0`. + fn set_amount(&mut self, amount: u64); + + /// Returns the `recipient_owner_id` field of the `TokenTransferTransitionV0`. + fn recipient_id(&self) -> Identifier; + + /// Returns a reference to the `recipient_owner_id` field of the `TokenTransferTransitionV0`. + fn recipient_id_ref(&self) -> &Identifier; + + /// Sets the value of the `recipient_owner_id` field in the `TokenTransferTransitionV0`. + fn set_recipient_id(&mut self, recipient_owner_id: Identifier); + + /// Returns the `public_note` field of the `TokenTransferTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenTransferTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenTransferTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `shared_encrypted_note` field of the `TokenTransferTransitionV0`. + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote>; + + /// Returns the owned `shared_encrypted_note` field of the `TokenTransferTransitionV0`. + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote>; + + /// Sets the value of the `shared_encrypted_note` field in the `TokenTransferTransitionV0`. + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>); + + /// Returns the `private_encrypted_note` field of the `TokenTransferTransitionV0`. + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>; + + /// Returns the owned `private_encrypted_note` field of the `TokenTransferTransitionV0`. + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>; + + /// Sets the value of the `private_encrypted_note` field in the `TokenTransferTransitionV0`. + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>); + + /// Returns all notes (public, shared, and private) as owned values in a tuple. + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ); + + /// Returns all notes (public, shared, and private) as cloned values in a tuple. + fn notes( + &self, + ) -> ( + Option<String>, + Option<(SenderKeyIndex, RecipientKeyIndex, Vec<u8>)>, + Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>, + ); +} + +impl TokenTransferTransitionV0Methods for TokenTransferTransitionV0 { + fn amount(&self) -> u64 { + self.amount + } + + fn set_amount(&mut self, amount: u64) { + self.amount = amount; + } + + fn recipient_id(&self) -> Identifier { + self.recipient_id + } + + fn recipient_id_ref(&self) -> &Identifier { + &self.recipient_id + } + + fn set_recipient_id(&mut self, recipient_owner_id: Identifier) { + self.recipient_id = recipient_owner_id; + } + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote> { + self.shared_encrypted_note.as_ref() + } + + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote> { + self.shared_encrypted_note + } + + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>) { + self.shared_encrypted_note = shared_encrypted_note; + } + + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + self.private_encrypted_note.as_ref() + } + + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + self.private_encrypted_note + } + + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>) { + self.private_encrypted_note = private_encrypted_note; + } + + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + ( + self.public_note, + self.shared_encrypted_note, + self.private_encrypted_note, + ) + } + + fn notes( + &self, + ) -> ( + Option<String>, + Option<(SenderKeyIndex, RecipientKeyIndex, Vec<u8>)>, + Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>, + ) { + ( + self.public_note.clone(), + self.shared_encrypted_note.clone(), + self.private_encrypted_note.clone(), + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs new file mode 100644 index 00000000000..aff9670182f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transfer_transition/v0_methods.rs @@ -0,0 +1,163 @@ +use platform_value::Identifier; +use crate::prelude::{DerivationEncryptionKeyIndex, RecipientKeyIndex, RootEncryptionKeyIndex, SenderKeyIndex}; +use crate::state_transition::batch_transition::batched_transition::token_transfer_transition::v0::v0_methods::TokenTransferTransitionV0Methods; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::TokenTransferTransition; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; + +impl TokenBaseTransitionAccessors for TokenTransferTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenTransferTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenTransferTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenTransferTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenTransferTransitionV0Methods for TokenTransferTransition { + fn amount(&self) -> u64 { + match self { + TokenTransferTransition::V0(v0) => v0.amount, + } + } + + fn set_amount(&mut self, amount: u64) { + match self { + TokenTransferTransition::V0(v0) => v0.amount = amount, + } + } + + fn recipient_id(&self) -> Identifier { + match self { + TokenTransferTransition::V0(v0) => v0.recipient_id, + } + } + + fn recipient_id_ref(&self) -> &Identifier { + match self { + TokenTransferTransition::V0(v0) => &v0.recipient_id, + } + } + + fn set_recipient_id(&mut self, recipient_id: Identifier) { + match self { + TokenTransferTransition::V0(v0) => v0.recipient_id = recipient_id, + } + } + + // Methods for `public_note` + fn public_note(&self) -> Option<&String> { + match self { + TokenTransferTransition::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenTransferTransition::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenTransferTransition::V0(v0) => v0.public_note = public_note, + } + } + + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote> { + match self { + TokenTransferTransition::V0(v0) => v0.shared_encrypted_note.as_ref(), + } + } + + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote> { + match self { + TokenTransferTransition::V0(v0) => v0.shared_encrypted_note, + } + } + + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>) { + match self { + TokenTransferTransition::V0(v0) => v0.shared_encrypted_note = shared_encrypted_note, + } + } + + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + match self { + TokenTransferTransition::V0(v0) => v0.private_encrypted_note.as_ref(), + } + } + + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + match self { + TokenTransferTransition::V0(v0) => v0.private_encrypted_note, + } + } + + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>) { + match self { + TokenTransferTransition::V0(v0) => v0.private_encrypted_note = private_encrypted_note, + } + } + + // Method to return all notes as owned values + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + match self { + TokenTransferTransition::V0(v0) => ( + v0.public_note, + v0.shared_encrypted_note, + v0.private_encrypted_note, + ), + } + } + + fn notes( + &self, + ) -> ( + Option<String>, + Option<(SenderKeyIndex, RecipientKeyIndex, Vec<u8>)>, + Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>, + ) { + match self { + TokenTransferTransition::V0(v0) => ( + v0.public_note.clone(), + v0.shared_encrypted_note.clone(), + v0.private_encrypted_note.clone(), + ), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition.rs new file mode 100644 index 00000000000..255c968c369 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition.rs @@ -0,0 +1,387 @@ +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use platform_value::Identifier; +use bincode::{Encode, Decode}; +use platform_version::version::PlatformVersion; +use crate::balances::credits::TokenAmount; +use crate::block::block_info::BlockInfo; +use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use crate::data_contract::associated_token::token_configuration::TokenConfiguration; +use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use crate::data_contract::DataContract; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::Document; +use crate::prelude::IdentityNonce; +use crate::ProtocolError; +use crate::state_transition::batch_transition::{DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, TokenBurnTransition, TokenConfigUpdateTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, TokenFreezeTransition, TokenMintTransition, TokenTransferTransition}; +use crate::state_transition::batch_transition::batched_transition::{DocumentPurchaseTransition, DocumentTransferTransition}; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::batched_transition::token_unfreeze_transition::TokenUnfreezeTransition; +use crate::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_burn_transition::v0::v0_methods::TokenBurnTransitionV0Methods; +use crate::state_transition::batch_transition::token_config_update_transition::v0::v0_methods::TokenConfigUpdateTransitionV0Methods; +use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::v0::v0_methods::TokenDestroyFrozenFundsTransitionV0Methods; +use crate::state_transition::batch_transition::token_emergency_action_transition::v0::v0_methods::TokenEmergencyActionTransitionV0Methods; +use crate::state_transition::batch_transition::token_freeze_transition::v0::v0_methods::TokenFreezeTransitionV0Methods; +use crate::state_transition::batch_transition::token_mint_transition::v0::v0_methods::TokenMintTransitionV0Methods; +use crate::state_transition::batch_transition::token_transfer_transition::v0::v0_methods::TokenTransferTransitionV0Methods; +use crate::state_transition::batch_transition::token_unfreeze_transition::v0::v0_methods::TokenUnfreezeTransitionV0Methods; +use crate::tokens::token_event::TokenEvent; + +pub const TOKEN_HISTORY_ID_BYTES: [u8; 32] = [ + 45, 67, 89, 21, 34, 216, 145, 78, 156, 243, 17, 58, 202, 190, 13, 92, 61, 40, 122, 201, 84, 99, + 187, 110, 233, 128, 63, 48, 172, 29, 210, 108, +]; + +#[derive(Debug, Clone, Encode, Decode, From, PartialEq, Display)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenTransition { + #[display("TokenBurnTransition({})", "_0")] + Burn(TokenBurnTransition), + + #[display("TokenIssuanceTransition({})", "_0")] + Mint(TokenMintTransition), + + #[display("TokenTransferTransition({})", "_0")] + Transfer(TokenTransferTransition), + + #[display("TokenFreezeTransition({})", "_0")] + Freeze(TokenFreezeTransition), + + #[display("TokenUnfreezeTransition({})", "_0")] + Unfreeze(TokenUnfreezeTransition), + + #[display("TokenDestroyFrozenFundsTransition({})", "_0")] + DestroyFrozenFunds(TokenDestroyFrozenFundsTransition), + + #[display("TokenEmergencyActionTransition({})", "_0")] + EmergencyAction(TokenEmergencyActionTransition), + + #[display("TokenConfigUpdateTransition({})", "_0")] + ConfigUpdate(TokenConfigUpdateTransition), +} + +impl BatchTransitionResolversV0 for TokenTransition { + fn as_transition_create(&self) -> Option<&DocumentCreateTransition> { + None + } + fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition> { + None + } + + fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition> { + None + } + + fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition> { + None + } + + fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition> { + None + } + + fn as_transition_token_burn(&self) -> Option<&TokenBurnTransition> { + if let Self::Burn(ref t) = self { + Some(t) + } else { + None + } + } + fn as_transition_token_mint(&self) -> Option<&TokenMintTransition> { + if let Self::Mint(ref t) = self { + Some(t) + } else { + None + } + } + + fn as_transition_token_transfer(&self) -> Option<&TokenTransferTransition> { + if let Self::Transfer(ref t) = self { + Some(t) + } else { + None + } + } + + fn as_transition_token_freeze(&self) -> Option<&TokenFreezeTransition> { + if let Self::Freeze(ref t) = self { + Some(t) + } else { + None + } + } + + fn as_transition_token_unfreeze(&self) -> Option<&TokenUnfreezeTransition> { + if let Self::Unfreeze(ref t) = self { + Some(t) + } else { + None + } + } + + fn as_transition_token_destroy_frozen_funds( + &self, + ) -> Option<&TokenDestroyFrozenFundsTransition> { + if let Self::DestroyFrozenFunds(ref t) = self { + Some(t) + } else { + None + } + } + + fn as_transition_token_emergency_action(&self) -> Option<&TokenEmergencyActionTransition> { + if let Self::EmergencyAction(ref t) = self { + Some(t) + } else { + None + } + } +} + +pub trait TokenTransitionV0Methods { + fn base(&self) -> &TokenBaseTransition; + fn base_mut(&mut self) -> &mut TokenBaseTransition; + /// get the data contract ID + fn data_contract_id(&self) -> Identifier; + /// set data contract's ID + fn set_data_contract_id(&mut self, id: Identifier); + + /// get the token ID + fn token_id(&self) -> Identifier; + + /// set the token ID + fn set_token_id(&mut self, id: Identifier); + + /// get the identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; + /// sets identity contract nonce + fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce); + + fn calculate_action_id(&self, owner_id: Identifier) -> Option<Identifier>; + + fn can_calculate_action_id(&self) -> bool; + /// Historical document type name for the token history contract + fn historical_document_type_name(&self) -> &str; + /// Historical document type for the token history contract + fn historical_document_type<'a>( + &self, + token_history_contract: &'a DataContract, + ) -> Result<DocumentTypeRef<'a>, ProtocolError>; + /// Historical document id + fn historical_document_id( + &self, + owner_id: Identifier, + owner_nonce: IdentityNonce, + ) -> Identifier; + fn associated_token_event( + &self, + token_configuration: &TokenConfiguration, + ) -> Result<TokenEvent, ProtocolError>; + /// Historical document id + fn build_historical_document( + &self, + token_historical_contract: &DataContract, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + block_info: &BlockInfo, + token_configuration: &TokenConfiguration, + platform_version: &PlatformVersion, + ) -> Result<Document, ProtocolError>; +} + +impl TokenTransitionV0Methods for TokenTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenTransition::Burn(t) => t.base(), + TokenTransition::Mint(t) => t.base(), + TokenTransition::Transfer(t) => t.base(), + TokenTransition::Freeze(t) => t.base(), + TokenTransition::Unfreeze(t) => t.base(), + TokenTransition::DestroyFrozenFunds(t) => t.base(), + TokenTransition::EmergencyAction(t) => t.base(), + TokenTransition::ConfigUpdate(t) => t.base(), + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenTransition::Burn(t) => t.base_mut(), + TokenTransition::Mint(t) => t.base_mut(), + TokenTransition::Transfer(t) => t.base_mut(), + TokenTransition::Freeze(t) => t.base_mut(), + TokenTransition::Unfreeze(t) => t.base_mut(), + TokenTransition::DestroyFrozenFunds(t) => t.base_mut(), + TokenTransition::EmergencyAction(t) => t.base_mut(), + TokenTransition::ConfigUpdate(t) => t.base_mut(), + } + } + + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + fn calculate_action_id(&self, owner_id: Identifier) -> Option<Identifier> { + match self { + TokenTransition::Burn(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::Mint(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::Freeze(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::Unfreeze(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::Transfer(_) => None, + TokenTransition::DestroyFrozenFunds(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::EmergencyAction(t) => Some(t.calculate_action_id(owner_id)), + TokenTransition::ConfigUpdate(t) => Some(t.calculate_action_id(owner_id)), + } + } + + fn can_calculate_action_id(&self) -> bool { + match self { + TokenTransition::Burn(_) + | TokenTransition::Mint(_) + | TokenTransition::Freeze(_) + | TokenTransition::Unfreeze(_) + | TokenTransition::DestroyFrozenFunds(_) + | TokenTransition::EmergencyAction(_) + | TokenTransition::ConfigUpdate(_) => true, + TokenTransition::Transfer(_) => false, + } + } + + fn set_data_contract_id(&mut self, id: Identifier) { + self.base_mut().set_data_contract_id(id); + } + + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + fn set_token_id(&mut self, token_id: Identifier) { + self.base_mut().set_token_id(token_id) + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + self.base().identity_contract_nonce() + } + + fn set_identity_contract_nonce(&mut self, nonce: IdentityNonce) { + self.base_mut().set_identity_contract_nonce(nonce); + } + + /// Historical document type name for the token history contract + fn historical_document_type_name(&self) -> &str { + match self { + TokenTransition::Burn(_) => "burn", + TokenTransition::Mint(_) => "mint", + TokenTransition::Transfer(_) => "transfer", + TokenTransition::Freeze(_) => "freeze", + TokenTransition::Unfreeze(_) => "unfreeze", + TokenTransition::EmergencyAction(_) => "emergencyAction", + TokenTransition::DestroyFrozenFunds(_) => "destroyFrozenFunds", + TokenTransition::ConfigUpdate(_) => "configUpdate", + } + } + + /// Historical document type for the token history contract + fn historical_document_type<'a>( + &self, + token_history_contract: &'a DataContract, + ) -> Result<DocumentTypeRef<'a>, ProtocolError> { + Ok(token_history_contract.document_type_for_name(self.historical_document_type_name())?) + } + + /// Historical document id + fn historical_document_id( + &self, + owner_id: Identifier, + owner_nonce: IdentityNonce, + ) -> Identifier { + let name = self.historical_document_type_name(); + Document::generate_document_id_v0( + &(TOKEN_HISTORY_ID_BYTES.into()), + &owner_id, + name, + owner_nonce.to_be_bytes().as_slice(), + ) + } + + /// Historical document id + fn build_historical_document( + &self, + token_historical_contract: &DataContract, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + block_info: &BlockInfo, + token_configuration: &TokenConfiguration, + platform_version: &PlatformVersion, + ) -> Result<Document, ProtocolError> { + self.associated_token_event(token_configuration)? + .build_historical_document_owned( + token_historical_contract, + token_id, + owner_id, + owner_nonce, + block_info, + platform_version, + ) + } + + fn associated_token_event( + &self, + token_configuration: &TokenConfiguration, + ) -> Result<TokenEvent, ProtocolError> { + Ok(match self { + TokenTransition::Burn(burn) => { + TokenEvent::Burn(burn.burn_amount(), burn.public_note().cloned()) + } + TokenTransition::Mint(mint) => { + let recipient = match mint.issued_to_identity_id() { + None => token_configuration.distribution_rules().new_tokens_destination_identity().copied().ok_or(ProtocolError::NotSupported("either the mint destination must be set or the contract must have a destination set for new tokens".to_string()))?, + Some(recipient) => recipient, + }; + TokenEvent::Mint(mint.amount(), recipient, mint.public_note().cloned()) + } + TokenTransition::Transfer(transfer) => { + let (public_note, shared_encrypted_note, private_encrypted_note) = transfer.notes(); + TokenEvent::Transfer( + transfer.recipient_id(), + public_note, + shared_encrypted_note, + private_encrypted_note, + transfer.amount(), + ) + } + TokenTransition::Freeze(freeze) => { + TokenEvent::Freeze(freeze.frozen_identity_id(), freeze.public_note().cloned()) + } + TokenTransition::Unfreeze(unfreeze) => TokenEvent::Unfreeze( + unfreeze.frozen_identity_id(), + unfreeze.public_note().cloned(), + ), + TokenTransition::EmergencyAction(emergency_action) => TokenEvent::EmergencyAction( + emergency_action.emergency_action(), + emergency_action.public_note().cloned(), + ), + TokenTransition::DestroyFrozenFunds(destroy_frozen_funds) => { + TokenEvent::DestroyFrozenFunds( + destroy_frozen_funds.frozen_identity_id(), + TokenAmount::MAX, // we do not know how much will be destroyed + destroy_frozen_funds.public_note().cloned(), + ) + } + TokenTransition::ConfigUpdate(config_update) => TokenEvent::ConfigUpdate( + config_update.update_token_configuration_item().clone(), + config_update.public_note().cloned(), + ), + }) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition_action_type.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition_action_type.rs new file mode 100644 index 00000000000..818c492021a --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_transition_action_type.rs @@ -0,0 +1,74 @@ +use std::fmt; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::token_transition::TokenTransition; +use crate::ProtocolError; + +// @append-only +#[derive(Eq, PartialEq, Debug, Copy, Clone, Hash)] +pub enum TokenTransitionActionType { + Burn, + Mint, + Transfer, + Freeze, + Unfreeze, + DestroyFrozenFunds, + EmergencyAction, + ConfigUpdate, +} + +impl fmt::Display for TokenTransitionActionType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let action_str = match self { + TokenTransitionActionType::Burn => "Burn", + TokenTransitionActionType::Mint => "Mint", + TokenTransitionActionType::Transfer => "Transfer", + TokenTransitionActionType::Freeze => "Freeze", + TokenTransitionActionType::Unfreeze => "Unfreeze", + TokenTransitionActionType::DestroyFrozenFunds => "DestroyFrozenFunds", + TokenTransitionActionType::EmergencyAction => "EmergencyAction", + TokenTransitionActionType::ConfigUpdate => "ConfigUpdate", + }; + write!(f, "{}", action_str) + } +} + +pub trait TokenTransitionActionTypeGetter { + fn action_type(&self) -> TokenTransitionActionType; +} + +impl TokenTransitionActionTypeGetter for TokenTransition { + fn action_type(&self) -> TokenTransitionActionType { + match self { + TokenTransition::Burn(_) => TokenTransitionActionType::Burn, + TokenTransition::Mint(_) => TokenTransitionActionType::Mint, + TokenTransition::Transfer(_) => TokenTransitionActionType::Transfer, + TokenTransition::Freeze(_) => TokenTransitionActionType::Freeze, + TokenTransition::Unfreeze(_) => TokenTransitionActionType::Unfreeze, + TokenTransition::DestroyFrozenFunds(_) => TokenTransitionActionType::DestroyFrozenFunds, + TokenTransition::EmergencyAction(_) => TokenTransitionActionType::EmergencyAction, + TokenTransition::ConfigUpdate(_) => TokenTransitionActionType::ConfigUpdate, + } + } +} + +impl TryFrom<&str> for TokenTransitionActionType { + type Error = ProtocolError; + + fn try_from(value: &str) -> Result<Self, Self::Error> { + match value { + "burn" => Ok(TokenTransitionActionType::Burn), + "issuance" => Ok(TokenTransitionActionType::Mint), + "transfer" => Ok(TokenTransitionActionType::Transfer), + "freeze" => Ok(TokenTransitionActionType::Freeze), + "unfreeze" => Ok(TokenTransitionActionType::Unfreeze), + "destroy_frozen_funds" | "destroyFrozenFunds" => { + Ok(TokenTransitionActionType::DestroyFrozenFunds) + } + "emergency_action" | "emergencyAction" => { + Ok(TokenTransitionActionType::EmergencyAction) + } + action_type => Err(ProtocolError::Generic(format!( + "unknown token transition action type {action_type}" + ))), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/mod.rs new file mode 100644 index 00000000000..4cefde0effb --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/mod.rs @@ -0,0 +1,24 @@ +pub mod v0; +mod v0_methods; + +use bincode::{Decode, Encode}; +use derive_more::{Display, From}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +pub use v0::TokenUnfreezeTransitionV0; + +#[derive(Debug, Clone, Encode, Decode, PartialEq, Display, From)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +pub enum TokenUnfreezeTransition { + #[display("V0({})", "_0")] + V0(TokenUnfreezeTransitionV0), +} + +impl Default for TokenUnfreezeTransition { + fn default() -> Self { + TokenUnfreezeTransition::V0(TokenUnfreezeTransitionV0::default()) // since only v0 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/mod.rs new file mode 100644 index 00000000000..a3e86da8d95 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/mod.rs @@ -0,0 +1,42 @@ +pub mod v0_methods; + +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use bincode::{Decode, Encode}; +use platform_value::Identifier; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; +use std::fmt; + +/// The Identifier fields in [`TokenUnfreezeTransition`] +pub use super::super::document_base_transition::IDENTIFIER_FIELDS; + +#[derive(Debug, Clone, Default, Encode, Decode, PartialEq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub struct TokenUnfreezeTransitionV0 { + /// Document Base Transition + #[cfg_attr(feature = "state-transition-serde-conversion", serde(flatten))] + pub base: TokenBaseTransition, + /// The identity that we are freezing + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "frozenIdentityId") + )] + pub frozen_identity_id: Identifier, + /// The public note + #[cfg_attr( + feature = "state-transition-serde-conversion", + serde(rename = "publicNote") + )] + pub public_note: Option<String>, +} + +impl fmt::Display for TokenUnfreezeTransitionV0 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + // Format the base transition (assuming `TokenBaseTransition` implements Display) + write!(f, "Base: {}, Froze: {}", self.base, self.frozen_identity_id) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/v0_methods.rs new file mode 100644 index 00000000000..0559542f7a7 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0/v0_methods.rs @@ -0,0 +1,78 @@ +use platform_value::Identifier; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::batched_transition::token_unfreeze_transition::TokenUnfreezeTransitionV0; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::TokenUnfreezeTransition; + +impl TokenBaseTransitionAccessors for TokenUnfreezeTransitionV0 { + fn base(&self) -> &TokenBaseTransition { + &self.base + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + &mut self.base + } + + fn set_base(&mut self, base: TokenBaseTransition) { + self.base = base; + } +} + +pub trait TokenUnfreezeTransitionV0Methods: + TokenBaseTransitionAccessors + AllowedAsMultiPartyAction +{ + /// Returns the `public_note` field of the `TokenUnfreezeTransitionV0`. + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenUnfreezeTransitionV0`. + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenUnfreezeTransitionV0`. + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the `frozen_identity_id` field of the `TokenUnfreezeTransitionV0`. + fn frozen_identity_id(&self) -> Identifier; + + /// Sets the value of the `frozen_identity_id` field in the `TokenUnfreezeTransitionV0`. + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier); +} + +impl TokenUnfreezeTransitionV0Methods for TokenUnfreezeTransitionV0 { + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn frozen_identity_id(&self) -> Identifier { + self.frozen_identity_id + } + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + self.frozen_identity_id = frozen_identity_id; + } +} + +impl AllowedAsMultiPartyAction for TokenUnfreezeTransitionV0 { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + let TokenUnfreezeTransitionV0 { + base, + frozen_identity_id, + .. + } = self; + + TokenUnfreezeTransition::calculate_action_id_with_fields( + base.token_id().as_bytes(), + owner_id.as_bytes(), + base.identity_contract_nonce(), + frozen_identity_id.as_bytes(), + ) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0_methods.rs new file mode 100644 index 00000000000..b90cf25acbd --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/batched_transition/token_unfreeze_transition/v0_methods.rs @@ -0,0 +1,85 @@ +use platform_value::Identifier; +use crate::prelude::IdentityNonce; +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::state_transition::batch_transition::token_unfreeze_transition::v0::v0_methods::TokenUnfreezeTransitionV0Methods; +use crate::state_transition::batch_transition::TokenUnfreezeTransition; +use crate::util::hash::hash_double; + +impl TokenBaseTransitionAccessors for TokenUnfreezeTransition { + fn base(&self) -> &TokenBaseTransition { + match self { + TokenUnfreezeTransition::V0(v0) => &v0.base, + } + } + + fn base_mut(&mut self) -> &mut TokenBaseTransition { + match self { + TokenUnfreezeTransition::V0(v0) => &mut v0.base, + } + } + + fn set_base(&mut self, base: TokenBaseTransition) { + match self { + TokenUnfreezeTransition::V0(v0) => v0.base = base, + } + } +} + +impl TokenUnfreezeTransitionV0Methods for TokenUnfreezeTransition { + fn public_note(&self) -> Option<&String> { + match self { + TokenUnfreezeTransition::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenUnfreezeTransition::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenUnfreezeTransition::V0(v0) => v0.set_public_note(public_note), + } + } + + fn frozen_identity_id(&self) -> Identifier { + match self { + TokenUnfreezeTransition::V0(v0) => v0.frozen_identity_id(), + } + } + + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + match self { + TokenUnfreezeTransition::V0(v0) => v0.set_frozen_identity_id(frozen_identity_id), + } + } +} + +impl AllowedAsMultiPartyAction for TokenUnfreezeTransition { + fn calculate_action_id(&self, owner_id: Identifier) -> Identifier { + match self { + TokenUnfreezeTransition::V0(v0) => v0.calculate_action_id(owner_id), + } + } +} + +impl TokenUnfreezeTransition { + pub fn calculate_action_id_with_fields( + token_id: &[u8; 32], + owner_id: &[u8; 32], + identity_contract_nonce: IdentityNonce, + target_id: &[u8; 32], + ) -> Identifier { + let mut bytes = b"action_token_unfreeze".to_vec(); + bytes.extend_from_slice(token_id); + bytes.extend_from_slice(owner_id); + bytes.extend_from_slice(&identity_contract_nonce.to_be_bytes()); + bytes.extend_from_slice(target_id); + + hash_double(bytes).into() + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/fields.rs similarity index 93% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/fields.rs index 06f39e42fc0..8a72a2d50c2 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/fields.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/fields.rs @@ -1,7 +1,7 @@ use crate::state_transition::state_transitions; use crate::identity::SecurityLevel; -use crate::state_transition::documents_batch_transition::fields::property_names::{ +use crate::state_transition::batch_transition::fields::property_names::{ OWNER_ID, TRANSITIONS_DATA_CONTRACT_ID, TRANSITIONS_ID, }; pub use state_transitions::common_fields::property_names::{ diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/identity_signed.rs new file mode 100644 index 00000000000..a3aba2340b1 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/identity_signed.rs @@ -0,0 +1,26 @@ +use crate::identity::{KeyID, Purpose, SecurityLevel}; +use crate::state_transition::batch_transition::BatchTransition; +use crate::state_transition::StateTransitionIdentitySigned; + +impl StateTransitionIdentitySigned for BatchTransition { + fn signature_public_key_id(&self) -> KeyID { + match self { + BatchTransition::V0(transition) => transition.signature_public_key_id(), + BatchTransition::V1(transition) => transition.signature_public_key_id(), + } + } + + fn set_signature_public_key_id(&mut self, key_id: KeyID) { + match self { + BatchTransition::V0(transition) => transition.set_signature_public_key_id(key_id), + BatchTransition::V1(transition) => transition.set_signature_public_key_id(key_id), + } + } + + fn security_level_requirement(&self, purpose: Purpose) -> Vec<SecurityLevel> { + match self { + BatchTransition::V0(transition) => transition.security_level_requirement(purpose), + BatchTransition::V1(transition) => transition.security_level_requirement(purpose), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/json_conversion.rs similarity index 52% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/json_conversion.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/json_conversion.rs index 1fb61df8b22..80d5c5c7911 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/json_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/json_conversion.rs @@ -1,5 +1,5 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::state_transitions::documents_batch_transition::fields::*; +use crate::state_transition::batch_transition::BatchTransition; +use crate::state_transition::state_transitions::batch_transition::fields::*; use crate::state_transition::{ JsonStateTransitionSerializationOptions, StateTransitionJsonConvert, }; @@ -7,13 +7,13 @@ use crate::ProtocolError; use serde_json::Number; use serde_json::Value as JsonValue; -impl<'a> StateTransitionJsonConvert<'a> for DocumentsBatchTransition { +impl<'a> StateTransitionJsonConvert<'a> for BatchTransition { fn to_json( &self, options: JsonStateTransitionSerializationOptions, ) -> Result<JsonValue, ProtocolError> { match self { - DocumentsBatchTransition::V0(transition) => { + BatchTransition::V0(transition) => { let mut value = transition.to_json(options)?; let map_value = value.as_object_mut().expect("expected an object"); map_value.insert( @@ -22,6 +22,15 @@ impl<'a> StateTransitionJsonConvert<'a> for DocumentsBatchTransition { ); Ok(value) } + BatchTransition::V1(transition) => { + let mut value = transition.to_json(options)?; + let map_value = value.as_object_mut().expect("expected an object"); + map_value.insert( + STATE_TRANSITION_PROTOCOL_VERSION.to_string(), + JsonValue::Number(Number::from(1)), + ); + Ok(value) + } } } } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs new file mode 100644 index 00000000000..5c7a5381495 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/mod.rs @@ -0,0 +1,919 @@ +#[cfg(feature = "state-transition-signing")] +use crate::balances::credits::TokenAmount; +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::TokenContractPosition; +#[cfg(feature = "state-transition-signing")] +use crate::document::Document; +use crate::fee::Credits; +#[cfg(feature = "state-transition-signing")] +use crate::group::GroupStateTransitionInfoStatus; +#[cfg(feature = "state-transition-signing")] +use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] +use crate::identity::IdentityPublicKey; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; +use crate::state_transition::batch_transition::batched_transition::BatchedTransition; +use crate::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use crate::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use crate::state_transition::batch_transition::BatchTransition; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::{BatchTransitionV0, BatchTransitionV1}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::emergency_action::TokenEmergencyAction; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; +use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; + +pub mod v0; +pub mod v1; + +impl DocumentsBatchTransitionMethodsV0 for BatchTransition { + fn all_document_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { + match self { + BatchTransition::V0(v0) => v0.all_document_purchases_amount(), + BatchTransition::V1(v1) => v1.all_document_purchases_amount(), + } + } + + fn all_conflicting_index_collateral_voting_funds( + &self, + ) -> Result<Option<Credits>, ProtocolError> { + match self { + BatchTransition::V0(v0) => v0.all_conflicting_index_collateral_voting_funds(), + BatchTransition::V1(v1) => v1.all_conflicting_index_collateral_voting_funds(), + } + } + + fn set_transitions(&mut self, transitions: Vec<BatchedTransition>) { + match self { + BatchTransition::V0(v0) => v0.set_transitions(transitions), + BatchTransition::V1(v1) => v1.set_transitions(transitions), + } + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + match self { + BatchTransition::V0(v0) => v0.set_identity_contract_nonce(identity_contract_nonce), + BatchTransition::V1(v1) => v1.set_identity_contract_nonce(identity_contract_nonce), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_creation_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + entropy: [u8; 32], + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + create_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_creation_transition_from_document( + document, + document_type, + entropy, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + create_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_creation_transition_from_document( + document, + document_type, + entropy, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + create_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_created_from_document".to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_replacement_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + replace_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_replacement_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + replace_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_replacement_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + replace_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_replacement_transition_from_document" + .to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + transfer_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_transfer_transition_from_document( + document, + document_type, + recipient_owner_id, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + transfer_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_transfer_transition_from_document( + document, + document_type, + recipient_owner_id, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + transfer_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_replacement_transition_from_document" + .to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_deletion_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_deletion_transition_from_document( + document, + document_type, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_document_deletion_transition_from_document" + .to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + update_price_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_update_price_transition_from_document( + document, + document_type, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_price_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_update_price_transition_from_document( + document, + document_type, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + update_price_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: + "DocumentsBatchTransition::new_document_update_price_transition_from_document" + .to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + new_owner_id: Identifier, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + purchase_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 0 => Ok( + BatchTransitionV0::new_document_purchase_transition_from_document( + document, + document_type, + new_owner_id, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + purchase_feature_version, + base_feature_version, + )?, + ), + 1 => Ok( + BatchTransitionV1::new_document_purchase_transition_from_document( + document, + document_type, + new_owner_id, + price, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + purchase_feature_version, + base_feature_version, + )?, + ), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_document_purchase_transition_from_document" + .to_string(), + known_versions: vec![0, 1], + received: version, + }), + } + } +} + +impl DocumentsBatchTransitionMethodsV1 for BatchTransition { + #[cfg(feature = "state-transition-signing")] + fn new_token_mint_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: TokenContractPosition, + amount: TokenAmount, + issued_to_identity_id: Option<Identifier>, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + BatchTransitionV1::new_token_mint_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + amount, + issued_to_identity_id, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_mint_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_burn_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + BatchTransitionV1::new_token_burn_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + amount, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_burn_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_transfer_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + recipient_id: Identifier, + public_note: Option<String>, + shared_encrypted_note: Option<SharedEncryptedNote>, + private_encrypted_note: Option<PrivateEncryptedNote>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the transfer transition for batch version 1 + BatchTransitionV1::new_token_transfer_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + amount, + recipient_id, + public_note, + shared_encrypted_note, + private_encrypted_note, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_transfer_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_freeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + freeze_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the freeze transition for batch version 1 + BatchTransitionV1::new_token_freeze_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + freeze_identity_id, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_freeze_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_unfreeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + unfreeze_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the freeze transition for batch version 1 + BatchTransitionV1::new_token_unfreeze_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + unfreeze_identity_id, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_unfreeze_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_destroy_frozen_funds_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the destroy frozen funds transition for batch version 1 + BatchTransitionV1::new_token_destroy_frozen_funds_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + frozen_identity_id, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_destroy_frozen_funds_transition" + .to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_emergency_action_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + emergency_action: TokenEmergencyAction, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the emergency action transition for batch version 1 + BatchTransitionV1::new_token_emergency_action_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + emergency_action, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + delete_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_emergency_action_transition" + .to_string(), + known_versions: vec![1], + received: version, + }), + } + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_config_update_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + update_token_configuration_item: TokenConfigurationChangeItem, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + config_update_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + match batch_feature_version.unwrap_or( + platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .default_current_version, + ) { + 1 | 0 + if platform_version + .dpp + .state_transition_serialization_versions + .batch_state_transition + .max_version + >= 1 => + { + // Create the emergency action transition for batch version 1 + BatchTransitionV1::new_token_config_update_transition( + token_id, + owner_id, + data_contract_id, + token_contract_position, + update_token_configuration_item, + public_note, + using_group_info, + identity_public_key, + identity_contract_nonce, + user_fee_increase, + signer, + platform_version, + batch_feature_version, + config_update_feature_version, + base_feature_version, + ) + } + version => Err(ProtocolError::UnknownVersionMismatch { + method: "DocumentsBatchTransition::new_token_config_update_transition".to_string(), + known_versions: vec![1], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v0/mod.rs similarity index 81% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v0/mod.rs index ceffcaa7aec..eaadd2777a5 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v0/mod.rs @@ -11,11 +11,8 @@ use crate::identity::SecurityLevel; use crate::prelude::IdentityNonce; #[cfg(feature = "state-transition-signing")] use crate::prelude::UserFeeIncrease; -use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; use crate::ProtocolError; @@ -23,6 +20,8 @@ use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use std::convert::TryFrom; +use crate::state_transition::batch_transition::batched_transition::{BatchedTransition, BatchedTransitionRef}; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 { #[cfg(feature = "state-transition-signing")] @@ -129,17 +128,19 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 // requirement is the highest level across all documents affected by the ST./ let mut highest_security_level = SecurityLevel::lowest_level(); - for transition in self.transitions().iter() { - let document_type_name = transition.base().document_type_name(); - let data_contract_id = transition.base().data_contract_id(); - let document_security_level = get_data_contract_security_level_requirement( - data_contract_id, - document_type_name.to_owned(), - )?; + for transition in self.transitions_iter() { + if let BatchedTransitionRef::Document(document_transition) = transition { + let document_type_name = document_transition.base().document_type_name(); + let data_contract_id = document_transition.base().data_contract_id(); + let document_security_level = get_data_contract_security_level_requirement( + data_contract_id, + document_type_name.to_owned(), + )?; - // lower enum enum representation means higher in security - if document_security_level < highest_security_level { - highest_security_level = document_security_level + // lower enum representation means higher in security + if document_security_level < highest_security_level { + highest_security_level = document_security_level + } } } Ok(if highest_security_level == SecurityLevel::MASTER { @@ -152,7 +153,7 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 }) } - fn set_transitions(&mut self, transitions: Vec<DocumentTransition>); + fn set_transitions(&mut self, transitions: Vec<BatchedTransition>); fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce); @@ -160,5 +161,5 @@ pub trait DocumentsBatchTransitionMethodsV0: DocumentsBatchTransitionAccessorsV0 &self, ) -> Result<Option<Credits>, ProtocolError>; - fn all_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError>; + fn all_document_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError>; } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs new file mode 100644 index 00000000000..f17e54aa2bc --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/methods/v1/mod.rs @@ -0,0 +1,184 @@ +#[cfg(feature = "state-transition-signing")] +use crate::balances::credits::TokenAmount; +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +#[cfg(feature = "state-transition-signing")] +use crate::group::GroupStateTransitionInfoStatus; +#[cfg(feature = "state-transition-signing")] +use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] +use crate::identity::IdentityPublicKey; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::{IdentityNonce, UserFeeIncrease}; +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::emergency_action::TokenEmergencyAction; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; +#[cfg(feature = "state-transition-signing")] +use crate::version::FeatureVersion; +#[cfg(feature = "state-transition-signing")] +use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::PlatformVersion; + +pub trait DocumentsBatchTransitionMethodsV1: DocumentsBatchTransitionAccessorsV0 { + #[cfg(feature = "state-transition-signing")] + fn new_token_mint_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + issued_to_identity_id: Option<Identifier>, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_burn_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_transfer_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + recipient_id: Identifier, + public_note: Option<String>, + shared_encrypted_note: Option<SharedEncryptedNote>, + private_encrypted_note: Option<PrivateEncryptedNote>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_freeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_unfreeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_destroy_frozen_funds_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_emergency_action_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + emergency_action: TokenEmergencyAction, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; + + #[cfg(feature = "state-transition-signing")] + fn new_token_config_update_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + update_token_configuration_item: TokenConfigurationChangeItem, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + batch_feature_version: Option<FeatureVersion>, + config_update_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError>; +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/mod.rs new file mode 100644 index 00000000000..4b33e2e79e5 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/mod.rs @@ -0,0 +1,116 @@ +use bincode::{Decode, Encode}; + +use std::convert::TryInto; + +use derive_more::From; + +use platform_value::Value; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +use crate::ProtocolError; +use crate::{identity::SecurityLevel, state_transition::StateTransitionFieldTypes}; + +pub use self::batched_transition::{ + document_base_transition, document_create_transition, + document_create_transition::DocumentCreateTransition, document_delete_transition, + document_delete_transition::DocumentDeleteTransition, document_replace_transition, + document_replace_transition::DocumentReplaceTransition, token_base_transition, + token_burn_transition, token_burn_transition::TokenBurnTransition, + token_config_update_transition, token_config_update_transition::TokenConfigUpdateTransition, + token_destroy_frozen_funds_transition, + token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransition, + token_emergency_action_transition, + token_emergency_action_transition::TokenEmergencyActionTransition, token_freeze_transition, + token_freeze_transition::TokenFreezeTransition, token_mint_transition, + token_mint_transition::TokenMintTransition, token_transfer_transition, + token_transfer_transition::TokenTransferTransition, token_unfreeze_transition, + token_unfreeze_transition::TokenUnfreezeTransition, +}; + +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; +use platform_versioning::PlatformVersioned; + +pub mod accessors; +pub mod batched_transition; +pub mod fields; +mod identity_signed; +#[cfg(feature = "state-transition-json-conversion")] +mod json_conversion; +pub mod methods; +pub mod resolvers; +mod state_transition_like; +mod v0; +mod v1; +#[cfg(feature = "validation")] +mod validation; +#[cfg(feature = "state-transition-value-conversion")] +mod value_conversion; +mod version; + +use crate::state_transition::data_contract_update_transition::{ + SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, +}; + +use crate::state_transition::batch_transition::fields::property_names; + +use crate::identity::state_transition::OptionallyAssetLockProved; +pub use v0::*; +pub use v1::*; + +#[derive( + Debug, + Clone, + PartialEq, + Encode, + Decode, + PlatformDeserialize, + PlatformSerialize, + PlatformSignable, + PlatformVersioned, + From, +)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(tag = "$version") +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +#[platform_version_path_bounds( + "dpp.state_transition_serialization_versions.batch_state_transition" +)] +pub enum BatchTransition { + #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "0"))] + V0(BatchTransitionV0), + #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "1"))] + V1(BatchTransitionV1), +} + +impl StateTransitionFieldTypes for BatchTransition { + fn binary_property_paths() -> Vec<&'static str> { + vec![SIGNATURE] + } + + fn identifiers_property_paths() -> Vec<&'static str> { + vec![property_names::OWNER_ID] + } + + fn signature_property_paths() -> Vec<&'static str> { + vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] + } +} + +// TODO: Make a DocumentType method +pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> SecurityLevel { + let maybe_security_level: Option<u64> = v + .get_optional_integer(property_names::SECURITY_LEVEL_REQUIREMENT) + // TODO: Data Contract must already valid so there is no chance that this will fail + .expect("document schema must be a map"); + + match maybe_security_level { + Some(some_level) => (some_level as u8).try_into().unwrap_or(default), + None => default, + } +} + +impl OptionallyAssetLockProved for BatchTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/mod.rs new file mode 100644 index 00000000000..2d24cd45f58 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/mod.rs @@ -0,0 +1 @@ +pub mod v0; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/v0/mod.rs new file mode 100644 index 00000000000..8dd6fd6ec1c --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/resolvers/v0/mod.rs @@ -0,0 +1,26 @@ +use crate::state_transition::batch_transition::batched_transition::token_unfreeze_transition::TokenUnfreezeTransition; +use crate::state_transition::batch_transition::batched_transition::{ + DocumentPurchaseTransition, DocumentTransferTransition, +}; +use crate::state_transition::batch_transition::{ + DocumentCreateTransition, DocumentDeleteTransition, DocumentReplaceTransition, + TokenBurnTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, + TokenFreezeTransition, TokenMintTransition, TokenTransferTransition, +}; + +pub trait BatchTransitionResolversV0 { + fn as_transition_create(&self) -> Option<&DocumentCreateTransition>; + fn as_transition_replace(&self) -> Option<&DocumentReplaceTransition>; + fn as_transition_delete(&self) -> Option<&DocumentDeleteTransition>; + fn as_transition_transfer(&self) -> Option<&DocumentTransferTransition>; + fn as_transition_purchase(&self) -> Option<&DocumentPurchaseTransition>; + fn as_transition_token_burn(&self) -> Option<&TokenBurnTransition>; + fn as_transition_token_mint(&self) -> Option<&TokenMintTransition>; + fn as_transition_token_transfer(&self) -> Option<&TokenTransferTransition>; + fn as_transition_token_freeze(&self) -> Option<&TokenFreezeTransition>; + fn as_transition_token_unfreeze(&self) -> Option<&TokenUnfreezeTransition>; + fn as_transition_token_destroy_frozen_funds( + &self, + ) -> Option<&TokenDestroyFrozenFundsTransition>; + fn as_transition_token_emergency_action(&self) -> Option<&TokenEmergencyActionTransition>; +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/state_transition_like.rs new file mode 100644 index 00000000000..0221ced2611 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/state_transition_like.rs @@ -0,0 +1,79 @@ +use crate::prelude::UserFeeIncrease; +use crate::state_transition::batch_transition::BatchTransition; +use crate::state_transition::{StateTransitionLike, StateTransitionType}; +use crate::version::FeatureVersion; +use platform_value::{BinaryData, Identifier}; + +impl StateTransitionLike for BatchTransition { + /// Returns ID of the created contract + fn modified_data_ids(&self) -> Vec<Identifier> { + match self { + BatchTransition::V0(transition) => transition.modified_data_ids(), + BatchTransition::V1(transition) => transition.modified_data_ids(), + } + } + + fn state_transition_protocol_version(&self) -> FeatureVersion { + match self { + BatchTransition::V0(_) => 0, + BatchTransition::V1(_) => 1, + } + } + /// returns the type of State Transition + fn state_transition_type(&self) -> StateTransitionType { + match self { + BatchTransition::V0(transition) => transition.state_transition_type(), + BatchTransition::V1(transition) => transition.state_transition_type(), + } + } + /// returns the signature as a byte-array + fn signature(&self) -> &BinaryData { + match self { + BatchTransition::V0(transition) => transition.signature(), + BatchTransition::V1(transition) => transition.signature(), + } + } + /// set a new signature + fn set_signature(&mut self, signature: BinaryData) { + match self { + BatchTransition::V0(transition) => transition.set_signature(signature), + BatchTransition::V1(transition) => transition.set_signature(signature), + } + } + + fn set_signature_bytes(&mut self, signature: Vec<u8>) { + match self { + BatchTransition::V0(transition) => transition.set_signature_bytes(signature), + BatchTransition::V1(transition) => transition.set_signature_bytes(signature), + } + } + + /// returns the fee multiplier + fn user_fee_increase(&self) -> UserFeeIncrease { + match self { + BatchTransition::V0(transition) => transition.user_fee_increase(), + BatchTransition::V1(transition) => transition.user_fee_increase(), + } + } + /// set a fee multiplier + fn set_user_fee_increase(&mut self, user_fee_increase: UserFeeIncrease) { + match self { + BatchTransition::V0(transition) => transition.set_user_fee_increase(user_fee_increase), + BatchTransition::V1(transition) => transition.set_user_fee_increase(user_fee_increase), + } + } + + fn owner_id(&self) -> Identifier { + match self { + BatchTransition::V0(transition) => transition.owner_id(), + BatchTransition::V1(transition) => transition.owner_id(), + } + } + + fn unique_identifiers(&self) -> Vec<String> { + match self { + BatchTransition::V0(transition) => transition.unique_identifiers(), + BatchTransition::V1(transition) => transition.unique_identifiers(), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/cbor_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/cbor_conversion.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/cbor_conversion.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/cbor_conversion.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/identity_signed.rs similarity index 83% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/identity_signed.rs index bdc0fe583a2..d0f7084b339 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/identity_signed.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/identity_signed.rs @@ -1,10 +1,10 @@ use crate::identity::SecurityLevel::{CRITICAL, HIGH, MEDIUM}; use crate::identity::{KeyID, Purpose, SecurityLevel}; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +use crate::state_transition::batch_transition::BatchTransitionV0; use crate::state_transition::StateTransitionIdentitySigned; -impl StateTransitionIdentitySigned for DocumentsBatchTransitionV0 { +impl StateTransitionIdentitySigned for BatchTransitionV0 { fn signature_public_key_id(&self) -> KeyID { self.signature_public_key_id } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/json_conversion.rs new file mode 100644 index 00000000000..59ec75a2e62 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/json_conversion.rs @@ -0,0 +1,4 @@ +use crate::state_transition::batch_transition::BatchTransitionV0; +use crate::state_transition::StateTransitionJsonConvert; + +impl<'a> StateTransitionJsonConvert<'a> for BatchTransitionV0 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/mod.rs similarity index 86% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/mod.rs index 4f301bb4520..3bd2cb1d1a0 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/mod.rs @@ -10,7 +10,7 @@ mod version; use crate::identity::KeyID; -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; use crate::ProtocolError; use bincode::{Decode, Encode}; use platform_serialization_derive::PlatformSignable; @@ -26,7 +26,7 @@ use serde::{Deserialize, Serialize}; derive(Serialize, Deserialize) )] #[derive(Default)] -pub struct DocumentsBatchTransitionV0 { +pub struct BatchTransitionV0 { pub owner_id: Identifier, pub transitions: Vec<DocumentTransition>, pub user_fee_increase: UserFeeIncrease, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/state_transition_like.rs similarity index 72% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/state_transition_like.rs index ce3faf2c4b6..83eb9f42442 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/state_transition_like.rs @@ -1,24 +1,24 @@ use crate::prelude::UserFeeIncrease; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; -use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionV0, +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; +use crate::state_transition::batch_transition::{ + BatchTransition, BatchTransitionV0, }; -use crate::state_transition::StateTransitionType::DocumentsBatch; +use crate::state_transition::StateTransitionType::Batch; use crate::state_transition::{StateTransition, StateTransitionLike, StateTransitionType}; use crate::version::FeatureVersion; use base64::prelude::BASE64_STANDARD; use base64::Engine; use platform_value::{BinaryData, Identifier}; -impl From<DocumentsBatchTransitionV0> for StateTransition { - fn from(value: DocumentsBatchTransitionV0) -> Self { - let document_batch_transition: DocumentsBatchTransition = value.into(); +impl From<BatchTransitionV0> for StateTransition { + fn from(value: BatchTransitionV0) -> Self { + let document_batch_transition: BatchTransition = value.into(); document_batch_transition.into() } } -impl StateTransitionLike for DocumentsBatchTransitionV0 { +impl StateTransitionLike for BatchTransitionV0 { /// Returns ID of the created contract fn modified_data_ids(&self) -> Vec<Identifier> { self.transitions.iter().map(|t| t.base().id()).collect() @@ -29,7 +29,7 @@ impl StateTransitionLike for DocumentsBatchTransitionV0 { } /// returns the type of State Transition fn state_transition_type(&self) -> StateTransitionType { - DocumentsBatch + Batch } /// returns the signature as a byte-array fn signature(&self) -> &BinaryData { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/types.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/types.rs similarity index 53% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/types.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/types.rs index 39d85d64372..abe0ef311e8 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/types.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/types.rs @@ -1,9 +1,9 @@ -use crate::state_transition::documents_batch_transition::fields::property_names::*; -use crate::state_transition::documents_batch_transition::fields::*; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +use crate::state_transition::batch_transition::fields::property_names::*; +use crate::state_transition::batch_transition::fields::*; +use crate::state_transition::batch_transition::BatchTransitionV0; use crate::state_transition::StateTransitionFieldTypes; -impl StateTransitionFieldTypes for DocumentsBatchTransitionV0 { +impl StateTransitionFieldTypes for BatchTransitionV0 { fn binary_property_paths() -> Vec<&'static str> { vec![SIGNATURE] } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs similarity index 77% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs index 0bafe6b8aeb..17b7c8df12b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/v0_methods.rs @@ -1,3 +1,4 @@ +use std::slice::Iter; #[cfg(feature = "state-transition-signing")] use crate::data_contract::document_type::DocumentTypeRef; #[cfg(feature = "state-transition-signing")] @@ -12,21 +13,19 @@ use crate::prelude::IdentityNonce; use crate::prelude::IdentityPublicKey; #[cfg(feature = "state-transition-signing")] use crate::prelude::UserFeeIncrease; -use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::accessors::{DocumentsBatchTransitionAccessorsV0}; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::batched_transition::{BatchedTransition, BatchedTransitionMutRef, BatchedTransitionRef}; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentReplaceTransition, DocumentTransferTransition, DocumentPurchaseTransition, DocumentUpdatePriceTransition, +use crate::state_transition::batch_transition::batched_transition::{ + DocumentPurchaseTransition, DocumentReplaceTransition, DocumentTransferTransition, DocumentUpdatePriceTransition, }; -use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +use crate::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use crate::state_transition::batch_transition::BatchTransitionV0; #[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::{ - DocumentDeleteTransition, DocumentsBatchTransition, +use crate::state_transition::batch_transition::{ + BatchTransition, DocumentDeleteTransition, }; #[cfg(feature = "state-transition-signing")] use crate::state_transition::StateTransition; @@ -35,20 +34,49 @@ use crate::ProtocolError; use platform_value::Identifier; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; -use crate::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; +use crate::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; + +impl DocumentsBatchTransitionAccessorsV0 for BatchTransitionV0 { + type IterType<'a> + = std::iter::Map< + Iter<'a, DocumentTransition>, + fn(&'a DocumentTransition) -> BatchedTransitionRef<'a>, + > + where + Self: 'a; + + /// Iterator for `BatchedTransitionRef` items in version 0. + fn transitions_iter<'a>(&'a self) -> Self::IterType<'a> { + self.transitions.iter().map(BatchedTransitionRef::Document) + } + + /// Returns the total number of transitions (document and token) in version 0. + fn transitions_len(&self) -> usize { + self.transitions.len() + } -impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransitionV0 { - fn transitions(&self) -> &Vec<DocumentTransition> { - &self.transitions + /// Checks if there are no transitions in version 0. + fn transitions_are_empty(&self) -> bool { + self.transitions.is_empty() } - fn transitions_slice(&self) -> &[DocumentTransition] { - self.transitions.as_slice() + /// Returns the first transition, if it exists, as a `BatchedTransitionRef`. + fn first_transition(&self) -> Option<BatchedTransitionRef> { + self.transitions.first().map(BatchedTransitionRef::Document) + } + + fn first_transition_mut(&mut self) -> Option<BatchedTransitionMutRef> { + self.transitions + .first_mut() + .map(BatchedTransitionMutRef::Document) } } -impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { +impl DocumentsBatchTransitionMethodsV0 for BatchTransitionV0 { #[cfg(feature = "state-transition-signing")] fn new_document_creation_transition_from_document<S: Signer>( document: Document, @@ -73,7 +101,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { create_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id, transitions: vec![create_transition.into()], user_fee_increase, @@ -112,7 +140,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { replace_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id, transitions: vec![replace_transition.into()], user_fee_increase, @@ -153,7 +181,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { transfer_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id, transitions: vec![transfer_transition.into()], user_fee_increase, @@ -192,7 +220,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { delete_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id, transitions: vec![delete_transition.into()], user_fee_increase, @@ -233,7 +261,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { update_price_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id, transitions: vec![transfer_transition.into()], user_fee_increase, @@ -274,7 +302,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { purchase_feature_version, base_feature_version, )?; - let documents_batch_transition: DocumentsBatchTransition = DocumentsBatchTransitionV0 { + let documents_batch_transition: BatchTransition = BatchTransitionV0 { owner_id: new_owner_id, transitions: vec![purchase_transition.into()], user_fee_increase, @@ -291,8 +319,14 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { Ok(state_transition) } - fn set_transitions(&mut self, transitions: Vec<DocumentTransition>) { - self.transitions = transitions; + fn set_transitions(&mut self, transitions: Vec<BatchedTransition>) { + self.transitions = transitions + .into_iter() + .filter_map(|batched_transition| match batched_transition { + BatchedTransition::Document(document) => Some(document), + BatchedTransition::Token(_) => None, + }) + .collect(); } fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { @@ -301,7 +335,7 @@ impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransitionV0 { .for_each(|transition| transition.set_identity_contract_nonce(identity_contract_nonce)); } - fn all_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { + fn all_document_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { let (total, any_purchases): (Option<Credits>, bool) = self .transitions .iter() diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/value_conversion.rs new file mode 100644 index 00000000000..5438c1e2d09 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/value_conversion.rs @@ -0,0 +1,4 @@ +use crate::state_transition::batch_transition::BatchTransitionV0; +use crate::state_transition::StateTransitionValueConvert; + +impl<'a> StateTransitionValueConvert<'a> for BatchTransitionV0 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/version.rs similarity index 52% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/version.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/version.rs index e087f12cb9f..c8a27eafe8f 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/version.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v0/version.rs @@ -1,8 +1,8 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; +use crate::state_transition::batch_transition::BatchTransitionV0; use crate::state_transition::FeatureVersioned; use crate::version::FeatureVersion; -impl FeatureVersioned for DocumentsBatchTransitionV0 { +impl FeatureVersioned for BatchTransitionV0 { fn feature_version(&self) -> FeatureVersion { 0 } diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/identity_signed.rs new file mode 100644 index 00000000000..cb735d5d76f --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/identity_signed.rs @@ -0,0 +1,23 @@ +use crate::identity::SecurityLevel::{CRITICAL, HIGH, MEDIUM}; +use crate::identity::{KeyID, Purpose, SecurityLevel}; + +use crate::state_transition::batch_transition::BatchTransitionV1; +use crate::state_transition::StateTransitionIdentitySigned; + +impl StateTransitionIdentitySigned for BatchTransitionV1 { + fn signature_public_key_id(&self) -> KeyID { + self.signature_public_key_id + } + + fn set_signature_public_key_id(&mut self, key_id: KeyID) { + self.signature_public_key_id = key_id + } + + fn security_level_requirement(&self, _purpose: Purpose) -> Vec<SecurityLevel> { + // These are the available key levels that must sign the state transition + // However the fact that it is signed by one of these does not guarantee that it + // meets the security level requirement, as that is dictated from within the data + // contract + vec![CRITICAL, HIGH, MEDIUM] + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/json_conversion.rs new file mode 100644 index 00000000000..b277e90e872 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/json_conversion.rs @@ -0,0 +1,4 @@ +use crate::state_transition::batch_transition::BatchTransitionV1; +use crate::state_transition::StateTransitionJsonConvert; + +impl<'a> StateTransitionJsonConvert<'a> for BatchTransitionV1 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/mod.rs new file mode 100644 index 00000000000..763f93b49a0 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/mod.rs @@ -0,0 +1,37 @@ +mod identity_signed; +#[cfg(feature = "state-transition-json-conversion")] +mod json_conversion; +mod state_transition_like; +mod types; +mod v0_methods; +#[cfg(feature = "state-transition-value-conversion")] +mod value_conversion; +mod version; + +use crate::identity::KeyID; + +use crate::state_transition::batch_transition::batched_transition::BatchedTransition; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_serialization_derive::PlatformSignable; + +use crate::prelude::UserFeeIncrease; +use platform_value::{BinaryData, Identifier}; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Encode, Decode, PlatformSignable)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize) +)] +#[derive(Default)] +pub struct BatchTransitionV1 { + pub owner_id: Identifier, + pub transitions: Vec<BatchedTransition>, + pub user_fee_increase: UserFeeIncrease, + #[platform_signable(exclude_from_sig_hash)] + pub signature_public_key_id: KeyID, + #[platform_signable(exclude_from_sig_hash)] + pub signature: BinaryData, +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/state_transition_like.rs new file mode 100644 index 00000000000..f215e8156b4 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/state_transition_like.rs @@ -0,0 +1,92 @@ +use crate::prelude::UserFeeIncrease; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; +use crate::state_transition::batch_transition::{BatchTransition, BatchTransitionV1}; +use crate::state_transition::StateTransitionType::Batch; +use crate::state_transition::{StateTransition, StateTransitionLike, StateTransitionType}; +use crate::version::FeatureVersion; +use base64::prelude::BASE64_STANDARD; +use base64::Engine; +use platform_value::{BinaryData, Identifier}; +use crate::state_transition::batch_transition::batched_transition::BatchedTransition; +use crate::state_transition::batch_transition::batched_transition::token_transition::TokenTransitionV0Methods; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; + +impl From<BatchTransitionV1> for StateTransition { + fn from(value: BatchTransitionV1) -> Self { + let document_batch_transition: BatchTransition = value.into(); + document_batch_transition.into() + } +} + +impl StateTransitionLike for BatchTransitionV1 { + /// Returns ID of the created contract + fn modified_data_ids(&self) -> Vec<Identifier> { + self.transitions + .iter() + .filter_map(|t| match t { + BatchedTransition::Document(document_transition) => { + Some(document_transition.base().id()) + } + BatchedTransition::Token(_) => None, + }) + .collect() + } + + fn state_transition_protocol_version(&self) -> FeatureVersion { + 1 + } + /// returns the type of State Transition + fn state_transition_type(&self) -> StateTransitionType { + Batch + } + /// returns the signature as a byte-array + fn signature(&self) -> &BinaryData { + &self.signature + } + /// set a new signature + fn set_signature(&mut self, signature: BinaryData) { + self.signature = signature + } + + fn set_signature_bytes(&mut self, signature: Vec<u8>) { + self.signature = BinaryData::new(signature) + } + + /// Get owner ID + fn owner_id(&self) -> Identifier { + self.owner_id + } + + /// We create a list of unique identifiers for the batch + fn unique_identifiers(&self) -> Vec<String> { + self.transitions + .iter() + .map(|transition| match transition { + BatchedTransition::Document(document_transition) => { + format!( + "{}-{}-{:x}", + BASE64_STANDARD.encode(self.owner_id), + BASE64_STANDARD.encode(document_transition.data_contract_id()), + document_transition.identity_contract_nonce() + ) + } + BatchedTransition::Token(token_transition) => { + format!( + "{}-{}-{:x}", + BASE64_STANDARD.encode(self.owner_id), + BASE64_STANDARD.encode(token_transition.data_contract_id()), + token_transition.identity_contract_nonce() + ) + } + }) + .collect() + } + + fn user_fee_increase(&self) -> UserFeeIncrease { + self.user_fee_increase + } + + fn set_user_fee_increase(&mut self, user_fee_increase: UserFeeIncrease) { + self.user_fee_increase = user_fee_increase + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/types.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/types.rs new file mode 100644 index 00000000000..2a3095b8f96 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/types.rs @@ -0,0 +1,18 @@ +use crate::state_transition::batch_transition::fields::property_names::*; +use crate::state_transition::batch_transition::fields::*; +use crate::state_transition::batch_transition::BatchTransitionV1; +use crate::state_transition::StateTransitionFieldTypes; + +impl StateTransitionFieldTypes for BatchTransitionV1 { + fn binary_property_paths() -> Vec<&'static str> { + vec![SIGNATURE] + } + + fn identifiers_property_paths() -> Vec<&'static str> { + vec![OWNER_ID] + } + + fn signature_property_paths() -> Vec<&'static str> { + vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs new file mode 100644 index 00000000000..fc3bb2eb527 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/v0_methods.rs @@ -0,0 +1,977 @@ +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::document_type::DocumentTypeRef; +#[cfg(feature = "state-transition-signing")] +use crate::document::{Document, DocumentV0Getters}; +use crate::fee::Credits; +#[cfg(feature = "state-transition-signing")] +use crate::identity::signer::Signer; +#[cfg(feature = "state-transition-signing")] +use crate::identity::SecurityLevel; +use crate::prelude::IdentityNonce; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::IdentityPublicKey; +#[cfg(feature = "state-transition-signing")] +use crate::prelude::UserFeeIncrease; +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::batched_transition::{ + BatchedTransition, BatchedTransitionMutRef, BatchedTransitionRef, +}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::batched_transition::{ + DocumentPurchaseTransition, DocumentReplaceTransition, DocumentTransferTransition, + DocumentUpdatePriceTransition, +}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; +use crate::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use std::iter::Map; +use std::slice::Iter; + +use crate::state_transition::batch_transition::{BatchTransitionV1, TokenBurnTransition, TokenConfigUpdateTransition, TokenDestroyFrozenFundsTransition, TokenEmergencyActionTransition, TokenFreezeTransition, TokenMintTransition, TokenTransferTransition, TokenUnfreezeTransition}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::{ + BatchTransition, DocumentDeleteTransition, +}; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::StateTransition; +use crate::ProtocolError; +#[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] +use platform_version::version::{FeatureVersion, PlatformVersion}; +#[cfg(feature = "state-transition-signing")] +use crate::balances::credits::TokenAmount; +#[cfg(feature = "state-transition-signing")] +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +#[cfg(feature = "state-transition-signing")] +use crate::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; +use crate::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use crate::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::batched_transition::multi_party_action::AllowedAsMultiPartyAction; +use crate::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use crate::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_burn_transition::TokenBurnTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_config_update_transition::TokenConfigUpdateTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_emergency_action_transition::TokenEmergencyActionTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_freeze_transition::TokenFreezeTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_mint_transition::TokenMintTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_transfer_transition::TokenTransferTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::state_transition::batch_transition::token_unfreeze_transition::TokenUnfreezeTransitionV0; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::emergency_action::TokenEmergencyAction; +#[cfg(feature = "state-transition-signing")] +use crate::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; + +impl DocumentsBatchTransitionAccessorsV0 for BatchTransitionV1 { + type IterType<'a> + = Map<Iter<'a, BatchedTransition>, fn(&'a BatchedTransition) -> BatchedTransitionRef<'a>> + where + Self: 'a; + + /// Iterator for `BatchedTransitionRef` items in version 1. + fn transitions_iter<'a>(&'a self) -> Self::IterType<'a> { + self.transitions + .iter() + .map(|transition| transition.borrow_as_ref()) + } + + /// Returns the total number of transitions (document and token) in version 1. + fn transitions_len(&self) -> usize { + self.transitions.len() + } + + /// Checks if there are no transitions in version 1. + fn transitions_are_empty(&self) -> bool { + self.transitions.is_empty() + } + + /// Returns the first transition, if it exists, as a `BatchedTransitionRef`. + fn first_transition(&self) -> Option<BatchedTransitionRef> { + self.transitions + .first() + .map(|transition| transition.borrow_as_ref()) + } + + /// Returns the first transition, if it exists, as a `BatchedTransitionMutRef`. + fn first_transition_mut(&mut self) -> Option<BatchedTransitionMutRef> { + self.transitions + .first_mut() + .map(|transition| transition.borrow_as_mut()) + } +} + +impl DocumentsBatchTransitionMethodsV0 for BatchTransitionV1 { + #[cfg(feature = "state-transition-signing")] + fn new_document_creation_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + entropy: [u8; 32], + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + create_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let owner_id = document.owner_id(); + let create_transition = DocumentCreateTransition::from_document( + document, + document_type, + entropy, + identity_contract_nonce, + platform_version, + create_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Document(create_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_replacement_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + replace_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let owner_id = document.owner_id(); + let replace_transition = DocumentReplaceTransition::from_document( + document, + document_type, + identity_contract_nonce, + platform_version, + replace_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Document(replace_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_transfer_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + recipient_owner_id: Identifier, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + transfer_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let owner_id = document.owner_id(); + let transfer_transition = DocumentTransferTransition::from_document( + document, + document_type, + identity_contract_nonce, + recipient_owner_id, + platform_version, + transfer_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Document(transfer_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_deletion_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + delete_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let owner_id = document.owner_id(); + let delete_transition = DocumentDeleteTransition::from_document( + document, + document_type, + identity_contract_nonce, + platform_version, + delete_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Document(delete_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_update_price_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + update_price_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let owner_id = document.owner_id(); + let transfer_transition = DocumentUpdatePriceTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + update_price_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Document(transfer_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_document_purchase_transition_from_document<S: Signer>( + document: Document, + document_type: DocumentTypeRef, + new_owner_id: Identifier, + price: Credits, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + purchase_feature_version: Option<FeatureVersion>, + base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let purchase_transition = DocumentPurchaseTransition::from_document( + document, + document_type, + price, + identity_contract_nonce, + platform_version, + purchase_feature_version, + base_feature_version, + )?; + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id: new_owner_id, + transitions: vec![BatchedTransition::Document(purchase_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + fn set_transitions(&mut self, transitions: Vec<BatchedTransition>) { + self.transitions = transitions; + } + + fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { + self.transitions + .iter_mut() + .for_each(|transition| transition.set_identity_contract_nonce(identity_contract_nonce)); + } + + fn all_document_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { + let (total, any_purchases): (Option<Credits>, bool) = self + .transitions + .iter() + .filter_map(|transition| { + transition + .as_transition_purchase() + .map(|purchase| purchase.price()) + }) + .fold((None, false), |(acc, _), price| match acc { + Some(acc_val) => acc_val + .checked_add(price) + .map_or((None, true), |sum| (Some(sum), true)), + None => (Some(price), true), + }); + + match (total, any_purchases) { + (Some(total), _) => Ok(Some(total)), + (None, true) => Err(ProtocolError::Overflow("overflow in all purchases amount")), // Overflow occurred + _ => Ok(None), // No purchases were found + } + } + + fn all_conflicting_index_collateral_voting_funds( + &self, + ) -> Result<Option<Credits>, ProtocolError> { + let (total, any_voting_funds): (Option<Credits>, bool) = self + .transitions + .iter() + .filter_map(|transition| { + transition + .as_transition_create() + .and_then(|document_create_transition| { + // Safely sum up values to avoid overflow. + document_create_transition + .prefunded_voting_balance() + .as_ref() + .map(|(_, credits)| *credits) + }) + }) + .fold((None, false), |(acc, _), price| match acc { + Some(acc_val) => acc_val + .checked_add(price) + .map_or((None, true), |sum| (Some(sum), true)), + None => (Some(price), true), + }); + + match (total, any_voting_funds) { + (Some(total), _) => Ok(Some(total)), + (None, true) => Err(ProtocolError::Overflow( + "overflow in all voting funds amount", + )), // Overflow occurred + _ => Ok(None), + } + } +} + +impl DocumentsBatchTransitionMethodsV1 for BatchTransitionV1 { + #[cfg(feature = "state-transition-signing")] + fn new_token_mint_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + issued_to_identity_id: Option<Identifier>, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut mint_transition = TokenMintTransition::V0(TokenMintTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + issued_to_identity_id, + amount, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = mint_transition.calculate_action_id(owner_id); + mint_transition.base_mut().set_using_group_info(Some( + GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + }, + )) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + mint_transition.base_mut().set_using_group_info(Some(info)) + } + } + } + + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(mint_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_burn_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut burn_transition = TokenBurnTransition::V0(TokenBurnTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + burn_amount: amount, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = burn_transition.calculate_action_id(owner_id); + burn_transition.base_mut().set_using_group_info(Some( + GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + }, + )) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + burn_transition.base_mut().set_using_group_info(Some(info)) + } + } + } + + // Wrap in a batch transition + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(burn_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + // Create the state transition + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + + Ok(state_transition) + } + #[cfg(feature = "state-transition-signing")] + fn new_token_transfer_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + amount: TokenAmount, + recipient_id: Identifier, + public_note: Option<String>, + shared_encrypted_note: Option<SharedEncryptedNote>, + private_encrypted_note: Option<PrivateEncryptedNote>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + // Create the transfer transition for batch version 1 + let transfer_transition = TokenTransferTransition::V0(TokenTransferTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + recipient_id, + amount, + public_note, + shared_encrypted_note, + private_encrypted_note, + }); + + // Wrap in a batch transition + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(transfer_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + // Create the state transition + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_freeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut freeze_transition = TokenFreezeTransition::V0(TokenFreezeTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + identity_to_freeze_id: frozen_identity_id, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = freeze_transition.calculate_action_id(owner_id); + freeze_transition.base_mut().set_using_group_info(Some( + GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + }, + )) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + freeze_transition + .base_mut() + .set_using_group_info(Some(info)) + } + } + } + + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(freeze_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_unfreeze_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut unfreeze_transition = TokenUnfreezeTransition::V0(TokenUnfreezeTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + frozen_identity_id, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = unfreeze_transition.calculate_action_id(owner_id); + unfreeze_transition.base_mut().set_using_group_info(Some( + GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + }, + )) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + unfreeze_transition + .base_mut() + .set_using_group_info(Some(info)) + } + } + } + + let documents_batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(unfreeze_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = documents_batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_destroy_frozen_funds_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + frozen_identity_id: Identifier, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut destroy_frozen_funds_transition = + TokenDestroyFrozenFundsTransition::V0(TokenDestroyFrozenFundsTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + frozen_identity_id, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = destroy_frozen_funds_transition.calculate_action_id(owner_id); + destroy_frozen_funds_transition + .base_mut() + .set_using_group_info(Some(GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + })) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + destroy_frozen_funds_transition + .base_mut() + .set_using_group_info(Some(info)) + } + } + } + + let batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token( + destroy_frozen_funds_transition.into(), + )], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_emergency_action_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + emergency_action: TokenEmergencyAction, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _delete_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut emergency_action_transition = + TokenEmergencyActionTransition::V0(TokenEmergencyActionTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + emergency_action, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = emergency_action_transition.calculate_action_id(owner_id); + emergency_action_transition + .base_mut() + .set_using_group_info(Some(GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + })) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + emergency_action_transition + .base_mut() + .set_using_group_info(Some(info)) + } + } + } + + let batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(emergency_action_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::HIGH)), + )?; + Ok(state_transition) + } + + #[cfg(feature = "state-transition-signing")] + fn new_token_config_update_transition<S: Signer>( + token_id: Identifier, + owner_id: Identifier, + data_contract_id: Identifier, + token_contract_position: u16, + update_token_configuration_item: TokenConfigurationChangeItem, + public_note: Option<String>, + using_group_info: Option<GroupStateTransitionInfoStatus>, + identity_public_key: &IdentityPublicKey, + identity_contract_nonce: IdentityNonce, + user_fee_increase: UserFeeIncrease, + signer: &S, + _platform_version: &PlatformVersion, + _batch_feature_version: Option<FeatureVersion>, + _config_update_feature_version: Option<FeatureVersion>, + _base_feature_version: Option<FeatureVersion>, + ) -> Result<StateTransition, ProtocolError> { + let mut config_update_transition = + TokenConfigUpdateTransition::V0(TokenConfigUpdateTransitionV0 { + base: TokenBaseTransition::V0(TokenBaseTransitionV0 { + identity_contract_nonce, + token_contract_position, + data_contract_id, + token_id, + using_group_info: None, + }), + update_token_configuration_item, + public_note, + }); + + if let Some(using_group_info_status) = using_group_info { + match using_group_info_status { + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer( + group_contract_position, + ) => { + let action_id = config_update_transition.calculate_action_id(owner_id); + config_update_transition + .base_mut() + .set_using_group_info(Some(GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer: true, + })) + } + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner(info) => { + config_update_transition + .base_mut() + .set_using_group_info(Some(info)) + } + } + } + + let batch_transition: BatchTransition = BatchTransitionV1 { + owner_id, + transitions: vec![BatchedTransition::Token(config_update_transition.into())], + user_fee_increase, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + let mut state_transition: StateTransition = batch_transition.into(); + state_transition.sign_external( + identity_public_key, + signer, + Some(|_, _| Ok(SecurityLevel::CRITICAL)), + )?; + Ok(state_transition) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/value_conversion.rs new file mode 100644 index 00000000000..53a75f0a890 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/value_conversion.rs @@ -0,0 +1,4 @@ +use crate::state_transition::batch_transition::BatchTransitionV1; +use crate::state_transition::StateTransitionValueConvert; + +impl<'a> StateTransitionValueConvert<'a> for BatchTransitionV1 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/version.rs new file mode 100644 index 00000000000..dcedbd28965 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/v1/version.rs @@ -0,0 +1,9 @@ +use crate::state_transition::batch_transition::BatchTransitionV1; +use crate::state_transition::FeatureVersioned; +use crate::version::FeatureVersion; + +impl FeatureVersioned for BatchTransitionV1 { + fn feature_version(&self) -> FeatureVersion { + 1 + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/mod.rs similarity index 84% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/mod.rs index 00206feeb5d..ccb6ab15307 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/mod.rs @@ -1,4 +1,4 @@ -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::DocumentTransition; use crate::ProtocolError; use platform_version::version::PlatformVersion; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/v0/mod.rs similarity index 73% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/v0/mod.rs index 71e1b19b29f..27f1f46368a 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/find_duplicates_by_id/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/find_duplicates_by_id/v0/mod.rs @@ -1,11 +1,8 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; - +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use platform_value::Identifier; use std::collections::btree_map::Entry; use std::collections::BTreeMap; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; #[derive(Hash, Eq, PartialEq, Ord, PartialOrd)] struct TransitionFingerprint<'a> { @@ -51,14 +48,14 @@ pub(super) fn find_duplicates_by_id<'a>( #[cfg(test)] mod test { use super::*; - use crate::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; - use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; - use crate::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; - use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; - use crate::state_transition::documents_batch_transition::document_transition::DocumentCreateTransition; - use crate::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; - use crate::state_transition::documents_batch_transition::document_transition::DocumentDeleteTransition; - use crate::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; + use crate::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; + use crate::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; + use crate::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; + use crate::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; + use crate::state_transition::batch_transition::batched_transition::DocumentCreateTransition; + use crate::state_transition::batch_transition::batched_transition::DocumentReplaceTransition; + use crate::state_transition::batch_transition::batched_transition::DocumentDeleteTransition; + use crate::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; #[test] fn test_duplicates() { diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/mod.rs similarity index 100% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/mod.rs diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/mod.rs similarity index 88% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/mod.rs index 69891782113..b2f89c158d7 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/mod.rs @@ -1,11 +1,11 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; +use crate::state_transition::batch_transition::BatchTransition; use crate::validation::SimpleConsensusValidationResult; use crate::ProtocolError; use platform_version::version::PlatformVersion; mod v0; -impl DocumentsBatchTransition { +impl BatchTransition { pub fn validate_base_structure( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/v0/mod.rs new file mode 100644 index 00000000000..fa69e5a93ff --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/validation/validate_basic_structure/v0/mod.rs @@ -0,0 +1,192 @@ +use crate::consensus::basic::document::{ + DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, + MaxDocumentsTransitionsExceededError, NonceOutOfBoundsError, +}; +use crate::consensus::basic::BasicError; + +use crate::identity::identity_nonce::MISSING_IDENTITY_REVISIONS_FILTER; +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use crate::state_transition::batch_transition::validation::find_duplicates_by_id::find_duplicates_by_id; +use crate::state_transition::batch_transition::BatchTransition; +use crate::validation::SimpleConsensusValidationResult; +use crate::ProtocolError; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use std::collections::btree_map::Entry; +use std::collections::BTreeMap; +use crate::consensus::basic::group::GroupActionNotAllowedOnTransitionError; +use crate::consensus::basic::token::{InvalidActionIdError, InvalidTokenIdError, TokenTransferToOurselfError}; +use crate::state_transition::batch_transition::batched_transition::BatchedTransitionRef; +use crate::state_transition::batch_transition::batched_transition::token_transition::{TokenTransition, TokenTransitionV0Methods}; +use crate::state_transition::batch_transition::batched_transition::token_transition_action_type::TokenTransitionActionTypeGetter; +use crate::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::state_transition::batch_transition::token_transfer_transition::v0::v0_methods::TokenTransferTransitionV0Methods; +use crate::state_transition::state_transitions::document::batch_transition::batched_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use crate::state_transition::StateTransitionLike; + +impl BatchTransition { + #[inline(always)] + pub(super) fn validate_base_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, ProtocolError> { + if self.transitions_are_empty() { + return Ok(SimpleConsensusValidationResult::new_with_error( + DocumentTransitionsAreAbsentError::new().into(), + )); + } + + let transitions_len = self.transitions_len(); + + if transitions_len > u16::MAX as usize + || transitions_len as u16 + > platform_version + .system_limits + .max_transitions_in_documents_batch + { + return Ok(SimpleConsensusValidationResult::new_with_error( + MaxDocumentsTransitionsExceededError::new( + platform_version + .system_limits + .max_transitions_in_documents_batch, + ) + .into(), + )); + } + + // Group transitions by contract ID + let mut document_transitions_by_contracts: BTreeMap<Identifier, Vec<&DocumentTransition>> = + BTreeMap::new(); + + // Group transitions by contract ID + let mut token_transitions: Vec<&TokenTransition> = vec![]; + + self.transitions_iter() + .for_each(|batch_transition| match batch_transition { + BatchedTransitionRef::Document(document_transition) => { + let contract_identifier = document_transition.data_contract_id(); + + match document_transitions_by_contracts.entry(contract_identifier) { + Entry::Vacant(vacant) => { + vacant.insert(vec![document_transition]); + } + Entry::Occupied(mut identifiers) => { + identifiers.get_mut().push(document_transition); + } + }; + } + BatchedTransitionRef::Token(token_transition) => { + token_transitions.push(token_transition) + } + }); + + let mut result = SimpleConsensusValidationResult::default(); + + for transitions in document_transitions_by_contracts.values() { + for transition in transitions { + // We need to make sure that the identity contract nonce is within the allowed bounds + // This means that it is stored on 40 bits + if transition.identity_contract_nonce() & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + result.add_error(BasicError::NonceOutOfBoundsError( + NonceOutOfBoundsError::new(transition.identity_contract_nonce()), + )); + } + } + + // Make sure we don't have duplicate transitions + let duplicate_transitions = find_duplicates_by_id(transitions, platform_version)?; + + if !duplicate_transitions.is_empty() { + let references: Vec<(String, [u8; 32])> = duplicate_transitions + .into_iter() + .map(|transition| { + Ok(( + transition.base().document_type_name().clone(), + transition.base().id().to_buffer(), + )) + }) + .collect::<Result<Vec<(String, [u8; 32])>, anyhow::Error>>()?; + + result.add_error(BasicError::DuplicateDocumentTransitionsWithIdsError( + DuplicateDocumentTransitionsWithIdsError::new(references), + )); + } + } + + for transition in token_transitions { + // We need to make sure that the identity contract nonce is within the allowed bounds + // This means that it is stored on 40 bits + if transition.identity_contract_nonce() & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + result.add_error(BasicError::NonceOutOfBoundsError( + NonceOutOfBoundsError::new(transition.identity_contract_nonce()), + )); + } + + let transition_token_id = transition.base().token_id(); + let calculated_token_id = transition.base().calculate_token_id(); + + // We need to verify that the token id is correct + if transition_token_id != calculated_token_id { + result.add_error(BasicError::InvalidTokenIdError(InvalidTokenIdError::new( + calculated_token_id, + transition_token_id, + ))); + } + + match transition { + TokenTransition::Burn(_) => {} + TokenTransition::Mint(_) => {} + TokenTransition::Transfer(transfer) => { + if transfer.recipient_id() == self.owner_id() { + // We can not transfer to ourselves + result.add_error(BasicError::TokenTransferToOurselfError( + TokenTransferToOurselfError::new( + transition.token_id(), + self.owner_id(), + ), + )); + } + } + TokenTransition::Freeze(_) => {} + TokenTransition::Unfreeze(_) => {} + TokenTransition::DestroyFrozenFunds(_) => {} + TokenTransition::EmergencyAction(_) => {} + TokenTransition::ConfigUpdate(_) => {} + } + + // We need to verify that the action id given matches the expected action id + // But only if we are the proposer + if let Some(group_state_transition_info) = transition.base().using_group_info() { + if group_state_transition_info.action_is_proposer { + if let Some(calculated_action_id) = + transition.calculate_action_id(self.owner_id()) + { + if group_state_transition_info.action_id != calculated_action_id { + result.add_error(BasicError::InvalidActionIdError( + InvalidActionIdError::new( + calculated_action_id, + group_state_transition_info.action_id, + ), + )); + } + } else { + result.add_error(BasicError::GroupActionNotAllowedOnTransitionError( + GroupActionNotAllowedOnTransitionError::new( + transition.action_type().to_string(), + ), + )); + } + } else if !transition.can_calculate_action_id() { + result.add_error(BasicError::GroupActionNotAllowedOnTransitionError( + GroupActionNotAllowedOnTransitionError::new( + transition.action_type().to_string(), + ), + )); + } + } + } + + Ok(result) + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/value_conversion.rs similarity index 61% rename from packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/value_conversion.rs rename to packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/value_conversion.rs index 5d02772e077..e9d975ea47b 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/value_conversion.rs @@ -4,53 +4,73 @@ use platform_value::Value; use crate::ProtocolError; -use crate::state_transition::documents_batch_transition::{ - DocumentsBatchTransition, DocumentsBatchTransitionV0, +use crate::state_transition::batch_transition::{ + BatchTransition, BatchTransitionV0, BatchTransitionV1, }; -use crate::state_transition::state_transitions::documents_batch_transition::fields::*; +use crate::state_transition::state_transitions::batch_transition::fields::*; use crate::state_transition::StateTransitionValueConvert; use platform_value::btreemap_extensions::BTreeValueRemoveFromMapHelper; use platform_version::version::{FeatureVersion, PlatformVersion}; -impl<'a> StateTransitionValueConvert<'a> for DocumentsBatchTransition { +impl<'a> StateTransitionValueConvert<'a> for BatchTransition { fn to_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { match self { - DocumentsBatchTransition::V0(transition) => { + BatchTransition::V0(transition) => { let mut value = transition.to_object(skip_signature)?; value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + BatchTransition::V1(transition) => { + let mut value = transition.to_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } fn to_canonical_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { match self { - DocumentsBatchTransition::V0(transition) => { + BatchTransition::V0(transition) => { let mut value = transition.to_canonical_object(skip_signature)?; value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + BatchTransition::V1(transition) => { + let mut value = transition.to_canonical_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } fn to_canonical_cleaned_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { match self { - DocumentsBatchTransition::V0(transition) => { + BatchTransition::V0(transition) => { let mut value = transition.to_canonical_cleaned_object(skip_signature)?; value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + BatchTransition::V1(transition) => { + let mut value = transition.to_canonical_cleaned_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } fn to_cleaned_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { match self { - DocumentsBatchTransition::V0(transition) => { + BatchTransition::V0(transition) => { let mut value = transition.to_cleaned_object(skip_signature)?; value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(0))?; Ok(value) } + BatchTransition::V1(transition) => { + let mut value = transition.to_cleaned_object(skip_signature)?; + value.insert(STATE_TRANSITION_PROTOCOL_VERSION.to_string(), Value::U16(1))?; + Ok(value) + } } } @@ -70,9 +90,10 @@ impl<'a> StateTransitionValueConvert<'a> for DocumentsBatchTransition { }); match version { - 0 => Ok(DocumentsBatchTransitionV0::from_object(raw_object, platform_version)?.into()), + 0 => Ok(BatchTransitionV0::from_object(raw_object, platform_version)?.into()), + 1 => Ok(BatchTransitionV1::from_object(raw_object, platform_version)?.into()), n => Err(ProtocolError::UnknownVersionError(format!( - "Unknown DataContractCreateTransition version {n}" + "Unknown contract_create_state_transition default_current_version {n}" ))), } } @@ -93,11 +114,10 @@ impl<'a> StateTransitionValueConvert<'a> for DocumentsBatchTransition { }); match version { - 0 => Ok( - DocumentsBatchTransitionV0::from_value_map(raw_value_map, platform_version)?.into(), - ), + 0 => Ok(BatchTransitionV0::from_value_map(raw_value_map, platform_version)?.into()), + 1 => Ok(BatchTransitionV1::from_value_map(raw_value_map, platform_version)?.into()), n => Err(ProtocolError::UnknownVersionError(format!( - "Unknown DataContractCreateTransition version {n}" + "Unknown contract_create_state_transition default_current_version {n}" ))), } } @@ -108,7 +128,8 @@ impl<'a> StateTransitionValueConvert<'a> for DocumentsBatchTransition { .map_err(ProtocolError::ValueError)?; match version { - 0 => DocumentsBatchTransitionV0::clean_value(value), + 0 => BatchTransitionV0::clean_value(value), + 1 => BatchTransitionV1::clean_value(value), n => Err(ProtocolError::UnknownVersionError(format!( "Unknown DataContractCreateTransition version {n}" ))), diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/version.rs new file mode 100644 index 00000000000..be7d07021e1 --- /dev/null +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/batch_transition/version.rs @@ -0,0 +1,12 @@ +use crate::state_transition::batch_transition::BatchTransition; +use crate::state_transition::FeatureVersioned; +use crate::version::FeatureVersion; + +impl FeatureVersioned for BatchTransition { + fn feature_version(&self) -> FeatureVersion { + match self { + BatchTransition::V0(v0) => v0.feature_version(), + BatchTransition::V1(v1) => v1.feature_version(), + } + } +} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/mod.rs deleted file mode 100644 index 34ae8b57ab9..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/mod.rs +++ /dev/null @@ -1,19 +0,0 @@ -mod v0; - -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -pub use v0::*; - -impl DocumentsBatchTransitionAccessorsV0 for DocumentsBatchTransition { - fn transitions(&self) -> &Vec<DocumentTransition> { - match self { - DocumentsBatchTransition::V0(v0) => &v0.transitions, - } - } - - fn transitions_slice(&self) -> &[DocumentTransition] { - match self { - DocumentsBatchTransition::V0(v0) => v0.transitions.as_slice(), - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/v0/mod.rs deleted file mode 100644 index 1e458fad496..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/accessors/v0/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; - -pub trait DocumentsBatchTransitionAccessorsV0 { - fn transitions(&self) -> &Vec<DocumentTransition>; - fn transitions_slice(&self) -> &[DocumentTransition]; -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/v0_methods.rs deleted file mode 100644 index d37685df0d3..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/document_transition/document_delete_transition/v0/v0_methods.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; -use crate::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; - -pub trait DocumentDeleteTransitionV0Methods { - /// Returns a reference to the `base` field of the `DocumentCreateTransitionV0`. - fn base(&self) -> &DocumentBaseTransition; - fn base_mut(&mut self) -> &mut DocumentBaseTransition; - - /// Sets the value of the `base` field in the `DocumentCreateTransitionV0`. - /// - /// # Arguments - /// - /// * `base` - A value of type `DocumentBaseTransition` to set. - fn set_base(&mut self, base: DocumentBaseTransition); -} - -impl DocumentDeleteTransitionV0Methods for DocumentDeleteTransitionV0 { - fn base(&self) -> &DocumentBaseTransition { - &self.base - } - - fn base_mut(&mut self) -> &mut DocumentBaseTransition { - &mut self.base - } - - fn set_base(&mut self, base: DocumentBaseTransition) { - self.base = base - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs deleted file mode 100644 index 3d8a2d1486e..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/identity_signed.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::identity::{KeyID, Purpose, SecurityLevel}; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::StateTransitionIdentitySigned; - -impl StateTransitionIdentitySigned for DocumentsBatchTransition { - fn signature_public_key_id(&self) -> KeyID { - match self { - DocumentsBatchTransition::V0(transition) => transition.signature_public_key_id(), - } - } - - fn set_signature_public_key_id(&mut self, key_id: KeyID) { - match self { - DocumentsBatchTransition::V0(transition) => { - transition.set_signature_public_key_id(key_id) - } - } - } - - fn security_level_requirement(&self, purpose: Purpose) -> Vec<SecurityLevel> { - match self { - DocumentsBatchTransition::V0(transition) => { - transition.security_level_requirement(purpose) - } - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs deleted file mode 100644 index 071ed54f90f..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/methods/mod.rs +++ /dev/null @@ -1,326 +0,0 @@ -#[cfg(feature = "state-transition-signing")] -use crate::data_contract::document_type::DocumentTypeRef; -#[cfg(feature = "state-transition-signing")] -use crate::document::Document; -use crate::fee::Credits; -#[cfg(feature = "state-transition-signing")] -use crate::identity::signer::Signer; -#[cfg(feature = "state-transition-signing")] -use crate::identity::IdentityPublicKey; -use crate::prelude::IdentityNonce; -#[cfg(feature = "state-transition-signing")] -use crate::prelude::UserFeeIncrease; -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; -use crate::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -#[cfg(feature = "state-transition-signing")] -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; -#[cfg(feature = "state-transition-signing")] -use crate::state_transition::StateTransition; -use crate::ProtocolError; -#[cfg(feature = "state-transition-signing")] -use platform_value::Identifier; -#[cfg(feature = "state-transition-signing")] -use platform_version::version::{FeatureVersion, PlatformVersion}; - -pub mod v0; - -impl DocumentsBatchTransitionMethodsV0 for DocumentsBatchTransition { - fn all_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { - match self { - DocumentsBatchTransition::V0(v0) => v0.all_purchases_amount(), - } - } - - fn all_conflicting_index_collateral_voting_funds( - &self, - ) -> Result<Option<Credits>, ProtocolError> { - match self { - DocumentsBatchTransition::V0(v0) => v0.all_conflicting_index_collateral_voting_funds(), - } - } - - fn set_transitions(&mut self, transitions: Vec<DocumentTransition>) { - match self { - DocumentsBatchTransition::V0(v0) => v0.set_transitions(transitions), - } - } - - fn set_identity_contract_nonce(&mut self, identity_contract_nonce: IdentityNonce) { - match self { - DocumentsBatchTransition::V0(v0) => { - v0.set_identity_contract_nonce(identity_contract_nonce) - } - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_creation_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - entropy: [u8; 32], - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - create_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_creation_transition_from_document( - document, - document_type, - entropy, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - create_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: "DocumentsBatchTransition::new_created_from_document".to_string(), - known_versions: vec![0], - received: version, - }), - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_replacement_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - replace_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_replacement_transition_from_document( - document, - document_type, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - replace_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: - "DocumentsBatchTransition::new_document_replacement_transition_from_document" - .to_string(), - known_versions: vec![0], - received: version, - }), - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_transfer_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - recipient_owner_id: Identifier, - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - transfer_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_transfer_transition_from_document( - document, - document_type, - recipient_owner_id, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - transfer_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: - "DocumentsBatchTransition::new_document_replacement_transition_from_document" - .to_string(), - known_versions: vec![0], - received: version, - }), - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_deletion_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - delete_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_deletion_transition_from_document( - document, - document_type, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - delete_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: "DocumentsBatchTransition::new_document_deletion_transition_from_document" - .to_string(), - known_versions: vec![0], - received: version, - }), - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_update_price_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - price: Credits, - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - update_price_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_update_price_transition_from_document( - document, - document_type, - price, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - update_price_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: - "DocumentsBatchTransition::new_document_update_price_transition_from_document" - .to_string(), - known_versions: vec![0], - received: version, - }), - } - } - - #[cfg(feature = "state-transition-signing")] - fn new_document_purchase_transition_from_document<S: Signer>( - document: Document, - document_type: DocumentTypeRef, - new_owner_id: Identifier, - price: Credits, - identity_public_key: &IdentityPublicKey, - identity_contract_nonce: IdentityNonce, - user_fee_increase: UserFeeIncrease, - signer: &S, - platform_version: &PlatformVersion, - batch_feature_version: Option<FeatureVersion>, - purchase_feature_version: Option<FeatureVersion>, - base_feature_version: Option<FeatureVersion>, - ) -> Result<StateTransition, ProtocolError> { - match batch_feature_version.unwrap_or( - platform_version - .dpp - .state_transition_serialization_versions - .documents_batch_state_transition - .default_current_version, - ) { - 0 => Ok( - DocumentsBatchTransitionV0::new_document_purchase_transition_from_document( - document, - document_type, - new_owner_id, - price, - identity_public_key, - identity_contract_nonce, - user_fee_increase, - signer, - platform_version, - batch_feature_version, - purchase_feature_version, - base_feature_version, - )?, - ), - version => Err(ProtocolError::UnknownVersionMismatch { - method: "DocumentsBatchTransition::new_document_purchase_transition_from_document" - .to_string(), - known_versions: vec![0], - received: version, - }), - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs deleted file mode 100644 index f62e971fb7e..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/mod.rs +++ /dev/null @@ -1,598 +0,0 @@ -use bincode::{Decode, Encode}; - -use std::convert::TryInto; - -use derive_more::From; - -use platform_value::Value; -#[cfg(feature = "state-transition-serde-conversion")] -use serde::{Deserialize, Serialize}; - -use crate::ProtocolError; -use crate::{identity::SecurityLevel, state_transition::StateTransitionFieldTypes}; - -pub use self::document_transition::{ - document_base_transition, document_create_transition, - document_create_transition::DocumentCreateTransition, document_delete_transition, - document_delete_transition::DocumentDeleteTransition, document_replace_transition, - document_replace_transition::DocumentReplaceTransition, -}; - -use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize, PlatformSignable}; -use platform_versioning::PlatformVersioned; - -pub mod accessors; -pub mod document_transition; -pub mod fields; -mod identity_signed; -#[cfg(feature = "state-transition-json-conversion")] -mod json_conversion; -pub mod methods; -mod state_transition_like; -mod v0; -#[cfg(feature = "validation")] -mod validation; -#[cfg(feature = "state-transition-value-conversion")] -mod value_conversion; -mod version; - -use crate::state_transition::data_contract_update_transition::{ - SIGNATURE, SIGNATURE_PUBLIC_KEY_ID, -}; - -use crate::state_transition::documents_batch_transition::fields::property_names; - -use crate::identity::state_transition::OptionallyAssetLockProved; -pub use v0::*; - -#[derive( - Debug, - Clone, - PartialEq, - Encode, - Decode, - PlatformDeserialize, - PlatformSerialize, - PlatformSignable, - PlatformVersioned, - From, -)] -#[cfg_attr( - feature = "state-transition-serde-conversion", - derive(Serialize, Deserialize), - serde(tag = "$version") -)] -#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version -#[platform_version_path_bounds( - "dpp.state_transition_serialization_versions.documents_batch_state_transition" -)] -pub enum DocumentsBatchTransition { - #[cfg_attr(feature = "state-transition-serde-conversion", serde(rename = "0"))] - V0(DocumentsBatchTransitionV0), -} - -// -// impl Default for DocumentsBatchTransition { -// fn default() -> Self { -// match LATEST_PLATFORM_VERSION -// .state_transitions -// .documents_batch_state_transition -// .default_current_version -// { -// 0 => DocumentsBatchTransitionV0::default().into(), -// _ => DocumentsBatchTransitionV0::default().into(), //for now -// } -// } -// } -// -// impl DocumentsBatchTransition { -// #[cfg(feature = "state-transition-json-conversion")] -// pub fn from_json_object( -// json_value: JsonValue, -// data_contracts: Vec<DataContract>, -// ) -> Result<Self, ProtocolError> { -// let mut json_value = json_value; -// -// let maybe_signature = json_value.get_string(property_names::SIGNATURE).ok(); -// let signature = if let Some(signature) = maybe_signature { -// Some(BinaryData( -// BASE64_STANDARD.decode(signature).context("signature exists but isn't valid base64")?, -// )) -// } else { -// None -// }; -// -// let mut batch_transitions = DocumentsBatchTransition { -// feature_version: json_value -// .get_u64(property_names::STATE_TRANSITION_PROTOCOL_VERSION) -// // js-dpp allows `protocolVersion` to be undefined -// .unwrap_or(LATEST_VERSION as u64) as u16, -// signature, -// signature_public_key_id: json_value -// .get_u64(property_names::SIGNATURE_PUBLIC_KEY_ID) -// .ok() -// .map(|v| v as KeyID), -// owner_id: Identifier::from_string( -// json_value.get_string(property_names::OWNER_ID)?, -// Encoding::Base58, -// )?, -// ..Default::default() -// }; -// -// let mut document_transitions: Vec<DocumentTransition> = vec![]; -// let maybe_transitions = json_value.remove(property_names::TRANSITIONS); -// if let Ok(JsonValue::Array(json_transitions)) = maybe_transitions { -// let data_contracts_map: HashMap<Vec<u8>, DataContract> = data_contracts -// .into_iter() -// .map(|dc| (dc.id.as_bytes().to_vec(), dc)) -// .collect(); -// -// for json_transition in json_transitions { -// let id = Identifier::from_string( -// json_transition.get_string(property_names::DATA_CONTRACT_ID)?, -// Encoding::Base58, -// )?; -// let data_contract = -// data_contracts_map -// .get(&id.as_bytes().to_vec()) -// .ok_or_else(|| { -// anyhow!( -// "Data Contract doesn't exists for Transition: {:?}", -// json_transition -// ) -// })?; -// let document_transition = -// DocumentTransition::from_json_object(json_transition, data_contract.clone())?; -// document_transitions.push(document_transition); -// } -// } -// -// batch_transitions.transitions = document_transitions; -// Ok(batch_transitions) -// } -// -// /// creates the instance of [`DocumentsBatchTransition`] from raw object -// pub fn from_object_with_contracts( -// raw_object: Value, -// data_contracts: Vec<DataContract>, -// ) -> Result<Self, ProtocolError> { -// let map = raw_object -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// Self::from_value_map(map, data_contracts) -// } -// -// /// creates the instance of [`DocumentsBatchTransition`] from a value map -// pub fn from_value_map( -// mut map: BTreeMap<String, Value>, -// data_contracts: Vec<DataContract>, -// ) -> Result<Self, ProtocolError> { -// let mut batch_transitions = DocumentsBatchTransition { -// feature_version: map -// .get_integer(property_names::STATE_TRANSITION_PROTOCOL_VERSION) -// // js-dpp allows `protocolVersion` to be undefined -// .unwrap_or(LATEST_VERSION as u64) as u16, -// signature: map -// .get_optional_binary_data(property_names::SIGNATURE) -// .map_err(ProtocolError::ValueError)?, -// signature_public_key_id: map -// .get_optional_integer(property_names::SIGNATURE_PUBLIC_KEY_ID) -// .map_err(ProtocolError::ValueError)?, -// owner_id: Identifier::from( -// map.get_hash256_bytes(property_names::OWNER_ID) -// .map_err(ProtocolError::ValueError)?, -// ), -// ..Default::default() -// }; -// -// let mut document_transitions: Vec<DocumentTransition> = vec![]; -// let maybe_transitions = map.remove(property_names::TRANSITIONS); -// if let Some(Value::Array(raw_transitions)) = maybe_transitions { -// let data_contracts_map: HashMap<Vec<u8>, DataContract> = data_contracts -// .into_iter() -// .map(|dc| (dc.id.as_bytes().to_vec(), dc)) -// .collect(); -// -// for raw_transition in raw_transitions { -// let mut raw_transition_map = raw_transition -// .into_btree_string_map() -// .map_err(ProtocolError::ValueError)?; -// let data_contract_id = -// raw_transition_map.get_hash256_bytes(property_names::DATA_CONTRACT_ID)?; -// let document_type = raw_transition_map.get_str(property_names::DOCUMENT_TYPE)?; -// let data_contract = data_contracts_map -// .get(data_contract_id.as_slice()) -// .ok_or_else(|| { -// anyhow!( -// "Data Contract doesn't exists for Transition: {:?}", -// raw_transition_map -// ) -// })?; -// -// //Because we don't know how the json came in we need to sanitize it -// let (identifiers, binary_paths): (Vec<_>, Vec<_>) = -// data_contract.get_identifiers_and_binary_paths_owned(document_type)?; -// -// raw_transition_map -// .replace_at_paths( -// identifiers.into_iter().chain( -// document_base_transition::IDENTIFIER_FIELDS -// .iter() -// .map(|a| a.to_string()), -// ), -// ReplacementType::Identifier, -// ) -// .map_err(ProtocolError::ValueError)?; -// raw_transition_map -// .replace_at_paths( -// binary_paths.into_iter().chain( -// document_create_transition::BINARY_FIELDS -// .iter() -// .map(|a| a.to_string()), -// ), -// ReplacementType::BinaryBytes, -// ) -// .map_err(ProtocolError::ValueError)?; -// -// let document_transition = -// DocumentTransition::from_value_map(raw_transition_map, data_contract.clone())?; -// document_transitions.push(document_transition); -// } -// } -// -// batch_transitions.transitions = document_transitions; -// Ok(batch_transitions) -// } -// -// pub fn transitions(&self) -> &Vec<DocumentTransition> { -// &self.transitions -// } -// -// pub fn transitions_slice(&self) -> &[DocumentTransition] { -// self.transitions.as_slice() -// } -// -// pub fn clean_value(value: &mut Value) -> Result<(), platform_value::Error> { -// value.replace_at_paths(IDENTIFIER_FIELDS, ReplacementType::Identifier)?; -// value.replace_integer_type_at_paths(U16_FIELDS, IntegerReplacementType::U16)?; -// Ok(()) -// } -// } -// -// -// impl DocumentsBatchTransition { -// fn to_value(&self, skip_signature: bool) -> Result<Value, ProtocolError> { -// Ok(self.to_value_map(skip_signature)?.into()) -// } -// -// fn to_value_map(&self, skip_signature: bool) -> Result<BTreeMap<String, Value>, ProtocolError> { -// let mut map = BTreeMap::new(); -// map.insert( -// property_names::STATE_TRANSITION_PROTOCOL_VERSION.to_string(), -// Value::U16(self.feature_version), -// ); -// map.insert( -// property_names::TRANSITION_TYPE.to_string(), -// Value::U8(self.transition_type as u8), -// ); -// map.insert( -// property_names::OWNER_ID.to_string(), -// Value::Identifier(self.owner_id.to_buffer()), -// ); -// -// if !skip_signature { -// if let Some(signature) = self.signature.as_ref() { -// map.insert( -// property_names::SIGNATURE.to_string(), -// Value::Bytes(signature.to_vec()), -// ); -// } -// if let Some(signature_key_id) = self.signature_public_key_id { -// map.insert( -// property_names::SIGNATURE.to_string(), -// Value::U32(signature_key_id), -// ); -// } -// } -// let mut transitions = vec![]; -// for transition in self.transitions.iter() { -// transitions.push(transition.to_object()?) -// } -// map.insert( -// property_names::TRANSITIONS.to_string(), -// Value::Array(transitions), -// ); -// -// Ok(map) -// } -// } - -impl StateTransitionFieldTypes for DocumentsBatchTransition { - fn binary_property_paths() -> Vec<&'static str> { - vec![SIGNATURE] - } - - fn identifiers_property_paths() -> Vec<&'static str> { - vec![property_names::OWNER_ID] - } - - fn signature_property_paths() -> Vec<&'static str> { - vec![SIGNATURE, SIGNATURE_PUBLIC_KEY_ID] - } - // - // fn to_json(&self, skip_signature: bool) -> Result<JsonValue, ProtocolError> { - // self.to_object(skip_signature) - // .and_then(|value| value.try_into().map_err(ProtocolError::ValueError)) - // } - // - // fn to_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { - // let mut object: Value = platform_value::to_value(self)?; - // if skip_signature { - // for path in Self::signature_property_paths() { - // let _ = object.remove_values_matching_path(path); - // } - // } - // let mut transitions = vec![]; - // for transition in self.transitions.iter() { - // transitions.push(transition.to_object()?) - // } - // object.insert( - // String::from(property_names::TRANSITIONS), - // Value::Array(transitions), - // )?; - // - // Ok(object) - // } - // - // #[cfg(feature = "state-transition-cbor-conversion")] - // fn to_cbor_buffer(&self, skip_signature: bool) -> Result<Vec<u8>, ProtocolError> { - // let mut result_buf = self.feature_version.encode_var_vec(); - // let value: CborValue = self.to_object(skip_signature)?.try_into()?; - // - // let map = CborValue::serialized(&value) - // .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; - // - // let mut canonical_map: CborCanonicalMap = map.try_into()?; - // canonical_map.remove(property_names::STATE_TRANSITION_PROTOCOL_VERSION); - // - // // Replace binary fields individually for every transition using respective data contract - // if let Some(CborValue::Array(ref mut transitions)) = - // canonical_map.get_mut(&CborValue::Text(property_names::TRANSITIONS.to_string())) - // { - // for (i, cbor_transition) in transitions.iter_mut().enumerate() { - // let transition = self - // .transitions - // .get(i) - // .context(format!("transition with index {} doesn't exist", i))?; - // - // let (identifier_properties, binary_properties) = transition - // .base() - // .data_contract - // .get_identifiers_and_binary_paths( - // &self.transitions[i].base().document_type_name, - // )?; - // - // if transition.get_updated_at().is_none() { - // cbor_transition.remove("$updatedAt"); - // } - // - // cbor_transition.replace_paths( - // identifier_properties - // .into_iter() - // .chain(binary_properties) - // .chain(document_base_transition::IDENTIFIER_FIELDS) - // .chain(document_create_transition::BINARY_FIELDS), - // FieldType::ArrayInt, - // FieldType::Bytes, - // ); - // } - // } - // - // canonical_map.replace_paths( - // Self::binary_property_paths() - // .into_iter() - // .chain(Self::identifiers_property_paths()), - // FieldType::ArrayInt, - // FieldType::Bytes, - // ); - // - // if !skip_signature { - // if self.signature.is_none() { - // canonical_map.insert(property_names::SIGNATURE, CborValue::Null) - // } - // if self.signature_public_key_id.is_none() { - // canonical_map.insert(property_names::SIGNATURE_PUBLIC_KEY_ID, CborValue::Null) - // } - // } - // - // canonical_map.sort_canonical(); - // - // let mut buffer = canonical_map - // .to_bytes() - // .map_err(|e| ProtocolError::EncodingError(e.to_string()))?; - // result_buf.append(&mut buffer); - // - // Ok(result_buf) - // } - // - // fn to_cleaned_object(&self, skip_signature: bool) -> Result<Value, ProtocolError> { - // let mut object: Value = platform_value::to_value(self)?; - // if skip_signature { - // for path in Self::signature_property_paths() { - // let _ = object.remove_values_matching_path(path); - // } - // } - // let mut transitions = vec![]; - // for transition in self.transitions.iter() { - // transitions.push(transition.to_cleaned_object()?) - // } - // object.insert( - // String::from(property_names::TRANSITIONS), - // Value::Array(transitions), - // )?; - // - // Ok(object) - // } -} - -// TODO: Make a DocumentType method -pub fn get_security_level_requirement(v: &Value, default: SecurityLevel) -> SecurityLevel { - let maybe_security_level: Option<u64> = v - .get_optional_integer(property_names::SECURITY_LEVEL_REQUIREMENT) - // TODO: Data Contract must already valid so there is no chance that this will fail - .expect("document schema must be a map"); - - match maybe_security_level { - Some(some_level) => (some_level as u8).try_into().unwrap_or(default), - None => default, - } -} -// -// #[cfg(test)] -// mod test { -// use itertools::Itertools; -// use std::sync::Arc; -// -// use platform_value::Bytes32; -// use serde_json::json; -// -// use crate::tests::fixtures::get_extended_documents_fixture; -// use crate::{ -// document::{ -// document_factory::DocumentFactory, -// fetch_and_validate_data_contract::DataContractFetcherAndValidator, -// }, -// state_repository::MockStateRepositoryLike, -// tests::fixtures::{ -// get_data_contract_fixture, get_document_transitions_fixture, -// get_document_validator_fixture, -// }, -// }; -// -// use super::{document_transition::Action, *}; -// -// #[test] -// fn should_return_highest_sec_level_for_all_transitions() { -// let mut data_contract = get_data_contract_fixture(None).data_contract; -// data_contract -// .documents -// .get_mut("niceDocument") -// .unwrap() -// .insert( -// property_names::SECURITY_LEVEL_REQUIREMENT.to_string(), -// json!(SecurityLevel::MEDIUM), -// ) -// .unwrap(); -// data_contract -// .documents -// .get_mut("prettyDocument") -// .unwrap() -// .insert( -// property_names::SECURITY_LEVEL_REQUIREMENT.to_string(), -// json!(SecurityLevel::MASTER), -// ) -// .unwrap(); -// -// // 0 is niceDocument, -// // 1 and 2 are pretty documents, -// // 3 and 4 are indexed documents that do not have security level specified -// let documents = get_extended_documents_fixture(data_contract).unwrap(); -// let medium_security_document = documents.get(0).unwrap(); -// let master_security_document = documents.get(1).unwrap(); -// let no_security_level_document = documents.get(3).unwrap(); -// -// let document_factory = DocumentFactory::new( -// 1, -// get_document_validator_fixture(), -// DataContractFetcherAndValidator::new(Arc::new(MockStateRepositoryLike::new())), -// ); -// -// let batch_transition = document_factory -// .create_state_transition(vec![( -// Action::Create, -// vec![medium_security_document.to_owned()], -// )]) -// .expect("batch transition should be created"); -// -// assert!(batch_transition -// .get_security_level_requirement() -// .iter() -// .contains(&SecurityLevel::MEDIUM)); -// -// let batch_transition = document_factory -// .create_state_transition(vec![( -// Action::Create, -// vec![ -// medium_security_document.to_owned(), -// master_security_document.to_owned(), -// ], -// )]) -// .expect("batch transition should be created"); -// -// assert!(batch_transition -// .get_security_level_requirement() -// .iter() -// .contains(&SecurityLevel::MASTER)); -// -// let batch_transition = document_factory -// .create_state_transition(vec![( -// Action::Create, -// vec![no_security_level_document.to_owned()], -// )]) -// .expect("batch transition should be created"); -// -// assert!(batch_transition -// .get_security_level_requirement() -// .iter() -// .contains(&SecurityLevel::HIGH)); -// } -// -// #[test] -// fn should_convert_to_batch_transition_to_the_buffer() { -// let transition_id_base58 = "6o8UfoeE2s7dTkxxyPCixuxe8TM5DtCGHTMummUN6t5M"; -// let expected_bytes_hex ="01a5647479706501676f776e657249645820a858bdc49c968148cd12648ee048d34003e9da3fbf2cbc62c31bb4c717bf690d697369676e6174757265f76b7472616e736974696f6e7381a7632469645820561b9b2e90b7c0ca355f729777b45bc646a18f5426a9462f0333c766135a3120646e616d656543757469656524747970656c6e696365446f63756d656e746724616374696f6e006824656e74726f707958202cdbaeda81c14765ba48432ff5cc900a7cacd4538b817fc71f38907aaa7023746a246372656174656441741b000001853a3602876f2464617461436f6e74726163744964582049aea5df2124a51d5d8dcf466e238fbc77fd72601be69daeb6dba75e8d26b30c747369676e61747572655075626c69634b65794964f7" ; -// let data_contract_id_base58 = "5xdDqypFMPfvF6UdWxefCGvRFyxgkPZCAK6TS4pvvw6T"; -// let owner_id_base58 = "CL9ydpdxP4kQniGx6z5JUL8K72gnwcemKT2aJmh7sdwJ"; -// let entropy_base64 = "LNuu2oHBR2W6SEMv9cyQCnys1FOLgX/HHziQeqpwI3Q="; -// -// let transition_id = -// Identifier::from_string(transition_id_base58, Encoding::Base58).unwrap(); -// let expected_bytes = hex::decode(expected_bytes_hex).unwrap(); -// let data_contract_id = -// Identifier::from_string(data_contract_id_base58, Encoding::Base58).unwrap(); -// let owner_id = Identifier::from_string(owner_id_base58, Encoding::Base58).unwrap(); -// let entropy_bytes: [u8; 32] = BASE64_STANDARD.decode(entropy_base64).unwrap().try_into().unwrap(); -// -// let mut data_contract = get_data_contract_fixture(Some(owner_id)).data_contract; -// data_contract.id = data_contract_id; -// -// let documents = get_extended_documents_fixture(data_contract.clone()).unwrap(); -// let mut document = documents.first().unwrap().to_owned(); -// document.entropy = Bytes32::new(entropy_bytes); -// -// let transitions = get_document_transitions_fixture([(DocumentTransitionActionType::Create, vec![document])]); -// let mut transition = transitions.first().unwrap().to_owned(); -// if let DocumentTransition::Create(ref mut t) = transition { -// t.created_at = Some(1671718896263); -// t.base.id = transition_id; -// } -// -// let mut map = BTreeMap::new(); -// map.insert( -// "ownerId".to_string(), -// Value::Identifier(owner_id.to_buffer()), -// ); -// map.insert( -// "transitions".to_string(), -// Value::Array(vec![transition.to_object().unwrap()]), -// ); -// -// let state_transition = DocumentsBatchTransition::from_value_map(map, vec![data_contract]) -// .expect("transition should be created"); -// -// let bytes = state_transition.to_cbor_buffer(false).unwrap(); -// -// assert_eq!(hex::encode(expected_bytes), hex::encode(bytes)); -// } -// } -impl OptionallyAssetLockProved for DocumentsBatchTransition {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs deleted file mode 100644 index 69b5bfa5713..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/state_transition_like.rs +++ /dev/null @@ -1,71 +0,0 @@ -use crate::prelude::UserFeeIncrease; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::{StateTransitionLike, StateTransitionType}; -use crate::version::FeatureVersion; -use platform_value::{BinaryData, Identifier}; - -impl StateTransitionLike for DocumentsBatchTransition { - /// Returns ID of the created contract - fn modified_data_ids(&self) -> Vec<Identifier> { - match self { - DocumentsBatchTransition::V0(transition) => transition.modified_data_ids(), - } - } - - fn state_transition_protocol_version(&self) -> FeatureVersion { - match self { - DocumentsBatchTransition::V0(_) => 0, - } - } - /// returns the type of State Transition - fn state_transition_type(&self) -> StateTransitionType { - match self { - DocumentsBatchTransition::V0(transition) => transition.state_transition_type(), - } - } - /// returns the signature as a byte-array - fn signature(&self) -> &BinaryData { - match self { - DocumentsBatchTransition::V0(transition) => transition.signature(), - } - } - /// set a new signature - fn set_signature(&mut self, signature: BinaryData) { - match self { - DocumentsBatchTransition::V0(transition) => transition.set_signature(signature), - } - } - - fn set_signature_bytes(&mut self, signature: Vec<u8>) { - match self { - DocumentsBatchTransition::V0(transition) => transition.set_signature_bytes(signature), - } - } - - /// returns the fee multiplier - fn user_fee_increase(&self) -> UserFeeIncrease { - match self { - DocumentsBatchTransition::V0(transition) => transition.user_fee_increase(), - } - } - /// set a fee multiplier - fn set_user_fee_increase(&mut self, user_fee_increase: UserFeeIncrease) { - match self { - DocumentsBatchTransition::V0(transition) => { - transition.set_user_fee_increase(user_fee_increase) - } - } - } - - fn owner_id(&self) -> Identifier { - match self { - DocumentsBatchTransition::V0(transition) => transition.owner_id(), - } - } - - fn unique_identifiers(&self) -> Vec<String> { - match self { - DocumentsBatchTransition::V0(transition) => transition.unique_identifiers(), - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/json_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/json_conversion.rs deleted file mode 100644 index ac62cb41c73..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/json_conversion.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; -use crate::state_transition::StateTransitionJsonConvert; - -impl<'a> StateTransitionJsonConvert<'a> for DocumentsBatchTransitionV0 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/value_conversion.rs deleted file mode 100644 index d82f708df4d..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/v0/value_conversion.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransitionV0; -use crate::state_transition::StateTransitionValueConvert; - -impl<'a> StateTransitionValueConvert<'a> for DocumentsBatchTransitionV0 {} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs deleted file mode 100644 index 1bc2dd8b510..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/validation/validate_basic_structure/v0/mod.rs +++ /dev/null @@ -1,104 +0,0 @@ -use crate::consensus::basic::document::{ - DocumentTransitionsAreAbsentError, DuplicateDocumentTransitionsWithIdsError, - MaxDocumentsTransitionsExceededError, NonceOutOfBoundsError, -}; -use crate::consensus::basic::BasicError; - -use crate::identity::identity_nonce::MISSING_IDENTITY_REVISIONS_FILTER; -use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use crate::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use crate::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; -use crate::state_transition::documents_batch_transition::validation::find_duplicates_by_id::find_duplicates_by_id; -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::validation::SimpleConsensusValidationResult; -use crate::ProtocolError; -use platform_value::Identifier; -use platform_version::version::PlatformVersion; -use std::collections::btree_map::Entry; -use std::collections::BTreeMap; - -impl DocumentsBatchTransition { - #[inline(always)] - pub(super) fn validate_base_structure_v0( - &self, - platform_version: &PlatformVersion, - ) -> Result<SimpleConsensusValidationResult, ProtocolError> { - if self.transitions().is_empty() { - return Ok(SimpleConsensusValidationResult::new_with_error( - DocumentTransitionsAreAbsentError::new().into(), - )); - } - - let transitions_len = self.transitions().len(); - - if transitions_len > u16::MAX as usize - || transitions_len as u16 - > platform_version - .system_limits - .max_transitions_in_documents_batch - { - return Ok(SimpleConsensusValidationResult::new_with_error( - MaxDocumentsTransitionsExceededError::new( - platform_version - .system_limits - .max_transitions_in_documents_batch, - ) - .into(), - )); - } - - // Group transitions by contract ID - let mut document_transitions_by_contracts: BTreeMap<Identifier, Vec<&DocumentTransition>> = - BTreeMap::new(); - - self.transitions().iter().for_each(|document_transition| { - let contract_identifier = document_transition.data_contract_id(); - - match document_transitions_by_contracts.entry(contract_identifier) { - Entry::Vacant(vacant) => { - vacant.insert(vec![document_transition]); - } - Entry::Occupied(mut identifiers) => { - identifiers.get_mut().push(document_transition); - } - }; - }); - - let mut result = SimpleConsensusValidationResult::default(); - - for transitions in document_transitions_by_contracts.values() { - for transition in transitions { - // We need to make sure that the identity contract nonce is within the allowed bounds - // This means that it is stored on 40 bits - if transition.identity_contract_nonce() & MISSING_IDENTITY_REVISIONS_FILTER > 0 { - result.add_error(BasicError::NonceOutOfBoundsError( - NonceOutOfBoundsError::new(transition.identity_contract_nonce()), - )); - } - } - - // Make sure we don't have duplicate transitions - let duplicate_transitions = find_duplicates_by_id(transitions, platform_version)?; - - if !duplicate_transitions.is_empty() { - let references: Vec<(String, [u8; 32])> = duplicate_transitions - .into_iter() - .map(|transition| { - Ok(( - transition.base().document_type_name().clone(), - transition.base().id().to_buffer(), - )) - }) - .collect::<Result<Vec<(String, [u8; 32])>, anyhow::Error>>()?; - - result.add_error(BasicError::DuplicateDocumentTransitionsWithIdsError( - DuplicateDocumentTransitionsWithIdsError::new(references), - )); - } - } - - Ok(result) - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/version.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/version.rs deleted file mode 100644 index f65071aabe8..00000000000 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/documents_batch_transition/version.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::state_transition::documents_batch_transition::DocumentsBatchTransition; -use crate::state_transition::FeatureVersioned; -use crate::version::FeatureVersion; - -impl FeatureVersioned for DocumentsBatchTransition { - fn feature_version(&self) -> FeatureVersion { - match self { - DocumentsBatchTransition::V0(v0) => v0.feature_version(), - } - } -} diff --git a/packages/rs-dpp/src/state_transition/state_transitions/document/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/document/mod.rs index 01a4fd6ffd8..03238bee69e 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/document/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/document/mod.rs @@ -1 +1 @@ -pub mod documents_batch_transition; +pub mod batch_transition; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs index 588fafe2c06..d0320bb4496 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/methods/v0/mod.rs @@ -6,6 +6,8 @@ use crate::{ ProtocolError, }; #[cfg(feature = "state-transition-signing")] +use platform_value::Identifier; +#[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; use crate::state_transition::StateTransitionType; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs index cf376b9b83a..bbcd3780c05 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/identity_credit_transfer_transition/v0/v0_methods.rs @@ -8,10 +8,12 @@ use crate::{ state_transition::StateTransition, ProtocolError, }; +#[cfg(feature = "state-transition-signing")] use platform_value::Identifier; use crate::state_transition::identity_credit_transfer_transition::methods::IdentityCreditTransferTransitionMethodsV0; use crate::state_transition::identity_credit_transfer_transition::v0::IdentityCreditTransferTransitionV0; +#[cfg(feature = "state-transition-signing")] use crate::state_transition::GetDataContractSecurityLevelRequirementFn; #[cfg(feature = "state-transition-signing")] use platform_version::version::{FeatureVersion, PlatformVersion}; diff --git a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/value_conversion.rs b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/value_conversion.rs index 2ebc3b6f859..6822f7d2c38 100644 --- a/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/value_conversion.rs +++ b/packages/rs-dpp/src/state_transition/state_transitions/identity/public_key_in_creation/value_conversion.rs @@ -1,5 +1,5 @@ use crate::serialization::ValueConvertible; -use crate::state_transition::documents_batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; +use crate::state_transition::batch_transition::fields::property_names::STATE_TRANSITION_PROTOCOL_VERSION; use crate::state_transition::public_key_in_creation::v0::IdentityPublicKeyInCreationV0; use crate::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use crate::state_transition::StateTransitionValueConvert; diff --git a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs index 4884fd46b68..e3084b6310d 100644 --- a/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs +++ b/packages/rs-dpp/src/state_transition/traits/state_transition_like.rs @@ -8,8 +8,7 @@ use crate::version::FeatureVersion; use crate::state_transition::StateTransitionType; use crate::state_transition::{StateTransition, StateTransitionFieldTypes}; -pub const DOCUMENT_TRANSITION_TYPES: [StateTransitionType; 1] = - [StateTransitionType::DocumentsBatch]; +pub const DOCUMENT_TRANSITION_TYPES: [StateTransitionType; 1] = [StateTransitionType::Batch]; pub const IDENTITY_TRANSITION_TYPE: [StateTransitionType; 5] = [ StateTransitionType::IdentityCreate, diff --git a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs index dfb531b5546..d50516c4400 100644 --- a/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs +++ b/packages/rs-dpp/src/tests/fixtures/get_document_transitions_fixture.rs @@ -5,12 +5,10 @@ use platform_version::version::PlatformVersion; use std::collections::BTreeMap; use crate::document::Document; -use crate::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use crate::state_transition::documents_batch_transition::document_transition::DocumentTransition; - -use crate::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; - -pub fn get_document_transitions_fixture<'a>( +use crate::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use crate::state_transition::batch_transition::batched_transition::BatchedTransition; +use crate::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionType; +pub fn get_batched_transitions_fixture<'a>( documents: impl IntoIterator< Item = ( DocumentTransitionActionType, @@ -18,7 +16,7 @@ pub fn get_document_transitions_fixture<'a>( ), >, nonce_counter: &mut BTreeMap<(Identifier, Identifier), u64>, //IdentityID/ContractID -> nonce -) -> Vec<DocumentTransition> { +) -> Vec<BatchedTransition> { let protocol_version = PlatformVersion::latest().protocol_version; let document_factory = DocumentFactory::new(protocol_version).expect("expected to get document factory"); @@ -26,6 +24,7 @@ pub fn get_document_transitions_fixture<'a>( document_factory .create_state_transition(documents, nonce_counter) .expect("the transitions should be created") - .transitions() - .to_owned() + .transitions_iter() + .map(|batched_transition_ref| batched_transition_ref.to_owned_transition()) + .collect() } diff --git a/packages/rs-dpp/src/tokens/allowed_currency.rs b/packages/rs-dpp/src/tokens/allowed_currency.rs new file mode 100644 index 00000000000..f6c5b4da938 --- /dev/null +++ b/packages/rs-dpp/src/tokens/allowed_currency.rs @@ -0,0 +1,7 @@ +use platform_value::Identifier; + +#[derive(Debug, PartialEq, Clone)] +pub enum AllowedCurrency { + TradingInDash, + OnContract(Identifier, String), +} diff --git a/packages/rs-dpp/src/tokens/emergency_action.rs b/packages/rs-dpp/src/tokens/emergency_action.rs new file mode 100644 index 00000000000..8bac9c8ea68 --- /dev/null +++ b/packages/rs-dpp/src/tokens/emergency_action.rs @@ -0,0 +1,33 @@ +use crate::tokens::status::TokenStatus; +use crate::ProtocolError; +use bincode::{Decode, Encode}; +use platform_version::version::PlatformVersion; +#[cfg(feature = "state-transition-serde-conversion")] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, Default, Encode, Decode, PartialOrd, PartialEq, Eq)] +#[cfg_attr( + feature = "state-transition-serde-conversion", + derive(Serialize, Deserialize), + serde(rename_all = "camelCase") +)] +pub enum TokenEmergencyAction { + #[default] + Pause = 0, + Resume = 1, +} + +impl TokenEmergencyAction { + pub fn paused(&self) -> bool { + matches!(self, TokenEmergencyAction::Pause) + } + pub fn resulting_status( + &self, + platform_version: &PlatformVersion, + ) -> Result<TokenStatus, ProtocolError> { + match self { + TokenEmergencyAction::Pause => TokenStatus::new(true, platform_version), + TokenEmergencyAction::Resume => TokenStatus::new(false, platform_version), + } + } +} diff --git a/packages/rs-dpp/src/tokens/errors.rs b/packages/rs-dpp/src/tokens/errors.rs new file mode 100644 index 00000000000..536534ddded --- /dev/null +++ b/packages/rs-dpp/src/tokens/errors.rs @@ -0,0 +1,11 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum TokenError { + #[error("There is no token at this position")] + TokenNotFoundAtPositionError, + #[error("The contract version does not allow tokens")] + TokenNotFoundOnContractVersion, + #[error("There is no minting recipient set")] + TokenNoMintingRecipient, +} diff --git a/packages/rs-dpp/src/tokens/info/methods.rs b/packages/rs-dpp/src/tokens/info/methods.rs new file mode 100644 index 00000000000..09884a8ab61 --- /dev/null +++ b/packages/rs-dpp/src/tokens/info/methods.rs @@ -0,0 +1,16 @@ +use crate::tokens::info::v0::IdentityTokenInfoV0Accessors; +use crate::tokens::info::IdentityTokenInfo; + +impl IdentityTokenInfoV0Accessors for IdentityTokenInfo { + fn frozen(&self) -> bool { + match self { + IdentityTokenInfo::V0(info) => info.frozen, + } + } + + fn set_frozen(&mut self, frozen: bool) { + match self { + IdentityTokenInfo::V0(info) => info.set_frozen(frozen), + } + } +} diff --git a/packages/rs-dpp/src/tokens/info/mod.rs b/packages/rs-dpp/src/tokens/info/mod.rs new file mode 100644 index 00000000000..ccf211d4404 --- /dev/null +++ b/packages/rs-dpp/src/tokens/info/mod.rs @@ -0,0 +1,44 @@ +use crate::tokens::info::v0::IdentityTokenInfoV0; +use crate::ProtocolError; +use bincode::Encode; +use derive_more::From; +use platform_serialization::de::Decode; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_version::version::PlatformVersion; +use platform_versioning::PlatformVersioned; + +mod methods; +pub mod v0; + +#[derive( + Debug, + Clone, + Encode, + Decode, + PlatformDeserialize, + PlatformSerialize, + PlatformVersioned, + From, + PartialEq, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub enum IdentityTokenInfo { + V0(IdentityTokenInfoV0), +} + +impl IdentityTokenInfo { + pub fn new(frozen: bool, platform_version: &PlatformVersion) -> Result<Self, ProtocolError> { + match platform_version + .dpp + .token_versions + .identity_token_info_default_structure_version + { + 0 => Ok(IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen })), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityTokenInfo::new".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/tokens/info/v0/mod.rs b/packages/rs-dpp/src/tokens/info/v0/mod.rs new file mode 100644 index 00000000000..2fa6f5e3106 --- /dev/null +++ b/packages/rs-dpp/src/tokens/info/v0/mod.rs @@ -0,0 +1,26 @@ +use bincode::{Decode, Encode}; +use derive_more::From; + +#[derive(Debug, Clone, Encode, Decode, From, PartialEq)] +/// Token information for an identity (version 0). +pub struct IdentityTokenInfoV0 { + pub frozen: bool, +} + +pub trait IdentityTokenInfoV0Accessors { + /// Gets the frozen state of the identity. + fn frozen(&self) -> bool; + + /// Sets the frozen state of the identity. + fn set_frozen(&mut self, frozen: bool); +} + +impl IdentityTokenInfoV0Accessors for IdentityTokenInfoV0 { + fn frozen(&self) -> bool { + self.frozen + } + + fn set_frozen(&mut self, frozen: bool) { + self.frozen = frozen; + } +} diff --git a/packages/rs-dpp/src/tokens/mod.rs b/packages/rs-dpp/src/tokens/mod.rs new file mode 100644 index 00000000000..b05c9bdbd95 --- /dev/null +++ b/packages/rs-dpp/src/tokens/mod.rs @@ -0,0 +1,26 @@ +use crate::data_contract::TokenContractPosition; +use crate::prelude::{ + DerivationEncryptionKeyIndex, RecipientKeyIndex, RootEncryptionKeyIndex, SenderKeyIndex, +}; +use crate::util::hash::hash_double; + +pub mod allowed_currency; +pub mod emergency_action; +pub mod errors; +pub mod info; +pub mod status; +pub mod token_event; + +pub type SharedEncryptedNote = (SenderKeyIndex, RecipientKeyIndex, Vec<u8>); +pub type PrivateEncryptedNote = ( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, +); + +pub fn calculate_token_id(contract_id: &[u8; 32], token_pos: TokenContractPosition) -> [u8; 32] { + let mut bytes = b"dash_token".to_vec(); + bytes.extend_from_slice(contract_id); + bytes.extend_from_slice(&token_pos.to_be_bytes()); + hash_double(bytes) +} diff --git a/packages/rs-dpp/src/tokens/status/methods.rs b/packages/rs-dpp/src/tokens/status/methods.rs new file mode 100644 index 00000000000..e912ea562e1 --- /dev/null +++ b/packages/rs-dpp/src/tokens/status/methods.rs @@ -0,0 +1,16 @@ +use crate::tokens::status::v0::TokenStatusV0Accessors; +use crate::tokens::status::TokenStatus; + +impl TokenStatusV0Accessors for TokenStatus { + fn paused(&self) -> bool { + match self { + TokenStatus::V0(status) => status.paused, + } + } + + fn set_paused(&mut self, frozen: bool) { + match self { + TokenStatus::V0(status) => status.set_paused(frozen), + } + } +} diff --git a/packages/rs-dpp/src/tokens/status/mod.rs b/packages/rs-dpp/src/tokens/status/mod.rs new file mode 100644 index 00000000000..f39cc6be09f --- /dev/null +++ b/packages/rs-dpp/src/tokens/status/mod.rs @@ -0,0 +1,44 @@ +use crate::tokens::status::v0::TokenStatusV0; +use crate::ProtocolError; +use bincode::Encode; +use derive_more::From; +use platform_serialization::de::Decode; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_version::version::PlatformVersion; +use platform_versioning::PlatformVersioned; + +mod methods; +pub mod v0; + +#[derive( + Debug, + Clone, + Encode, + Decode, + PlatformDeserialize, + PlatformSerialize, + PlatformVersioned, + From, + PartialEq, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub enum TokenStatus { + V0(TokenStatusV0), +} + +impl TokenStatus { + pub fn new(paused: bool, platform_version: &PlatformVersion) -> Result<Self, ProtocolError> { + match platform_version + .dpp + .token_versions + .identity_token_status_default_structure_version + { + 0 => Ok(TokenStatus::V0(TokenStatusV0 { paused })), + version => Err(ProtocolError::UnknownVersionMismatch { + method: "IdentityTokenStatus::new".to_string(), + known_versions: vec![0], + received: version, + }), + } + } +} diff --git a/packages/rs-dpp/src/tokens/status/v0/mod.rs b/packages/rs-dpp/src/tokens/status/v0/mod.rs new file mode 100644 index 00000000000..a8dd3a0f83a --- /dev/null +++ b/packages/rs-dpp/src/tokens/status/v0/mod.rs @@ -0,0 +1,26 @@ +use bincode::{Decode, Encode}; +use derive_more::From; + +#[derive(Debug, Clone, Encode, Decode, From, PartialEq)] +/// Token status +pub struct TokenStatusV0 { + pub paused: bool, +} + +pub trait TokenStatusV0Accessors { + /// Gets the paused state of the token. + fn paused(&self) -> bool; + + /// Sets the paused state of the token. + fn set_paused(&mut self, paused: bool); +} + +impl TokenStatusV0Accessors for TokenStatusV0 { + fn paused(&self) -> bool { + self.paused + } + + fn set_paused(&mut self, paused: bool) { + self.paused = paused; + } +} diff --git a/packages/rs-dpp/src/tokens/token_event.rs b/packages/rs-dpp/src/tokens/token_event.rs new file mode 100644 index 00000000000..82c72825d70 --- /dev/null +++ b/packages/rs-dpp/src/tokens/token_event.rs @@ -0,0 +1,230 @@ +use crate::balances::credits::TokenAmount; +use crate::block::block_info::BlockInfo; +use crate::data_contract::accessors::v0::DataContractV0Getters; +use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use crate::data_contract::document_type::DocumentTypeRef; +use crate::document::{Document, DocumentV0}; +use crate::prelude::{ + DataContract, DerivationEncryptionKeyIndex, IdentityNonce, RootEncryptionKeyIndex, +}; +use bincode::{Decode, Encode}; +use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; +use platform_value::Identifier; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +pub type TokenEventPublicNote = Option<String>; +pub type TokenEventSharedEncryptedNote = Option<SharedEncryptedNote>; +pub type TokenEventPersonalEncryptedNote = Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, +)>; +use crate::serialization::PlatformSerializableWithPlatformVersion; +use crate::tokens::emergency_action::TokenEmergencyAction; +use crate::tokens::SharedEncryptedNote; +use crate::ProtocolError; + +pub type RecipientIdentifier = Identifier; +pub type FrozenIdentifier = Identifier; + +#[derive( + Debug, PartialEq, PartialOrd, Clone, Eq, Encode, Decode, PlatformDeserialize, PlatformSerialize, +)] +#[platform_serialize(unversioned)] //versioned directly, no need to use platform_version +pub enum TokenEvent { + Mint(TokenAmount, RecipientIdentifier, TokenEventPublicNote), + Burn(TokenAmount, TokenEventPublicNote), + Freeze(FrozenIdentifier, TokenEventPublicNote), + Unfreeze(FrozenIdentifier, TokenEventPublicNote), + DestroyFrozenFunds(FrozenIdentifier, TokenAmount, TokenEventPublicNote), + Transfer( + RecipientIdentifier, + TokenEventPublicNote, + TokenEventSharedEncryptedNote, + TokenEventPersonalEncryptedNote, + TokenAmount, + ), + EmergencyAction(TokenEmergencyAction, TokenEventPublicNote), + ConfigUpdate(TokenConfigurationChangeItem, TokenEventPublicNote), +} + +impl TokenEvent { + pub fn associated_document_type_name(&self) -> &str { + match self { + TokenEvent::Mint(_, _, _) => "mint", + TokenEvent::Burn(_, _) => "burn", + TokenEvent::Freeze(_, _) => "freeze", + TokenEvent::Unfreeze(_, _) => "unfreeze", + TokenEvent::DestroyFrozenFunds(_, _, _) => "destroyFrozenFunds", + TokenEvent::Transfer(_, _, _, _, _) => "transfer", + TokenEvent::EmergencyAction(_, _) => "emergencyAction", + TokenEvent::ConfigUpdate(_, _) => "configUpdate", + } + } + + pub fn associated_document_type<'a>( + &self, + token_history_contract: &'a DataContract, + ) -> Result<DocumentTypeRef<'a>, ProtocolError> { + Ok(token_history_contract.document_type_for_name(self.associated_document_type_name())?) + } + + pub fn build_historical_document_owned( + self, + token_history_contract: &DataContract, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + block_info: &BlockInfo, + platform_version: &PlatformVersion, + ) -> Result<Document, ProtocolError> { + let document_id = Document::generate_document_id_v0( + &token_history_contract.id(), + &owner_id, + self.associated_document_type_name(), + owner_nonce.to_be_bytes().as_slice(), + ); + + let properties = match self { + TokenEvent::Mint(mint_amount, recipient_id, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("recipientId".to_string(), recipient_id.into()), + ("amount".to_string(), mint_amount.into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::Burn(burn_amount, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("amount".to_string(), burn_amount.into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::Transfer( + to, + public_note, + token_event_shared_encrypted_note, + token_event_personal_encrypted_note, + amount, + ) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("amount".to_string(), amount.into()), + ("toIdentityId".to_string(), to.into()), + ]); + if let Some(note) = public_note { + properties.insert("publicNote".to_string(), note.into()); + } + if let Some((sender_key_index, recipient_key_index, note)) = + token_event_shared_encrypted_note + { + properties.insert("encryptedSharedNote".to_string(), note.into()); + properties.insert("senderKeyIndex".to_string(), sender_key_index.into()); + properties.insert("recipientKeyIndex".to_string(), recipient_key_index.into()); + } + + if let Some((root_encryption_key_index, derivation_encryption_key_index, note)) = + token_event_personal_encrypted_note + { + properties.insert("encryptedPersonalNote".to_string(), note.into()); + properties.insert( + "rootEncryptionKeyIndex".to_string(), + root_encryption_key_index.into(), + ); + properties.insert( + "derivationEncryptionKeyIndex".to_string(), + derivation_encryption_key_index.into(), + ); + } + properties + } + TokenEvent::Freeze(frozen_identity_id, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("frozenIdentityId".to_string(), frozen_identity_id.into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::Unfreeze(frozen_identity_id, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("frozenIdentityId".to_string(), frozen_identity_id.into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::DestroyFrozenFunds(frozen_identity_id, amount, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("frozenIdentityId".to_string(), frozen_identity_id.into()), + ("destroyedAmount".to_string(), amount.into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::EmergencyAction(action, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ("action".to_string(), (action as u8).into()), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + TokenEvent::ConfigUpdate(configuration_change_item, public_note) => { + let mut properties = BTreeMap::from([ + ("tokenId".to_string(), token_id.into()), + ( + "changeItemType".to_string(), + configuration_change_item.u8_item_index().into(), + ), + ( + "changeItem".to_string(), + configuration_change_item + .serialize_consume_to_bytes_with_platform_version(platform_version)? + .into(), + ), + ]); + if let Some(note) = public_note { + properties.insert("note".to_string(), note.into()); + } + properties + } + }; + + let document: Document = DocumentV0 { + id: document_id, + owner_id, + properties, + revision: None, + created_at: Some(block_info.time_ms), + updated_at: None, + transferred_at: None, + created_at_block_height: Some(block_info.height), + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + + Ok(document) + } +} diff --git a/packages/rs-dpp/src/util/cbor_value/canonical.rs b/packages/rs-dpp/src/util/cbor_value/canonical.rs index 99ca93f0abb..05d3a61782f 100644 --- a/packages/rs-dpp/src/util/cbor_value/canonical.rs +++ b/packages/rs-dpp/src/util/cbor_value/canonical.rs @@ -114,9 +114,7 @@ impl CborCanonicalMap { let map = CborValue::Map(self.inner); - ciborium::ser::SerializerOptions::default() - .serialize_null_as_undefined(true) - .into_writer(&map, &mut bytes)?; + ciborium::ser::into_writer(&map, &mut bytes)?; Ok(bytes) } diff --git a/packages/rs-dpp/src/util/deserializer.rs b/packages/rs-dpp/src/util/deserializer.rs index 301bdf24d27..9be4ff6bba3 100644 --- a/packages/rs-dpp/src/util/deserializer.rs +++ b/packages/rs-dpp/src/util/deserializer.rs @@ -6,23 +6,9 @@ use crate::consensus::basic::BasicError; use crate::consensus::ConsensusError; use integer_encoding::VarInt; use platform_version::version::FeatureVersion; -use serde_json::{Map, Number, Value as JsonValue}; use crate::errors::ProtocolError; -pub fn parse_protocol_version( - protocol_bytes: &[u8], - json_map: &mut Map<String, JsonValue>, -) -> Result<(), ProtocolError> { - let protocol_version = get_protocol_version(protocol_bytes)?; - - json_map.insert( - String::from("$protocolVersion"), - JsonValue::Number(Number::from(protocol_version)), - ); - Ok(()) -} - /// A protocol version pub type ProtocolVersion = u32; diff --git a/packages/rs-dpp/src/util/json_schema.rs b/packages/rs-dpp/src/util/json_schema.rs index eaf8fb0d909..081460ea08a 100644 --- a/packages/rs-dpp/src/util/json_schema.rs +++ b/packages/rs-dpp/src/util/json_schema.rs @@ -26,6 +26,7 @@ pub trait JsonSchemaExt { fn is_type_of_identifier(&self) -> bool; } +// TODO: This is big (due to using regex inside?) pub fn resolve_uri<'a>(value: &'a Value, uri: &str) -> Result<&'a Value, DataContractError> { if !uri.starts_with("#/") { return Err(DataContractError::InvalidURI( diff --git a/packages/rs-dpp/src/validation/meta_validators/mod.rs b/packages/rs-dpp/src/validation/meta_validators/mod.rs index 8d1ce93b7e3..05e1024a526 100644 --- a/packages/rs-dpp/src/validation/meta_validators/mod.rs +++ b/packages/rs-dpp/src/validation/meta_validators/mod.rs @@ -36,10 +36,14 @@ lazy_static! { "../../../schema/meta_schemas/draft2020-12/meta/content.json" )) .expect("Valid schema!"); - static ref DATA_CONTRACT_V0: Value = serde_json::from_str::<Value>(include_str!( + static ref DOCUMENT_META_JSON_V0: Value = serde_json::from_str::<Value>(include_str!( "../../../schema/meta_schemas/document/v0/document-meta.json" )) .unwrap(); + static ref TOKEN_META_JSON_V0: Value = serde_json::from_str::<Value>(include_str!( + "../../../schema/meta_schemas/token/v0/token-meta.json" + )) + .unwrap(); pub static ref DRAFT_202012_META_SCHEMA: JSONSchema = JSONSchema::options() .with_draft(Draft::Draft202012) @@ -85,8 +89,7 @@ lazy_static! { .compile(&DRAFT202012) .expect("Invalid data contract schema"); - - // Compiled version of data contract meta schema + // Compiled version of document meta schema pub static ref DOCUMENT_META_SCHEMA_V0: JSONSchema = JSONSchema::options() .with_keyword( "byteArray", @@ -137,6 +140,60 @@ lazy_static! { DRAFT202012.clone(), ) .to_owned() - .compile(&DATA_CONTRACT_V0) + .compile(&DOCUMENT_META_JSON_V0) + .expect("Invalid data contract schema"); + + // Compiled version of token meta schema + pub static ref TOKEN_META_SCHEMA_V0: JSONSchema = JSONSchema::options() + .with_keyword( + "byteArray", + |_, _, _| Ok(Box::new(ByteArrayKeyword)), + ) + .with_patterns_regex_engine(RegexEngine::Regex(RegexOptions { + size_limit: Some(5 * (1 << 20)), + ..Default::default() + })) + .should_ignore_unknown_formats(false) + .should_validate_formats(true) + .with_patterns_regex_engine(RegexEngine::Regex(Default::default())) + .with_draft(Draft::Draft202012) + .with_document( + "https://json-schema.org/draft/2020-12/meta/applicator".to_string(), + DRAFT202012_APPLICATOR.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/core".to_string(), + DRAFT202012_CORE.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/applicator".to_string(), + DRAFT202012_APPLICATOR.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/unevaluated".to_string(), + DRAFT202012_UNEVALUATED.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/validation".to_string(), + DRAFT202012_VALIDATION.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/meta-data".to_string(), + DRAFT202012_META_DATA.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/format-annotation".to_string(), + DRAFT202012_FORMAT_ANNOTATION.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/meta/content".to_string(), + DRAFT202012_CONTENT.clone(), + ) + .with_document( + "https://json-schema.org/draft/2020-12/schema".to_string(), + DRAFT202012.clone(), + ) + .to_owned() + .compile(&TOKEN_META_JSON_V0) .expect("Invalid data contract schema"); } diff --git a/packages/rs-dpp/src/voting/contender_structs/contender/v0/mod.rs b/packages/rs-dpp/src/voting/contender_structs/contender/v0/mod.rs index 7ff0929f612..ed4c0fc0797 100644 --- a/packages/rs-dpp/src/voting/contender_structs/contender/v0/mod.rs +++ b/packages/rs-dpp/src/voting/contender_structs/contender/v0/mod.rs @@ -1,8 +1,8 @@ use crate::data_contract::document_type::DocumentTypeRef; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; use crate::document::Document; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::ProtocolError; +use bincode::{Decode, Encode}; use platform_value::Identifier; use platform_version::version::PlatformVersion; diff --git a/packages/rs-dpp/src/voting/contender_structs/mod.rs b/packages/rs-dpp/src/voting/contender_structs/mod.rs index 0e8d96c25fe..a71c77f19ab 100644 --- a/packages/rs-dpp/src/voting/contender_structs/mod.rs +++ b/packages/rs-dpp/src/voting/contender_structs/mod.rs @@ -3,9 +3,9 @@ mod contender; use crate::data_contract::document_type::DocumentTypeRef; use crate::document::serialization_traits::DocumentPlatformConversionMethodsV0; use crate::document::Document; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use crate::ProtocolError; +use bincode::{Decode, Encode}; use platform_value::Identifier; use platform_version::version::PlatformVersion; use std::fmt; diff --git a/packages/rs-dpp/src/voting/vote_info_storage/contested_document_vote_poll_stored_info/mod.rs b/packages/rs-dpp/src/voting/vote_info_storage/contested_document_vote_poll_stored_info/mod.rs index 12eb2b400cc..90a920fa78e 100644 --- a/packages/rs-dpp/src/voting/vote_info_storage/contested_document_vote_poll_stored_info/mod.rs +++ b/packages/rs-dpp/src/voting/vote_info_storage/contested_document_vote_poll_stored_info/mod.rs @@ -1,13 +1,13 @@ mod v0; use crate::block::block_info::BlockInfo; -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::voting::contender_structs::{ ContenderWithSerializedDocument, FinalizedResourceVoteChoicesWithVoterInfo, }; use crate::voting::vote_info_storage::contested_document_vote_poll_stored_info::v0::ContestedDocumentVotePollStoredInfoV0; use crate::voting::vote_info_storage::contested_document_vote_poll_winner_info::ContestedDocumentVotePollWinnerInfo; use crate::ProtocolError; +use bincode::{Decode, Encode}; use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/voting/vote_polls/contested_document_resource_vote_poll/mod.rs b/packages/rs-dpp/src/voting/vote_polls/contested_document_resource_vote_poll/mod.rs index 21f953f844c..9342eae819a 100644 --- a/packages/rs-dpp/src/voting/vote_polls/contested_document_resource_vote_poll/mod.rs +++ b/packages/rs-dpp/src/voting/vote_polls/contested_document_resource_vote_poll/mod.rs @@ -1,7 +1,7 @@ -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::serialization::PlatformSerializable; use crate::util::hash::hash_double; use crate::ProtocolError; +use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::{Identifier, Value}; #[cfg(feature = "vote-serde-conversion")] diff --git a/packages/rs-dpp/src/voting/vote_polls/mod.rs b/packages/rs-dpp/src/voting/vote_polls/mod.rs index 9186451e680..938a852ed4e 100644 --- a/packages/rs-dpp/src/voting/vote_polls/mod.rs +++ b/packages/rs-dpp/src/voting/vote_polls/mod.rs @@ -1,6 +1,6 @@ -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll; use crate::ProtocolError; +use bincode::{Decode, Encode}; use derive_more::From; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; use platform_value::Identifier; diff --git a/packages/rs-dpp/src/voting/votes/resource_vote/mod.rs b/packages/rs-dpp/src/voting/votes/resource_vote/mod.rs index 8ee89fe3714..15787e88d73 100644 --- a/packages/rs-dpp/src/voting/votes/resource_vote/mod.rs +++ b/packages/rs-dpp/src/voting/votes/resource_vote/mod.rs @@ -1,6 +1,6 @@ -use crate::identity::state_transition::asset_lock_proof::{Decode, Encode}; use crate::voting::votes::resource_vote::v0::ResourceVoteV0; use crate::ProtocolError; +use bincode::{Decode, Encode}; use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}; #[cfg(feature = "vote-serde-conversion")] use serde::{Deserialize, Serialize}; diff --git a/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs index b1cd0a477db..997bd422621 100644 --- a/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs +++ b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/mod.rs @@ -4,6 +4,7 @@ use crate::ProtocolError; use platform_version::version::PlatformVersion; mod v0; +mod v1; pub fn daily_withdrawal_limit( total_credits_in_platform: Credits, @@ -11,6 +12,7 @@ pub fn daily_withdrawal_limit( ) -> Result<Credits, ProtocolError> { match platform_version.dpp.methods.daily_withdrawal_limit { 0 => Ok(daily_withdrawal_limit_v0(total_credits_in_platform)), + 1 => Ok(v1::daily_withdrawal_limit_v1()), v => Err(ProtocolError::UnknownVersionError(format!( "Unknown daily_withdrawal_limit version {v}" ))), diff --git a/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v1/mod.rs b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v1/mod.rs new file mode 100644 index 00000000000..56112338a6d --- /dev/null +++ b/packages/rs-dpp/src/withdrawal/daily_withdrawal_limit/v1/mod.rs @@ -0,0 +1,8 @@ +use crate::fee::Credits; + +/// Set constant withdrawal daily limit to 2000 Dash +/// that corresponds to the limit in Core v22. +pub const fn daily_withdrawal_limit_v1() -> Credits { + // 2000 Dash + 200_000_000_000_000 +} diff --git a/packages/rs-drive-abci/Cargo.toml b/packages/rs-drive-abci/Cargo.toml index 48f60e83add..3b9bd54a61f 100644 --- a/packages/rs-drive-abci/Cargo.toml +++ b/packages/rs-drive-abci/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "drive-abci" -version = "1.6.2" +version = "1.8.0" authors = [ "Samuel Westrich <sam@dash.org>", "Ivan Shumkov <ivan@shumkov.ru>", @@ -15,7 +15,7 @@ license = "MIT" [dependencies] arc-swap = "1.7.0" bincode = { version = "2.0.0-rc.3", features = ["serde"] } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } +ciborium = { version = "0.2.2" } chrono = "0.4.35" serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"] } @@ -28,7 +28,7 @@ rand = "0.8.5" tempfile = "3.3.0" hex = "0.4.3" indexmap = { version = "2.2.6", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", tag = "v0.37.0" } dpp = { path = "../rs-dpp", features = ["abci"] } simple-signer = { path = "../simple-signer" } rust_decimal = "1.2.5" @@ -39,7 +39,10 @@ tracing = { version = "0.1.37", default-features = false, features = [] } clap = { version = "4.4.10", features = ["derive"] } envy = { version = "0.4.2" } dotenvy = { version = "0.15.7" } -dapi-grpc = { path = "../dapi-grpc", features = ["server"] } +dapi-grpc = { path = "../dapi-grpc", default-features = false, features = [ + "server", + "platform", +] } tracing-subscriber = { version = "0.3.16", default-features = false, features = [ "env-filter", "ansi", @@ -49,9 +52,10 @@ tracing-subscriber = { version = "0.3.16", default-features = false, features = "registry", "tracing-log", ], optional = false } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", features = [ +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.3.0", tag = "v1.3.0+1.3.0", features = [ "grpc", ] } + lazy_static = "1.4.0" itertools = { version = "0.13" } file-rotate = { version = "0.7.3" } @@ -73,7 +77,7 @@ tokio-util = { version = "0.7" } derive_more = { version = "1.0", features = ["from", "deref", "deref_mut"] } async-trait = "0.1.77" console-subscriber = { version = "0.4", optional = true } -bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3", optional = true } [dev-dependencies] bs58 = { version = "0.5.0" } @@ -93,19 +97,20 @@ dpp = { path = "../rs-dpp", features = [ "data-contract-json-conversion", "data-contract-cbor-conversion", ] } -drive = { path = "../rs-drive" } +drive = { path = "../rs-drive", features = ["fixtures-and-mocks"] } strategy-tests = { path = "../strategy-tests" } assert_matches = "1.5.0" -drive-abci = { path = ".", features = ["testing-config"] } +drive-abci = { path = ".", features = ["testing-config", "mocks"] } +bls-signatures = { git = "https://github.com/dashpay/bls-signatures", tag = "1.3.3" } +mockall = { version = "0.13" } # For tests of grovedb verify -rocksdb = { version = "0.22.0" } +rocksdb = { version = "0.23.0" } integer-encoding = { version = "4.0.0" } [features] - -default = ["mocks"] -mocks = ["mockall", "drive/fixtures-and-mocks"] +default = [] +mocks = ["mockall", "drive/fixtures-and-mocks", "bls-signatures"] console = ["console-subscriber", "tokio/tracing"] testing-config = [] grovedbg = ["drive/grovedbg"] @@ -113,3 +118,7 @@ grovedbg = ["drive/grovedbg"] [[bin]] name = "drive-abci" path = "src/main.rs" + + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tokio_unstable)'] } diff --git a/packages/rs-drive-abci/src/abci/handler/check_tx.rs b/packages/rs-drive-abci/src/abci/handler/check_tx.rs index bcad2ba2b42..f087bcb5d84 100644 --- a/packages/rs-drive-abci/src/abci/handler/check_tx.rs +++ b/packages/rs-drive-abci/src/abci/handler/check_tx.rs @@ -151,10 +151,11 @@ where let handler_error = HandlerError::Internal(error.to_string()); if tracing::enabled!(tracing::Level::ERROR) { - let st_hash = hex::encode(hash_single(tx)); + let st_hash = hex::encode(hash_single(&tx)); tracing::error!( ?error, + st = hex::encode(tx), st_hash, check_tx_mode = r#type, "Failed to check state transition ({}): {}", diff --git a/packages/rs-drive-abci/src/config.rs b/packages/rs-drive-abci/src/config.rs index 1e8f5f3c264..afa20e34f5d 100644 --- a/packages/rs-drive-abci/src/config.rs +++ b/packages/rs-drive-abci/src/config.rs @@ -105,6 +105,10 @@ pub struct ExecutionConfig { #[serde(default = "ExecutionConfig::default_verify_sum_trees")] pub verify_sum_trees: bool, + /// Should we verify sum trees? Useful to set as `false` for tests + #[serde(default = "ExecutionConfig::default_verify_token_sum_trees")] + pub verify_token_sum_trees: bool, + /// How long in seconds should an epoch last /// It might last a lot longer if the chain is halted #[serde( @@ -614,6 +618,10 @@ impl ExecutionConfig { true } + fn default_verify_token_sum_trees() -> bool { + true + } + fn default_use_document_triggers() -> bool { true } @@ -669,6 +677,7 @@ impl Default for ExecutionConfig { Self { use_document_triggers: ExecutionConfig::default_use_document_triggers(), verify_sum_trees: ExecutionConfig::default_verify_sum_trees(), + verify_token_sum_trees: ExecutionConfig::default_verify_token_sum_trees(), epoch_time_length_s: ExecutionConfig::default_epoch_time_length_s(), } } diff --git a/packages/rs-drive-abci/src/error/execution.rs b/packages/rs-drive-abci/src/error/execution.rs index efa4e2a6c83..0d351a95447 100644 --- a/packages/rs-drive-abci/src/error/execution.rs +++ b/packages/rs-drive-abci/src/error/execution.rs @@ -1,5 +1,5 @@ -use dashcore_rpc::dashcore::consensus::encode::Error as DashCoreConsensusEncodeError; use dpp::bls_signatures::BlsError; +use dpp::dashcore::consensus::encode::Error as DashCoreConsensusEncodeError; use dpp::identity::TimestampMillis; use dpp::version::FeatureVersion; use drive::error::Error as DriveError; diff --git a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs index acfb7fca049..06292c23421 100644 --- a/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/check_tx/v0/mod.rs @@ -229,8 +229,8 @@ mod tests { use dpp::serialization::{PlatformSerializable, Signable}; use dpp::native_bls::NativeBlsModule; - use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; - use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::identity_create_transition::methods::IdentityCreateTransitionMethodsV0; use dpp::state_transition::identity_create_transition::IdentityCreateTransition; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; @@ -381,7 +381,7 @@ mod tests { } #[test] - fn data_contract_create_check_tx() { + fn data_contract_create_check_tx_first_protocol_version() { let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -392,6 +392,7 @@ mod tests { let platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(1) .build_with_mock_rpc(); let platform_state = platform.state.load(); @@ -523,6 +524,149 @@ mod tests { )); } + #[test] + fn data_contract_create_check_tx_latest_protocol_version() { + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc(); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut create_contract_state_transition: StateTransition = dashpay + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let platform_ref = PlatformRef { + drive: &platform.drive, + state: &platform_state, + config: &platform.config, + core_rpc: &platform.core_rpc, + }; + + let validation_result = platform + .check_tx( + serialized.as_slice(), + FirstTimeCheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2484410); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); + } + #[test] fn data_contract_create_check_tx_for_invalid_contract() { let platform_config = PlatformConfig { @@ -728,7 +872,7 @@ mod tests { } #[test] - fn data_contract_create_check_tx_priority() { + fn data_contract_create_check_tx_priority_first_protocol_version() { let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -739,6 +883,7 @@ mod tests { let platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(1) .build_with_mock_rpc(); let platform_state = platform.state.load(); @@ -882,7 +1027,7 @@ mod tests { } #[test] - fn data_contract_create_check_tx_after_identity_balance_used_up() { + fn data_contract_create_check_tx_priority_latest_protocol_version() { let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -923,7 +1068,7 @@ mod tests { 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, ]), public_keys: BTreeMap::from([(1, key.clone())]), - balance: 200000000, // we have enough balance only for 1 insertion (this is where this test is different) + balance: 1000000000, revision: 0, } .into(); @@ -932,6 +1077,9 @@ mod tests { let mut create_contract_state_transition: StateTransition = dashpay .try_into_platform_versioned(platform_version) .expect("expected a state transition"); + + create_contract_state_transition.set_user_fee_increase(100); // This means that things will be twice as expensive + create_contract_state_transition .sign(&key, private_key.as_slice(), &NativeBlsModule) .expect("expected to sign transition"); @@ -961,6 +1109,8 @@ mod tests { assert!(validation_result.errors.is_empty()); + assert_eq!(validation_result.data.unwrap().priority, 10000); + let check_result = platform .check_tx( serialized.as_slice(), @@ -972,9 +1122,11 @@ mod tests { assert!(check_result.is_valid()); + assert_eq!(check_result.data.unwrap().priority, 10000); + let transaction = platform.drive.grove.start_transaction(); - platform + let processing_result = platform .platform .process_raw_state_transitions( &vec![serialized.clone()], @@ -987,6 +1139,10 @@ mod tests { ) .expect("expected to process state transition"); + // The processing fees should be twice as much as a fee multiplier of 0, + // since a fee multiplier of 100 means 100% more of 1 (gives 2) + assert_eq!(processing_result.aggregated_fees().processing_fee, 4968820); + let check_result = platform .check_tx( serialized.as_slice(), @@ -998,6 +1154,8 @@ mod tests { assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + assert_eq!(check_result.data.unwrap().priority, 10000); + platform .drive .grove @@ -1014,11 +1172,16 @@ mod tests { ) .expect("expected to check tx"); - assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); } #[test] - fn data_contract_update_check_tx() { + fn data_contract_create_check_tx_after_identity_balance_used_up() { let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -1059,15 +1222,13 @@ mod tests { 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, ]), public_keys: BTreeMap::from([(1, key.clone())]), - balance: 1000000000, + balance: 200000000, // we have enough balance only for 1 insertion (this is where this test is different) revision: 0, } .into(); - let dashpay_created_contract = - get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); - let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); - let mut create_contract_state_transition: StateTransition = dashpay_created_contract + let dashpay = get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut create_contract_state_transition: StateTransition = dashpay .try_into_platform_versioned(platform_version) .expect("expected a state transition"); create_contract_state_transition @@ -1079,7 +1240,7 @@ mod tests { platform .drive .add_new_identity( - identity.clone(), + identity, false, &BlockInfo::default(), true, @@ -1088,68 +1249,9 @@ mod tests { ) .expect("expected to insert identity"); - let transaction = platform.drive.grove.start_transaction(); - - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![serialized.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - false, - None, - ) - .expect("expected to process state transition"); - - assert_eq!(processing_result.aggregated_fees().processing_fee, 2483610); - - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit"); - - // Now let's do the data contract update - let _dashpay_id = modified_dashpay_contract.id(); - // we need to alter dashpay to make it invalid - - modified_dashpay_contract.set_version(2); - - let document_types = modified_dashpay_contract.document_types_mut(); - - let dpns_contract = - get_dpns_data_contract_fixture(Some(identity.id()), 1, protocol_version) - .data_contract_owned(); - - document_types.insert( - "preorder".to_string(), - dpns_contract - .document_type_for_name("preorder") - .expect("expected document type") - .to_owned_document_type(), - ); - - let mut update_contract_state_transition: StateTransition = - DataContractUpdateTransition::try_from_platform_versioned( - (modified_dashpay_contract, 2), - platform_version, - ) - .expect("expected a state transition") - .into(); - - update_contract_state_transition - .sign(&key, private_key.as_slice(), &NativeBlsModule) - .expect("expected to sign transition"); - let serialized_update = update_contract_state_transition - .serialize_to_bytes() - .expect("serialized state transition"); - let validation_result = platform .check_tx( - serialized_update.as_slice(), + serialized.as_slice(), FirstTimeCheck, &platform_ref, platform_version, @@ -1160,7 +1262,7 @@ mod tests { let check_result = platform .check_tx( - serialized_update.as_slice(), + serialized.as_slice(), Recheck, &platform_ref, platform_version, @@ -1171,10 +1273,10 @@ mod tests { let transaction = platform.drive.grove.start_transaction(); - let update_processing_result = platform + platform .platform .process_raw_state_transitions( - &vec![serialized_update.clone()], + &vec![serialized.clone()], &platform_state, &BlockInfo::default(), &transaction, @@ -1184,17 +1286,9 @@ mod tests { ) .expect("expected to process state transition"); - // We have one invalid paid for state transition - assert_eq!(update_processing_result.valid_count(), 1); - - assert_eq!( - update_processing_result.aggregated_fees().processing_fee, - 2495990 - ); - let check_result = platform .check_tx( - serialized_update.as_slice(), + serialized.as_slice(), Recheck, &platform_ref, platform_version, @@ -1212,14 +1306,430 @@ mod tests { let check_result = platform .check_tx( - serialized_update.as_slice(), + serialized.as_slice(), Recheck, &platform_ref, platform_version, ) .expect("expected to check tx"); - assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + assert!(!check_result.is_valid()); // the identity shouldn't have enough balance anymore + } + + #[test] + fn data_contract_update_check_tx_first_protocol_version() { + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_initial_protocol_version(1) + .build_with_mock_rpc(); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let platform_ref = PlatformRef { + drive: &platform.drive, + state: &platform_state, + config: &platform.config, + core_rpc: &platform.core_rpc, + }; + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay_created_contract = + get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); + let mut create_contract_state_transition: StateTransition = dashpay_created_contract + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2483610); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Now let's do the data contract update + let _dashpay_id = modified_dashpay_contract.id(); + // we need to alter dashpay to make it invalid + + modified_dashpay_contract.set_version(2); + + let document_types = modified_dashpay_contract.document_types_mut(); + + let dpns_contract = + get_dpns_data_contract_fixture(Some(identity.id()), 1, protocol_version) + .data_contract_owned(); + + document_types.insert( + "preorder".to_string(), + dpns_contract + .document_type_for_name("preorder") + .expect("expected document type") + .to_owned_document_type(), + ); + + let mut update_contract_state_transition: StateTransition = + DataContractUpdateTransition::try_from_platform_versioned( + (modified_dashpay_contract, 2), + platform_version, + ) + .expect("expected a state transition") + .into(); + + update_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized_update = update_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + serialized_update.as_slice(), + FirstTimeCheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let update_processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized_update.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(update_processing_result.valid_count(), 1); + + assert_eq!( + update_processing_result.aggregated_fees().processing_fee, + 2495990 + ); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); + } + + #[test] + fn data_contract_update_check_tx_latest_protocol_version() { + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc(); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let platform_ref = PlatformRef { + drive: &platform.drive, + state: &platform_state, + config: &platform.config, + core_rpc: &platform.core_rpc, + }; + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay_created_contract = + get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); + let mut create_contract_state_transition: StateTransition = dashpay_created_contract + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2484410); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Now let's do the data contract update + let _dashpay_id = modified_dashpay_contract.id(); + // we need to alter dashpay to make it invalid + + modified_dashpay_contract.set_version(2); + + let document_types = modified_dashpay_contract.document_types_mut(); + + let dpns_contract = + get_dpns_data_contract_fixture(Some(identity.id()), 1, protocol_version) + .data_contract_owned(); + + document_types.insert( + "preorder".to_string(), + dpns_contract + .document_type_for_name("preorder") + .expect("expected document type") + .to_owned_document_type(), + ); + + let mut update_contract_state_transition: StateTransition = + DataContractUpdateTransition::try_from_platform_versioned( + (modified_dashpay_contract, 2), + platform_version, + ) + .expect("expected a state transition") + .into(); + + update_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized_update = update_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + serialized_update.as_slice(), + FirstTimeCheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let update_processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized_update.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(update_processing_result.valid_count(), 1); + + assert_eq!( + update_processing_result.aggregated_fees().processing_fee, + 2496910 + ); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check assert!(matches!( check_result.errors.first().expect("expected an error"), @@ -1228,7 +1738,7 @@ mod tests { } #[test] - fn data_contract_update_check_tx_for_invalid_update() { + fn data_contract_update_check_tx_for_invalid_update_first_protocol_version() { let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -1239,6 +1749,7 @@ mod tests { let platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(1) .build_with_mock_rpc(); let platform_state = platform.state.load(); @@ -1472,6 +1983,251 @@ mod tests { )); } + #[test] + fn data_contract_update_check_tx_for_invalid_update_latest_protocol_version() { + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc(); + + let platform_state = platform.state.load(); + let protocol_version = platform_state.current_protocol_version_in_consensus(); + let platform_version = PlatformVersion::get(protocol_version).unwrap(); + + let platform_ref = PlatformRef { + drive: &platform.drive, + state: &platform_state, + config: &platform.config, + core_rpc: &platform.core_rpc, + }; + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(1), + platform_version, + ) + .expect("expected to get key pair"); + + platform + .drive + .create_initial_state_structure(None, platform_version) + .expect("expected to create state structure"); + let identity: Identity = IdentityV0 { + id: Identifier::new([ + 158, 113, 180, 126, 91, 83, 62, 44, 83, 54, 97, 88, 240, 215, 84, 139, 167, 156, + 166, 203, 222, 4, 64, 31, 215, 199, 149, 151, 190, 246, 251, 44, + ]), + public_keys: BTreeMap::from([(1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let dashpay_created_contract = + get_dashpay_contract_fixture(Some(identity.id()), 1, protocol_version); + let mut modified_dashpay_contract = dashpay_created_contract.data_contract().clone(); + let mut create_contract_state_transition: StateTransition = dashpay_created_contract + .try_into_platform_versioned(platform_version) + .expect("expected a state transition"); + create_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized = create_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + platform + .drive + .add_new_identity( + identity, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2484410); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Now let's do the data contract update + let dashpay_id = modified_dashpay_contract.id(); + // we need to alter dashpay to make it invalid + + let document_types = modified_dashpay_contract.document_types_mut(); + + let parameters = RandomDocumentTypeParameters { + new_fields_optional_count_range: 5..6, + new_fields_required_count_range: 3..4, + new_indexes_count_range: Default::default(), + field_weights: FieldTypeWeights { + string_weight: 5, + float_weight: 3, + integer_weight: 2, + date_weight: 0, + boolean_weight: 1, + byte_array_weight: 0, + }, + field_bounds: FieldMinMaxBounds { + string_min_len: Default::default(), + string_has_min_len_chance: 0.0, + string_max_len: Default::default(), + string_has_max_len_chance: 0.0, + integer_min: Default::default(), + integer_has_min_chance: 0.0, + integer_max: Default::default(), + integer_has_max_chance: 0.0, + float_min: Default::default(), + float_has_min_chance: 0.0, + float_max: Default::default(), + float_has_max_chance: 0.0, + date_min: 0, + date_max: 100, + byte_array_min_len: Default::default(), + byte_array_has_min_len_chance: 0.0, + byte_array_max_len: Default::default(), + byte_array_has_max_len_chance: 0.0, + }, + keep_history_chance: 0.0, + documents_mutable_chance: 0.0, + documents_can_be_deleted_chance: 0.0, + }; + + let mut rng = StdRng::seed_from_u64(6); + + document_types.insert( + "invalid".to_string(), + DocumentType::V0( + DocumentTypeV0::invalid_random_document_type( + parameters, + dashpay_id, + &mut rng, + platform_version, + ) + .expect("expected an invalid document type"), + ), + ); + + let mut update_contract_state_transition: StateTransition = + DataContractUpdateTransition::try_from_platform_versioned( + (modified_dashpay_contract, 2), + platform_version, + ) + .expect("expected a state transition") + .into(); + + update_contract_state_transition + .sign(&key, private_key.as_slice(), &NativeBlsModule) + .expect("expected to sign transition"); + let serialized_update = update_contract_state_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let validation_result = platform + .check_tx( + serialized_update.as_slice(), + FirstTimeCheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(validation_result.errors.is_empty()); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![serialized_update.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // We have one invalid paid for state transition + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 448640); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(check_result.is_valid()); // it should still be valid, because we didn't commit the transaction + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let check_result = platform + .check_tx( + serialized_update.as_slice(), + Recheck, + &platform_ref, + platform_version, + ) + .expect("expected to check tx"); + + assert!(!check_result.is_valid()); // it should no longer be valid, because of the nonce check + + assert!(matches!( + check_result.errors.first().expect("expected an error"), + ConsensusError::StateError(StateError::InvalidIdentityNonceError(_)) + )); + } + #[test] fn document_update_check_tx() { let platform_config = PlatformConfig { @@ -1592,7 +2348,7 @@ mod tests { altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -1612,7 +2368,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, diff --git a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs index ecfc3d6edf3..c8d71074316 100644 --- a/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/finalize_block_proposal/v0/mod.rs @@ -9,7 +9,7 @@ use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0; use dpp::version::PlatformVersion; use tenderdash_abci::{ - proto::{serializers::timestamp::ToMilis, types::BlockId as ProtoBlockId}, + proto::{types::BlockId as ProtoBlockId, ToMillis}, signatures::Hashable, }; @@ -195,7 +195,10 @@ where .expect("current epoch info should be in range"), ); - to_commit_block_info.time_ms = block_header.time.to_milis(); + to_commit_block_info.time_ms = block_header + .time + .to_millis() + .map_err(|e| AbciError::BadRequest(format!("invalid block time: {}", e)))?; to_commit_block_info.core_height = block_header.core_chain_locked_height; diff --git a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs index b67cd012531..4e3bc0eb5bf 100644 --- a/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/initialization/init_chain/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::abci::AbciError; use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; @@ -18,7 +19,7 @@ use dpp::version::PlatformVersion; use std::sync::Arc; use tenderdash_abci::proto::abci::{RequestInitChain, ResponseInitChain}; use tenderdash_abci::proto::google::protobuf::Timestamp; -use tenderdash_abci::proto::serializers::timestamp::FromMilis; +use tenderdash_abci::proto::FromMillis; impl<C> Platform<C> where @@ -154,7 +155,12 @@ where validator_set_update: Some(validator_set), next_core_chain_lock_update: None, initial_core_height: core_height, // we send back the core height when the fork happens - genesis_time: Some(Timestamp::from_milis(genesis_time)), + genesis_time: Some(Timestamp::from_millis(genesis_time).map_err(|e| { + AbciError::InvalidChainLock(format!( + "chainlock contains invalid genesis time: {}", + e + )) + })?), }) } } diff --git a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs index 4cef4a48bca..67590faa833 100644 --- a/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/engine/run_block_proposal/v0/mod.rs @@ -270,6 +270,10 @@ where })?; // This is a system error // Rebroadcast expired withdrawals if they exist + // We do that before we mark withdrawals as expired + // to rebroadcast them on the next block but not the same + // one + // TODO: It must be also only on core height change self.rebroadcast_expired_withdrawal_documents( &block_info, last_committed_platform_state, @@ -364,7 +368,7 @@ where let block_fees_v0: BlockFeesV0 = state_transitions_result.aggregated_fees().clone().into(); // Process fees - let processed_block_fees = self.process_block_fees( + let processed_block_fees = self.process_block_fees_and_validate_sum_trees( &block_execution_context, block_fees_v0.into(), transaction, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/add_process_epoch_change_operations/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/add_process_epoch_change_operations/mod.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/add_process_epoch_change_operations/v0/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/add_process_epoch_change_operations/v0/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/add_process_epoch_change_operations/v0/mod.rs diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/mod.rs similarity index 56% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/mod.rs index 232c76143e8..03c783e1dd9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/mod.rs @@ -1,5 +1,5 @@ mod add_process_epoch_change_operations; -pub mod process_block_fees; +pub mod process_block_fees_and_validate_sum_trees; #[cfg(test)] mod tests; diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/mod.rs similarity index 79% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/mod.rs index 7ab4cbe08d8..012bc0528b9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use dpp::version::PlatformVersion; @@ -34,7 +35,7 @@ impl<CoreRPCLike> Platform<CoreRPCLike> { /// * `Result<processed_block_fees_outcome::v0::ProcessedBlockFeesOutcome, Error>` - /// If the operation is successful, it returns `Ok(ProcessedBlockFeesOutcome)`. If there is an error, it returns `Error`. /// - pub fn process_block_fees( + pub fn process_block_fees_and_validate_sum_trees( &self, block_execution_context: &BlockExecutionContext, block_fees: BlockFees, @@ -45,17 +46,23 @@ impl<CoreRPCLike> Platform<CoreRPCLike> { .drive_abci .methods .block_fee_processing - .process_block_fees + .process_block_fees_and_validate_sum_trees { - 0 => self.process_block_fees_v0( + 0 => self.process_block_fees_and_validate_sum_trees_v0( + block_execution_context, + block_fees, + transaction, + platform_version, + ), + 1 => self.process_block_fees_and_validate_sum_trees_v1( block_execution_context, block_fees, transaction, platform_version, ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { - method: "process_block_fees".to_string(), - known_versions: vec![0], + method: "process_block_fees_and_validate_sum_trees".to_string(), + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v0/mod.rs similarity index 99% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v0/mod.rs index 4bb341a678e..a3fa6719562 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/process_block_fees/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v0/mod.rs @@ -47,7 +47,7 @@ impl<CoreRPCLike> Platform<CoreRPCLike> { /// /// Returns `ProcessedBlockFeesOutcome`. #[inline(always)] - pub(super) fn process_block_fees_v0( + pub(super) fn process_block_fees_and_validate_sum_trees_v0( &self, block_execution_context: &BlockExecutionContext, block_fees: BlockFees, @@ -274,7 +274,7 @@ mod tests { }; let storage_fee_distribution_outcome = platform - .process_block_fees_v0( + .process_block_fees_and_validate_sum_trees_v0( &block_execution_context.into(), block_fees.clone(), transaction, diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v1/mod.rs new file mode 100644 index 00000000000..4e9edf37f22 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/process_block_fees_and_validate_sum_trees/v1/mod.rs @@ -0,0 +1,54 @@ +//! Block Fees Processing. +//! +//! This module defines functions related to processing block fees upon block and +//! epoch changes. +//! + +use crate::error::Error; +use crate::execution::types::block_execution_context::BlockExecutionContext; +use crate::execution::types::block_fees::BlockFees; +use crate::execution::types::processed_block_fees_outcome; +use crate::platform_types::platform::Platform; +use dpp::version::PlatformVersion; +use drive::grovedb::Transaction; + +/// From the Dash Improvement Proposal: + +/// For the purpose of this explanation we can trivialize that the execution of a block comprises +/// the sum of the execution of all state transitions contained within the block. In order to +/// avoid altering participating masternode identity balances every block and distribute fees +/// evenly, the concept of pools is introduced. We will also introduce the concepts of an Epoch +/// and the Epoch Era that are both covered later in this document. As the block executes state +/// transitions, processing and storage fees are accumulated, as well as a list of refunded fees +/// from various Epochs and fee multipliers. When there are no more state transitions to execute +/// we can say the block has ended its state transition execution phase. The system will then add +/// the accumulated fees to their corresponding pools, and in the case of deletion of data, remove +/// storage fees from future Epoch storage pools. + +impl<CoreRPCLike> Platform<CoreRPCLike> { + /// Adds operations to GroveDB op batch related to processing + /// and distributing the block fees from the previous block and applies the batch. + /// + /// Returns `ProcessedBlockFeesOutcome`. + /// + /// V1 adds the validation of the token aggregated balance + #[inline(always)] + pub(super) fn process_block_fees_and_validate_sum_trees_v1( + &self, + block_execution_context: &BlockExecutionContext, + block_fees: BlockFees, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<processed_block_fees_outcome::v0::ProcessedBlockFeesOutcome, Error> { + let outcome = self.process_block_fees_and_validate_sum_trees_v0( + block_execution_context, + block_fees, + transaction, + platform_version, + )?; + + self.validate_token_aggregated_balance(transaction, platform_version)?; + + Ok(outcome) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/tests.rs similarity index 95% rename from packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs rename to packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/tests.rs index 1cbac74c740..2c0fe0a0275 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/block_fee_processing/tests.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/block_processing_end_events/tests.rs @@ -16,6 +16,7 @@ mod refund_tests { CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; use dpp::data_contract::document_type::DocumentTypeRef; + use dpp::data_contract::DataContract; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::{Document, DocumentV0Setters}; @@ -24,8 +25,8 @@ mod refund_tests { use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::{Identity, IdentityPublicKey}; use dpp::platform_value::Bytes32; - use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; - use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::batch_transition::BatchTransition; use drive::util::test_helpers::setup_contract; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; @@ -71,7 +72,7 @@ mod refund_tests { altered_document.set("avatarUrl", "http://test.com/dog.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), profile, entropy.0, @@ -178,7 +179,7 @@ mod refund_tests { assert_eq!(serialized_len, 173); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), profile, entropy.0, @@ -272,6 +273,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -296,7 +300,7 @@ mod refund_tests { setup_initial_document(&platform, profile, &mut rng, &identity, &key, &signer); let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -368,6 +372,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -392,7 +399,7 @@ mod refund_tests { fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -467,6 +474,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -491,7 +501,7 @@ mod refund_tests { fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 40, false); //a year later let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -562,6 +572,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -586,7 +599,7 @@ mod refund_tests { fast_forward_to_block(&platform, 10_200_000_000, 9000, 42, 40 * 25, false); //25 years later let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -657,6 +670,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -681,7 +697,7 @@ mod refund_tests { fast_forward_to_block(&platform, 10_200_000_000, 9000, 42, 40 * 50, false); //50 years later let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -753,6 +769,9 @@ mod refund_tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-indexes.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let profile = dashpay_contract_no_indexes @@ -777,7 +796,7 @@ mod refund_tests { fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 10, false); //next epoch let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, profile, &key, @@ -823,9 +842,6 @@ mod refund_tests { .calculate_refunds_amount_for_identity(identity.id()) .expect("expected refunds for identity"); - // println!("{}", insertion_fee_result.storage_fee); - // println!("{}", refund_amount); - // we should be refunding around 21% after 25 years. let refunded_percentage = refund_amount * 100 / insertion_fee_result.storage_fee; assert_eq!(refunded_percentage, 98); diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs index e2a9176d3cb..ac7cdd08bf5 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/mod.rs @@ -18,7 +18,7 @@ mod update_voter_identity; // mod tests { // use crate::config::PlatformConfig; // use crate::test::helpers::setup::TestPlatformBuilder; -// use dashcore_rpc::dashcore::ProTxHash; +// use dpp::dashcore::ProTxHash; // use dashcore_rpc::dashcore_rpc_json::MasternodeListDiffWithMasternodes; // use dashcore_rpc::json::MasternodeType::Regular; // use dashcore_rpc::json::{DMNState, MasternodeListItem}; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/mod.rs index abbfe75ebd2..913b01ec33c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/mod.rs @@ -3,9 +3,9 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ProTxHash; use dashcore_rpc::dashcore_rpc_json::{MasternodeListDiff, MasternodeListItem}; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::ProTxHash; use dpp::version::PlatformVersion; use drive::grovedb::Transaction; use std::collections::BTreeMap; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs index 0b7af918d53..3fc5597544d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_masternode_identities/v0/mod.rs @@ -3,10 +3,10 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ProTxHash; use dashcore_rpc::dashcore_rpc_json::MasternodeListDiff; use dashcore_rpc::json::MasternodeListItem; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::ProTxHash; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/mod.rs index e87425a4b29..13c7e7cc1ab 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/mod.rs @@ -5,7 +5,7 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ProTxHash; +use dpp::dashcore::ProTxHash; use dpp::version::PlatformVersion; use drive::util::batch::DriveOperation; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs index 7c901380b09..2b88fb4d4f9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_operator_identity/v0/mod.rs @@ -5,7 +5,7 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ProTxHash; +use dpp::dashcore::ProTxHash; use dpp::dashcore::hashes::Hash; use dpp::identifier::{Identifier, MasternodeIdentifiers}; @@ -396,12 +396,12 @@ where mod tests { use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::test::helpers::setup::{TempPlatform, TestPlatformBuilder}; - use dashcore_rpc::dashcore::ProTxHash; use dashcore_rpc::dashcore_rpc_json::{MasternodeListItem, MasternodeType}; use dashcore_rpc::json::DMNState; use dpp::block::block_info::BlockInfo; use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; use dpp::dashcore::hashes::Hash; + use dpp::dashcore::ProTxHash; use dpp::dashcore::Txid; use dpp::identifier::MasternodeIdentifiers; use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/mod.rs index f0c711d4d51..08492dc2d8a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/mod.rs @@ -7,7 +7,7 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ProTxHash; +use dpp::dashcore::ProTxHash; use dashcore_rpc::json::DMNStateDiff; use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs index a0b6fa68a1c..c10fbd263ef 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_identities/update_voter_identity/v0/mod.rs @@ -5,8 +5,8 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::ProTxHash; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::ProTxHash; use dashcore_rpc::json::DMNStateDiff; use dpp::block::block_info::BlockInfo; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs index b6c447fa75b..ae809ef7aa9 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_based_updates/update_masternode_list/update_state_masternode_list/v0/mod.rs @@ -7,8 +7,8 @@ use crate::platform_types::platform_state::PlatformState; use crate::platform_types::validator_set::v0::ValidatorSetV0Getters; use crate::platform_types::validator_set::ValidatorSet; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::{DMNStateDiff, MasternodeListDiff, MasternodeType}; +use dpp::dashcore::{ProTxHash, QuorumHash}; use indexmap::IndexMap; use std::collections::{BTreeMap, BTreeSet}; diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs index 52eb63c4e44..a22dc58031d 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/mod.rs @@ -2,7 +2,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ChainLock; +use dpp::dashcore::ChainLock; use dpp::version::PlatformVersion; /// Version 0 diff --git a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs index f92183277b4..bb86d5928aa 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/core_chain_lock/make_sure_core_is_synced_to_chain_lock/v0/mod.rs @@ -2,7 +2,7 @@ use crate::error::Error; use crate::execution::platform_events::core_chain_lock::make_sure_core_is_synced_to_chain_lock::CoreSyncStatus; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::ChainLock; +use dpp::dashcore::ChainLock; use dpp::version::PlatformVersion; impl<C> Platform<C> diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs new file mode 100644 index 00000000000..9d0a27dec46 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/common.rs @@ -0,0 +1,101 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use dpp::platform_value::platform_value; +use dpp::ProtocolError; + +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::DataContract; +use dpp::document::DocumentV0; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::system_data_contracts::dpns_contract::DPNS_DASH_TLD_DOCUMENT_ID; +use dpp::version::PlatformVersion; +use drive::dpp::identity::TimestampMillis; +use drive::util::batch::{DataContractOperationType, DocumentOperationType, DriveOperation}; +use drive::util::object_size_info::{ + DataContractInfo, DocumentInfo, DocumentTypeInfo, OwnedDocumentInfo, +}; +use std::borrow::Cow; + +impl<C> Platform<C> { + pub(in crate::execution::platform_events::initialization::create_genesis_state) fn register_system_data_contract_operations< + 'a, + >( + &self, + data_contract: &'a DataContract, + operations: &mut Vec<DriveOperation<'a>>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let serialization = + data_contract.serialize_to_bytes_with_platform_version(platform_version)?; + operations.push(DriveOperation::DataContractOperation( + DataContractOperationType::ApplyContractWithSerialization { + contract: Cow::Borrowed(data_contract), + serialized_contract: serialization, + storage_flags: None, + }, + )); + Ok(()) + } + + pub(in crate::execution::platform_events::initialization::create_genesis_state) fn register_dpns_top_level_domain_operations< + 'a, + >( + &'a self, + contract: &'a DataContract, + genesis_time: TimestampMillis, + operations: &mut Vec<DriveOperation<'a>>, + ) -> Result<(), Error> { + let domain = "dash"; + + let document_stub_properties_value = platform_value!({ + "label" : domain, + "normalizedLabel" : domain, + "parentDomainName" : "", + "normalizedParentDomainName" : "", + "records" : { + "identity" : contract.owner_id(), + }, + "subdomainRules": { + "allowSubdomains": true, + } + }); + + let document_stub_properties = document_stub_properties_value + .into_btree_string_map() + .map_err(|e| Error::Protocol(ProtocolError::ValueError(e)))?; + + let document = DocumentV0 { + id: DPNS_DASH_TLD_DOCUMENT_ID.into(), + properties: document_stub_properties, + owner_id: contract.owner_id(), + revision: None, + created_at: Some(genesis_time), + updated_at: Some(genesis_time), + transferred_at: Some(genesis_time), + created_at_block_height: None, + updated_at_block_height: None, + transferred_at_block_height: None, + created_at_core_block_height: None, + updated_at_core_block_height: None, + transferred_at_core_block_height: None, + } + .into(); + + let document_type = contract.document_type_for_name("domain")?; + + let operation = DriveOperation::DocumentOperation(DocumentOperationType::AddDocument { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentInfo::DocumentOwnedInfo((document, None)), + owner_id: None, + }, + contract_info: DataContractInfo::BorrowedDataContract(contract), + document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), + override_document: false, + }); + + operations.push(operation); + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/mod.rs index e046d8bc3d4..72819eb9936 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/mod.rs @@ -6,7 +6,9 @@ use dpp::prelude::CoreBlockHeight; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; +mod common; pub mod v0; +pub mod v1; impl<C> Platform<C> { /// Creates trees and populates them with necessary identities, contracts and documents @@ -29,9 +31,15 @@ impl<C> Platform<C> { transaction, platform_version, ), + 1 => self.create_genesis_state_v1( + genesis_core_height, + genesis_time, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "create_genesis_state".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs index e343d710c81..89f8ccd79ef 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v0/mod.rs @@ -1,27 +1,13 @@ use crate::error::Error; use crate::platform_types::platform::Platform; -use dpp::platform_value::platform_value; -use dpp::ProtocolError; - use drive::dpp::identity::TimestampMillis; use dpp::block::block_info::BlockInfo; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::DataContract; -use dpp::document::DocumentV0; -use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::prelude::CoreBlockHeight; use dpp::version::PlatformVersion; use drive::dpp::system_data_contracts::SystemDataContract; -use drive::util::batch::{DataContractOperationType, DocumentOperationType, DriveOperation}; - -use dpp::prelude::CoreBlockHeight; -use dpp::system_data_contracts::dpns_contract::DPNS_DASH_TLD_DOCUMENT_ID; use drive::query::TransactionArg; -use drive::util::object_size_info::{ - DataContractInfo, DocumentInfo, DocumentTypeInfo, OwnedDocumentInfo, -}; -use std::borrow::Cow; use std::collections::BTreeMap; impl<C> Platform<C> { @@ -92,83 +78,6 @@ impl<C> Platform<C> { Ok(()) } - - fn register_system_data_contract_operations<'a>( - &self, - data_contract: &'a DataContract, - operations: &mut Vec<DriveOperation<'a>>, - platform_version: &PlatformVersion, - ) -> Result<(), Error> { - let serialization = - data_contract.serialize_to_bytes_with_platform_version(platform_version)?; - operations.push(DriveOperation::DataContractOperation( - DataContractOperationType::ApplyContractWithSerialization { - contract: Cow::Borrowed(data_contract), - serialized_contract: serialization, - storage_flags: None, - }, - )); - Ok(()) - } - - fn register_dpns_top_level_domain_operations<'a>( - &'a self, - contract: &'a DataContract, - genesis_time: TimestampMillis, - operations: &mut Vec<DriveOperation<'a>>, - ) -> Result<(), Error> { - let domain = "dash"; - - let document_stub_properties_value = platform_value!({ - "label" : domain, - "normalizedLabel" : domain, - "parentDomainName" : "", - "normalizedParentDomainName" : "", - "records" : { - "identity" : contract.owner_id(), - }, - "subdomainRules": { - "allowSubdomains": true, - } - }); - - let document_stub_properties = document_stub_properties_value - .into_btree_string_map() - .map_err(|e| Error::Protocol(ProtocolError::ValueError(e)))?; - - let document = DocumentV0 { - id: DPNS_DASH_TLD_DOCUMENT_ID.into(), - properties: document_stub_properties, - owner_id: contract.owner_id(), - revision: None, - created_at: Some(genesis_time), - updated_at: Some(genesis_time), - transferred_at: Some(genesis_time), - created_at_block_height: None, - updated_at_block_height: None, - transferred_at_block_height: None, - created_at_core_block_height: None, - updated_at_core_block_height: None, - transferred_at_core_block_height: None, - } - .into(); - - let document_type = contract.document_type_for_name("domain")?; - - let operation = DriveOperation::DocumentOperation(DocumentOperationType::AddDocument { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentInfo::DocumentOwnedInfo((document, None)), - owner_id: None, - }, - contract_info: DataContractInfo::BorrowedDataContract(contract), - document_type_info: DocumentTypeInfo::DocumentTypeRef(document_type), - override_document: false, - }); - - operations.push(operation); - - Ok(()) - } } #[cfg(test)] diff --git a/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v1/mod.rs new file mode 100644 index 00000000000..d6a1cf70396 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/initialization/create_genesis_state/v1/mod.rs @@ -0,0 +1,125 @@ +use crate::error::Error; +use crate::platform_types::platform::Platform; + +use drive::dpp::identity::TimestampMillis; + +use dpp::block::block_info::BlockInfo; +use dpp::prelude::CoreBlockHeight; +use dpp::version::PlatformVersion; +use drive::dpp::system_data_contracts::SystemDataContract; +use drive::query::TransactionArg; +use std::collections::BTreeMap; + +impl<C> Platform<C> { + /// Creates trees and populates them with necessary identities, contracts and documents + #[inline(always)] + pub(super) fn create_genesis_state_v1( + &self, + genesis_core_height: CoreBlockHeight, + genesis_time: TimestampMillis, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + //versioned call + self.drive + .create_initial_state_structure(transaction, platform_version)?; + + self.drive + .store_genesis_core_height(genesis_core_height, transaction, platform_version)?; + + let mut operations = vec![]; + + // Create system identities and contracts + + let system_data_contracts = &self.drive.cache.system_data_contracts; + + let system_data_contract_types = BTreeMap::from_iter([ + (SystemDataContract::DPNS, system_data_contracts.load_dpns()), + ( + SystemDataContract::Withdrawals, + system_data_contracts.load_withdrawals(), + ), + ( + SystemDataContract::Dashpay, + system_data_contracts.load_dashpay(), + ), + ( + SystemDataContract::MasternodeRewards, + system_data_contracts.load_masternode_reward_shares(), + ), + ( + SystemDataContract::TokenHistory, + system_data_contracts.load_token_history(), + ), + ]); + //todo add Wallet Utils (maybe) + + for data_contract in system_data_contract_types.values() { + self.register_system_data_contract_operations( + data_contract, + &mut operations, + platform_version, + )?; + } + + let dpns_contract = system_data_contracts.load_dpns(); + + self.register_dpns_top_level_domain_operations( + &dpns_contract, + genesis_time, + &mut operations, + )?; + + let block_info = BlockInfo::default_with_time(genesis_time); + + self.drive.apply_drive_operations( + operations, + true, + &block_info, + transaction, + platform_version, + None, // No previous_fee_versions needed for genesis state creation + )?; + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + mod create_genesis_state { + use crate::config::PlatformConfig; + use crate::test::helpers::setup::TestPlatformBuilder; + use drive::config::DriveConfig; + use platform_version::version::{PlatformVersion, INITIAL_PROTOCOL_VERSION}; + + #[test] + pub fn should_create_genesis_state_deterministically() { + let platform_version = PlatformVersion::first(); + let platform = TestPlatformBuilder::new() + .with_config(PlatformConfig { + drive: DriveConfig { + epochs_per_era: 20, + ..Default::default() + }, + ..Default::default() + }) + .with_initial_protocol_version(INITIAL_PROTOCOL_VERSION) + .build_with_mock_rpc() + .set_genesis_state(); + + let root_hash = platform + .drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should obtain root hash"); + + // This should never be changed + assert_eq!( + hex::encode(root_hash), + "dc5b0d4be407428adda2315db7d782e64015cbe2d2b7df963f05622390dc3c9f" + ) + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/mod.rs index 41b64d63b18..1ac0715b9d2 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/mod.rs @@ -1,7 +1,7 @@ /// Methods occurring at the finalization of a block pub(in crate::execution) mod block_end; /// Block fee processing -pub(in crate::execution) mod block_fee_processing; +pub(in crate::execution) mod block_processing_end_events; /// Events happening what starting to process a block pub(in crate::execution) mod block_start; /// Update from core such as a masternode list update or quorums being updated @@ -22,6 +22,7 @@ pub(in crate::execution) mod initialization; pub(in crate::execution) mod protocol_upgrade; /// State transition processing pub(in crate::execution) mod state_transition_processing; +mod tokens; /// Voting pub(in crate::execution) mod voting; /// Withdrawal methods diff --git a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs index d36250ea3e7..1557075db17 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/protocol_upgrade/perform_events_on_first_block_of_protocol_change/v0/mod.rs @@ -1,3 +1,4 @@ +use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; @@ -5,9 +6,14 @@ use crate::platform_types::platform_state::PlatformState; use dpp::block::block_info::BlockInfo; use dpp::dashcore::hashes::Hash; use dpp::data_contracts::SystemDataContract; +use dpp::fee::Credits; +use dpp::platform_value::Identifier; +use dpp::serialization::PlatformDeserializable; use dpp::system_data_contracts::load_system_data_contract; use dpp::version::PlatformVersion; use dpp::version::ProtocolVersion; +use dpp::voting::vote_polls::VotePoll; +use drive::drive::balances::TOTAL_TOKEN_SUPPLIES_STORAGE_KEY; use drive::drive::identity::key::fetch::{ IdentityKeysRequest, KeyIDIdentityPublicKeyPairBTreeMap, KeyRequestType, }; @@ -15,7 +21,22 @@ use drive::drive::identity::withdrawals::paths::{ get_withdrawal_root_path, WITHDRAWAL_TRANSACTIONS_BROADCASTED_KEY, WITHDRAWAL_TRANSACTIONS_SUM_AMOUNT_TREE_KEY, }; -use drive::grovedb::{Element, Transaction}; +use drive::drive::prefunded_specialized_balances::prefunded_specialized_balances_for_voting_path_vec; +use drive::drive::system::misc_path; +use drive::drive::tokens::paths::{ + token_distributions_root_path, token_timed_distributions_path, tokens_root_path, + TOKEN_BALANCES_KEY, TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY, TOKEN_DISTRIBUTIONS_KEY, + TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY, TOKEN_IDENTITY_INFO_KEY, TOKEN_MS_TIMED_DISTRIBUTIONS_KEY, + TOKEN_PERPETUAL_DISTRIBUTIONS_KEY, TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY, + TOKEN_STATUS_INFO_KEY, TOKEN_TIMED_DISTRIBUTIONS_KEY, +}; +use drive::drive::votes::paths::vote_end_date_queries_tree_path_vec; +use drive::drive::RootTree; +use drive::grovedb::{Element, PathQuery, Query, QueryItem, SizedQuery, Transaction}; +use drive::grovedb_path::SubtreePath; +use drive::query::QueryResultType; +use std::collections::HashSet; +use std::ops::RangeFull; impl<C> Platform<C> { /// Executes protocol-specific events on the first block after a protocol version change. @@ -58,30 +79,23 @@ impl<C> Platform<C> { self.transition_to_version_6(block_info, transaction, platform_version)?; } - Ok(()) - } + if previous_protocol_version < 8 && platform_version.protocol_version >= 8 { + self.transition_to_version_8(block_info, transaction, platform_version) + .or_else(|e| { + tracing::error!( + error = ?e, + "Error while transitioning to version 8: {e}" + ); - /// Initializes the wallet contract that supports mobile wallets with additional - /// functionality - /// - /// This function is called during the transition from protocol version 5 to protocol version 6 - /// and higher to set up the wallet contract in the platform. - fn transition_to_version_6( - &self, - block_info: &BlockInfo, - transaction: &Transaction, - platform_version: &PlatformVersion, - ) -> Result<(), Error> { - let contract = - load_system_data_contract(SystemDataContract::WalletUtils, platform_version)?; + // We ignore this transition errors because it's not changing the state structure + // and not critical for the system + Ok::<(), Error>(()) + })?; + } - self.drive.insert_contract( - &contract, - *block_info, - true, - Some(transaction), - platform_version, - )?; + if previous_protocol_version < 9 && platform_version.protocol_version >= 9 { + self.transition_to_version_9(block_info, transaction, platform_version)?; + } Ok(()) } @@ -179,4 +193,299 @@ impl<C> Platform<C> { } Ok(()) } + + /// Initializes the wallet contract that supports mobile wallets with additional + /// functionality + /// + /// This function is called during the transition from protocol version 5 to protocol version 6 + /// and higher to set up the wallet contract in the platform. + fn transition_to_version_6( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let contract = + load_system_data_contract(SystemDataContract::WalletUtils, platform_version)?; + + self.drive.insert_contract( + &contract, + *block_info, + true, + Some(transaction), + platform_version, + )?; + + Ok(()) + } + + /// When transitioning to version 8 we need to empty some specialized balances + fn transition_to_version_8( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + // Let's start by getting all the specialized balances that exist + let path_holding_specialized_balances = + prefunded_specialized_balances_for_voting_path_vec(); + let path_query = PathQuery::new_single_query_item( + path_holding_specialized_balances, + QueryItem::RangeFull(RangeFull), + ); + let all_specialized_balances_still_around: HashSet<_> = self + .drive + .grove_get_path_query( + &path_query, + Some(transaction), + QueryResultType::QueryKeyElementPairResultType, + &mut vec![], + &platform_version.drive, + )? + .0 + .to_keys() + .into_iter() + .map(Identifier::try_from) + .collect::<Result<HashSet<_>, dpp::platform_value::Error>>()?; + + let path = vote_end_date_queries_tree_path_vec(); + + let mut query = Query::new_with_direction(true); + + query.insert_all(); + + let mut sub_query = Query::new(); + + sub_query.insert_all(); + + query.default_subquery_branch.subquery = Some(sub_query.into()); + + let current_votes_path_query = PathQuery { + path, + query: SizedQuery { + query, + limit: Some(30000), //Just a high number that shouldn't break the system + offset: None, + }, + }; + + let (query_result_elements, _) = self.drive.grove_get_path_query( + &current_votes_path_query, + Some(transaction), + QueryResultType::QueryElementResultType, + &mut vec![], + &platform_version.drive, + )?; + + let active_specialized_balances = query_result_elements + .to_elements() + .into_iter() + .map(|element| { + let contested_document_resource_vote_poll_bytes = element + .into_item_bytes() + .map_err(drive::error::Error::GroveDB)?; + let vote_poll = + VotePoll::deserialize_from_bytes(&contested_document_resource_vote_poll_bytes)?; + match vote_poll { + VotePoll::ContestedDocumentResourceVotePoll(contested) => { + contested.specialized_balance_id().map_err(Error::Protocol) + } + } + }) + .collect::<Result<HashSet<Identifier>, Error>>()?; + + // let's get the non-active ones + let non_active_specialized_balances = + all_specialized_balances_still_around.difference(&active_specialized_balances); + + let mut total_credits_to_add_to_processing: Credits = 0; + + let mut operations = vec![]; + + for specialized_balance_id in non_active_specialized_balances { + let (credits, mut empty_specialized_balance_operation) = + self.drive.empty_prefunded_specialized_balance_operations( + *specialized_balance_id, + false, + &mut None, + Some(transaction), + platform_version, + )?; + operations.append(&mut empty_specialized_balance_operation); + total_credits_to_add_to_processing = total_credits_to_add_to_processing + .checked_add(credits) + .ok_or(Error::Execution(ExecutionError::Overflow( + "Credits from specialized balances are overflowing", + )))?; + } + + if total_credits_to_add_to_processing > 0 { + operations.push( + self.drive + .add_epoch_processing_credits_for_distribution_operation( + &block_info.epoch, + total_credits_to_add_to_processing, + Some(transaction), + platform_version, + )?, + ); + } + + if !operations.is_empty() { + self.drive.apply_batch_low_level_drive_operations( + None, + Some(transaction), + operations, + &mut vec![], + &platform_version.drive, + )?; + } + + Ok(()) + } + + /// Adds all trees needed for tokens, also adds the token history system data contract + /// + /// This function is called during the transition from protocol version 5 to protocol version 6 + /// and higher to set up the wallet contract in the platform. + fn transition_to_version_9( + &self, + block_info: &BlockInfo, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + self.drive.grove_insert_empty_tree( + SubtreePath::empty(), + &[RootTree::GroupActions as u8], + Some(transaction), + None, + &mut vec![], + &platform_version.drive, + )?; + + // The root token trees + + let path = tokens_root_path(); + self.drive.grove_insert_if_not_exists( + (&path).into(), + &[TOKEN_BALANCES_KEY], + Element::empty_big_sum_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&path).into(), + &[TOKEN_IDENTITY_INFO_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&path).into(), + &[TOKEN_STATUS_INFO_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&path).into(), + &[TOKEN_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + // The token distribution trees + + let token_distributions_path = token_distributions_root_path(); + + self.drive.grove_insert_if_not_exists( + (&token_distributions_path).into(), + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&token_distributions_path).into(), + &[TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&token_distributions_path).into(), + &[TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + // The token time distribution trees + let timed_distributions_path = token_timed_distributions_path(); + + self.drive.grove_insert_if_not_exists( + (&timed_distributions_path).into(), + &[TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&timed_distributions_path).into(), + &[TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + self.drive.grove_insert_if_not_exists( + (&timed_distributions_path).into(), + &[TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + // The token total supply + + let path = misc_path(); + self.drive.grove_insert_if_not_exists( + (&path).into(), + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY.as_slice(), + Element::empty_big_sum_tree(), + Some(transaction), + None, + &platform_version.drive, + )?; + + let contract = + load_system_data_contract(SystemDataContract::TokenHistory, platform_version)?; + + self.drive.insert_contract( + &contract, + *block_info, + true, + Some(transaction), + platform_version, + )?; + + Ok(()) + } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/tokens/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/tokens/mod.rs new file mode 100644 index 00000000000..b3c9f415e5e --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/tokens/mod.rs @@ -0,0 +1 @@ +mod validate_token_aggregated_balance; diff --git a/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/mod.rs new file mode 100644 index 00000000000..68718a29b63 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/mod.rs @@ -0,0 +1,54 @@ +mod v0; + +use dpp::version::PlatformVersion; + +use drive::grovedb::Transaction; + +use crate::error::execution::ExecutionError; +use crate::error::Error; + +use crate::platform_types::platform::Platform; + +impl<C> Platform<C> { + /// Validates the aggregated token balance for the platform. + /// + /// This function verifies that the total token balances in the platform are consistent + /// and correctly aggregated. It delegates the validation to a version-specific implementation + /// based on the `PlatformVersion` provided. + /// + /// # Arguments + /// + /// * `transaction` - A reference to the current transaction. + /// * `platform_version` - The platform version specifying the implementation to use. + /// + /// # Returns + /// + /// * `Ok(())` if the token balances are validated successfully. + /// * `Err(Error)` if the validation fails due to inconsistencies or an unknown version. + /// + /// # Errors + /// + /// Returns an `ExecutionError::CorruptedCreditsNotBalanced` if the token sum trees + /// are not balanced. + /// + /// Returns an `ExecutionError::UnknownVersionMismatch` if the platform version is not recognized. + pub fn validate_token_aggregated_balance( + &self, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive_abci + .methods + .tokens_processing + .validate_token_aggregated_balance + { + 0 => self.validate_token_aggregated_balance_v0(transaction, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "validate_token_aggregated_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/v0/mod.rs new file mode 100644 index 00000000000..b4538389f21 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/tokens/validate_token_aggregated_balance/v0/mod.rs @@ -0,0 +1,37 @@ +use drive::grovedb::Transaction; + +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + #[inline(always)] + pub(super) fn validate_token_aggregated_balance_v0( + &self, + transaction: &Transaction, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + if self.config.execution.verify_token_sum_trees { + // Verify sum trees + let token_balance = self + .drive + .calculate_total_tokens_balance(Some(transaction), platform_version) + .map_err(Error::Drive)?; + + if !token_balance.ok()? { + return Err(Error::Execution( + ExecutionError::CorruptedCreditsNotBalanced(format!( + "credits are not balanced after block execution {:?} off by {}", + token_balance, + token_balance + .total_identity_token_balances + .abs_diff(token_balance.total_tokens_in_platform) + )), + )); + } + } + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/check_for_ended_vote_polls/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/check_for_ended_vote_polls/v0/mod.rs index 426888de5da..99f9fa150d1 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/check_for_ended_vote_polls/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/check_for_ended_vote_polls/v0/mod.rs @@ -3,8 +3,8 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; use crate::rpc::core::CoreRPCLike; -use dashcore_rpc::dashcore::Network::Testnet; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::Network::Testnet; use dpp::document::DocumentV0Getters; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; @@ -310,6 +310,7 @@ where // This means removing it and also removing all current votes if !vote_polls_with_info.is_empty() { self.clean_up_after_vote_polls_end( + block_info, &vote_polls_with_info, clean_up_testnet_corrupted_reference_issue, transaction, diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/mod.rs index 1c13190a5a4..d3cdd55fa2c 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/mod.rs @@ -2,6 +2,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; @@ -11,6 +12,7 @@ use drive::grovedb::TransactionArg; use std::collections::BTreeMap; mod v0; +mod v1; impl<C> Platform<C> where @@ -19,6 +21,7 @@ where /// Checks for ended vote polls pub(in crate::execution) fn clean_up_after_contested_resources_vote_polls_end( &self, + block_info: &BlockInfo, vote_polls: Vec<( &ContestedDocumentResourceVotePollWithContractInfo, &TimestampMillis, @@ -40,9 +43,16 @@ where transaction, platform_version, ), + 1 => self.clean_up_after_contested_resources_vote_polls_end_v1( + block_info, + vote_polls, + clean_up_testnet_corrupted_reference_issue, + transaction, + platform_version, + ), version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "clean_up_after_contested_resources_vote_polls_end".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v0/mod.rs index f444ed1e61f..3dc1777acfd 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v0/mod.rs @@ -8,6 +8,7 @@ use dpp::version::PlatformVersion; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use dpp::ProtocolError; use drive::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfo; +use drive::fees::op::LowLevelDriveOperation; use drive::grovedb::TransactionArg; use std::collections::BTreeMap; @@ -28,12 +29,43 @@ where transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { + let operations = self.clean_up_after_contested_resources_vote_polls_end_operations_v0( + vote_polls.as_slice(), + clean_up_testnet_corrupted_reference_issue, + transaction, + platform_version, + )?; + if !operations.is_empty() { + self.drive.apply_batch_low_level_drive_operations( + None, + transaction, + operations, + &mut vec![], + &platform_version.drive, + )?; + } + + Ok(()) + } + /// Checks for ended vote polls + #[inline(always)] + pub(super) fn clean_up_after_contested_resources_vote_polls_end_operations_v0( + &self, + vote_polls: &[( + &ContestedDocumentResourceVotePollWithContractInfo, + &TimestampMillis, + &BTreeMap<ResourceVoteChoice, Vec<Identifier>>, + )], + clean_up_testnet_corrupted_reference_issue: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { let mut operations = vec![]; // We remove the end date query self.drive .remove_contested_resource_vote_poll_end_date_query_operations( - vote_polls.as_slice(), + vote_polls, &mut operations, transaction, platform_version, @@ -42,7 +74,7 @@ where // We remove the votes from under the contenders votes received self.drive .remove_contested_resource_vote_poll_votes_operations( - vote_polls.as_slice(), + vote_polls, true, &mut operations, transaction, @@ -52,7 +84,7 @@ where // We remove the documents that contenders have self.drive .remove_contested_resource_vote_poll_documents_operations( - vote_polls.as_slice(), + vote_polls, clean_up_testnet_corrupted_reference_issue, &mut operations, transaction, @@ -62,7 +94,7 @@ where // We remove the contenders self.drive .remove_contested_resource_vote_poll_contenders_operations( - vote_polls.as_slice(), + vote_polls, &mut operations, transaction, platform_version, @@ -81,7 +113,7 @@ where let mut identity_to_vote_ids_map: BTreeMap<&Identifier, Vec<&Identifier>> = BTreeMap::new(); - for (vote_poll, _, voters_for_contender) in &vote_polls { + for (vote_poll, _, voters_for_contender) in vote_polls { let vote_id = vote_poll_ids .iter() .find_map(|(vp, vid)| if vp == vote_poll { Some(vid) } else { None }) @@ -113,7 +145,7 @@ where if clean_up_testnet_corrupted_reference_issue { self.drive.remove_contested_resource_info_operations( - vote_polls.as_slice(), + vote_polls, &mut operations, transaction, platform_version, @@ -121,23 +153,13 @@ where // We remove the last index self.drive .remove_contested_resource_top_level_index_operations( - vote_polls.as_slice(), + vote_polls, &mut operations, transaction, platform_version, )?; } - if !operations.is_empty() { - self.drive.apply_batch_low_level_drive_operations( - None, - transaction, - operations, - &mut vec![], - &platform_version.drive, - )?; - } - - Ok(()) + Ok(operations) } } diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v1/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v1/mod.rs new file mode 100644 index 00000000000..9fd22acf087 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_contested_resources_vote_polls_end/v1/mod.rs @@ -0,0 +1,88 @@ +use crate::error::execution::ExecutionError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::prelude::TimestampMillis; +use dpp::version::PlatformVersion; +use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; +use drive::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfo; +use drive::grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl<C> Platform<C> +where + C: CoreRPCLike, +{ + /// Checks for ended vote polls + #[inline(always)] + pub(super) fn clean_up_after_contested_resources_vote_polls_end_v1( + &self, + block_info: &BlockInfo, + vote_polls: Vec<( + &ContestedDocumentResourceVotePollWithContractInfo, + &TimestampMillis, + &BTreeMap<ResourceVoteChoice, Vec<Identifier>>, + )>, + clean_up_testnet_corrupted_reference_issue: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut operations = self.clean_up_after_contested_resources_vote_polls_end_operations_v0( + vote_polls.as_slice(), + clean_up_testnet_corrupted_reference_issue, + transaction, + platform_version, + )?; + + // We also need to clean out the specialized balances + + let mut total_credits_to_add_to_processing: Credits = 0; + + for specialized_balance_id in vote_polls + .iter() + .map(|(vote_poll, _, _)| vote_poll.specialized_balance_id()) + { + let (credits, mut empty_specialized_balance_operation) = + self.drive.empty_prefunded_specialized_balance_operations( + specialized_balance_id?, + false, + &mut None, + transaction, + platform_version, + )?; + operations.append(&mut empty_specialized_balance_operation); + total_credits_to_add_to_processing = total_credits_to_add_to_processing + .checked_add(credits) + .ok_or(Error::Execution(ExecutionError::Overflow( + "Credits from specialized balances are overflowing", + )))?; + } + + if total_credits_to_add_to_processing > 0 { + operations.push( + self.drive + .add_epoch_processing_credits_for_distribution_operation( + &block_info.epoch, + total_credits_to_add_to_processing, + transaction, + platform_version, + )?, + ); + } + + if !operations.is_empty() { + self.drive.apply_batch_low_level_drive_operations( + None, + transaction, + operations, + &mut vec![], + &platform_version.drive, + )?; + } + + Ok(()) + } +} diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/mod.rs index 2852effd323..6580b030998 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/mod.rs @@ -2,6 +2,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; use drive::drive::votes::resolved::vote_polls::ResolvedVotePollWithVotes; @@ -17,6 +18,7 @@ where /// Checks for ended vote polls pub(in crate::execution) fn clean_up_after_vote_polls_end( &self, + block_info: &BlockInfo, vote_polls: &BTreeMap<TimestampMillis, Vec<ResolvedVotePollWithVotes>>, clean_up_testnet_corrupted_reference_issue: bool, transaction: TransactionArg, @@ -29,6 +31,7 @@ where .clean_up_after_vote_poll_end { 0 => self.clean_up_after_vote_polls_end_v0( + block_info, vote_polls, clean_up_testnet_corrupted_reference_issue, transaction, diff --git a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/v0/mod.rs index a5b0d75a3b5..81d8b84157b 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/voting/clean_up_after_vote_polls_end/v0/mod.rs @@ -1,6 +1,7 @@ use crate::error::Error; use crate::platform_types::platform::Platform; use crate::rpc::core::CoreRPCLike; +use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; @@ -18,6 +19,7 @@ where #[inline(always)] pub(super) fn clean_up_after_vote_polls_end_v0( &self, + block_info: &BlockInfo, vote_polls: &BTreeMap<TimestampMillis, Vec<ResolvedVotePollWithVotes>>, clean_up_testnet_corrupted_reference_issue: bool, transaction: TransactionArg, @@ -44,6 +46,7 @@ where if !contested_polls.is_empty() { // Call the function to clean up contested document resource vote polls self.clean_up_after_contested_resources_vote_polls_end( + block_info, contested_polls, clean_up_testnet_corrupted_reference_issue, transaction, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs index 1f6cacbc2bf..c8f8dda8e5a 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/append_signatures_and_broadcast_withdrawal_transactions/v0/mod.rs @@ -1,10 +1,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::platform_types::platform::Platform; -use crate::rpc::core::{ - CoreRPCLike, CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED, CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM, - CORE_RPC_TX_ALREADY_IN_CHAIN, -}; +use crate::rpc::core::{CoreRPCLike, CORE_RPC_TX_ALREADY_IN_CHAIN}; use dashcore_rpc::jsonrpc; use dashcore_rpc::Error as CoreRPCError; use dpp::dashcore::bls_sig_utils::BLSSignature; @@ -18,6 +15,14 @@ use std::path::Path; use std::time::{SystemTime, UNIX_EPOCH}; use tenderdash_abci::proto::types::VoteExtension; +// This error is returned when Core can't find a quorum for the asset unlock transaction in Core 21 +const CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM: &str = "bad-assetunlock-not-active-quorum"; + +// This error replaced the previous since Core 22 to make it more verbose +const CORE_RPC_ERROR_ASSET_UNLOCK_TOO_OLD_QUORUM: &str = "bad-assetunlock-too-old-quorum"; + +const CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED: &str = "bad-assetunlock-too-late"; + impl<C> Platform<C> where C: CoreRPCLike, @@ -90,7 +95,8 @@ where } Err(CoreRPCError::JsonRpc(jsonrpc::error::Error::Rpc(e))) if e.message == CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM - || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED => + || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED + || e.message == CORE_RPC_ERROR_ASSET_UNLOCK_TOO_OLD_QUORUM => { tracing::debug!( tx_id = transaction.txid().to_string(), diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs index 13da6e72f1f..57c938c0488 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/build_untied_withdrawal_transactions_from_documents/v0/mod.rs @@ -1,5 +1,5 @@ -use dashcore_rpc::dashcore::consensus::Encodable; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::consensus::Encodable; use dpp::data_contracts::withdrawals_contract; use dpp::data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::document::document_methods::DocumentMethodsV0; diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs index 74315a1d6c7..0c4ab33a051 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/cleanup_expired_locks_of_withdrawal_amounts/v0/mod.rs @@ -6,7 +6,7 @@ use dpp::block::block_info::BlockInfo; use dpp::version::PlatformVersion; use drive::drive::identity::withdrawals::paths::get_withdrawal_transactions_sum_tree_path_vec; -use drive::grovedb::{PathQuery, QueryItem, Transaction}; +use drive::grovedb::{MaybeTree, PathQuery, QueryItem, Transaction}; use drive::util::grove_operations::BatchDeleteApplyType; impl<C> Platform<C> @@ -49,7 +49,7 @@ where true, // we know that we are not deleting a subtree BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, Some(transaction), &mut batch_operations, diff --git a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs index 7a37525de68..5729e4fcefa 100644 --- a/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/platform_events/withdrawals/dequeue_and_build_unsigned_withdrawal_transactions/v0/mod.rs @@ -1,10 +1,10 @@ -use dashcore_rpc::dashcore::{ - blockdata::transaction::special_transaction::asset_unlock::request_info::AssetUnlockRequestInfo, - hashes::Hash, QuorumHash, -}; use dpp::block::block_info::BlockInfo; use dpp::dashcore::transaction::special_transaction::asset_unlock::qualified_asset_unlock::build_asset_unlock_tx; use dpp::dashcore::Transaction; +use dpp::dashcore::{ + blockdata::transaction::special_transaction::asset_unlock::request_info::AssetUnlockRequestInfo, + hashes::Hash, QuorumHash, +}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::{Document, DocumentV0Setters}; diff --git a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs index 1150faaca11..73c87119d07 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_event/mod.rs @@ -162,7 +162,7 @@ impl<'a> ExecutionEvent<'a> { ))) } } - StateTransitionAction::DocumentsBatchAction(document_batch_action) => { + StateTransitionAction::BatchAction(document_batch_action) => { let user_fee_increase = action.user_fee_increase(); let removed_balance = document_batch_action.all_used_balances()?; let operations = diff --git a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs index d44b854495e..c0dc1fa91e8 100644 --- a/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/execution_operation/mod.rs @@ -65,6 +65,7 @@ pub const SHA256_BLOCK_SIZE: u16 = 64; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ValidationOperation { Protocol(ProtocolValidationOperation), + RetrieveIdentityTokenBalance, RetrieveIdentity(RetrieveIdentityInfo), RetrievePrefundedSpecializedBalance, PerformNetworkThresholdSigning, @@ -224,6 +225,19 @@ impl ValidationOperation { "execution processing fee overflow error", ))?; } + ValidationOperation::RetrieveIdentityTokenBalance => { + let operation_cost = platform_version + .fee_version + .processing + .fetch_identity_token_balance_processing_cost; + + fee_result.processing_fee = fee_result + .processing_fee + .checked_add(operation_cost) + .ok_or(ExecutionError::Overflow( + "execution processing fee overflow error", + ))?; + } } } Ok(()) diff --git a/packages/rs-drive-abci/src/execution/types/update_state_masternode_list_outcome/v0/mod.rs b/packages/rs-drive-abci/src/execution/types/update_state_masternode_list_outcome/v0/mod.rs index ab04c9770d1..0794c2f52bf 100644 --- a/packages/rs-drive-abci/src/execution/types/update_state_masternode_list_outcome/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/types/update_state_masternode_list_outcome/v0/mod.rs @@ -1,5 +1,5 @@ -use dashcore_rpc::dashcore::ProTxHash; use dashcore_rpc::dashcore_rpc_json::{MasternodeListDiff, MasternodeListItem}; +use dpp::dashcore::ProTxHash; use std::collections::BTreeMap; /// Represents the outcome of an attempt to update the state of a masternode list. diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs index 0f11ba2a64d..b48a79bf8ef 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/asset_lock/transaction/fetch_asset_lock_transaction_output_sync/v0/mod.rs @@ -49,7 +49,7 @@ pub fn fetch_asset_lock_transaction_output_sync_v0<C: CoreRPCLike>( let Some(transaction_info) = maybe_transaction_info else { // Transaction hash bytes needs to be reversed to match actual transaction hash - let mut hash: [u8; 32] = *transaction_hash.as_raw_hash().as_byte_array(); + let mut hash: [u8; 32] = transaction_hash.as_raw_hash().to_byte_array(); hash.reverse(); return Ok(ValidationResult::new_with_error( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs index 6f9cfb87adf..9a9e2f8901f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/common/validate_simple_pre_check_balance/v0/mod.rs @@ -33,7 +33,7 @@ impl ValidateSimplePreCheckBalanceV0 for StateTransition { .state_transition_min_fees .contract_update } - StateTransition::DocumentsBatch(_) => { + StateTransition::Batch(_) => { platform_version .fee_version .state_transition_min_fees diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs index c3f10fa2758..12d7bdd4e06 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/processor/v0/mod.rs @@ -528,7 +528,7 @@ impl StateTransitionBasicStructureValidationV0 for StateTransition { StateTransition::IdentityCreditWithdrawal(st) => { st.validate_basic_structure(platform_version) } - StateTransition::DocumentsBatch(st) => st.validate_basic_structure(platform_version), + StateTransition::Batch(st) => st.validate_basic_structure(platform_version), StateTransition::IdentityCreditTransfer(st) => { st.validate_basic_structure(platform_version) } @@ -554,7 +554,7 @@ impl StateTransitionNonceValidationV0 for StateTransition { platform_version: &PlatformVersion, ) -> Result<SimpleConsensusValidationResult, Error> { match self { - StateTransition::DocumentsBatch(st) => st.validate_nonces( + StateTransition::Batch(st) => st.validate_nonces( platform, block_info, tx, @@ -618,7 +618,7 @@ impl StateTransitionHasNonceValidationV0 for StateTransition { 0 => { let has_nonce_validation = matches!( self, - StateTransition::DocumentsBatch(_) + StateTransition::Batch(_) | StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) | StateTransition::IdentityUpdate(_) @@ -632,7 +632,7 @@ impl StateTransitionHasNonceValidationV0 for StateTransition { // Preferably to use match without wildcard arm (_) to avoid missing cases // in the future when new state transitions are added let has_nonce_validation = match self { - StateTransition::DocumentsBatch(_) + StateTransition::Batch(_) | StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) | StateTransition::IdentityUpdate(_) @@ -666,7 +666,7 @@ impl StateTransitionIdentityBalanceValidationV0 for StateTransition { StateTransition::IdentityCreditWithdrawal(st) => { st.validate_minimum_balance_pre_check(identity, platform_version) } - StateTransition::DocumentsBatch(st) => { + StateTransition::Batch(st) => { st.validate_minimum_balance_pre_check(identity, platform_version) } StateTransition::DataContractCreate(_) @@ -687,7 +687,7 @@ impl StateTransitionIdentityBalanceValidationV0 for StateTransition { | StateTransition::IdentityCreditWithdrawal(_) | StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) - | StateTransition::DocumentsBatch(_) + | StateTransition::Batch(_) | StateTransition::IdentityUpdate(_) ) } @@ -790,7 +790,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { platform_version: &PlatformVersion, ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { match self { - StateTransition::DocumentsBatch(st) => st.validate_advanced_structure_from_state( + StateTransition::Batch(st) => st.validate_advanced_structure_from_state( block_info, network, action, @@ -829,7 +829,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { fn has_advanced_structure_validation_with_state(&self) -> bool { matches!( self, - StateTransition::DocumentsBatch(_) + StateTransition::Batch(_) | StateTransition::IdentityCreate(_) | StateTransition::MasternodeVote(_) ) @@ -838,7 +838,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for StateTransition { /// This means we should transform into the action before validation of the advanced structure, /// and that we must even do this on check_tx fn requires_advanced_structure_validation_with_state_on_check_tx(&self) -> bool { - matches!(self, StateTransition::DocumentsBatch(_)) + matches!(self, StateTransition::Batch(_)) } } @@ -854,7 +854,7 @@ impl StateTransitionIdentityBasedSignatureValidationV0 for StateTransition { StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) | StateTransition::IdentityCreditTransfer(_) - | StateTransition::DocumentsBatch(_) => { + | StateTransition::Batch(_) => { //Basic signature verification Ok(self.validate_state_transition_identity_signed( drive, @@ -1029,7 +1029,7 @@ impl StateTransitionStateValidationV0 for StateTransition { tx, ), // The replay attack is prevented by identity data contract nonce - StateTransition::DocumentsBatch(st) => st.validate_state( + StateTransition::Batch(st) => st.validate_state( action, platform, validation_mode, @@ -1060,7 +1060,7 @@ impl StateTransitionStateValidationV0 for StateTransition { impl StateTransitionIsAllowedValidationV0 for StateTransition { fn has_is_allowed_validation(&self, platform_version: &PlatformVersion) -> Result<bool, Error> { match self { - StateTransition::DocumentsBatch(st) => st.has_is_allowed_validation(platform_version), + StateTransition::Batch(st) => st.has_is_allowed_validation(platform_version), StateTransition::DataContractCreate(_) | StateTransition::DataContractUpdate(_) | StateTransition::IdentityCreate(_) @@ -1078,9 +1078,7 @@ impl StateTransitionIsAllowedValidationV0 for StateTransition { platform_version: &PlatformVersion, ) -> Result<ConsensusValidationResult<()>, Error> { match self { - StateTransition::DocumentsBatch(st) => { - st.validate_is_allowed(platform, platform_version) - } + StateTransition::Batch(st) => st.validate_is_allowed(platform, platform_version), _ => Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "validate_is_allowed is not implemented for this state transition", ))), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/mod.rs similarity index 86% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/mod.rs index 7dfa5e8ebab..5304f28180b 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/mod.rs @@ -1,16 +1,16 @@ -use dashcore_rpc::dashcore::Network; +use dpp::dashcore::Network; use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::state_v0::DocumentCreateTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::state_v1::DocumentCreateTransitionActionStateValidationV1; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::structure_v0::DocumentCreateTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_create_transition_action::state_v0::DocumentCreateTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_create_transition_action::state_v1::DocumentCreateTransitionActionStateValidationV1; +use crate::execution::validation::state_transition::batch::action_validation::document::document_create_transition_action::structure_v0::DocumentCreateTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -49,7 +49,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_create_transition_structure_validation { 0 => self.validate_structure_v0(owner_id, block_info, network, platform_version), @@ -74,7 +74,7 @@ impl DocumentCreateTransitionActionValidation for DocumentCreateTransitionAction .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_create_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v0/mod.rs similarity index 94% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v0/mod.rs index fdc1c0a2dfa..5b016084d44 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v0/mod.rs @@ -10,8 +10,8 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::{ConsensusValidationResult, Identifier}; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use dpp::voting::vote_info_storage::contested_document_vote_poll_stored_info::{ContestedDocumentVotePollStatus, ContestedDocumentVotePollStoredInfoV0Getters}; use drive::error::drive::DriveError; @@ -19,11 +19,11 @@ use drive::query::TransactionArg; use crate::error::Error; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_contender::fetch_contender; -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::fetch_document_with_id; +use crate::execution::validation::state_transition::batch::state::v0::fetch_contender::fetch_contender; +use crate::execution::validation::state_transition::batch::state::v0::fetch_documents::fetch_document_with_id; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentCreateTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentCreateTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v1/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v1/mod.rs similarity index 95% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v1/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v1/mod.rs index 2e2908d9b56..6bde962b057 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/state_v1/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/state_v1/mod.rs @@ -12,8 +12,8 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::prelude::{ConsensusValidationResult, Identifier}; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use dpp::voting::vote_info_storage::contested_document_vote_poll_stored_info::{ContestedDocumentVotePollStatus, ContestedDocumentVotePollStoredInfoV0Getters}; use drive::error::drive::DriveError; @@ -21,11 +21,11 @@ use drive::query::TransactionArg; use crate::error::Error; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_contender::fetch_contender; -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::{fetch_document_with_id, has_contested_document_with_document_id}; +use crate::execution::validation::state_transition::batch::state::v0::fetch_contender::fetch_contender; +use crate::execution::validation::state_transition::batch::state::v0::fetch_documents::{fetch_document_with_id, has_contested_document_with_document_id}; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentCreateTransitionActionStateValidationV1 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentCreateTransitionActionStateValidationV1 { fn validate_state_v1( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/structure_v0/mod.rs similarity index 94% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/structure_v0/mod.rs index 7ae98cf477c..d3c0d57b7df 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_create_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_create_transition_action/structure_v0/mod.rs @@ -9,12 +9,12 @@ use dpp::data_contract::document_type::restricted_creation::CreationRestrictionM use dpp::data_contract::validate_document::DataContractDocumentValidationMethodsV0; use dpp::identifier::Identifier; use dpp::validation::{SimpleConsensusValidationResult}; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -pub(super) trait DocumentCreateTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentCreateTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, owner_id: Identifier, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/mod.rs similarity index 87% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/mod.rs index b36e68daa93..4bc007486bc 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/mod.rs @@ -1,14 +1,14 @@ use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::state_v0::DocumentDeleteTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::structure_v0::DocumentDeleteTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_delete_transition_action::state_v0::DocumentDeleteTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_delete_transition_action::structure_v0::DocumentDeleteTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -40,7 +40,7 @@ impl DocumentDeleteTransitionActionValidation for DocumentDeleteTransitionAction .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_delete_transition_structure_validation { 0 => self.validate_structure_v0(), @@ -65,7 +65,7 @@ impl DocumentDeleteTransitionActionValidation for DocumentDeleteTransitionAction .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_delete_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/state_v0/mod.rs similarity index 89% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/state_v0/mod.rs index 98ce7ed92b8..bd96ae4727a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/state_v0/mod.rs @@ -9,18 +9,18 @@ use dpp::document::{Document, DocumentV0Getters}; use dpp::identifier::Identifier; use dpp::prelude::ConsensusValidationResult; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use crate::error::Error; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::fetch_document_with_id; +use crate::execution::validation::state_transition::batch::state::v0::fetch_documents::fetch_document_with_id; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentDeleteTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentDeleteTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/structure_v0/mod.rs similarity index 84% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/structure_v0/mod.rs index 3813405201c..0a9cbfe8929 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_delete_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_delete_transition_action/structure_v0/mod.rs @@ -2,13 +2,13 @@ use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, Inva use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use crate::error::Error; -pub(super) trait DocumentDeleteTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentDeleteTransitionActionStructureValidationV0 { fn validate_structure_v0(&self) -> Result<SimpleConsensusValidationResult, Error>; } impl DocumentDeleteTransitionActionStructureValidationV0 for DocumentDeleteTransitionAction { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/mod.rs index ef6c32b9968..8b37d7ed409 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/mod.rs @@ -2,14 +2,14 @@ use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::state_v0::DocumentPurchaseTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::structure_v0::DocumentPurchaseTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_purchase_transition_action::state_v0::DocumentPurchaseTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_purchase_transition_action::structure_v0::DocumentPurchaseTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -41,7 +41,7 @@ impl DocumentPurchaseTransitionActionValidation for DocumentPurchaseTransitionAc .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_purchase_transition_structure_validation { 0 => self.validate_structure_v0(platform_version), @@ -66,7 +66,7 @@ impl DocumentPurchaseTransitionActionValidation for DocumentPurchaseTransitionAc .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_purchase_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/state_v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/state_v0/mod.rs index 79e43113440..9d7b5d884fd 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/state_v0/mod.rs @@ -4,15 +4,15 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentPurchaseTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentPurchaseTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/structure_v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/structure_v0/mod.rs index afbe3ae28b2..7c65043d3e5 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_purchase_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_purchase_transition_action/structure_v0/mod.rs @@ -4,12 +4,12 @@ use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::document::DocumentV0Getters; use dpp::nft::TradeMode; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -pub(super) trait DocumentPurchaseTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentPurchaseTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/mod.rs index fe65d922dd6..6419ff58119 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/mod.rs @@ -2,14 +2,14 @@ use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::state_v0::DocumentReplaceTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::structure_v0::DocumentReplaceTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_replace_transition_action::state_v0::DocumentReplaceTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_replace_transition_action::structure_v0::DocumentReplaceTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -41,7 +41,7 @@ impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionActi .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_replace_transition_structure_validation { 0 => self.validate_structure_v0(platform_version), @@ -66,7 +66,7 @@ impl DocumentReplaceTransitionActionValidation for DocumentReplaceTransitionActi .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_replace_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/state_v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/state_v0/mod.rs index 8fea8e28565..ef3e33ad720 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/state_v0/mod.rs @@ -4,15 +4,15 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentReplaceTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentReplaceTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/structure_v0/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/structure_v0/mod.rs index 6f77359d1ad..582db214f0d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_replace_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_replace_transition_action/structure_v0/mod.rs @@ -3,12 +3,12 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::validate_document::DataContractDocumentValidationMethodsV0; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -pub(super) trait DocumentReplaceTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentReplaceTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/mod.rs index 9b4f6e8b55d..d5df2e9b98c 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/mod.rs @@ -2,14 +2,14 @@ use dpp::block::block_info::BlockInfo; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::state_v0::DocumentTransferTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::structure_v0::DocumentTransferTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_transfer_transition_action::state_v0::DocumentTransferTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_transfer_transition_action::structure_v0::DocumentTransferTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -41,7 +41,7 @@ impl DocumentTransferTransitionActionValidation for DocumentTransferTransitionAc .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_transfer_transition_structure_validation { 0 => self.validate_structure_v0(platform_version), @@ -66,7 +66,7 @@ impl DocumentTransferTransitionActionValidation for DocumentTransferTransitionAc .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_transfer_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/state_v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/state_v0/mod.rs index 7613df9afcd..51b68d3d3ca 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/state_v0/mod.rs @@ -4,15 +4,15 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentTransferTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentTransferTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/structure_v0/mod.rs similarity index 87% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/structure_v0/mod.rs index 3910574a615..c8c27c46303 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_transfer_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_transfer_transition_action/structure_v0/mod.rs @@ -2,12 +2,12 @@ use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, Inva use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -pub(super) trait DocumentTransferTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentTransferTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/mod.rs index 39a18561c03..6b9dcdcfe74 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/mod.rs @@ -4,12 +4,12 @@ use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; use crate::error::Error; use crate::error::execution::ExecutionError; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::state_v0::DocumentUpdatePriceTransitionActionStateValidationV0; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::structure_v0::DocumentUpdatePriceTransitionActionStructureValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_update_price_transition_action::state_v0::DocumentUpdatePriceTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::document::document_update_price_transition_action::structure_v0::DocumentUpdatePriceTransitionActionStructureValidationV0; use crate::platform_types::platform::PlatformStateRef; mod state_v0; @@ -41,7 +41,7 @@ impl DocumentUpdatePriceTransitionActionValidation for DocumentUpdatePriceTransi .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_transfer_transition_structure_validation { 0 => self.validate_structure_v0(platform_version), @@ -66,7 +66,7 @@ impl DocumentUpdatePriceTransitionActionValidation for DocumentUpdatePriceTransi .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .document_transfer_transition_state_validation { 0 => self.validate_state_v0( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/state_v0/mod.rs similarity index 90% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/state_v0/mod.rs index 43a72d50a57..62e1ff3cbb2 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/state_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/state_v0/mod.rs @@ -4,15 +4,15 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::identifier::Identifier; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::platform_types::platform::PlatformStateRef; -pub(super) trait DocumentUpdatePriceTransitionActionStateValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentUpdatePriceTransitionActionStateValidationV0 { fn validate_state_v0( &self, platform: &PlatformStateRef, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/structure_v0/mod.rs similarity index 87% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/structure_v0/mod.rs index f8b66fe3746..c595dba4919 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/document_update_price_transition_action/structure_v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/document_update_price_transition_action/structure_v0/mod.rs @@ -2,12 +2,12 @@ use dpp::consensus::basic::document::{InvalidDocumentTransitionActionError, Inva use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::validation::SimpleConsensusValidationResult; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::Error; -pub(super) trait DocumentUpdatePriceTransitionActionStructureValidationV0 { +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait DocumentUpdatePriceTransitionActionStructureValidationV0 { fn validate_structure_v0( &self, platform_version: &PlatformVersion, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/action_validation/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/document/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/mod.rs new file mode 100644 index 00000000000..7a2f9c5eb02 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod document; +pub(crate) mod token; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/mod.rs new file mode 100644 index 00000000000..7060861681a --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/mod.rs @@ -0,0 +1,9 @@ +pub(crate) mod token_base_transition_action; +pub(crate) mod token_burn_transition_action; +pub(crate) mod token_config_update_transition_action; +pub(crate) mod token_destroy_frozen_funds_transition_action; +pub(crate) mod token_emergency_action_transition_action; +pub(crate) mod token_freeze_transition_action; +pub(crate) mod token_mint_transition_action; +pub(crate) mod token_transfer_transition_action; +pub(crate) mod token_unfreeze_transition_action; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/mod.rs new file mode 100644 index 00000000000..3ee470eb309 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/mod.rs @@ -0,0 +1,138 @@ +use std::collections::BTreeMap; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; +use dpp::data_contract::change_control_rules::ChangeControlRules; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::state_v0::TokenBaseTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::structure_v0::TokenBaseTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenBaseTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_group_action( + &self, + rules: &ChangeControlRules, + owner_id: Identifier, + contract_owner_id: Identifier, + main_control_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_type_string: String, + token_configuration: &TokenConfiguration, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenBaseTransitionActionValidation for TokenBaseTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_base_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenBaseTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_base_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenBaseTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_group_action( + &self, + rules: &ChangeControlRules, + owner_id: Identifier, + contract_owner_id: Identifier, + main_control_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_type_string: String, + token_configuration: &TokenConfiguration, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_base_transition_group_action_validation + { + 0 => self.validate_group_action_v0( + rules, + owner_id, + contract_owner_id, + main_control_group, + groups, + action_type_string, + token_configuration, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenBaseTransitionAction::validate_group_action".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..14c0b96d6a4 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/state_v0/mod.rs @@ -0,0 +1,178 @@ +use std::collections::BTreeMap; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::group::GroupActionAlreadySignedByIdentityError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::UnauthorizedTokenActionError; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; +use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dpp::data_contract::change_control_rules::ChangeControlRules; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::group::action_taker::{ActionGoal, ActionTaker}; +use dpp::prelude::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenBaseTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_group_action_v0( + &self, + rules: &ChangeControlRules, + owner_id: Identifier, + contract_owner_id: Identifier, + main_control_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_type_string: String, + token_configuration: &TokenConfiguration, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenBaseTransitionActionStateValidationV0 for TokenBaseTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + // We should start by validating that if we did not yet sign + if let Some(group_state_transition_resolved_info) = self.store_in_group() { + let (already_signed, cost) = platform.drive.fetch_action_id_has_signer_with_costs( + self.data_contract_id(), + group_state_transition_resolved_info.group_contract_position, + group_state_transition_resolved_info.action_id, + owner_id, + block_info, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(cost)); + if already_signed { + // We already have signed this state transition group action + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::GroupActionAlreadySignedByIdentityError( + GroupActionAlreadySignedByIdentityError::new( + owner_id, + self.data_contract_id(), + group_state_transition_resolved_info.group_contract_position, + group_state_transition_resolved_info.action_id, + ), + ), + ), + )); + } + } + + Ok(SimpleConsensusValidationResult::new()) + } + + fn validate_group_action_v0( + &self, + rules: &ChangeControlRules, + owner_id: Identifier, + contract_owner_id: Identifier, + main_control_group: Option<GroupContractPosition>, + groups: &BTreeMap<GroupContractPosition, Group>, + action_type_string: String, + token_configuration: &TokenConfiguration, + ) -> Result<SimpleConsensusValidationResult, Error> { + // We should start by validating that if we did not yet sign + if let Some(resolved_group_info) = self.store_in_group() { + // We are trying to do a group action + // We have already checked when converting into an action that we are a member of the Group + // Now we need to just check that the group is the actual group set by the contract + match rules.authorized_to_make_change_action_takers() { + AuthorizedActionTakers::NoOne + | AuthorizedActionTakers::ContractOwner + | AuthorizedActionTakers::Identity(_) => { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError( + UnauthorizedTokenActionError::new( + self.token_id(), + owner_id, + action_type_string, + rules.authorized_to_make_change_action_takers().clone(), + ), + )), + )) + } + AuthorizedActionTakers::MainGroup => { + if let Some(main_control_group_contract_position) = + token_configuration.main_control_group() + { + if main_control_group_contract_position + != resolved_group_info.group_contract_position + { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::UnauthorizedTokenActionError( + UnauthorizedTokenActionError::new( + self.token_id(), + owner_id, + action_type_string, + rules.authorized_to_make_change_action_takers().clone(), + ), + ), + ), + )); + } + } + } + AuthorizedActionTakers::Group(group_contract_position) => { + if *group_contract_position != resolved_group_info.group_contract_position { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError( + UnauthorizedTokenActionError::new( + self.token_id(), + owner_id, + action_type_string, + rules.authorized_to_make_change_action_takers().clone(), + ), + )), + )); + } + } + } + } else { + if !rules.can_make_change( + &contract_owner_id, + main_control_group, + groups, + &ActionTaker::SingleIdentity(owner_id), + ActionGoal::ActionCompletion, + ) { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError( + UnauthorizedTokenActionError::new( + self.token_id(), + owner_id, + action_type_string, + rules.authorized_to_make_change_action_takers().clone(), + ), + )), + )); + } + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..3fb19707d41 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_base_transition_action/structure_v0/mod.rs @@ -0,0 +1,49 @@ +use dpp::consensus::basic::BasicError; +use dpp::consensus::basic::token::ContractHasNoTokensError; +use dpp::consensus::basic::token::InvalidTokenPositionError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenBaseTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenBaseTransitionActionStructureValidationV0 for TokenBaseTransitionAction { + fn validate_structure_v0( + &self, + _platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let token_position = self.token_position(); + let contract = self.data_contract_fetch_info_ref(); + if contract.contract.tokens().get(&token_position).is_none() { + return if contract.contract.tokens().is_empty() { + Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::ContractHasNoTokensError(ContractHasNoTokensError::new( + contract.contract.id(), + )) + .into(), + )) + } else { + Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::InvalidTokenPositionError(InvalidTokenPositionError::new( + *contract + .contract + .tokens() + .keys() + .last() + .expect("we already checked this was not empty"), + token_position, + )) + .into(), + )) + }; + } + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/mod.rs new file mode 100644 index 00000000000..e92feab605f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::TokenBurnTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_burn_transition_action::state_v0::TokenBurnTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_burn_transition_action::structure_v0::TokenBurnTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenBurnTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenBurnTransitionActionValidation for TokenBurnTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_burn_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenBurnTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_burn_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenBurnTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..cc45b90a418 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/state_v0/mod.rs @@ -0,0 +1,100 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::IdentityDoesNotHaveEnoughTokenBalanceError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::{TokenBurnTransitionAction, TokenBurnTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenBurnTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenBurnTransitionActionStateValidationV0 for TokenBurnTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.manual_burning_rules(); + + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "burn".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // We need to verify that we have enough of the token + let balance = platform + .drive + .fetch_identity_token_balance( + self.token_id().to_buffer(), + owner_id.to_buffer(), + transaction, + platform_version, + )? + .unwrap_or_default(); + execution_context.add_operation(ValidationOperation::RetrieveIdentityTokenBalance); + if balance < self.burn_amount() { + // The identity does not exist + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityDoesNotHaveEnoughTokenBalanceError( + IdentityDoesNotHaveEnoughTokenBalanceError::new( + self.token_id(), + owner_id, + self.burn_amount(), + balance, + "burn".to_string(), + ), + )), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..440d14ec869 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_burn_transition_action/structure_v0/mod.rs @@ -0,0 +1,25 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::{TokenBurnTransitionAction, TokenBurnTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenBurnTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenBurnTransitionActionStructureValidationV0 for TokenBurnTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/mod.rs new file mode 100644 index 00000000000..8dc97773668 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::TokenConfigUpdateTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_config_update_transition_action::state_v0::TokenConfigUpdateTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_config_update_transition_action::structure_v0::TokenConfigUpdateTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenConfigUpdateTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenConfigUpdateTransitionActionValidation for TokenConfigUpdateTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_config_update_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenConfigUpdateTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_config_update_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenConfigUpdateTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..bc1935f9a35 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/state_v0/mod.rs @@ -0,0 +1,385 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::{InvalidGroupPositionError, NewAuthorizedActionTakerGroupDoesNotExistError, NewAuthorizedActionTakerIdentityDoesNotExistError, NewAuthorizedActionTakerMainGroupNotSetError, NewTokensDestinationIdentityDoesNotExistError, TokenSettingMaxSupplyToLessThanCurrentSupplyError, UnauthorizedTokenActionError}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; +use dpp::group::action_taker::{ActionGoal, ActionTaker}; +use dpp::prelude::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::{TokenConfigUpdateTransitionAction, TokenConfigUpdateTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::error::drive::DriveError; +use drive::query::TransactionArg; +use drive::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenConfigUpdateTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenConfigUpdateTransitionActionStateValidationV0 for TokenConfigUpdateTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let main_control_group = token_configuration.main_control_group(); + + let goal = if self.base().store_in_group().is_some() { + // We are using a group + // We just need to be able to participate + ActionGoal::ActionParticipation + } else { + // We are not using a group + // We need to make sure that for the change we are doing that we can finish it + ActionGoal::ActionCompletion + }; + + if !token_configuration.can_apply_token_configuration_item( + self.update_token_configuration_item(), + &contract.owner_id(), + main_control_group, + contract.groups(), + &ActionTaker::SingleIdentity(owner_id), + goal, + ) { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError( + UnauthorizedTokenActionError::new( + self.token_id(), + owner_id, + "config_update".to_string(), + token_configuration.authorized_action_takers_for_configuration_item( + self.update_token_configuration_item(), + ), + ), + )), + )); + } + + match self.update_token_configuration_item() { + TokenConfigurationChangeItem::MaxSupply(Some(max_supply)) => { + // If we are setting a max supply we need to make sure it isn't less than the + // current supply of the token + let (token_total_supply, fee) = platform.drive.fetch_token_total_supply_with_cost( + self.token_id().to_buffer(), + block_info, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + if let Some(token_total_supply) = token_total_supply { + if token_total_supply > *max_supply { + // We are trying to set a max supply smaller than the token total supply + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::TokenSettingMaxSupplyToLessThanCurrentSupplyError( + TokenSettingMaxSupplyToLessThanCurrentSupplyError::new( + self.token_id(), + *max_supply, + token_total_supply, + ), + ), + ), + )); + } + } else { + return Err(Error::Drive(drive::error::Error::Drive( + DriveError::CorruptedDriveState(format!( + "token {} total supply not found", + self.token_id() + )), + ))); + } + } + TokenConfigurationChangeItem::NewTokensDestinationIdentity(Some(identity_id)) => { + // We need to make sure the identity exists + let (identity_balance, fee) = platform.drive.fetch_identity_balance_with_costs( + identity_id.to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + if identity_balance.is_none() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NewTokensDestinationIdentityDoesNotExistError( + NewTokensDestinationIdentityDoesNotExistError::new(*identity_id), + ), + ), + )); + } + } + TokenConfigurationChangeItem::MainControlGroup(Some(control_group)) => { + if !self + .data_contract_fetch_info() + .contract + .groups() + .contains_key(control_group) + { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::InvalidGroupPositionError( + InvalidGroupPositionError::new( + self.data_contract_fetch_info() + .contract + .groups() + .keys() + .last() + .copied(), + *control_group, + ), + )), + )); + } + } + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::MaxSupplyAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::ManualMinting(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::ManualMintingAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::ManualBurning(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::ManualBurningAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::Freeze(AuthorizedActionTakers::Identity(identity_id)) + | TokenConfigurationChangeItem::FreezeAdminGroup(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::Unfreeze(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::UnfreezeAdminGroup(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::DestroyFrozenFunds(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) + | TokenConfigurationChangeItem::EmergencyAction(AuthorizedActionTakers::Identity( + identity_id, + )) + | TokenConfigurationChangeItem::EmergencyActionAdminGroup( + AuthorizedActionTakers::Identity(identity_id), + ) => { + let (identity_balance, fee) = platform.drive.fetch_identity_balance_with_costs( + identity_id.to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + if identity_balance.is_none() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerIdentityDoesNotExistError( + NewAuthorizedActionTakerIdentityDoesNotExistError::new( + *identity_id, + ), + ), + ), + )); + } + } + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::ConventionsAdminGroup(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::MaxSupplyControlGroup(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::MaxSupplyAdminGroup(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::ManualMinting(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::ManualMintingAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::ManualBurning(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::ManualBurningAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::Freeze(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::FreezeAdminGroup(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::Unfreeze(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::UnfreezeAdminGroup(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::DestroyFrozenFunds(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) + | TokenConfigurationChangeItem::EmergencyAction(AuthorizedActionTakers::Group( + group_contract_position, + )) + | TokenConfigurationChangeItem::EmergencyActionAdminGroup( + AuthorizedActionTakers::Group(group_contract_position), + ) => { + if !self + .data_contract_fetch_info() + .contract + .groups() + .contains_key(group_contract_position) + { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerGroupDoesNotExistError( + NewAuthorizedActionTakerGroupDoesNotExistError::new( + *group_contract_position, + ), + ), + ), + )); + } + } + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::MaxSupplyAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityControlGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::NewTokensDestinationIdentityAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationControlGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::MintingAllowChoosingDestinationAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::ManualMinting(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::ManualMintingAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::ManualBurning(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::ManualBurningAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::Freeze(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::FreezeAdminGroup(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::Unfreeze(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::UnfreezeAdminGroup(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::DestroyFrozenFunds(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup( + AuthorizedActionTakers::MainGroup, + ) + | TokenConfigurationChangeItem::EmergencyAction(AuthorizedActionTakers::MainGroup) + | TokenConfigurationChangeItem::EmergencyActionAdminGroup( + AuthorizedActionTakers::MainGroup, + ) => { + if token_configuration.main_control_group().is_none() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerMainGroupNotSetError( + NewAuthorizedActionTakerMainGroupNotSetError::new(), + ), + ), + )); + } + } + _ => {} + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..604c50480bc --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_config_update_transition_action/structure_v0/mod.rs @@ -0,0 +1,25 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::{TokenConfigUpdateTransitionAction, TokenConfigUpdateTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenConfigUpdateTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenConfigUpdateTransitionActionStructureValidationV0 for TokenConfigUpdateTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/mod.rs new file mode 100644 index 00000000000..513913539b8 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_destroy_frozen_funds_transition_action::state_v0::TokenDestroyFrozenFundsTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_destroy_frozen_funds_transition_action::structure_v0::TokenDestroyFrozenFundsTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenDestroyFrozenFundsTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenDestroyFrozenFundsTransitionActionValidation for TokenDestroyFrozenFundsTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_destroy_frozen_funds_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenDestroyFrozenFundsTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_destroy_frozen_funds_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenDestroyFrozenFundsTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..a2c4057c8ee --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/state_v0/mod.rs @@ -0,0 +1,100 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::IdentityTokenAccountNotFrozenError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::{TokenDestroyFrozenFundsTransitionAction, TokenDestroyFrozenFundsTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenDestroyFrozenFundsTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenDestroyFrozenFundsTransitionActionStateValidationV0 + for TokenDestroyFrozenFundsTransitionAction +{ + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // We need to validate that we are frozen + + let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( + self.token_id().to_buffer(), + self.frozen_identity_id().to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + if info.is_none() || !info.unwrap().frozen() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityTokenAccountNotFrozenError( + IdentityTokenAccountNotFrozenError::new( + self.token_id(), + self.frozen_identity_id(), + "destroy_frozen_funds".to_string(), + ), + )), + )); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.destroy_frozen_funds_rules(); + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "destroy frozen funds".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..35537185729 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_destroy_frozen_funds_transition_action/structure_v0/mod.rs @@ -0,0 +1,27 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::{TokenDestroyFrozenFundsTransitionAction, TokenDestroyFrozenFundsTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenDestroyFrozenFundsTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenDestroyFrozenFundsTransitionActionStructureValidationV0 + for TokenDestroyFrozenFundsTransitionAction +{ + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/mod.rs new file mode 100644 index 00000000000..074b2f59f1f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_emergency_action_transition_action::state_v0::TokenEmergencyActionTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_emergency_action_transition_action::structure_v0::TokenEmergencyActionTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenEmergencyActionTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenEmergencyActionTransitionActionValidation for TokenEmergencyActionTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_emergency_action_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenEmergencyActionTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_emergency_action_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenEmergencyActionTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..6bc128ce25e --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/state_v0/mod.rs @@ -0,0 +1,115 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::{TokenAlreadyPausedError, TokenNotPausedError}; +use dpp::consensus::ConsensusError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::tokens::emergency_action::TokenEmergencyAction; +use dpp::tokens::status::v0::TokenStatusV0Accessors; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::{TokenEmergencyActionTransitionAction, TokenEmergencyActionTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenEmergencyActionTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenEmergencyActionTransitionActionStateValidationV0 + for TokenEmergencyActionTransitionAction +{ + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.emergency_action_rules(); + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "emergency action".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Check if we are paused + let (maybe_token_status, fee_result) = platform.drive.fetch_token_status_with_costs( + self.token_id().to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + if let Some(token_status) = maybe_token_status { + match self.emergency_action() { + TokenEmergencyAction::Pause => { + if token_status.paused() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::TokenAlreadyPausedError( + TokenAlreadyPausedError::new( + self.token_id(), + "Pause Token".to_string(), + ), + )), + )); + } + } + TokenEmergencyAction::Resume => { + if !token_status.paused() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::TokenNotPausedError( + TokenNotPausedError::new( + self.token_id(), + "Resume Token".to_string(), + ), + )), + )); + } + } + } + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..e89432925e6 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_emergency_action_transition_action/structure_v0/mod.rs @@ -0,0 +1,27 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::{TokenEmergencyActionTransitionAction, TokenEmergencyActionTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenEmergencyActionTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenEmergencyActionTransitionActionStructureValidationV0 + for TokenEmergencyActionTransitionAction +{ + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/mod.rs new file mode 100644 index 00000000000..a832de48109 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::TokenFreezeTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_freeze_transition_action::state_v0::TokenFreezeTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_freeze_transition_action::structure_v0::TokenFreezeTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenFreezeTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenFreezeTransitionActionValidation for TokenFreezeTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_freeze_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenFreezeTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_freeze_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenFreezeTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..25cdcc6d89f --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/state_v0/mod.rs @@ -0,0 +1,101 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::IdentityTokenAccountAlreadyFrozenError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::{TokenFreezeTransitionAction, TokenFreezeTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; +use dpp::consensus::ConsensusError; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenFreezeTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenFreezeTransitionActionStateValidationV0 for TokenFreezeTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.freeze_rules(); + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "freeze".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Check if the identity is already frozen + let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( + self.token_id().to_buffer(), + self.identity_to_freeze_id().to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + if let Some(info) = info { + if info.frozen() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityTokenAccountAlreadyFrozenError( + IdentityTokenAccountAlreadyFrozenError::new( + self.token_id(), + owner_id, + "Freeze Identity Token Account".to_string(), + ), + )), + )); + } + }; + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..d2c641554c3 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_freeze_transition_action/structure_v0/mod.rs @@ -0,0 +1,25 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::{TokenFreezeTransitionAction, TokenFreezeTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenFreezeTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenFreezeTransitionActionStructureValidationV0 for TokenFreezeTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/mod.rs new file mode 100644 index 00000000000..56c8d556a74 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::TokenMintTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_mint_transition_action::state_v0::TokenMintTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_mint_transition_action::structure_v0::TokenMintTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenMintTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenMintTransitionActionValidation for TokenMintTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_mint_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenMintTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_issuance_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenMintTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..d30cb0d377d --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/state_v0/mod.rs @@ -0,0 +1,147 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::identity::RecipientIdentityDoesNotExistError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::TokenMintPastMaxSupplyError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::{TokenMintTransitionAction, TokenMintTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::error::drive::DriveError; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::{RetrieveIdentityInfo, ValidationOperation}; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenMintTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenMintTransitionActionStateValidationV0 for TokenMintTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.manual_minting_rules(); + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "mint".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + if let Some(max_supply) = token_configuration.max_supply() { + // We have a max supply, let's get the current supply + let (token_total_supply, fee) = platform.drive.fetch_token_total_supply_with_cost( + self.token_id().to_buffer(), + block_info, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + if let Some(token_total_supply) = token_total_supply { + if let Some(total_supply_after_mint) = + token_total_supply.checked_add(self.mint_amount()) + { + if total_supply_after_mint > max_supply { + // We are trying to set a max supply smaller than the token total supply + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::TokenMintPastMaxSupplyError( + TokenMintPastMaxSupplyError::new( + self.token_id(), + self.mint_amount(), + token_total_supply, + max_supply, + ), + )), + )); + } + } else { + // if we overflow we would also always go over max supply + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::TokenMintPastMaxSupplyError( + TokenMintPastMaxSupplyError::new( + self.token_id(), + self.mint_amount(), + token_total_supply, + max_supply, + ), + )), + )); + } + } else { + return Err(Error::Drive(drive::error::Error::Drive( + DriveError::CorruptedDriveState(format!( + "token {} total supply not found", + self.token_id() + )), + ))); + } + } + + // We need to verify that the receiver is a valid identity + + let recipient = self.identity_balance_holder_id(); + if recipient != owner_id { + // We have already checked that this user exists if the recipient is the owner id + let balance = platform.drive.fetch_identity_balance( + recipient.to_buffer(), + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::RetrieveIdentity( + RetrieveIdentityInfo::only_balance(), + )); + if balance.is_none() { + // The identity does not exist + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::RecipientIdentityDoesNotExistError( + RecipientIdentityDoesNotExistError::new(recipient), + )), + )); + } + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..7eb4aab96d5 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_mint_transition_action/structure_v0/mod.rs @@ -0,0 +1,25 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::{TokenMintTransitionAction, TokenMintTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenMintTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenMintTransitionActionStructureValidationV0 for TokenMintTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs new file mode 100644 index 00000000000..924b4b80a24 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/mod.rs @@ -0,0 +1,88 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_transfer_transition_action::state_v0::TokenTransferTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_transfer_transition_action::structure_v0::TokenTransferTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenTransferTransitionActionValidation { + fn validate_structure( + &self, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenTransferTransitionActionValidation for TokenTransferTransitionAction { + fn validate_structure( + &self, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_transfer_transition_structure_validation + { + 0 => self.validate_structure_v0(owner_id, platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenTransferTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_issuance_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenTransferTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..4541089195b --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/state_v0/mod.rs @@ -0,0 +1,122 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::{IdentityDoesNotHaveEnoughTokenBalanceError, IdentityTokenAccountFrozenError, TokenIsPausedError}; +use dpp::prelude::Identifier; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::tokens::status::v0::TokenStatusV0Accessors; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::v0::TokenTransferTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenTransferTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenTransferTransitionActionStateValidationV0 for TokenTransferTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // We need to verify that we have enough of the token + let balance = platform + .drive + .fetch_identity_token_balance( + self.token_id().to_buffer(), + owner_id.to_buffer(), + transaction, + platform_version, + )? + .unwrap_or_default(); + execution_context.add_operation(ValidationOperation::RetrieveIdentityTokenBalance); + if balance < self.amount() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityDoesNotHaveEnoughTokenBalanceError( + IdentityDoesNotHaveEnoughTokenBalanceError::new( + self.token_id(), + owner_id, + self.amount(), + balance, + "transfer".to_string(), + ), + )), + )); + } + + // We need to verify that our token account is not frozen + let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( + self.token_id().to_buffer(), + owner_id.to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + if let Some(info) = info { + if info.frozen() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityTokenAccountFrozenError( + IdentityTokenAccountFrozenError::new( + self.token_id(), + owner_id, + "transfer".to_string(), + ), + )), + )); + } + }; + + // We need to verify that the token is not paused + let (token_status, fee_result) = platform.drive.fetch_token_status_with_costs( + self.token_id().to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + if let Some(status) = token_status { + if status.paused() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::TokenIsPausedError( + TokenIsPausedError::new(self.token_id()), + )), + )); + } + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..2b0fc92e204 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_transfer_transition_action/structure_v0/mod.rs @@ -0,0 +1,29 @@ +use dpp::identifier::Identifier; +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use dpp::version::PlatformVersion; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::v0::TokenTransferTransitionActionAccessorsV0; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenTransferTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenTransferTransitionActionStructureValidationV0 for TokenTransferTransitionAction { + fn validate_structure_v0( + &self, + _owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/mod.rs new file mode 100644 index 00000000000..293906e3f0c --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/mod.rs @@ -0,0 +1,86 @@ +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::TokenUnfreezeTransitionAction; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::token::token_unfreeze_transition_action::state_v0::TokenUnfreezeTransitionActionStateValidationV0; +use crate::execution::validation::state_transition::batch::action_validation::token::token_unfreeze_transition_action::structure_v0::TokenUnfreezeTransitionActionStructureValidationV0; +use crate::platform_types::platform::PlatformStateRef; + +mod state_v0; +mod structure_v0; + +pub trait TokenUnfreezeTransitionActionValidation { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl TokenUnfreezeTransitionActionValidation for TokenUnfreezeTransitionAction { + fn validate_structure( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_unfreeze_transition_structure_validation + { + 0 => self.validate_structure_v0(platform_version), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenUnfreezeTransitionAction::validate_structure".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + fn validate_state( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + match platform_version + .drive_abci + .validation_and_processing + .state_transitions + .batch_state_transition + .token_unfreeze_transition_state_validation + { + 0 => self.validate_state_v0( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + ), + version => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { + method: "TokenUnfreezeTransitionAction::validate_state".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/state_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/state_v0/mod.rs new file mode 100644 index 00000000000..03e633a9608 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/state_v0/mod.rs @@ -0,0 +1,96 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::IdentityTokenAccountNotFrozenError; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::prelude::Identifier; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::validation::SimpleConsensusValidationResult; +use drive::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::{TokenUnfreezeTransitionAction, TokenUnfreezeTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use drive::query::TransactionArg; +use crate::error::Error; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; +use crate::platform_types::platform::PlatformStateRef; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenUnfreezeTransitionActionStateValidationV0 { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenUnfreezeTransitionActionStateValidationV0 for TokenUnfreezeTransitionAction { + fn validate_state_v0( + &self, + platform: &PlatformStateRef, + owner_id: Identifier, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Let's first check to see if we are authorized to perform this action + let contract = &self.data_contract_fetch_info_ref().contract; + let token_configuration = contract.expected_token_configuration(self.token_position())?; + let rules = token_configuration.unfreeze_rules(); + let main_control_group = token_configuration.main_control_group(); + let validation_result = self.base().validate_group_action( + rules, + owner_id, + contract.owner_id(), + main_control_group, + contract.groups(), + "unfreeze".to_string(), + token_configuration, + platform_version, + )?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + // Then validate that the identity is frozen + let (info, fee_result) = platform.drive.fetch_identity_token_info_with_costs( + self.token_id().to_buffer(), + self.frozen_identity_id().to_buffer(), + block_info, + true, + transaction, + platform_version, + )?; + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + if info.is_none() || !info.unwrap().frozen() { + return Ok(SimpleConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityTokenAccountNotFrozenError( + IdentityTokenAccountNotFrozenError::new( + self.token_id(), + self.frozen_identity_id(), + "Unfreeze".to_string(), + ), + )), + )); + } + + Ok(SimpleConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/structure_v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/structure_v0/mod.rs new file mode 100644 index 00000000000..f3a0b24e337 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/action_validation/token/token_unfreeze_transition_action/structure_v0/mod.rs @@ -0,0 +1,25 @@ +use dpp::validation::{SimpleConsensusValidationResult}; +use drive::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::{TokenUnfreezeTransitionAction, TokenUnfreezeTransitionActionAccessorsV0}; +use dpp::version::PlatformVersion; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::action_validation::token::token_base_transition_action::TokenBaseTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch::action_validation) trait TokenUnfreezeTransitionActionStructureValidationV0 { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} +impl TokenUnfreezeTransitionActionStructureValidationV0 for TokenUnfreezeTransitionAction { + fn validate_structure_v0( + &self, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let validation_result = self.base().validate_structure(platform_version)?; + if !validation_result.is_valid() { + return Ok(validation_result); + } + + Ok(SimpleConsensusValidationResult::default()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/v0/mod.rs new file mode 100644 index 00000000000..1147fa871c4 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/advanced_structure/v0/mod.rs @@ -0,0 +1,354 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; +use dpp::consensus::signature::{InvalidSignaturePublicKeySecurityLevelError, SignatureError}; +use dpp::dashcore::Network; +use dpp::document::Document; +use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; +use dpp::identity::PartialIdentity; +use dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::{StateTransitionIdentitySigned, StateTransitionLike}; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::batched_transition::BatchedTransitionRef; +use dpp::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use dpp::validation::ConsensusValidationResult; + +use dpp::version::PlatformVersion; + +use drive::state_transition_action::batch::BatchTransitionAction; +use crate::execution::validation::state_transition::state_transitions::batch::action_validation::document::document_replace_transition_action::DocumentReplaceTransitionActionValidation; +use crate::execution::validation::state_transition::state_transitions::batch::action_validation::document::document_delete_transition_action::DocumentDeleteTransitionActionValidation; +use crate::execution::validation::state_transition::state_transitions::batch::action_validation::document::document_create_transition_action::DocumentCreateTransitionActionValidation; +use dpp::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use drive::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::DocumentReplaceTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::TokenConfigUpdateTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::TokenFreezeTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::TokenMintTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::v0::TokenTransferTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::TokenUnfreezeTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use drive::state_transition_action::StateTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use crate::error::execution::ExecutionError; +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; +use crate::execution::validation::state_transition::batch::action_validation::document::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_burn_transition_action::TokenBurnTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_config_update_transition_action::TokenConfigUpdateTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_emergency_action_transition_action::TokenEmergencyActionTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_freeze_transition_action::TokenFreezeTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_mint_transition_action::TokenMintTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_transfer_transition_action::TokenTransferTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_unfreeze_transition_action::TokenUnfreezeTransitionActionValidation; + +pub(in crate::execution::validation::state_transition::state_transitions::batch) trait DocumentsBatchStateTransitionStructureValidationV0 +{ + fn validate_advanced_structure_from_state_v0( + &self, + block_info: &BlockInfo, + network: Network, + action: &BatchTransitionAction, + identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; +} + +impl DocumentsBatchStateTransitionStructureValidationV0 for BatchTransition { + fn validate_advanced_structure_from_state_v0( + &self, + block_info: &BlockInfo, + network: Network, + action: &BatchTransitionAction, + identity: &PartialIdentity, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { + let security_levels = action.contract_based_security_level_requirement()?; + + let signing_key = identity.loaded_public_keys.get(&self.signature_public_key_id()).ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("the key must exist for advanced structure validation as we already fetched it during signature validation")))?; + + if !security_levels.contains(&signing_key.security_level()) { + // We only need to bump the first identity data contract nonce as that will make a replay + // attack not possible + + let first_transition = self.first_transition().ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("There must be at least one state transition as this is already verified in basic validation")))?; + + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_batched_transition_ref( + first_transition, + self.owner_id(), + self.user_fee_increase(), + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![SignatureError::InvalidSignaturePublicKeySecurityLevelError( + InvalidSignaturePublicKeySecurityLevelError::new( + signing_key.security_level(), + security_levels, + ), + ) + .into()], + )); + } + + // We should validate that all newly created documents have valid ids + for transition in self.transitions_iter() { + if let BatchedTransitionRef::Document(DocumentTransition::Create(create_transition)) = + transition + { + // Validate the ID + let generated_document_id = Document::generate_document_id_v0( + create_transition.base().data_contract_id_ref(), + &self.owner_id(), + create_transition.base().document_type_name(), + &create_transition.entropy(), + ); + + // This hash will take 2 blocks (128 bytes) + execution_context.add_operation(ValidationOperation::DoubleSha256(2)); + + let id = create_transition.base().id(); + if generated_document_id != id { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( + create_transition.base(), + self.owner_id(), + self.user_fee_increase(), + ), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ + InvalidDocumentTransitionIdError::new(generated_document_id, id).into(), + ], + )); + } + } + } + + // Next we need to validate the structure of all actions (this means with the data contract) + for transition in action.transitions() { + match transition { + BatchedTransitionAction::DocumentAction(document_action) => match document_action { + DocumentTransitionAction::CreateAction(create_action) => { + let result = create_action.validate_structure( + identity.id, + block_info, + network, + platform_version, + )?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(document_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::ReplaceAction(replace_action) => { + let result = replace_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(replace_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::DeleteAction(delete_action) => { + let result = delete_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(delete_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::TransferAction(transfer_action) => { + let result = transfer_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transfer_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + let result = update_price_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(update_price_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + DocumentTransitionAction::PurchaseAction(purchase_action) => { + let result = purchase_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(purchase_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + }, + BatchedTransitionAction::TokenAction(token_action) => match token_action { + TokenTransitionAction::BurnAction(burn_action) => { + let result = burn_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(token_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::MintAction(mint_action) => { + let result = mint_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(mint_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::TransferAction(transfer_action) => { + let result = transfer_action + .validate_structure(self.owner_id(), platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(transfer_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::FreezeAction(freeze_action) => { + let result = freeze_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(freeze_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::UnfreezeAction(unfreeze_action) => { + let result = unfreeze_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(unfreeze_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::EmergencyActionAction(emergency_action_action) => { + let result = + emergency_action_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(emergency_action_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::DestroyFrozenFundsAction( + destroy_frozen_funds_action, + ) => { + let result = + destroy_frozen_funds_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(destroy_frozen_funds_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + TokenTransitionAction::ConfigUpdateAction(config_update_action) => { + let result = config_update_action.validate_structure(platform_version)?; + if !result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action(config_update_action.base(), self.owner_id(), self.user_fee_increase()), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + result.errors, + )); + } + } + }, + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should not have a bump identity contract nonce at this stage", + ))); + } + } + } + Ok(ConsensusValidationResult::new()) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/mod.rs similarity index 76% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/mod.rs index b56c2b8ff32..2b46fb66246 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/mod.rs @@ -1,14 +1,14 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::balance::v0::DocumentsBatchTransitionBalanceValidationV0; +use crate::execution::validation::state_transition::batch::balance::v0::DocumentsBatchTransitionBalanceValidationV0; use crate::execution::validation::state_transition::processor::v0::StateTransitionIdentityBalanceValidationV0; use dpp::identity::PartialIdentity; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; pub(crate) mod v0; -impl StateTransitionIdentityBalanceValidationV0 for DocumentsBatchTransition { +impl StateTransitionIdentityBalanceValidationV0 for BatchTransition { fn validate_minimum_balance_pre_check( &self, identity: &PartialIdentity, @@ -18,7 +18,7 @@ impl StateTransitionIdentityBalanceValidationV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .balance_pre_check { 0 => self.validate_advanced_minimum_balance_pre_check_v0(identity, platform_version), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/v0/mod.rs similarity index 89% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/v0/mod.rs index 6f2dc0fd993..63b5472314a 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/balance/v0/mod.rs @@ -4,12 +4,11 @@ use dpp::consensus::basic::BasicError; use dpp::consensus::state::identity::IdentityInsufficientBalanceError; use dpp::consensus::ConsensusError; use dpp::identity::PartialIdentity; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::ProtocolError; - +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::validation::SimpleConsensusValidationResult; +use dpp::ProtocolError; use crate::error::execution::ExecutionError; use dpp::version::PlatformVersion; @@ -23,7 +22,7 @@ pub(in crate::execution::validation::state_transition::state_transitions) trait ) -> Result<SimpleConsensusValidationResult, Error>; } -impl DocumentsBatchTransitionBalanceValidationV0 for DocumentsBatchTransition { +impl DocumentsBatchTransitionBalanceValidationV0 for BatchTransition { fn validate_advanced_minimum_balance_pre_check_v0( &self, identity: &PartialIdentity, @@ -36,7 +35,7 @@ impl DocumentsBatchTransitionBalanceValidationV0 for DocumentsBatchTransition { "expected to have a balance on identity for documents batch transition", )))?; - let purchases_amount = match self.all_purchases_amount() { + let purchases_amount = match self.all_document_purchases_amount() { Ok(purchase_amount) => purchase_amount.unwrap_or_default(), Err(ProtocolError::Overflow(e)) => { return Ok(SimpleConsensusValidationResult::new_with_error( @@ -65,7 +64,7 @@ impl DocumentsBatchTransitionBalanceValidationV0 for DocumentsBatchTransition { Err(e) => return Err(e.into()), }; - let base_fees = match platform_version.fee_version.state_transition_min_fees.document_batch_sub_transition.checked_mul(self.transitions().len() as u64) { + let base_fees = match platform_version.fee_version.state_transition_min_fees.document_batch_sub_transition.checked_mul(self.transitions_len() as u64) { None => return Ok(SimpleConsensusValidationResult::new_with_error(ConsensusError::BasicError(BasicError::OverflowError(OverflowError::new("overflow when multiplying base fee and amount of sub transitions in documents batch transition".to_string()))))), Some(base_fees) => base_fees }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/mod.rs similarity index 89% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/mod.rs index 6ab41f38000..9c06e6b4294 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/mod.rs @@ -1,10 +1,10 @@ -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTriggerExecutionContext, DataTriggerExecutionResult, }; use derive_more::From; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; -use drive::state_transition_action::document::documents_batch::document_transition::{ +use drive::state_transition_action::batch::batched_transition::document_transition::{ DocumentTransitionAction, DocumentTransitionActionType, }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs similarity index 96% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs index 7c390af6f24..39e3c871c66 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/data_trigger_binding/v0/mod.rs @@ -1,10 +1,10 @@ use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTrigger, DataTriggerExecutionContext, DataTriggerExecutionResult, }; use dpp::identifier::Identifier; use dpp::version::PlatformVersion; -use drive::state_transition_action::document::documents_batch::document_transition::{ +use drive::state_transition_action::batch::batched_transition::document_transition::{ DocumentTransitionAction, DocumentTransitionActionType, }; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/mod.rs similarity index 79% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/mod.rs index ea2bdcc07a3..52c0d8c55b4 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/mod.rs @@ -1,6 +1,6 @@ use dpp::ProtocolError; use dpp::version::PlatformVersion; -use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; +use crate::execution::validation::state_transition::batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; mod v0; @@ -11,7 +11,7 @@ pub fn data_trigger_bindings_list( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .bindings { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/v0/mod.rs similarity index 88% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/v0/mod.rs index 4e11bd50ee8..fe3c94b3e45 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/list/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/list/v0/mod.rs @@ -1,13 +1,13 @@ -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dashpay::create_contact_request_data_trigger; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dpns::create_domain_data_trigger; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::reject::reject_data_trigger; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::withdrawals::delete_withdrawal_data_trigger; -use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::dashpay::create_contact_request_data_trigger; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::dpns::create_domain_data_trigger; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::reject::reject_data_trigger; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::withdrawals::delete_withdrawal_data_trigger; +use crate::execution::validation::state_transition::batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0; use dpp::errors::ProtocolError; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use dpp::system_data_contracts::{dashpay_contract, dpns_contract, SystemDataContract}; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionActionType; /// Retrieves a list of data triggers binding with matching params. /// diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/bindings/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/bindings/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/context.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/context.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/context.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/context.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/executor.rs similarity index 58% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/executor.rs index ac229976a55..a85f1b6febb 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/executor.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/executor.rs @@ -1,15 +1,14 @@ -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTriggerExecutionContext, DataTriggerExecutionResult, }; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionTypeGetter; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use dpp::version::PlatformVersion; -use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; -use crate::execution::validation::state_transition::documents_batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0Getters; +use crate::execution::validation::state_transition::batch::data_triggers::bindings::data_trigger_binding::DataTriggerBinding; +use crate::execution::validation::state_transition::batch::data_triggers::bindings::data_trigger_binding::DataTriggerBindingV0Getters; use crate::error::Error; -use crate::error::execution::ExecutionError; pub trait DataTriggerExecutor { fn validate_with_data_triggers( @@ -27,18 +26,8 @@ impl DataTriggerExecutor for DocumentTransitionAction { context: &DataTriggerExecutionContext, platform_version: &PlatformVersion, ) -> Result<DataTriggerExecutionResult, Error> { - let data_contract_id = self - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_id(); - let document_type_name = self - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .document_type_name(); + let data_contract_id = self.base().data_contract_id(); + let document_type_name = self.base().document_type_name(); let transition_action = self.action_type(); // Match data triggers by action type, contract ID and document type name diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/mod.rs similarity index 94% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/mod.rs index 9920418f531..21bdb917740 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/mod.rs @@ -2,7 +2,7 @@ use dpp::validation::SimpleValidationResult; /// Data triggers implement custom validation logic for state transitions /// that modifies documents in a specific data contract. /// Data triggers can be assigned based on the data contract ID, document type, and action. -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use crate::error::Error; use dpp::consensus::state::data_trigger::DataTriggerError; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/mod.rs similarity index 74% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/mod.rs index 1f2e7fbbf8b..61c486c13ad 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/mod.rs @@ -1,11 +1,11 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::triggers::dashpay::v0::create_contact_request_data_trigger_v0; +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTriggerExecutionContext, DataTriggerExecutionResult, }; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; use dpp::version::PlatformVersion; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dashpay::v0::create_contact_request_data_trigger_v0; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; mod v0; @@ -18,7 +18,7 @@ pub fn create_contact_request_data_trigger( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .triggers .create_contact_request_data_trigger diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/v0/mod.rs similarity index 86% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/v0/mod.rs index b1b183ef24d..d3cdf285133 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dashpay/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dashpay/v0/mod.rs @@ -6,14 +6,14 @@ use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::ProtocolError; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; use dpp::system_data_contracts::dashpay_contract::v1::document_types::contact_request::properties ::{TO_USER_ID}; use dpp::version::PlatformVersion; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContextMethodsV0; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; +use crate::execution::validation::state_transition::batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; /// Creates a data trigger for handling contact request documents. /// @@ -36,12 +36,7 @@ pub(super) fn create_contact_request_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result<DataTriggerExecutionResult, Error> { - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); + let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); let is_dry_run = context.state_transition_execution_context.in_dry_run(); @@ -52,12 +47,7 @@ pub(super) fn create_contact_request_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base" - )))? - .id() + document_transition.base().id() ), ))); }; @@ -72,12 +62,7 @@ pub(super) fn create_contact_request_data_trigger_v0( if !is_dry_run && owner_id == &to_user_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!("Identity {to_user_id} must not be equal to owner id"), ); @@ -120,14 +105,15 @@ mod test { use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::platform_value; use dpp::platform_value::{Bytes32}; - use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; - use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; - use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dashpay::create_contact_request_data_trigger; + use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionAction; + use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionActionType; + use crate::execution::validation::state_transition::batch::data_triggers::triggers::dashpay::create_contact_request_data_trigger; use crate::platform_types::platform::PlatformStateRef; use crate::test::helpers::setup::TestPlatformBuilder; use super::*; use dpp::errors::consensus::state::data_trigger::DataTriggerError; - use dpp::tests::fixtures::{get_contact_request_document_fixture, get_dashpay_contract_fixture, get_document_transitions_fixture, get_identity_fixture}; + use dpp::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; + use dpp::tests::fixtures::{get_contact_request_document_fixture, get_dashpay_contract_fixture, get_batched_transitions_fixture, get_identity_fixture}; use dpp::version::DefaultForPlatformVersion; use drive::drive::contract::DataContractFetchInfo; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; @@ -165,7 +151,7 @@ mod test { .document_type_for_name("contactRequest") .expect("expected a contact request"); - let document_transitions = get_document_transitions_fixture( + let document_transitions = get_batched_transitions_fixture( [( DocumentTransitionActionType::Create, vec![(contact_request_document, document_type, Bytes32::default())], @@ -194,7 +180,7 @@ mod test { }; let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { + &DocumentCreateTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }, platform_version).expect("expected to create action").0.into(), &data_trigger_context, @@ -268,7 +254,7 @@ mod test { .document_type_for_name("contactRequest") .expect("expected a contact request"); - let document_transitions = get_document_transitions_fixture( + let document_transitions = get_batched_transitions_fixture( [( DocumentTransitionActionType::Create, vec![(contact_request_document, document_type, Bytes32::default())], @@ -312,7 +298,7 @@ mod test { let _dashpay_identity_id = data_trigger_context.owner_id.to_owned(); let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { + &DocumentCreateTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }, platform_version).expect("expected to create action").0.into(), &data_trigger_context, @@ -396,7 +382,7 @@ mod test { .get_identifier("toUserId") .expect("expected to get toUserId"); - let document_transitions = get_document_transitions_fixture( + let document_transitions = get_batched_transitions_fixture( [( DocumentTransitionActionType::Create, vec![(contact_request_document, document_type, Bytes32::default())], @@ -425,7 +411,7 @@ mod test { let _dashpay_identity_id = data_trigger_context.owner_id.to_owned(); let result = create_contact_request_data_trigger( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { + &DocumentCreateTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dashpay_contract_fixture(protocol_version))) }, platform_version).expect("expected to create action").0.into(), &data_trigger_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/mod.rs similarity index 70% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/mod.rs index efd55c380fa..42159810ddf 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/mod.rs @@ -1,9 +1,11 @@ -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use dpp::version::PlatformVersion; -use crate::error::Error; use crate::error::execution::ExecutionError; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::dpns::v0::create_domain_data_trigger_v0; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::dpns::v0::create_domain_data_trigger_v0; +use crate::execution::validation::state_transition::batch::data_triggers::{ + DataTriggerExecutionContext, DataTriggerExecutionResult, +}; +use dpp::version::PlatformVersion; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; mod v0; @@ -16,7 +18,7 @@ pub fn create_domain_data_trigger( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .triggers .create_domain_data_trigger diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/v0/mod.rs similarity index 79% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/v0/mod.rs index a790d727bd8..55ffa746720 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/dpns/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/dpns/v0/mod.rs @@ -8,16 +8,16 @@ use std::collections::BTreeMap; use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTriggerExecutionContext, DataTriggerExecutionResult, }; use dpp::document::DocumentV0Getters; use dpp::platform_value::btreemap_extensions::{BTreeValueMapHelper, BTreeValueMapPathHelper}; use dpp::platform_value::Value; use dpp::ProtocolError; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::dpns_contract; use dpp::system_data_contracts::dpns_contract::v1::document_types::domain::properties::{ALLOW_SUBDOMAINS, DASH_ALIAS_IDENTITY_ID, DASH_UNIQUE_IDENTITY_ID, LABEL, NORMALIZED_LABEL, NORMALIZED_PARENT_DOMAIN_NAME, PREORDER_SALT, RECORDS}; @@ -50,12 +50,7 @@ pub(super) fn create_domain_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result<DataTriggerExecutionResult, Error> { - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); + let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let is_dry_run = context.state_transition_execution_context.in_dry_run(); let document_create_transition = match document_transition { @@ -64,12 +59,7 @@ pub(super) fn create_domain_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base" - )))? - .id() + document_transition.base().id() ), ))) } @@ -118,12 +108,7 @@ pub(super) fn create_domain_data_trigger_v0( if full_domain_name.len() > MAX_PRINTABLE_DOMAIN_NAME_LENGTH { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "Full domain name length can not be more than {} characters long but got {}", MAX_PRINTABLE_DOMAIN_NAME_LENGTH, @@ -137,12 +122,7 @@ pub(super) fn create_domain_data_trigger_v0( if normalized_label != convert_to_homograph_safe_chars(label.as_str()) { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "Normalized label doesn't match label: {} != {}", normalized_label, label @@ -157,12 +137,7 @@ pub(super) fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "Normalized parent domain name doesn't match parent domain name: {} != {}", normalized_parent_domain_name, parent_domain_name @@ -179,12 +154,7 @@ pub(super) fn create_domain_data_trigger_v0( if id != owner_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "ownerId {} doesn't match {} {}", owner_id, DASH_UNIQUE_IDENTITY_ID, id @@ -202,12 +172,7 @@ pub(super) fn create_domain_data_trigger_v0( if id != owner_id { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "ownerId {} doesn't match {} {}", owner_id, DASH_ALIAS_IDENTITY_ID, id @@ -222,12 +187,7 @@ pub(super) fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "Can't create top level domain for this identity".to_string(), ); @@ -299,12 +259,7 @@ pub(super) fn create_domain_data_trigger_v0( if documents.is_empty() { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "Parent domain is not present".to_string(), ); @@ -317,12 +272,7 @@ pub(super) fn create_domain_data_trigger_v0( if rule_allow_subdomains { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "Allowing subdomains registration is forbidden for this domain".to_string(), ); @@ -339,12 +289,7 @@ pub(super) fn create_domain_data_trigger_v0( { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "The subdomain can be created only by the parent domain owner".to_string(), ); @@ -407,12 +352,7 @@ pub(super) fn create_domain_data_trigger_v0( if preorder_documents.is_empty() { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), format!( "preorderDocument was not found with a salted domain hash of {}", hex::encode(salted_domain_hash) @@ -429,9 +369,9 @@ mod test { use std::sync::Arc; use dpp::block::block_info::BlockInfo; use dpp::platform_value::Bytes32; - use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; - use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionActionType; - use dpp::tests::fixtures::{get_document_transitions_fixture, get_dpns_data_contract_fixture, get_dpns_parent_document_fixture, ParentDocumentOptions}; + use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionAction; + use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionActionType; + use dpp::tests::fixtures::{get_batched_transitions_fixture, get_dpns_data_contract_fixture, get_dpns_parent_document_fixture, ParentDocumentOptions}; use dpp::tests::utils::generate_random_identifier_struct; use dpp::version::{DefaultForPlatformVersion}; use drive::drive::contract::DataContractFetchInfo; @@ -440,6 +380,7 @@ mod test { use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::test::helpers::setup::TestPlatformBuilder; use super::*; + use dpp::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; #[test] fn should_return_execution_result_on_dry_run() { @@ -481,7 +422,7 @@ mod test { let document_type = data_contract .document_type_for_name("domain") .expect("expected to get domain document type"); - let transitions = get_document_transitions_fixture( + let transitions = get_batched_transitions_fixture( [( DocumentTransitionActionType::Create, vec![(document, document_type, Bytes32::default())], @@ -504,8 +445,8 @@ mod test { }; let result = create_domain_data_trigger_v0( - &DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, - document_create_transition, &BlockInfo::default(), |_identifier| { + &DocumentCreateTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup(&platform.drive, None, + document_create_transition, &BlockInfo::default(), |_identifier| { Ok(Arc::new(DataContractFetchInfo::dpns_contract_fixture(platform_version.protocol_version))) }, platform_version).expect("expected to create action").0.into(), &data_trigger_context, diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/mod.rs similarity index 70% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/mod.rs index 9b0ecd61878..31f4b43ccbb 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/mod.rs @@ -1,9 +1,9 @@ -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::version::PlatformVersion; use crate::error::Error; use crate::error::execution::ExecutionError; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::feature_flags::v0::create_feature_flag_data_trigger_v0; +use crate::execution::validation::state_transition::batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::feature_flags::v0::create_feature_flag_data_trigger_v0; mod v0; @@ -17,7 +17,7 @@ pub fn create_feature_flag_data_trigger( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .triggers .create_feature_flag_data_trigger diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/v0/mod.rs similarity index 83% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/v0/mod.rs index 50c867efa68..d1cca4bf1ad 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/feature_flags/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/feature_flags/v0/mod.rs @@ -6,9 +6,9 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTrigg use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::feature_flags_contract; use dpp::system_data_contracts::feature_flags_contract::v1::document_types::update_consensus_params::properties ::PROPERTY_ENABLE_AT_HEIGHT; @@ -39,12 +39,7 @@ pub(super) fn create_feature_flag_data_trigger_v0( _platform_version: &PlatformVersion, ) -> Result<DataTriggerExecutionResult, Error> { let mut result = DataTriggerExecutionResult::default(); - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); + let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let document_create_transition = match document_transition { @@ -53,12 +48,7 @@ pub(super) fn create_feature_flag_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'CREATE", - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base" - )))? - .id() + document_transition.base().id() ), ))) } @@ -78,12 +68,7 @@ pub(super) fn create_feature_flag_data_trigger_v0( if enable_at_height < latest_block_height { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "This identity can't activate selected feature flag".to_string(), ); @@ -95,12 +80,7 @@ pub(super) fn create_feature_flag_data_trigger_v0( if context.owner_id != &feature_flags_contract::OWNER_ID { let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "This identity can't activate selected feature flag".to_string(), ); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/mod.rs similarity index 69% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/mod.rs index 402668738d5..7c540836cad 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/mod.rs @@ -1,9 +1,11 @@ -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use dpp::version::PlatformVersion; -use crate::error::Error; use crate::error::execution::ExecutionError; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::reject::v0::reject_data_trigger_v0; +use crate::error::Error; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::reject::v0::reject_data_trigger_v0; +use crate::execution::validation::state_transition::batch::data_triggers::{ + DataTriggerExecutionContext, DataTriggerExecutionResult, +}; +use dpp::version::PlatformVersion; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; mod v0; @@ -16,7 +18,7 @@ pub fn reject_data_trigger( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .triggers .reject_data_trigger diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/v0/mod.rs similarity index 68% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/v0/mod.rs index 69c287e6004..1fe229182f6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/reject/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/reject/v0/mod.rs @@ -1,10 +1,9 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTriggerConditionError; use dpp::data_contract::accessors::v0::DataContractV0Getters; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::DataTriggerExecutionResult; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use crate::error::execution::ExecutionError; +use crate::execution::validation::state_transition::batch::data_triggers::DataTriggerExecutionResult; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; /// Creates a data trigger for handling document rejections. /// @@ -26,23 +25,13 @@ use crate::error::execution::ExecutionError; pub(super) fn reject_data_trigger_v0( document_transition: &DocumentTransitionAction, ) -> Result<DataTriggerExecutionResult, Error> { - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); + let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); let err = DataTriggerConditionError::new( data_contract.id(), - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .id(), + document_transition.base().id(), "Action is not allowed".to_string(), ); diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/mod.rs similarity index 74% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/mod.rs index ae8758fe067..967adaba8c8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/mod.rs @@ -1,11 +1,11 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ DataTriggerExecutionContext, DataTriggerExecutionResult, }; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::version::PlatformVersion; -use crate::execution::validation::state_transition::documents_batch::data_triggers::triggers::withdrawals::v0::delete_withdrawal_data_trigger_v0; +use crate::execution::validation::state_transition::batch::data_triggers::triggers::withdrawals::v0::delete_withdrawal_data_trigger_v0; mod v0; @@ -18,7 +18,7 @@ pub fn delete_withdrawal_data_trigger( .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .data_triggers .triggers .delete_withdrawal_data_trigger diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/v0/mod.rs similarity index 91% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/v0/mod.rs index e0960ea7151..e39046a6709 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/data_triggers/triggers/withdrawals/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/data_triggers/triggers/withdrawals/v0/mod.rs @@ -4,7 +4,7 @@ use crate::error::Error; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::Value; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::system_data_contracts::withdrawals_contract; use dpp::version::PlatformVersion; use drive::query::{DriveDocumentQuery, InternalClauses, WhereClause, WhereOperator}; @@ -13,11 +13,11 @@ use dpp::consensus::state::data_trigger::data_trigger_condition_error::DataTrigg use dpp::{document, ProtocolError}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::document::DocumentV0Getters; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use dpp::system_data_contracts::withdrawals_contract::v1::document_types::withdrawal; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; +use crate::execution::validation::state_transition::batch::data_triggers::{DataTriggerExecutionContext, DataTriggerExecutionResult}; /// Creates a data trigger for handling deletion of withdrawal documents. /// @@ -39,12 +39,7 @@ pub(super) fn delete_withdrawal_data_trigger_v0( context: &DataTriggerExecutionContext<'_>, platform_version: &PlatformVersion, ) -> Result<DataTriggerExecutionResult, Error> { - let data_contract_fetch_info = document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base", - )))? - .data_contract_fetch_info(); + let data_contract_fetch_info = document_transition.base().data_contract_fetch_info(); let data_contract = &data_contract_fetch_info.contract; let mut result = DataTriggerExecutionResult::default(); @@ -52,12 +47,7 @@ pub(super) fn delete_withdrawal_data_trigger_v0( return Err(Error::Execution(ExecutionError::DataTriggerExecutionError( format!( "the Document Transition {} isn't 'DELETE", - document_transition - .base() - .ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( - "expecting action to have a base" - )))? - .id() + document_transition.base().id() ), ))); }; @@ -141,9 +131,9 @@ mod tests { use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::{Document, DocumentV0Getters}; use dpp::platform_value::platform_value; - use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; - use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; - use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionV0; + use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; + use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; + use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionV0; use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract}; use dpp::tests::fixtures::{get_data_contract_fixture, get_withdrawal_document_fixture}; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/identity_contract_nonce/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/identity_contract_nonce/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/identity_contract_nonce/v0/mod.rs similarity index 82% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/identity_contract_nonce/v0/mod.rs index 1487567a4bd..32829c45b70 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/identity_contract_nonce/v0/mod.rs @@ -1,10 +1,9 @@ use crate::error::Error; use dpp::block::block_info::BlockInfo; use dpp::identity::identity_nonce::{validate_identity_nonce_update, validate_new_identity_nonce}; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::StateTransitionLike; use dpp::validation::SimpleConsensusValidationResult; @@ -17,7 +16,7 @@ use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionIdentityContractNonceV0 +pub(in crate::execution::validation::state_transition::state_transitions::batch) trait DocumentsBatchStateTransitionIdentityContractNonceV0 { fn validate_identity_contract_nonces_v0( &self, @@ -29,7 +28,7 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume ) -> Result<SimpleConsensusValidationResult, Error>; } -impl DocumentsBatchStateTransitionIdentityContractNonceV0 for DocumentsBatchTransition { +impl DocumentsBatchStateTransitionIdentityContractNonceV0 for BatchTransition { fn validate_identity_contract_nonces_v0( &self, platform: &PlatformStateRef, @@ -39,7 +38,7 @@ impl DocumentsBatchStateTransitionIdentityContractNonceV0 for DocumentsBatchTran platform_version: &PlatformVersion, ) -> Result<SimpleConsensusValidationResult, Error> { // We should validate that all newly created documents have valid ids - for transition in self.transitions() { + for transition in self.transitions_iter() { let revision_nonce = transition.identity_contract_nonce(); let identity_id = self.owner_id(); let (existing_nonce, fee) = platform.drive.fetch_identity_contract_nonce_with_fees( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/mod.rs similarity index 86% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/mod.rs index 8ff239d954b..0e594bc5895 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/mod.rs @@ -2,19 +2,19 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::validation::state_transition::processor::v0::StateTransitionIsAllowedValidationV0; use crate::platform_types::platform::PlatformRef; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; mod v0; -impl StateTransitionIsAllowedValidationV0 for DocumentsBatchTransition { +impl StateTransitionIsAllowedValidationV0 for BatchTransition { fn has_is_allowed_validation(&self, platform_version: &PlatformVersion) -> Result<bool, Error> { match platform_version .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .is_allowed { 0 => Ok(true), @@ -36,7 +36,7 @@ impl StateTransitionIsAllowedValidationV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .is_allowed { 0 => Ok(v0::validate_is_allowed_v0(self, platform)), diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/v0/mod.rs similarity index 75% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/v0/mod.rs index a98801ee70b..82f7855f1c6 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/is_allowed/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/is_allowed/v0/mod.rs @@ -2,9 +2,10 @@ use crate::platform_types::platform::PlatformRef; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::block::epoch::EpochIndex; use dpp::consensus::basic::document::ContestedDocumentsTemporarilyNotAllowedError; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use dpp::state_transition::batch_transition::resolvers::v0::BatchTransitionResolversV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::validation::ConsensusValidationResult; // TARGET_EPOCH_INDEX was introduced without versioning. @@ -15,7 +16,7 @@ pub const TARGET_EPOCH_INDEX: EpochIndex = 4; #[inline(always)] pub fn validate_is_allowed_v0<C>( - state_transition: &DocumentsBatchTransition, + state_transition: &BatchTransition, platform: &PlatformRef<C>, ) -> ConsensusValidationResult<()> { #[cfg(feature = "testing-config")] @@ -33,7 +34,7 @@ pub fn validate_is_allowed_v0<C>( return ConsensusValidationResult::new(); } - let is_contested = state_transition.transitions().iter().any(|transition| { + let is_contested = state_transition.transitions_iter().any(|transition| { transition .as_transition_create() .and_then(|create| create.prefunded_voting_balance().as_ref()) diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/mod.rs similarity index 52% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/mod.rs index 1cb7c26a62b..7b38ca9b32f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/mod.rs @@ -11,7 +11,7 @@ use dpp::block::block_info::BlockInfo; use dpp::dashcore::Network; use dpp::identity::PartialIdentity; use dpp::prelude::*; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::validation::SimpleConsensusValidationResult; use dpp::version::PlatformVersion; use drive::state_transition_action::StateTransitionAction; @@ -25,9 +25,9 @@ use crate::execution::types::state_transition_execution_context::StateTransition use crate::platform_types::platform::{PlatformRef, PlatformStateRef}; use crate::rpc::core::CoreRPCLike; -use crate::execution::validation::state_transition::documents_batch::advanced_structure::v0::DocumentsBatchStateTransitionStructureValidationV0; -use crate::execution::validation::state_transition::documents_batch::identity_contract_nonce::v0::DocumentsBatchStateTransitionIdentityContractNonceV0; -use crate::execution::validation::state_transition::documents_batch::state::v0::DocumentsBatchStateTransitionStateValidationV0; +use crate::execution::validation::state_transition::batch::advanced_structure::v0::DocumentsBatchStateTransitionStructureValidationV0; +use crate::execution::validation::state_transition::batch::identity_contract_nonce::v0::DocumentsBatchStateTransitionIdentityContractNonceV0; +use crate::execution::validation::state_transition::batch::state::v0::DocumentsBatchStateTransitionStateValidationV0; use crate::execution::validation::state_transition::processor::v0::{ StateTransitionBasicStructureValidationV0, StateTransitionNonceValidationV0, @@ -38,8 +38,8 @@ use crate::execution::validation::state_transition::ValidationMode; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; impl ValidationMode { - /// Returns a bool on whether we should validate that documents are valid against the state - pub fn should_validate_document_valid_against_state(&self) -> bool { + /// Returns a bool on whether we should validate that batched transitions are valid against the state + pub fn should_validate_batch_valid_against_state(&self) -> bool { match self { ValidationMode::CheckTx => false, ValidationMode::RecheckTx => false, @@ -49,7 +49,7 @@ impl ValidationMode { } } -impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { +impl StateTransitionActionTransformerV0 for BatchTransition { fn transform_into_action<C: CoreRPCLike>( &self, platform: &PlatformRef<C>, @@ -64,7 +64,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .transform_into_action { 0 => self.transform_into_action_v0(&platform.into(), block_info, validation_mode, tx), @@ -77,7 +77,7 @@ impl StateTransitionActionTransformerV0 for DocumentsBatchTransition { } } -impl StateTransitionBasicStructureValidationV0 for DocumentsBatchTransition { +impl StateTransitionBasicStructureValidationV0 for BatchTransition { fn validate_basic_structure( &self, platform_version: &PlatformVersion, @@ -86,7 +86,7 @@ impl StateTransitionBasicStructureValidationV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .basic_structure { 0 => { @@ -103,7 +103,7 @@ impl StateTransitionBasicStructureValidationV0 for DocumentsBatchTransition { } } -impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { +impl StateTransitionNonceValidationV0 for BatchTransition { fn validate_nonces( &self, platform: &PlatformStateRef, @@ -116,7 +116,7 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .revision { 0 => self.validate_identity_contract_nonces_v0( @@ -135,7 +135,7 @@ impl StateTransitionNonceValidationV0 for DocumentsBatchTransition { } } -impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransition { +impl StateTransitionStructureKnownInStateValidationV0 for BatchTransition { fn validate_advanced_structure_from_state( &self, block_info: &BlockInfo, @@ -149,7 +149,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .advanced_structure { 0 => { @@ -157,8 +157,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti identity.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( "The identity must be known on advanced structure validation", )))?; - let StateTransitionAction::DocumentsBatchAction(documents_batch_transition_action) = - action + let StateTransitionAction::BatchAction(documents_batch_transition_action) = action else { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "action must be a documents batch transition action", @@ -190,7 +189,7 @@ impl StateTransitionStructureKnownInStateValidationV0 for DocumentsBatchTransiti } } -impl StateTransitionStateValidationV0 for DocumentsBatchTransition { +impl StateTransitionStateValidationV0 for BatchTransition { fn validate_state<C: CoreRPCLike>( &self, action: Option<StateTransitionAction>, @@ -206,7 +205,7 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { .drive_abci .validation_and_processing .state_transitions - .documents_batch_state_transition + .batch_state_transition .state { 0 => { @@ -214,8 +213,7 @@ impl StateTransitionStateValidationV0 for DocumentsBatchTransition { action.ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution( "documents batch structure validation should have an action", )))?; - let StateTransitionAction::DocumentsBatchAction(documents_batch_transition_action) = - action + let StateTransitionAction::BatchAction(documents_batch_transition_action) = action else { return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( "action must be a documents batch transition action", @@ -245,25 +243,33 @@ mod tests { use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::test::helpers::setup::TestPlatformBuilder; + use assert_matches::assert_matches; use dpp::block::block_info::BlockInfo; + use dpp::consensus::basic::BasicError; + use dpp::consensus::state::state_error::StateError; + use dpp::consensus::ConsensusError; use dpp::dash_to_credits; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::random_document::{ CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType, }; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; use dpp::document::document_methods::DocumentMethodsV0; use dpp::document::transfer::Transferable; use dpp::document::{DocumentV0Getters, DocumentV0Setters}; use dpp::fee::fee_result::BalanceChange; use dpp::fee::Credits; + use dpp::group::GroupStateTransitionInfo; + use dpp::identifier::Identifier; use dpp::identity::accessors::IdentityGettersV0; use dpp::nft::TradeMode; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; use dpp::platform_value::{Bytes32, Value}; use dpp::serialization::PlatformSerializable; - use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; - use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; + use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::batch_transition::BatchTransition; use dpp::tests::json_document::json_document_to_contract; use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; use drive::drive::document::query::QueryDocumentsWithFlagsOutcomeV0Methods; @@ -271,10 +277,10 @@ mod tests { use drive::util::storage_flags::StorageFlags; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; + use rand::Rng; use rand::SeedableRng; mod creation_tests { - use rand::Rng; use dapi_grpc::platform::v0::{get_contested_resource_vote_state_request, get_contested_resource_vote_state_response, GetContestedResourceVoteStateRequest, GetContestedResourceVoteStateResponse}; use dapi_grpc::platform::v0::get_contested_resource_vote_state_request::get_contested_resource_vote_state_request_v0::ResultType; use dapi_grpc::platform::v0::get_contested_resource_vote_state_request::GetContestedResourceVoteStateRequestV0; @@ -306,10 +312,11 @@ mod tests { use dpp::consensus::state::state_error::StateError; use dpp::dashcore::Network; use dpp::dashcore::Network::Testnet; + use dpp::data_contract::DataContract; use dpp::identity::SecurityLevel; - use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; - use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; - use dpp::state_transition::documents_batch_transition::{DocumentCreateTransition, DocumentsBatchTransitionV0}; + use dpp::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; + use dpp::state_transition::batch_transition::document_create_transition::DocumentCreateTransitionV0; + use dpp::state_transition::batch_transition::{DocumentCreateTransition, BatchTransitionV0}; use dpp::state_transition::StateTransition; use crate::config::PlatformConfig; @@ -352,7 +359,7 @@ mod tests { document.set("avatarUrl", "http://test.com/bob.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -438,7 +445,7 @@ mod tests { document.set("avatarUrl", "http://test.com/bob.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -500,7 +507,7 @@ mod tests { document.set("avatarUrl", "http://test.com/coy.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -569,6 +576,9 @@ mod tests { "tests/supporting_files/contract/dashpay/dashpay-contract-no-max-length.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let dashpay_contract = dashpay_contract_no_max_length.clone(); @@ -605,7 +615,7 @@ mod tests { ); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -785,7 +795,7 @@ mod tests { document_2.set("preorderSalt", salt_2.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1, preorder, entropy.0, @@ -806,7 +816,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_2, preorder, entropy.0, @@ -827,7 +837,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1, domain, entropy.0, @@ -848,7 +858,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_2, domain, entropy.0, @@ -1208,7 +1218,7 @@ mod tests { document_1.set("preorderSalt", salt_1.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1, preorder, entropy.0, @@ -1244,15 +1254,14 @@ mod tests { prefunded_voting_balance: None, } .into(); - let documents_batch_inner_create_transition_1: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id, - transitions: vec![create_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 0, - signature: Default::default(), - } - .into(); + let documents_batch_inner_create_transition_1: BatchTransition = BatchTransitionV0 { + owner_id, + transitions: vec![create_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); let mut documents_batch_create_transition_1: StateTransition = documents_batch_inner_create_transition_1.into(); documents_batch_create_transition_1 @@ -1486,7 +1495,7 @@ mod tests { document_1.set("preorderSalt", salt_1.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1, preorder, entropy.0, @@ -1521,15 +1530,14 @@ mod tests { prefunded_voting_balance: None, } .into(); - let documents_batch_inner_create_transition_1: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id, - transitions: vec![create_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 0, - signature: Default::default(), - } - .into(); + let documents_batch_inner_create_transition_1: BatchTransition = BatchTransitionV0 { + owner_id, + transitions: vec![create_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); let mut documents_batch_create_transition_1: StateTransition = documents_batch_inner_create_transition_1.into(); documents_batch_create_transition_1 @@ -1838,7 +1846,7 @@ mod tests { document_3_on_identity_1.set("preorderSalt", salt_3.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1, preorder, entropy.0, @@ -1859,7 +1867,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_2, preorder, entropy.0, @@ -1880,7 +1888,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_preorder_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_3_on_identity_1, preorder, new_entropy.0, @@ -1901,7 +1909,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1, domain, entropy.0, @@ -1922,7 +1930,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_2, domain, entropy.0, @@ -1943,7 +1951,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_3_on_identity_1, domain, entropy.0, @@ -2383,7 +2391,7 @@ mod tests { )); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1, domain, different_entropy.0, @@ -2616,7 +2624,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -2678,7 +2686,7 @@ mod tests { document.set("defense", 2.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -2787,7 +2795,7 @@ mod tests { altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -2831,7 +2839,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -2877,7 +2885,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1341740); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1443820); let issues = platform .drive @@ -2939,7 +2947,7 @@ mod tests { document.set("avatarUrl", "http://test.com/bob.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), profile, entropy.0, @@ -2996,7 +3004,7 @@ mod tests { ); //less than a week let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( document.clone(), profile, &key, @@ -3286,7 +3294,7 @@ mod tests { altered_document.set("senderKeyIndex", Value::U32(2)); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, contact_request_document_type, entropy.0, @@ -3330,7 +3338,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, contact_request_document_type, &key, @@ -3416,7 +3424,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -3512,7 +3520,7 @@ mod tests { document.set("defense", 0.into()); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( document, card_document_type, &key, @@ -3620,7 +3628,7 @@ mod tests { altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); let documents_batch_update_transition = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -3722,7 +3730,7 @@ mod tests { altered_document_2.set("avatarUrl", "http://test.com/drapes.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -3787,7 +3795,7 @@ mod tests { assert_eq!(document.to_string(), "v0 : id:GcviwUsEr9Ji4rCrnnsgmVAghNaVPDumsfcagvBbBy45 owner_id:CisQdz2ej7EwWv8JbetSXBNsV4xsf8QsSS8tqp4tEf7V created_at:1970-01-14 21:20:00 updated_at:1970-01-14 21:20:00 avatarFingerprint:bytes d7b0e2b357c10312 avatarHash:bytes32 YonaRoE0hMgat53AYt5LTlQlIkKLReGpB7xNAqJ5HM8= avatarUrl:string http://test.com/bob.[...(23)] displayName:string QBwBNNXXYCngB0er publicMessage:string 8XG7KBGNvm2 "); let documents_batch_update_transition_1 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -3807,7 +3815,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_update_transition_2 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document_2, profile, &key, @@ -3940,7 +3948,7 @@ mod tests { altered_document_2.set("avatarUrl", "http://test.com/drapes.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -4009,7 +4017,7 @@ mod tests { let platform_state = platform.state.load(); let documents_batch_update_transition_1 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -4029,7 +4037,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_update_transition_2 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document_2, profile, &key, @@ -4199,7 +4207,7 @@ mod tests { altered_document_2.increment_revision().unwrap(); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -4268,7 +4276,7 @@ mod tests { let platform_state = platform.state.load(); let documents_batch_update_transition_1 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -4288,7 +4296,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_update_transition_2 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document_2, profile, &key, @@ -4462,7 +4470,7 @@ mod tests { altered_document_2.set("avatarUrl", "http://test.com/drapes.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -4531,7 +4539,7 @@ mod tests { let platform_state = platform.state.load(); let documents_batch_update_transition_1 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document, profile, &key, @@ -4551,7 +4559,7 @@ mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_update_transition_2 = - DocumentsBatchTransition::new_document_replacement_transition_from_document( + BatchTransition::new_document_replacement_transition_from_document( altered_document_2, profile, &key, @@ -4723,7 +4731,7 @@ mod tests { altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, profile, entropy.0, @@ -4767,7 +4775,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( altered_document, profile, &key, @@ -4813,7 +4821,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1609340); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1711420); let issues = platform .drive @@ -4904,7 +4912,7 @@ mod tests { altered_document.set("senderKeyIndex", Value::U32(2)); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, contact_request_document_type, entropy.0, @@ -4948,7 +4956,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( altered_document, contact_request_document_type, &key, @@ -5069,7 +5077,7 @@ mod tests { altered_document.set("senderKeyIndex", Value::U32(2)); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, contact_request_document_type, entropy.0, @@ -5113,7 +5121,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( altered_document, contact_request_document_type, &key, @@ -5234,7 +5242,7 @@ mod tests { altered_document.set("senderKeyIndex", Value::U32(2)); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document, contact_request_document_type, entropy.0, @@ -5278,7 +5286,7 @@ mod tests { .expect("expected to commit transaction"); let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( altered_document, contact_request_document_type, &key, @@ -5371,7 +5379,7 @@ mod tests { altered_document.set("avatarUrl", "http://test.com/cat.jpg".into()); let documents_batch_delete_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( altered_document, profile, &key, @@ -5484,7 +5492,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -5530,7 +5538,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( + BatchTransition::new_document_transfer_transition_from_document( document, card_document_type, receiver.id(), @@ -5639,7 +5647,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -5732,7 +5740,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( + BatchTransition::new_document_transfer_transition_from_document( document, card_document_type, receiver.id(), @@ -5864,7 +5872,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -5957,7 +5965,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( + BatchTransition::new_document_transfer_transition_from_document( document, card_document_type, receiver.id(), @@ -6109,7 +6117,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( + BatchTransition::new_document_transfer_transition_from_document( document, card_document_type, receiver.id(), @@ -6215,7 +6223,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -6308,7 +6316,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_transfer_transition = - DocumentsBatchTransition::new_document_transfer_transition_from_document( + BatchTransition::new_document_transfer_transition_from_document( document.clone(), card_document_type, receiver.id(), @@ -6378,7 +6386,7 @@ mod tests { document.set_owner_id(receiver.id()); let documents_batch_deletion_transition = - DocumentsBatchTransition::new_document_deletion_transition_from_document( + BatchTransition::new_document_deletion_transition_from_document( document, card_document_type, &recipient_key, @@ -6448,6 +6456,7 @@ mod tests { mod nft_tests { use super::*; + use crate::test::helpers::fast_forward_to_block::fast_forward_to_block; #[test] fn test_document_set_price_on_document_without_ability_to_purchase() { let platform_version = PlatformVersion::latest(); @@ -6485,7 +6494,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -6555,7 +6564,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), @@ -6645,7 +6654,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -6738,7 +6747,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), @@ -6865,7 +6874,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -6984,7 +6993,7 @@ mod tests { document.set_revision(Some(2)); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), @@ -7099,7 +7108,7 @@ mod tests { document.set_revision(Some(3)); let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( + BatchTransition::new_document_purchase_transition_from_document( document.clone(), card_document_type, purchaser.id(), @@ -7193,17 +7202,33 @@ mod tests { .expect("expected to get purchaser balance") .expect("expected that purchaser exists"); - // the buyer payed 0.1, but also storage and processing fees + // the buyer paid 0.1, but also storage and processing fees assert_eq!(buyers_balance, dash_to_credits!(0.9) - 68691480); } #[test] - fn test_document_set_price_and_try_purchase_at_different_amount() { + fn test_document_set_price_and_purchase_different_epoch_documents_mutable() { let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() + let mut platform = TestPlatformBuilder::new() .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game_nft(TradeMode::DirectPurchase); + .set_initial_state_structure(); + + let card_game_path = "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-documents-mutable.json"; + + // let's construct the grovedb structure for the card game data contract + let contract = json_document_to_contract(card_game_path, true, platform_version) + .expect("expected to get data contract"); + platform + .drive + .apply_contract( + &contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); let mut rng = StdRng::seed_from_u64(433); @@ -7226,7 +7251,7 @@ mod tests { .document_type_for_name("card") .expect("expected a profile document type"); - assert!(!card_document_type.documents_mutable()); + assert!(card_document_type.documents_mutable()); let entropy = Bytes32::random_with_rng(&mut rng); @@ -7245,7 +7270,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -7281,6 +7306,20 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); + assert_eq!( + processing_result + .aggregated_fees() + .clone() + .into_balance_change(identity.id()) + .change(), + &BalanceChange::RemoveFromBalance { + required_removed_balance: 138159000, + desired_removed_balance: 141234660, + } + ); + + let original_creation_cost = 141234660; + platform .drive .grove @@ -7288,87 +7327,101 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - document.set_revision(Some(2)); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( - document.clone(), - card_document_type, - dash_to_credits!(0.5), - &key, - 3, - 0, - &signer, - platform_version, + // the seller already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost + ); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", purchaser.id()); + + let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), None, + false, None, None, ) - .expect("expect to create documents batch transition for the update price"); - - let documents_batch_transfer_serialized_transition = - documents_batch_update_price_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); - - let transaction = platform.drive.grove.start_transaction(); + .expect("expected query result"); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_transfer_serialized_transition.clone()], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, false, None, + None, ) - .expect("expected to process state transition"); + .expect("expected query result"); - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - assert_eq!(processing_result.valid_count(), 1); + assert_eq!(query_receiver_results.documents().len(), 0); - // At this point we want to have the receiver purchase the document + // now let's modify the document - document.set_revision(Some(3)); + fast_forward_to_block(&platform, 500_000, 100, 3, 1, false); //next epoch - let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( + document.set("description", "chopsticks".into()); + document.bump_revision(); + + let documents_batch_update_transition = + BatchTransition::new_document_replacement_transition_from_document( document.clone(), card_document_type, - purchaser.id(), - dash_to_credits!(0.35), //different than requested price - &recipient_key, - 1, // 1 because he's never done anything + &key, + 3, 0, - &recipient_signer, + &signer, platform_version, None, None, None, ) - .expect("expect to create documents batch transition for the purchase"); + .expect("expect to create documents batch transition"); - let documents_batch_purchase_serialized_transition = - documents_batch_purchase_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let documents_batch_update_serialized_transition = documents_batch_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); let transaction = platform.drive.grove.start_transaction(); + let platform_state = platform.state.load(); + let processing_result = platform .platform .process_raw_state_transitions( - &vec![documents_batch_purchase_serialized_transition], + &vec![documents_batch_update_serialized_transition.clone()], &platform_state, - &BlockInfo::default_with_time(50000000), + platform_state.last_block_info(), &transaction, platform_version, false, @@ -7383,30 +7436,38 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 1); - - let result = processing_result.into_execution_results().remove(0); + assert_eq!( + processing_result.invalid_paid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); - let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result - else { - panic!("expected a paid consensus error"); - }; - assert_eq!(consensus_error.to_string(), "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document can not be purchased for 35000000000, it's sale price is 50000000000 (in credits)"); - } + assert_eq!( + processing_result.invalid_unpaid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); - #[test] - fn test_document_set_price_and_purchase_from_ones_self() { - let platform_version = PlatformVersion::latest(); - let (mut platform, contract) = TestPlatformBuilder::new() - .build_with_mock_rpc() - .set_initial_state_structure() - .with_crypto_card_game_nft(TradeMode::DirectPurchase); + assert_eq!( + processing_result.valid_count(), + 1, + "{:?}", + processing_result.execution_results() + ); - let mut rng = StdRng::seed_from_u64(433); + assert_eq!(processing_result.aggregated_fees().storage_fee, 378000); - let platform_state = platform.state.load(); + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + None + ); - let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.5)); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2717400); let seller_balance = platform .drive @@ -7414,83 +7475,25 @@ mod tests { .expect("expected to get identity balance") .expect("expected that identity exists"); - assert_eq!(seller_balance, dash_to_credits!(0.5)); - - let card_document_type = contract - .document_type_for_name("card") - .expect("expected a profile document type"); - - assert!(!card_document_type.documents_mutable()); - - let entropy = Bytes32::random_with_rng(&mut rng); - - let mut document = card_document_type - .random_document_with_identifier_and_entropy( - &mut rng, - identity.id(), - entropy, - DocumentFieldFillType::DoNotFillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document.set("attack", 4.into()); - document.set("defense", 7.into()); - - let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document.clone(), - card_document_type, - entropy.0, - &key, - 2, - 0, - &signer, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); - - let documents_batch_create_serialized_transition = documents_batch_create_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); - - let transaction = platform.drive.grove.start_transaction(); - - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_create_serialized_transition.clone()], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - false, - None, - ) - .expect("expected to process state transition"); + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost - 2717400 - 378000 + ); - assert_eq!(processing_result.valid_count(), 1); + // now let's update price, but first go to next epoch - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 2, false); //next epoch - document.set_revision(Some(2)); + document.bump_revision(); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), &key, - 3, + 4, 0, &signer, platform_version, @@ -7527,22 +7530,105 @@ mod tests { .unwrap() .expect("expected to commit transaction"); + assert_eq!( + processing_result.invalid_paid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); + + assert_eq!( + processing_result.invalid_unpaid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); + assert_eq!(processing_result.valid_count(), 1); - // At this point we want to have the receiver purchase the document + assert_eq!(processing_result.aggregated_fees().storage_fee, 216000); // we added 8 bytes for the price - document.set_revision(Some(3)); + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + None + ); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2721160); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) + - original_creation_cost + - 2717400 + - 378000 + - 2721160 + - 216000 + ); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let mut document = query_sender_results.documents_owned().remove(0); + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + // At this point we want to have the receiver purchase the document at the next epoch + + fast_forward_to_block(&platform, 1_700_000_000, 1200, 42, 3, false); //next epoch + + document.bump_revision(); let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( + BatchTransition::new_document_purchase_transition_from_document( document.clone(), card_document_type, - identity.id(), + purchaser.id(), dash_to_credits!(0.1), //same price as requested - &key, + &recipient_key, 1, // 1 because he's never done anything 0, - &signer, + &recipient_signer, platform_version, None, None, @@ -7577,21 +7663,78 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!( + processing_result.invalid_paid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); - let result = processing_result.into_execution_results().remove(0); + assert_eq!( + processing_result.invalid_unpaid_count(), + 0, + "{:?}", + processing_result.execution_results() + ); - let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result - else { - panic!("expected a paid consensus error"); - }; - assert_eq!(consensus_error.to_string(), "Document transition action on document type: card identity trying to purchase a document that is already owned by the purchaser is not supported"); + assert_eq!( + processing_result.valid_count(), + 1, + "{:?}", + processing_result.execution_results() + ); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 4345280); + + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(52987722) + ); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.2) - original_creation_cost + 46955162 + ); + + let buyers_balance = platform + .drive + .fetch_identity_balance(purchaser.id().to_buffer(), None, platform_version) + .expect("expected to get purchaser balance") + .expect("expected that purchaser exists"); + + // the buyer paid 0.1, but also storage and processing fees + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 68956280); } #[test] - fn test_document_set_price_and_purchase_then_try_buy_back() { - // In this test we try to buy back a document after it has been sold - + fn test_document_set_price_and_purchase_different_epoch() { let platform_version = PlatformVersion::latest(); let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() @@ -7638,7 +7781,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -7674,6 +7817,20 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); + assert_eq!( + processing_result + .aggregated_fees() + .clone() + .into_balance_change(identity.id()) + .change(), + &BalanceChange::RemoveFromBalance { + required_removed_balance: 123579000, + desired_removed_balance: 126435860, + } + ); + + let original_creation_cost = 126435860; + platform .drive .grove @@ -7681,10 +7838,73 @@ mod tests { .unwrap() .expect("expected to commit transaction"); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost + ); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", purchaser.id()); + + let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // now let's update price, but first go to next epoch + + fast_forward_to_block(&platform, 1_200_000_000, 900, 42, 1, false); //next epoch + document.set_revision(Some(2)); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), @@ -7726,86 +7946,42 @@ mod tests { .unwrap() .expect("expected to commit transaction"); + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + assert_eq!(processing_result.valid_count(), 1); - // At this point we want to have the receiver purchase the document + assert_eq!(processing_result.aggregated_fees().storage_fee, 216000); // we added 8 bytes for the price - document.set_revision(Some(3)); + assert_eq!( + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + None + ); - let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( - document.clone(), - card_document_type, - purchaser.id(), - dash_to_credits!(0.1), //same price as requested - &recipient_key, - 1, // 1 because he's never done anything - 0, - &recipient_signer, - platform_version, + assert_eq!(processing_result.aggregated_fees().processing_fee, 2473880); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.1) - original_creation_cost - 2689880 + ); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), None, - None, - None, - ) - .expect("expect to create documents batch transition for the purchase"); - - let documents_batch_purchase_serialized_transition = - documents_batch_purchase_transition - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); - - let transaction = platform.drive.grove.start_transaction(); - - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![documents_batch_purchase_serialized_transition], - &platform_state, - &BlockInfo::default_with_time(50000000), - &transaction, - platform_version, - false, - None, - ) - .expect("expected to process state transition"); - - platform - .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); - - assert_eq!(processing_result.valid_count(), 1); - - // Let's verify some stuff - - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", purchaser.id()); - - let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, + false, None, None, ) @@ -7823,37 +7999,37 @@ mod tests { .expect("expected query result"); // We expect the sender to still have their document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 0); + assert_eq!(query_sender_results.documents().len(), 1); - assert_eq!(query_receiver_results.documents().len(), 1); + assert_eq!(query_receiver_results.documents().len(), 0); // The sender document should have the desired price - let mut document = query_receiver_results.documents_owned().remove(0); + let mut document = query_sender_results.documents_owned().remove(0); - let price: Option<Credits> = document + let price: Credits = document .properties() - .get_optional_integer("$price") + .get_integer("$price") .expect("expected to get back price"); - assert_eq!(price, None); + assert_eq!(dash_to_credits!(0.1), price); - assert_eq!(document.owner_id(), purchaser.id()); + // At this point we want to have the receiver purchase the document at the next epoch - // At this point we want to have the sender to try to buy back the document + fast_forward_to_block(&platform, 1_700_000_000, 1200, 42, 2, false); //next epoch - document.set_revision(Some(4)); + document.set_revision(Some(3)); let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( + BatchTransition::new_document_purchase_transition_from_document( document.clone(), card_document_type, - identity.id(), - dash_to_credits!(0.1), //same price as old requested - &key, - 4, // 1 because he's never done anything + purchaser.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything 0, - &signer, + &recipient_signer, platform_version, None, None, @@ -7888,23 +8064,63 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!(processing_result.invalid_paid_count(), 0); - let result = processing_result.into_execution_results().remove(0); + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().storage_fee, 64611000); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 4080480); - let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result - else { - panic!("expected a paid consensus error"); - }; assert_eq!( - consensus_error.to_string(), - "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document not for sale" + processing_result + .aggregated_fees() + .fee_refunds + .calculate_refunds_amount_for_identity(identity.id()), + Some(22704503) + ); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents(query_receiver_identity_documents, None, false, None, None) + .expect("expected query result"); + + // We expect the sender to have no documents, and the receiver to have 1 + assert_eq!(query_sender_results.documents().len(), 0); + + assert_eq!(query_receiver_results.documents().len(), 1); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + // the seller should have received 0.1 and already had 0.1 minus the processing fee and storage fee + assert_eq!( + seller_balance, + dash_to_credits!(0.2) - original_creation_cost + 20014623 ); + + let buyers_balance = platform + .drive + .fetch_identity_balance(purchaser.id().to_buffer(), None, platform_version) + .expect("expected to get purchaser balance") + .expect("expected that purchaser exists"); + + // the buyer paid 0.1, but also storage and processing fees + assert_eq!(buyers_balance, dash_to_credits!(0.9) - 68691480); } #[test] - fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( - ) { + fn test_document_set_price_and_try_purchase_at_different_amount() { let platform_version = PlatformVersion::latest(); let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() @@ -7917,8 +8133,16 @@ mod tests { let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let (receiver, recipient_signer, recipient_key) = - setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); + + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + assert_eq!(seller_balance, dash_to_credits!(0.1)); let card_document_type = contract .document_type_for_name("card") @@ -7943,7 +8167,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -7986,60 +8210,13 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); - - let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let receiver_documents_sql_string = - format!("select * from card where $ownerId == '{}'", receiver.id()); - - let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( - receiver_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); - - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); - - // We expect the sender to have 1 document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); - - assert_eq!(query_receiver_results.documents().len(), 0); - document.set_revision(Some(2)); let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, - dash_to_credits!(0.1), + dash_to_credits!(0.5), &key, 3, 0, @@ -8078,62 +8255,18 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 0); - - assert_eq!(processing_result.invalid_unpaid_count(), 0); - assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2473880); - - let query_sender_results = platform - .drive - .query_documents( - query_sender_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); - - let query_receiver_results = platform - .drive - .query_documents( - query_receiver_identity_documents.clone(), - None, - false, - None, - None, - ) - .expect("expected query result"); - - // We expect the sender to still have their document, and the receiver to have none - assert_eq!(query_sender_results.documents().len(), 1); - - assert_eq!(query_receiver_results.documents().len(), 0); - - // The sender document should have the desired price - - let mut document = query_sender_results.documents_owned().remove(0); - - let price: Credits = document - .properties() - .get_integer("$price") - .expect("expected to get back price"); - - assert_eq!(dash_to_credits!(0.1), price); - // At this point we want to have the receiver purchase the document document.set_revision(Some(3)); let documents_batch_purchase_transition = - DocumentsBatchTransition::new_document_purchase_transition_from_document( + BatchTransition::new_document_purchase_transition_from_document( document.clone(), card_document_type, - receiver.id(), - dash_to_credits!(0.1), //same price as requested + purchaser.id(), + dash_to_credits!(0.35), //different than requested price &recipient_key, 1, // 1 because he's never done anything 0, @@ -8172,19 +8305,19 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - // nothing can go through because the purchaser doesn't have enough balance - - assert_eq!(processing_result.invalid_paid_count(), 0); - - assert_eq!(processing_result.invalid_unpaid_count(), 1); + assert_eq!(processing_result.invalid_paid_count(), 1); - assert_eq!(processing_result.valid_count(), 0); + let result = processing_result.into_execution_results().remove(0); - assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document can not be purchased for 35000000000, it's sale price is 50000000000 (in credits)"); } #[test] - fn test_document_set_price_on_not_owned_document() { + fn test_document_set_price_and_purchase_from_ones_self() { let platform_version = PlatformVersion::latest(); let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() @@ -8195,10 +8328,15 @@ mod tests { let platform_state = platform.state.load(); - let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.5)); - let (other_identity, other_identity_signer, other_identity_key) = - setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); + + assert_eq!(seller_balance, dash_to_credits!(0.5)); let card_document_type = contract .document_type_for_name("card") @@ -8223,7 +8361,7 @@ mod tests { document.set("defense", 7.into()); let documents_batch_create_transition = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document.clone(), card_document_type, entropy.0, @@ -8268,17 +8406,15 @@ mod tests { document.set_revision(Some(2)); - document.set_owner_id(other_identity.id()); // we do this to trick the system - let documents_batch_update_price_transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( + BatchTransition::new_document_update_price_transition_from_document( document.clone(), card_document_type, dash_to_credits!(0.1), - &other_identity_key, - 1, + &key, + 3, 0, - &other_identity_signer, + &signer, platform_version, None, None, @@ -8313,363 +8449,230 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.invalid_paid_count(), 1); + assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.invalid_unpaid_count(), 0); + // At this point we want to have the receiver purchase the document - assert_eq!(processing_result.valid_count(), 0); + document.set_revision(Some(3)); - assert_eq!(processing_result.aggregated_fees().processing_fee, 36200); + let documents_batch_purchase_transition = + BatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + identity.id(), + dash_to_credits!(0.1), //same price as requested + &key, + 1, // 1 because he's never done anything + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); - let sender_documents_sql_string = - format!("select * from card where $ownerId == '{}'", identity.id()); + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( - sender_documents_sql_string.as_str(), - &contract, - Some(&platform.config.drive), - ) - .expect("expected document query"); + let transaction = platform.drive.grove.start_transaction(); - let query_sender_results = platform + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform .drive - .query_documents(query_sender_identity_documents, None, false, None, None) - .expect("expected query result"); + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // The sender document should not have the desired price + assert_eq!(processing_result.invalid_paid_count(), 1); - let document = query_sender_results.documents().first().unwrap(); + let result = processing_result.into_execution_results().remove(0); - assert_eq!( - document - .properties() - .get_optional_integer::<u64>("$price") - .expect("expected None"), - None - ); + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!(consensus_error.to_string(), "Document transition action on document type: card identity trying to purchase a document that is already owned by the purchaser is not supported"); } - } - - mod dpns_tests { - use super::*; - use crate::execution::validation::state_transition::tests::setup_identity; - use crate::test::helpers::setup::TestPlatformBuilder; - use dpp::dash_to_credits; - use dpp::data_contract::document_type::random_document::{ - DocumentFieldFillSize, DocumentFieldFillType, - }; - use dpp::platform_value::Bytes32; - use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; - use dpp::util::hash::hash_double; - use drive::query::{InternalClauses, OrderClause, WhereClause, WhereOperator}; - use drive::util::test_helpers::setup_contract; - use indexmap::IndexMap; - use platform_version::version::PlatformVersion; - use rand::prelude::StdRng; - use rand::Rng; - use std::collections::BTreeMap; #[test] - fn test_dpns_contract_references_with_no_contested_unique_index() { + fn test_document_set_price_and_purchase_then_try_buy_back() { + // In this test we try to buy back a document after it has been sold + let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .with_latest_protocol_version() + let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() - .set_genesis_state(); + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); let mut rng = StdRng::seed_from_u64(433); let platform_state = platform.state.load(); - let (identity_1, signer_1, key_1) = - setup_identity(&mut platform, 958, dash_to_credits!(0.5)); - - let (identity_2, signer_2, key_2) = - setup_identity(&mut platform, 93, dash_to_credits!(0.5)); - - let (identity_3, signer_3, key_3) = - setup_identity(&mut platform, 98, dash_to_credits!(0.5)); - - let dashpay_contract = setup_contract( - &platform.drive, - "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", - None, - None, - ); - - let card_game = setup_contract( - &platform.drive, - "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", - None, - None, - ); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - let dpns_contract = setup_contract( - &platform.drive, - "tests/supporting_files/contract/dpns/dpns-contract-contested-unique-index-with-contract-id.json", - None, - None, - ); + let (purchaser, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(1.0)); - let preorder = dpns_contract - .document_type_for_name("preorder") - .expect("expected a profile document type"); + let seller_balance = platform + .drive + .fetch_identity_balance(identity.id().to_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected that identity exists"); - assert!(!preorder.documents_mutable()); - assert!(preorder.documents_can_be_deleted()); - assert!(!preorder.documents_transferable().is_transferable()); + assert_eq!(seller_balance, dash_to_credits!(0.1)); - let domain = dpns_contract - .document_type_for_name("domain") + let card_document_type = contract + .document_type_for_name("card") .expect("expected a profile document type"); - assert!(!domain.documents_mutable()); - // Deletion is disabled with data trigger - assert!(domain.documents_can_be_deleted()); - assert!(domain.documents_transferable().is_transferable()); + assert!(!card_document_type.documents_mutable()); let entropy = Bytes32::random_with_rng(&mut rng); - let mut preorder_document_1 = preorder + let mut document = card_document_type .random_document_with_identifier_and_entropy( &mut rng, - identity_1.id(), + identity.id(), entropy, - DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillType::DoNotFillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, platform_version, ) .expect("expected a random document"); - let mut preorder_document_2 = preorder - .random_document_with_identifier_and_entropy( - &mut rng, - identity_2.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + document.set("attack", 4.into()); + document.set("defense", 7.into()); - let mut preorder_document_3 = preorder - .random_document_with_identifier_and_entropy( - &mut rng, - identity_3.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, + let documents_batch_create_transition = + BatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, platform_version, + None, + None, + None, ) - .expect("expected a random document"); + .expect("expect to create documents batch transition"); - let mut document_1 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_1.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let mut document_2 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_2.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, platform_version, + false, + None, ) - .expect("expected a random document"); - - let mut document_3 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_3.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); - - document_1.set("parentDomainName", "dash".into()); - document_1.set("normalizedParentDomainName", "dash".into()); - document_1.set("label", "quantum123".into()); - document_1.set("normalizedLabel", "quantum123".into()); - document_1.set("records.contract", dashpay_contract.id().into()); - document_1.set("subdomainRules.allowSubdomains", false.into()); - - document_2.set("parentDomainName", "dash".into()); - document_2.set("normalizedParentDomainName", "dash".into()); - document_2.set("label", "van89".into()); - document_2.set("normalizedLabel", "van89".into()); - document_2.set("records.contract", card_game.id().into()); - document_2.set("subdomainRules.allowSubdomains", false.into()); - - document_3.set("parentDomainName", "dash".into()); - document_3.set("normalizedParentDomainName", "dash".into()); - document_3.set("label", "jazz65".into()); - document_3.set("normalizedLabel", "jazz65".into()); - document_3.set("records.identity", document_3.owner_id().into()); - document_3.set("subdomainRules.allowSubdomains", false.into()); - - let salt_1: [u8; 32] = rng.gen(); - let salt_2: [u8; 32] = rng.gen(); - let salt_3: [u8; 32] = rng.gen(); - - let mut salted_domain_buffer_1: Vec<u8> = vec![]; - salted_domain_buffer_1.extend(salt_1); - salted_domain_buffer_1.extend("quantum123.dash".as_bytes()); - - let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); - - let mut salted_domain_buffer_2: Vec<u8> = vec![]; - salted_domain_buffer_2.extend(salt_2); - salted_domain_buffer_2.extend("van89.dash".as_bytes()); - - let salted_domain_hash_2 = hash_double(salted_domain_buffer_2); - - let mut salted_domain_buffer_3: Vec<u8> = vec![]; - salted_domain_buffer_3.extend(salt_3); - salted_domain_buffer_3.extend("jazz65.dash".as_bytes()); + .expect("expected to process state transition"); - let salted_domain_hash_3 = hash_double(salted_domain_buffer_3); + assert_eq!(processing_result.valid_count(), 1); - preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); - preorder_document_2.set("saltedDomainHash", salted_domain_hash_2.into()); - preorder_document_3.set("saltedDomainHash", salted_domain_hash_3.into()); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - document_1.set("preorderSalt", salt_1.into()); - document_2.set("preorderSalt", salt_2.into()); - document_3.set("preorderSalt", salt_3.into()); + document.set_revision(Some(2)); - let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_1, - preorder, - entropy.0, - &key_1, - 2, + let documents_batch_update_price_transition = + BatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, + 3, 0, - &signer_1, + &signer, platform_version, None, None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_create_serialized_preorder_transition_1 = - documents_batch_create_preorder_transition_1 + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition .serialize_to_bytes() .expect("expected documents batch serialized state transition"); - let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_2, - preorder, - entropy.0, - &key_2, - 2, - 0, - &signer_2, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); - - let documents_batch_create_serialized_preorder_transition_2 = - documents_batch_create_preorder_transition_2 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let transaction = platform.drive.grove.start_transaction(); - let documents_batch_create_preorder_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_3, - preorder, - entropy.0, - &key_3, - 2, - 0, - &signer_3, + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, platform_version, - None, - None, + false, None, ) - .expect("expect to create documents batch transition"); - - let documents_batch_create_serialized_preorder_transition_3 = - documents_batch_create_preorder_transition_3 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + .expect("expected to process state transition"); - let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_1, - domain, - entropy.0, - &key_1, - 3, - 0, - &signer_1, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let documents_batch_create_serialized_transition_1 = - documents_batch_create_transition_1 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + assert_eq!(processing_result.valid_count(), 1); - let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_2, - domain, - entropy.0, - &key_2, - 3, - 0, - &signer_2, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + // At this point we want to have the receiver purchase the document - let documents_batch_create_serialized_transition_2 = - documents_batch_create_transition_2 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + document.set_revision(Some(3)); - let documents_batch_create_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_3.clone(), - domain, - entropy.0, - &key_3, - 3, + let documents_batch_purchase_transition = + BatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + purchaser.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything 0, - &signer_3, + &recipient_signer, platform_version, None, None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition for the purchase"); - let documents_batch_create_serialized_transition_3 = - documents_batch_create_transition_3 + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition .serialize_to_bytes() .expect("expected documents batch serialized state transition"); @@ -8678,13 +8681,9 @@ mod tests { let processing_result = platform .platform .process_raw_state_transitions( - &vec![ - documents_batch_create_serialized_preorder_transition_1.clone(), - documents_batch_create_serialized_preorder_transition_2.clone(), - documents_batch_create_serialized_preorder_transition_3.clone(), - ], + &vec![documents_batch_purchase_serialized_transition], &platform_state, - &BlockInfo::default(), + &BlockInfo::default_with_time(50000000), &transaction, platform_version, false, @@ -8699,426 +8698,283 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 3); + assert_eq!(processing_result.valid_count(), 1); - let transaction = platform.drive.grove.start_transaction(); + // Let's verify some stuff - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![ - documents_batch_create_serialized_transition_1.clone(), - documents_batch_create_serialized_transition_2.clone(), - documents_batch_create_serialized_transition_3.clone(), - ], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", purchaser.id()); + + let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, false, None, + None, ) - .expect("expected to process state transition"); + .expect("expected query result"); - platform + let query_receiver_results = platform .drive - .grove - .commit_transaction(transaction) - .unwrap() - .expect("expected to commit transaction"); + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); - assert_eq!(processing_result.valid_count(), 3); + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 0); - let mut order_by = IndexMap::new(); + assert_eq!(query_receiver_results.documents().len(), 1); - order_by.insert( - "records.identity".to_string(), - OrderClause { - field: "records.identity".to_string(), - ascending: true, - }, - ); + // The sender document should have the desired price - let drive_query = DriveDocumentQuery { - contract: &dpns_contract, - document_type: domain, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: Some(WhereClause { - field: "records.identity".to_string(), - operator: WhereOperator::LessThanOrEquals, - value: Value::Bytes32([255; 32]), - }), - equal_clauses: Default::default(), - }, - offset: None, - limit: None, - order_by, - start_at: None, - start_at_included: false, - block_time_ms: None, - }; + let mut document = query_receiver_results.documents_owned().remove(0); - let documents = platform - .drive - .query_documents(drive_query, None, false, None, None) - .expect("expected to get back documents") - .documents_owned(); + let price: Option<Credits> = document + .properties() + .get_optional_integer("$price") + .expect("expected to get back price"); - let transient_fields = domain - .transient_fields() - .iter() - .map(|a| a.as_str()) - .collect(); + assert_eq!(price, None); - assert!(documents - .get(0) - .expect("expected a document") - .is_equal_ignoring_time_based_fields( - &document_3, - Some(transient_fields), - platform_version + assert_eq!(document.owner_id(), purchaser.id()); + + // At this point we want to have the sender to try to buy back the document + + document.set_revision(Some(4)); + + let documents_batch_purchase_transition = + BatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + identity.id(), + dash_to_credits!(0.1), //same price as old requested + &key, + 4, // 1 because he's never done anything + 0, + &signer, + platform_version, + None, + None, + None, ) - .expect("expected to run is equal")); + .expect("expect to create documents batch transition for the purchase"); - let drive_query = DriveDocumentQuery { - contract: &dpns_contract, - document_type: domain, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: None, - equal_clauses: BTreeMap::from([( - "records.identity".to_string(), - WhereClause { - field: "records.identity".to_string(), - operator: WhereOperator::Equal, - value: Value::Null, - }, - )]), - }, - offset: None, - limit: None, - order_by: Default::default(), - start_at: None, - start_at_included: false, - block_time_ms: None, - }; + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let documents = platform + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform .drive - .query_documents(drive_query, None, false, None, None) - .expect("expected to get back documents") - .documents_owned(); + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - // This is normal because we set that we could not query on null - assert_eq!(documents.len(), 0); + assert_eq!(processing_result.invalid_paid_count(), 1); + + let result = processing_result.into_execution_results().remove(0); + + let StateTransitionExecutionResult::PaidConsensusError(consensus_error, _) = result + else { + panic!("expected a paid consensus error"); + }; + assert_eq!( + consensus_error.to_string(), + "5rJccTdtJfg6AxSKyrptWUug3PWjveEitTTLqBn9wHdk document not for sale" + ); } #[test] - fn test_dpns_contract_references_with_no_contested_unique_index_null_searchable_true() { + fn test_document_set_price_and_purchase_with_enough_credits_to_buy_but_not_enough_to_pay_for_processing( + ) { let platform_version = PlatformVersion::latest(); - let mut platform = TestPlatformBuilder::new() - .with_latest_protocol_version() + let (mut platform, contract) = TestPlatformBuilder::new() .build_with_mock_rpc() - .set_genesis_state(); + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); let mut rng = StdRng::seed_from_u64(433); let platform_state = platform.state.load(); - let (identity_1, signer_1, key_1) = - setup_identity(&mut platform, 958, dash_to_credits!(0.5)); - - let (identity_2, signer_2, key_2) = - setup_identity(&mut platform, 93, dash_to_credits!(0.5)); - - let (identity_3, signer_3, key_3) = - setup_identity(&mut platform, 98, dash_to_credits!(0.5)); - - let dashpay_contract = setup_contract( - &platform.drive, - "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", - None, - None, - ); - - let card_game = setup_contract( - &platform.drive, - "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", - None, - None, - ); - - let dpns_contract = setup_contract( - &platform.drive, - "tests/supporting_files/contract/dpns/dpns-contract-contested-unique-index-with-contract-id-null-searchable-true.json", - None, - None, - ); - - let preorder = dpns_contract - .document_type_for_name("preorder") - .expect("expected a profile document type"); + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); - assert!(!preorder.documents_mutable()); - assert!(preorder.documents_can_be_deleted()); - assert!(!preorder.documents_transferable().is_transferable()); + let (receiver, recipient_signer, recipient_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); - let domain = dpns_contract - .document_type_for_name("domain") + let card_document_type = contract + .document_type_for_name("card") .expect("expected a profile document type"); - assert!(!domain.documents_mutable()); - // Deletion is disabled with data trigger - assert!(domain.documents_can_be_deleted()); - assert!(domain.documents_transferable().is_transferable()); + assert!(!card_document_type.documents_mutable()); let entropy = Bytes32::random_with_rng(&mut rng); - let mut preorder_document_1 = preorder + let mut document = card_document_type .random_document_with_identifier_and_entropy( &mut rng, - identity_1.id(), + identity.id(), entropy, - DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillType::DoNotFillIfNotRequired, DocumentFieldFillSize::AnyDocumentFillSize, platform_version, ) .expect("expected a random document"); - let mut preorder_document_2 = preorder - .random_document_with_identifier_and_entropy( - &mut rng, - identity_2.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + document.set("attack", 4.into()); + document.set("defense", 7.into()); - let mut preorder_document_3 = preorder - .random_document_with_identifier_and_entropy( - &mut rng, - identity_3.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, + let documents_batch_create_transition = + BatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, platform_version, + None, + None, + None, ) - .expect("expected a random document"); + .expect("expect to create documents batch transition"); - let mut document_1 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_1.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); - let mut document_2 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_2.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, - platform_version, - ) - .expect("expected a random document"); + let transaction = platform.drive.grove.start_transaction(); - let mut document_3 = domain - .random_document_with_identifier_and_entropy( - &mut rng, - identity_3.id(), - entropy, - DocumentFieldFillType::FillIfNotRequired, - DocumentFieldFillSize::AnyDocumentFillSize, + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, platform_version, + false, + None, ) - .expect("expected a random document"); - - document_1.set("parentDomainName", "dash".into()); - document_1.set("normalizedParentDomainName", "dash".into()); - document_1.set("label", "quantum123".into()); - document_1.set("normalizedLabel", "quantum123".into()); - document_1.set("records.contract", dashpay_contract.id().into()); - document_1.set("subdomainRules.allowSubdomains", false.into()); - - document_2.set("parentDomainName", "dash".into()); - document_2.set("normalizedParentDomainName", "dash".into()); - document_2.set("label", "van89".into()); - document_2.set("normalizedLabel", "van89".into()); - document_2.set("records.contract", card_game.id().into()); - document_2.set("subdomainRules.allowSubdomains", false.into()); - - document_3.set("parentDomainName", "dash".into()); - document_3.set("normalizedParentDomainName", "dash".into()); - document_3.set("label", "jazz65".into()); - document_3.set("normalizedLabel", "jazz65".into()); - document_3.set("records.identity", document_3.owner_id().into()); - document_3.set("subdomainRules.allowSubdomains", false.into()); - - let salt_1: [u8; 32] = rng.gen(); - let salt_2: [u8; 32] = rng.gen(); - let salt_3: [u8; 32] = rng.gen(); - - let mut salted_domain_buffer_1: Vec<u8> = vec![]; - salted_domain_buffer_1.extend(salt_1); - salted_domain_buffer_1.extend("quantum123.dash".as_bytes()); - - let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); - - let mut salted_domain_buffer_2: Vec<u8> = vec![]; - salted_domain_buffer_2.extend(salt_2); - salted_domain_buffer_2.extend("van89.dash".as_bytes()); - - let salted_domain_hash_2 = hash_double(salted_domain_buffer_2); - - let mut salted_domain_buffer_3: Vec<u8> = vec![]; - salted_domain_buffer_3.extend(salt_3); - salted_domain_buffer_3.extend("jazz65.dash".as_bytes()); - - let salted_domain_hash_3 = hash_double(salted_domain_buffer_3); + .expect("expected to process state transition"); - preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); - preorder_document_2.set("saltedDomainHash", salted_domain_hash_2.into()); - preorder_document_3.set("saltedDomainHash", salted_domain_hash_3.into()); + assert_eq!(processing_result.valid_count(), 1); - document_1.set("preorderSalt", salt_1.into()); - document_2.set("preorderSalt", salt_2.into()); - document_3.set("preorderSalt", salt_3.into()); + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_1, - preorder, - entropy.0, - &key_1, - 2, - 0, - &signer_1, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); - let documents_batch_create_serialized_preorder_transition_1 = - documents_batch_create_preorder_transition_1 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); - let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_2, - preorder, - entropy.0, - &key_2, - 2, - 0, - &signer_2, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + let receiver_documents_sql_string = + format!("select * from card where $ownerId == '{}'", receiver.id()); - let documents_batch_create_serialized_preorder_transition_2 = - documents_batch_create_preorder_transition_2 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + let query_receiver_identity_documents = DriveDocumentQuery::from_sql_expr( + receiver_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); - let documents_batch_create_preorder_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - preorder_document_3, - preorder, - entropy.0, - &key_3, - 2, - 0, - &signer_3, - platform_version, + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), None, + false, None, None, ) - .expect("expect to create documents batch transition"); - - let documents_batch_create_serialized_preorder_transition_3 = - documents_batch_create_preorder_transition_3 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + .expect("expected query result"); - let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_1, - domain, - entropy.0, - &key_1, - 3, - 0, - &signer_1, - platform_version, + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), None, + false, None, None, ) - .expect("expect to create documents batch transition"); + .expect("expected query result"); - let documents_batch_create_serialized_transition_1 = - documents_batch_create_transition_1 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + // We expect the sender to have 1 document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); - let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_2, - domain, - entropy.0, - &key_2, - 3, - 0, - &signer_2, - platform_version, - None, - None, - None, - ) - .expect("expect to create documents batch transition"); + assert_eq!(query_receiver_results.documents().len(), 0); - let documents_batch_create_serialized_transition_2 = - documents_batch_create_transition_2 - .serialize_to_bytes() - .expect("expected documents batch serialized state transition"); + document.set_revision(Some(2)); - let documents_batch_create_transition_3 = - DocumentsBatchTransition::new_document_creation_transition_from_document( - document_3.clone(), - domain, - entropy.0, - &key_3, + let documents_batch_update_price_transition = + BatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &key, 3, 0, - &signer_3, + &signer, platform_version, None, None, None, ) - .expect("expect to create documents batch transition"); + .expect("expect to create documents batch transition for the update price"); - let documents_batch_create_serialized_transition_3 = - documents_batch_create_transition_3 + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition .serialize_to_bytes() .expect("expected documents batch serialized state transition"); @@ -9127,13 +8983,9 @@ mod tests { let processing_result = platform .platform .process_raw_state_transitions( - &vec![ - documents_batch_create_serialized_preorder_transition_1.clone(), - documents_batch_create_serialized_preorder_transition_2.clone(), - documents_batch_create_serialized_preorder_transition_3.clone(), - ], + &vec![documents_batch_transfer_serialized_transition.clone()], &platform_state, - &BlockInfo::default(), + &BlockInfo::default_with_time(50000000), &transaction, platform_version, false, @@ -9148,109 +9000,7336 @@ mod tests { .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 3); + assert_eq!(processing_result.invalid_paid_count(), 0); - let transaction = platform.drive.grove.start_transaction(); + assert_eq!(processing_result.invalid_unpaid_count(), 0); - let processing_result = platform - .platform - .process_raw_state_transitions( - &vec![ - documents_batch_create_serialized_transition_1.clone(), - documents_batch_create_serialized_transition_2.clone(), - documents_batch_create_serialized_transition_3.clone(), - ], - &platform_state, - &BlockInfo::default(), - &transaction, - platform_version, - false, - None, - ) - .expect("expected to process state transition"); + assert_eq!(processing_result.valid_count(), 1); - platform - .drive - .grove + assert_eq!(processing_result.aggregated_fees().processing_fee, 2473880); + + let query_sender_results = platform + .drive + .query_documents( + query_sender_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + let query_receiver_results = platform + .drive + .query_documents( + query_receiver_identity_documents.clone(), + None, + false, + None, + None, + ) + .expect("expected query result"); + + // We expect the sender to still have their document, and the receiver to have none + assert_eq!(query_sender_results.documents().len(), 1); + + assert_eq!(query_receiver_results.documents().len(), 0); + + // The sender document should have the desired price + + let mut document = query_sender_results.documents_owned().remove(0); + + let price: Credits = document + .properties() + .get_integer("$price") + .expect("expected to get back price"); + + assert_eq!(dash_to_credits!(0.1), price); + + // At this point we want to have the receiver purchase the document + + document.set_revision(Some(3)); + + let documents_batch_purchase_transition = + BatchTransition::new_document_purchase_transition_from_document( + document.clone(), + card_document_type, + receiver.id(), + dash_to_credits!(0.1), //same price as requested + &recipient_key, + 1, // 1 because he's never done anything + 0, + &recipient_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the purchase"); + + let documents_batch_purchase_serialized_transition = + documents_batch_purchase_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_purchase_serialized_transition], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove .commit_transaction(transaction) .unwrap() .expect("expected to commit transaction"); - assert_eq!(processing_result.valid_count(), 3); + // nothing can go through because the purchaser doesn't have enough balance - let mut order_by = IndexMap::new(); + assert_eq!(processing_result.invalid_paid_count(), 0); - order_by.insert( - "records.identity".to_string(), - OrderClause { - field: "records.identity".to_string(), - ascending: true, - }, - ); + assert_eq!(processing_result.invalid_unpaid_count(), 1); - let drive_query = DriveDocumentQuery { - contract: &dpns_contract, - document_type: domain, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: Some(WhereClause { - field: "records.identity".to_string(), - operator: WhereOperator::LessThanOrEquals, - value: Value::Bytes32([255; 32]), - }), - equal_clauses: Default::default(), - }, - offset: None, - limit: None, - order_by, - start_at: None, - start_at_included: false, - block_time_ms: None, - }; + assert_eq!(processing_result.valid_count(), 0); - let documents = platform - .drive - .query_documents(drive_query, None, false, None, None) - .expect("expected to get back documents") - .documents_owned(); + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + } - // here we will get all 3 documents - assert_eq!(documents.len(), 3); + #[test] + fn test_document_set_price_on_not_owned_document() { + let platform_version = PlatformVersion::latest(); + let (mut platform, contract) = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure() + .with_crypto_card_game_nft(TradeMode::DirectPurchase); - let drive_query = DriveDocumentQuery { - contract: &dpns_contract, - document_type: domain, - internal_clauses: InternalClauses { - primary_key_in_clause: None, - primary_key_equal_clause: None, - in_clause: None, - range_clause: None, - equal_clauses: BTreeMap::from([( - "records.identity".to_string(), - WhereClause { - field: "records.identity".to_string(), - operator: WhereOperator::Equal, - value: Value::Null, - }, - )]), - }, - offset: None, - limit: None, - order_by: Default::default(), - start_at: None, - start_at_included: false, - block_time_ms: None, - }; + let mut rng = StdRng::seed_from_u64(433); - let documents = platform + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (other_identity, other_identity_signer, other_identity_key) = + setup_identity(&mut platform, 450, dash_to_credits!(0.1)); + + let card_document_type = contract + .document_type_for_name("card") + .expect("expected a profile document type"); + + assert!(!card_document_type.documents_mutable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut document = card_document_type + .random_document_with_identifier_and_entropy( + &mut rng, + identity.id(), + entropy, + DocumentFieldFillType::DoNotFillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document.set("attack", 4.into()); + document.set("defense", 7.into()); + + let documents_batch_create_transition = + BatchTransition::new_document_creation_transition_from_document( + document.clone(), + card_document_type, + entropy.0, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + platform .drive - .query_documents(drive_query, None, false, None, None) - .expect("expected to get back documents") - .documents_owned(); + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); - assert_eq!(documents.len(), 2); + document.set_revision(Some(2)); + + document.set_owner_id(other_identity.id()); // we do this to trick the system + + let documents_batch_update_price_transition = + BatchTransition::new_document_update_price_transition_from_document( + document.clone(), + card_document_type, + dash_to_credits!(0.1), + &other_identity_key, + 1, + 0, + &other_identity_signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition for the update price"); + + let documents_batch_transfer_serialized_transition = + documents_batch_update_price_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default_with_time(50000000), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 36200); + + let sender_documents_sql_string = + format!("select * from card where $ownerId == '{}'", identity.id()); + + let query_sender_identity_documents = DriveDocumentQuery::from_sql_expr( + sender_documents_sql_string.as_str(), + &contract, + Some(&platform.config.drive), + ) + .expect("expected document query"); + + let query_sender_results = platform + .drive + .query_documents(query_sender_identity_documents, None, false, None, None) + .expect("expected query result"); + + // The sender document should not have the desired price + + let document = query_sender_results.documents().first().unwrap(); + + assert_eq!( + document + .properties() + .get_optional_integer::<u64>("$price") + .expect("expected None"), + None + ); + } + } + + mod dpns_tests { + use super::*; + use crate::execution::validation::state_transition::tests::setup_identity; + use crate::test::helpers::setup::TestPlatformBuilder; + use dpp::dash_to_credits; + use dpp::data_contract::document_type::random_document::{ + DocumentFieldFillSize, DocumentFieldFillType, + }; + use dpp::data_contract::DataContract; + use dpp::platform_value::Bytes32; + use dpp::state_transition::batch_transition::BatchTransition; + use dpp::util::hash::hash_double; + use drive::query::{InternalClauses, OrderClause, WhereClause, WhereOperator}; + use drive::util::test_helpers::setup_contract; + use indexmap::IndexMap; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use std::collections::BTreeMap; + + #[test] + fn test_dpns_contract_references_with_no_contested_unique_index() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity_1, signer_1, key_1) = + setup_identity(&mut platform, 958, dash_to_credits!(0.5)); + + let (identity_2, signer_2, key_2) = + setup_identity(&mut platform, 93, dash_to_credits!(0.5)); + + let (identity_3, signer_3, key_3) = + setup_identity(&mut platform, 98, dash_to_credits!(0.5)); + + let dashpay_contract = setup_contract( + &platform.drive, + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let card_game = setup_contract( + &platform.drive, + "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let dpns_contract = setup_contract( + &platform.drive, + "tests/supporting_files/contract/dpns/dpns-contract-contested-unique-index-with-contract-id.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let preorder = dpns_contract + .document_type_for_name("preorder") + .expect("expected a profile document type"); + + assert!(!preorder.documents_mutable()); + assert!(preorder.documents_can_be_deleted()); + assert!(!preorder.documents_transferable().is_transferable()); + + let domain = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type"); + + assert!(!domain.documents_mutable()); + // Deletion is disabled with data trigger + assert!(domain.documents_can_be_deleted()); + assert!(domain.documents_transferable().is_transferable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut preorder_document_1 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut preorder_document_2 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_2.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut preorder_document_3 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_3.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_1 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_2 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_2.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_3 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_3.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document_1.set("parentDomainName", "dash".into()); + document_1.set("normalizedParentDomainName", "dash".into()); + document_1.set("label", "quantum123".into()); + document_1.set("normalizedLabel", "quantum123".into()); + document_1.set("records.contract", dashpay_contract.id().into()); + document_1.set("subdomainRules.allowSubdomains", false.into()); + + document_2.set("parentDomainName", "dash".into()); + document_2.set("normalizedParentDomainName", "dash".into()); + document_2.set("label", "van89".into()); + document_2.set("normalizedLabel", "van89".into()); + document_2.set("records.contract", card_game.id().into()); + document_2.set("subdomainRules.allowSubdomains", false.into()); + + document_3.set("parentDomainName", "dash".into()); + document_3.set("normalizedParentDomainName", "dash".into()); + document_3.set("label", "jazz65".into()); + document_3.set("normalizedLabel", "jazz65".into()); + document_3.set("records.identity", document_3.owner_id().into()); + document_3.set("subdomainRules.allowSubdomains", false.into()); + + let salt_1: [u8; 32] = rng.gen(); + let salt_2: [u8; 32] = rng.gen(); + let salt_3: [u8; 32] = rng.gen(); + + let mut salted_domain_buffer_1: Vec<u8> = vec![]; + salted_domain_buffer_1.extend(salt_1); + salted_domain_buffer_1.extend("quantum123.dash".as_bytes()); + + let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); + + let mut salted_domain_buffer_2: Vec<u8> = vec![]; + salted_domain_buffer_2.extend(salt_2); + salted_domain_buffer_2.extend("van89.dash".as_bytes()); + + let salted_domain_hash_2 = hash_double(salted_domain_buffer_2); + + let mut salted_domain_buffer_3: Vec<u8> = vec![]; + salted_domain_buffer_3.extend(salt_3); + salted_domain_buffer_3.extend("jazz65.dash".as_bytes()); + + let salted_domain_hash_3 = hash_double(salted_domain_buffer_3); + + preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); + preorder_document_2.set("saltedDomainHash", salted_domain_hash_2.into()); + preorder_document_3.set("saltedDomainHash", salted_domain_hash_3.into()); + + document_1.set("preorderSalt", salt_1.into()); + document_2.set("preorderSalt", salt_2.into()); + document_3.set("preorderSalt", salt_3.into()); + + let documents_batch_create_preorder_transition_1 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_1, + preorder, + entropy.0, + &key_1, + 2, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_1 = + documents_batch_create_preorder_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_preorder_transition_2 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_2, + preorder, + entropy.0, + &key_2, + 2, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_2 = + documents_batch_create_preorder_transition_2 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_preorder_transition_3 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_3, + preorder, + entropy.0, + &key_3, + 2, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_3 = + documents_batch_create_preorder_transition_3 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_1 = + BatchTransition::new_document_creation_transition_from_document( + document_1, + domain, + entropy.0, + &key_1, + 3, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_1 = + documents_batch_create_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_2 = + BatchTransition::new_document_creation_transition_from_document( + document_2, + domain, + entropy.0, + &key_2, + 3, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_2 = + documents_batch_create_transition_2 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_3 = + BatchTransition::new_document_creation_transition_from_document( + document_3.clone(), + domain, + entropy.0, + &key_3, + 3, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_3 = + documents_batch_create_transition_3 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![ + documents_batch_create_serialized_preorder_transition_1.clone(), + documents_batch_create_serialized_preorder_transition_2.clone(), + documents_batch_create_serialized_preorder_transition_3.clone(), + ], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 3); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![ + documents_batch_create_serialized_transition_1.clone(), + documents_batch_create_serialized_transition_2.clone(), + documents_batch_create_serialized_transition_3.clone(), + ], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 3); + + let mut order_by = IndexMap::new(); + + order_by.insert( + "records.identity".to_string(), + OrderClause { + field: "records.identity".to_string(), + ascending: true, + }, + ); + + let drive_query = DriveDocumentQuery { + contract: &dpns_contract, + document_type: domain, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: Some(WhereClause { + field: "records.identity".to_string(), + operator: WhereOperator::LessThanOrEquals, + value: Value::Bytes32([255; 32]), + }), + equal_clauses: Default::default(), + }, + offset: None, + limit: None, + order_by, + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + let transient_fields = domain + .transient_fields() + .iter() + .map(|a| a.as_str()) + .collect(); + + assert!(documents + .get(0) + .expect("expected a document") + .is_equal_ignoring_time_based_fields( + &document_3, + Some(transient_fields), + platform_version + ) + .expect("expected to run is equal")); + + let drive_query = DriveDocumentQuery { + contract: &dpns_contract, + document_type: domain, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([( + "records.identity".to_string(), + WhereClause { + field: "records.identity".to_string(), + operator: WhereOperator::Equal, + value: Value::Null, + }, + )]), + }, + offset: None, + limit: None, + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + // This is normal because we set that we could not query on null + assert_eq!(documents.len(), 0); + } + + #[test] + fn test_dpns_contract_references_with_no_contested_unique_index_null_searchable_true() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(433); + + let platform_state = platform.state.load(); + + let (identity_1, signer_1, key_1) = + setup_identity(&mut platform, 958, dash_to_credits!(0.5)); + + let (identity_2, signer_2, key_2) = + setup_identity(&mut platform, 93, dash_to_credits!(0.5)); + + let (identity_3, signer_3, key_3) = + setup_identity(&mut platform, 98, dash_to_credits!(0.5)); + + let dashpay_contract = setup_contract( + &platform.drive, + "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let card_game = setup_contract( + &platform.drive, + "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let dpns_contract = setup_contract( + &platform.drive, + "tests/supporting_files/contract/dpns/dpns-contract-contested-unique-index-with-contract-id-null-searchable-true.json", + None, + None, + None::<fn(&mut DataContract)>, + None, + None, + ); + + let preorder = dpns_contract + .document_type_for_name("preorder") + .expect("expected a profile document type"); + + assert!(!preorder.documents_mutable()); + assert!(preorder.documents_can_be_deleted()); + assert!(!preorder.documents_transferable().is_transferable()); + + let domain = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type"); + + assert!(!domain.documents_mutable()); + // Deletion is disabled with data trigger + assert!(domain.documents_can_be_deleted()); + assert!(domain.documents_transferable().is_transferable()); + + let entropy = Bytes32::random_with_rng(&mut rng); + + let mut preorder_document_1 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut preorder_document_2 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_2.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut preorder_document_3 = preorder + .random_document_with_identifier_and_entropy( + &mut rng, + identity_3.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_1 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_1.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_2 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_2.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + let mut document_3 = domain + .random_document_with_identifier_and_entropy( + &mut rng, + identity_3.id(), + entropy, + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + platform_version, + ) + .expect("expected a random document"); + + document_1.set("parentDomainName", "dash".into()); + document_1.set("normalizedParentDomainName", "dash".into()); + document_1.set("label", "quantum123".into()); + document_1.set("normalizedLabel", "quantum123".into()); + document_1.set("records.contract", dashpay_contract.id().into()); + document_1.set("subdomainRules.allowSubdomains", false.into()); + + document_2.set("parentDomainName", "dash".into()); + document_2.set("normalizedParentDomainName", "dash".into()); + document_2.set("label", "van89".into()); + document_2.set("normalizedLabel", "van89".into()); + document_2.set("records.contract", card_game.id().into()); + document_2.set("subdomainRules.allowSubdomains", false.into()); + + document_3.set("parentDomainName", "dash".into()); + document_3.set("normalizedParentDomainName", "dash".into()); + document_3.set("label", "jazz65".into()); + document_3.set("normalizedLabel", "jazz65".into()); + document_3.set("records.identity", document_3.owner_id().into()); + document_3.set("subdomainRules.allowSubdomains", false.into()); + + let salt_1: [u8; 32] = rng.gen(); + let salt_2: [u8; 32] = rng.gen(); + let salt_3: [u8; 32] = rng.gen(); + + let mut salted_domain_buffer_1: Vec<u8> = vec![]; + salted_domain_buffer_1.extend(salt_1); + salted_domain_buffer_1.extend("quantum123.dash".as_bytes()); + + let salted_domain_hash_1 = hash_double(salted_domain_buffer_1); + + let mut salted_domain_buffer_2: Vec<u8> = vec![]; + salted_domain_buffer_2.extend(salt_2); + salted_domain_buffer_2.extend("van89.dash".as_bytes()); + + let salted_domain_hash_2 = hash_double(salted_domain_buffer_2); + + let mut salted_domain_buffer_3: Vec<u8> = vec![]; + salted_domain_buffer_3.extend(salt_3); + salted_domain_buffer_3.extend("jazz65.dash".as_bytes()); + + let salted_domain_hash_3 = hash_double(salted_domain_buffer_3); + + preorder_document_1.set("saltedDomainHash", salted_domain_hash_1.into()); + preorder_document_2.set("saltedDomainHash", salted_domain_hash_2.into()); + preorder_document_3.set("saltedDomainHash", salted_domain_hash_3.into()); + + document_1.set("preorderSalt", salt_1.into()); + document_2.set("preorderSalt", salt_2.into()); + document_3.set("preorderSalt", salt_3.into()); + + let documents_batch_create_preorder_transition_1 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_1, + preorder, + entropy.0, + &key_1, + 2, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_1 = + documents_batch_create_preorder_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_preorder_transition_2 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_2, + preorder, + entropy.0, + &key_2, + 2, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_2 = + documents_batch_create_preorder_transition_2 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_preorder_transition_3 = + BatchTransition::new_document_creation_transition_from_document( + preorder_document_3, + preorder, + entropy.0, + &key_3, + 2, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_preorder_transition_3 = + documents_batch_create_preorder_transition_3 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_1 = + BatchTransition::new_document_creation_transition_from_document( + document_1, + domain, + entropy.0, + &key_1, + 3, + 0, + &signer_1, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_1 = + documents_batch_create_transition_1 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_2 = + BatchTransition::new_document_creation_transition_from_document( + document_2, + domain, + entropy.0, + &key_2, + 3, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_2 = + documents_batch_create_transition_2 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let documents_batch_create_transition_3 = + BatchTransition::new_document_creation_transition_from_document( + document_3.clone(), + domain, + entropy.0, + &key_3, + 3, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition_3 = + documents_batch_create_transition_3 + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![ + documents_batch_create_serialized_preorder_transition_1.clone(), + documents_batch_create_serialized_preorder_transition_2.clone(), + documents_batch_create_serialized_preorder_transition_3.clone(), + ], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 3); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![ + documents_batch_create_serialized_transition_1.clone(), + documents_batch_create_serialized_transition_2.clone(), + documents_batch_create_serialized_transition_3.clone(), + ], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + assert_eq!(processing_result.valid_count(), 3); + + let mut order_by = IndexMap::new(); + + order_by.insert( + "records.identity".to_string(), + OrderClause { + field: "records.identity".to_string(), + ascending: true, + }, + ); + + let drive_query = DriveDocumentQuery { + contract: &dpns_contract, + document_type: domain, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: Some(WhereClause { + field: "records.identity".to_string(), + operator: WhereOperator::LessThanOrEquals, + value: Value::Bytes32([255; 32]), + }), + equal_clauses: Default::default(), + }, + offset: None, + limit: None, + order_by, + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + // here we will get all 3 documents + assert_eq!(documents.len(), 3); + + let drive_query = DriveDocumentQuery { + contract: &dpns_contract, + document_type: domain, + internal_clauses: InternalClauses { + primary_key_in_clause: None, + primary_key_equal_clause: None, + in_clause: None, + range_clause: None, + equal_clauses: BTreeMap::from([( + "records.identity".to_string(), + WhereClause { + field: "records.identity".to_string(), + operator: WhereOperator::Equal, + value: Value::Null, + }, + )]), + }, + offset: None, + limit: None, + order_by: Default::default(), + start_at: None, + start_at_included: false, + block_time_ms: None, + }; + + let documents = platform + .drive + .query_documents(drive_query, None, false, None, None) + .expect("expected to get back documents") + .documents_owned(); + + assert_eq!(documents.len(), 2); + } + } + + mod token_tests { + use super::*; + use crate::execution::validation::state_transition::tests::create_token_contract_with_owner_identity; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Setters; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationConventionV0; + use dpp::data_contract::associated_token::token_configuration_convention::v0::TokenConfigurationLocalizationsV0; + use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Setters; + use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; + use dpp::data_contract::change_control_rules::v0::ChangeControlRulesV0; + use dpp::data_contract::change_control_rules::ChangeControlRules; + use dpp::group::GroupStateTransitionInfoStatus; + use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; + use dpp::state_transition::batch_transition::TokenConfigUpdateTransition; + mod token_mint_tests { + use super::*; + + mod token_mint_tests_normal_scenarios { + use super::*; + + #[test] + fn test_token_mint_by_owner_allowed_sending_to_self() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + } + + #[test] + fn test_token_mint_by_owner_can_not_mint_past_max_supply() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply(Some(1000000)); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 2000000, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::TokenMintPastMaxSupplyError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owner_allowed_sending_to_other() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (receiver, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(receiver.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + receiver.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(1337)); + } + + #[test] + fn test_token_mint_sending_to_non_existing_identity_causes_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let receiver = Identifier::random_with_rng(&mut rng); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(receiver), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::RecipientIdentityDoesNotExistError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + receiver.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owner_no_destination_causes_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::DestinationIdentityForTokenMintingNotSetError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } + + mod token_mint_tests_no_recipient_minting { + use super::*; + + #[test] + fn test_token_mint_by_owned_id_allowed_sending_to_self() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::ChoosingTokenMintRecipientNotAllowedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owned_id_allowed_sending_to_other() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (receiver, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(receiver.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::ChoosingTokenMintRecipientNotAllowedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + receiver.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owned_id_no_destination_causes_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::DestinationIdentityForTokenMintingNotSetError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } + + mod token_mint_tests_contract_has_recipient { + use super::*; + + #[test] + fn test_token_mint_by_owned_id_allowed_sending_to_self() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + token_configuration + .distribution_rules_mut() + .set_new_tokens_destination_identity(Some(identity.id())); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::ChoosingTokenMintRecipientNotAllowedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owned_id_allowed_sending_to_other() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (receiver, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + token_configuration + .distribution_rules_mut() + .set_new_tokens_destination_identity(Some(identity.id())); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(receiver.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::ChoosingTokenMintRecipientNotAllowedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + receiver.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owned_id_no_set_destination_should_use_contracts() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); + token_configuration + .distribution_rules_mut() + .set_new_tokens_destination_identity(Some(identity.id())); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + } + } + + mod token_mint_tests_authorization_scenarios { + use super::*; + use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; + use dpp::data_contract::change_control_rules::v0::ChangeControlRulesV0; + use dpp::data_contract::change_control_rules::ChangeControlRules; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; + use dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; + use dpp::state_transition::batch_transition::TokenMintTransition; + + #[test] + fn test_token_mint_by_owner_sending_to_self_minting_not_allowed() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::NoOne, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + None, + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owner_sending_to_self_minting_only_allowed_by_group() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 5), (identity_2.id(), 5)].into(), + required_power: 10, + }), + )] + .into(), + ), + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owner_sending_to_self_minting_only_allowed_by_group_enough_member_power( + ) { + // We are using a group, but our member alone has enough power in the group to do the action + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 5), (identity_2.id(), 1)].into(), + required_power: 5, + }), + )] + .into(), + ), + platform_version, + ); + + let documents_batch_create_transition = + BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + } + + #[test] + fn test_token_mint_by_owner_requires_group_other_member() { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + // Now we need to get the second identity to also sign it + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owner_requires_group_resubmitting_causes_error() { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + // Now we need to get the second identity to also sign it, but we are going to resubmit with first + // This will create an error + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::GroupActionAlreadySignedByIdentityError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owner_requires_group_other_member_resubmitting_causes_error() + { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_3, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_2.id(), 1), + (identity_3.id(), 1), + ] + .into(), + required_power: 3, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + // Now we need to get the second identity to also sign it + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + + // Now we need to get the second identity to sign it again to cause the error + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 3, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::GroupActionAlreadySignedByIdentityError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owner_requires_group_other_member_submitting_after_completion_causes_error( + ) { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_3, signer3, key3) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_2.id(), 1), + (identity_3.id(), 1), + ] + .into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + // Now we need to get the second identity to also sign it + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + + // Now we need to get the second identity to sign it again to cause the error + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_3.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key3, + 2, + 0, + &signer3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::GroupActionAlreadyCompletedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(101337)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_by_owner_requires_group_proposer_not_in_group() { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_3, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity_3.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::IdentityNotMemberOfGroupError( + _ + )), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_mint_by_owner_requires_group_other_signer_not_part_of_group() { + // We are using a group, and two members need to sign for the event to happen + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_3, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_3.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + // Now we need to get the second identity to also sign it + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::IdentityNotMemberOfGroupError( + _ + )), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_mint_other_signer_going_first_causes_error() { + // We are using a group, and the second member gets a bit hasty and signs first + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + // The second identity to also sign it + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + let confirm_token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let confirm_token_mint_serialized_transition = confirm_token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![confirm_token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::GroupActionDoesNotExistError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + } + } + + mod token_burn_tests { + use super::*; + + #[test] + fn test_token_burn() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = BatchTransition::new_token_burn_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000 - 1337; + assert_eq!(token_balance, Some(expected_amount)); + } + + #[test] + fn test_token_burn_trying_to_burn_more_than_we_have() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = BatchTransition::new_token_burn_transition( + token_id, + identity.id(), + contract.id(), + 0, + 200000, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::IdentityDoesNotHaveEnoughTokenBalanceError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); // nothing was burned + } + + #[test] + fn test_token_burn_gives_error_if_trying_to_burn_from_not_allowed_identity() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (contract_owner_identity, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + contract_owner_identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let documents_batch_create_transition = BatchTransition::new_token_burn_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let documents_batch_create_serialized_transition = + documents_batch_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![documents_batch_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + contract_owner_identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + } + + mod token_transfer_tests { + use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; + use dpp::data_contract::change_control_rules::ChangeControlRules; + use dpp::data_contract::change_control_rules::v0::ChangeControlRulesV0; + use dpp::data_contract::group::Group; + use dpp::state_transition::batch_transition::TokenMintTransition; + use dpp::data_contract::group::v0::GroupV0; + use dpp::group::{GroupStateTransitionInfo, GroupStateTransitionInfoStatus}; + use dpp::identity::SecurityLevel; + use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; + use dpp::state_transition::batch_transition::batched_transition::token_transition::TokenTransition; + use dpp::state_transition::StateTransition; + use dpp::state_transition::batch_transition::batched_transition::BatchedTransitionMutRef; + use dpp::state_transition::batch_transition::token_base_transition::token_base_transition_accessors::TokenBaseTransitionAccessors; + use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; + use super::*; + + #[test] + fn test_token_transfer() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (recipient, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + recipient.id(), + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000 - 1337; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 1337; + assert_eq!(token_balance, Some(expected_amount)); + } + + #[test] + fn test_token_transfer_to_ourself_should_fail() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + identity.id(), + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::UnpaidConsensusError( + ConsensusError::BasicError(BasicError::TokenTransferToOurselfError(_)) + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(100000)); + } + + #[test] + fn test_token_transfer_trying_to_send_more_than_we_have() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (recipient, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + None::<fn(&mut TokenConfiguration)>, + None, + platform_version, + ); + + let token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + identity.id(), + contract.id(), + 0, + 200000, + recipient.id(), + None, + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::IdentityDoesNotHaveEnoughTokenBalanceError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_token_transfer_adding_group_info_causes_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (recipient, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + // let's start by creating a real action + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (recipient.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let token_mint_transition = BatchTransition::new_token_mint_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + Some(identity.id()), + None, + Some(GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0)), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_mint_serialized_transition = token_mint_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_mint_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let action_id = TokenMintTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + 1337, + ); + + let mut token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + identity.id(), + contract.id(), + 0, + 200000, + recipient.id(), + None, + None, + None, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + // here we add fake info + match &mut token_transfer_transition { + StateTransition::Batch(batch) => { + let first_transition = batch + .first_transition_mut() + .expect("expected_first_transition"); + match first_transition { + BatchedTransitionMutRef::Token(token) => match token { + TokenTransition::Transfer(transfer) => transfer + .base_mut() + .set_using_group_info(Some(GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: true, + })), + _ => {} + }, + _ => {} + } + } + _ => {} + } + + token_transfer_transition + .sign_external(&key, &signer, Some(|_, _| Ok(SecurityLevel::HIGH))) + .expect("expected to resign transaction"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::UnpaidConsensusError( + ConsensusError::BasicError( + BasicError::GroupActionNotAllowedOnTransitionError(_) + ) + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + } + + mod token_freeze_tests { + use super::*; + use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; + + #[test] + fn test_token_freeze() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_freeze_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + None, + platform_version, + ); + + let freeze_transition = BatchTransition::new_token_freeze_transition( + token_id, + identity.id(), + contract.id(), + 0, + identity_2.id(), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let freeze_serialized_transition = freeze_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![freeze_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_frozen = platform + .drive + .fetch_identity_token_info( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token info") + .map(|info| info.frozen()); + assert_eq!(token_frozen, Some(true)); + } + + #[test] + fn test_token_freeze_and_unfreeze() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_freeze_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + token_configuration.set_unfreeze_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + None, + platform_version, + ); + + let freeze_transition = BatchTransition::new_token_freeze_transition( + token_id, + identity.id(), + contract.id(), + 0, + identity_2.id(), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let freeze_serialized_transition = freeze_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![freeze_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_frozen = platform + .drive + .fetch_identity_token_info( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token info") + .map(|info| info.frozen()); + assert_eq!(token_frozen, Some(true)); + + let unfreeze_transition = BatchTransition::new_token_unfreeze_transition( + token_id, + identity.id(), + contract.id(), + 0, + identity_2.id(), + None, + None, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let unfreeze_serialized_transition = unfreeze_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![unfreeze_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_frozen = platform + .drive + .fetch_identity_token_info( + token_id.to_buffer(), + identity_2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token info") + .map(|info| info.frozen()); + assert_eq!(token_frozen, Some(false)); + } + + #[test] + fn test_token_frozen_receive_balance_allowed_sending_not_allowed_till_unfrozen() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (recipient, signer2, key2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_freeze_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + token_configuration.set_unfreeze_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + }), + None, + platform_version, + ); + + let freeze_transition = BatchTransition::new_token_freeze_transition( + token_id, + identity.id(), + contract.id(), + 0, + recipient.id(), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let freeze_serialized_transition = freeze_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![freeze_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_frozen = platform + .drive + .fetch_identity_token_info( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token info") + .map(|info| info.frozen()); + assert_eq!(token_frozen, Some(true)); + + let token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + identity.id(), + contract.id(), + 0, + 1337, + recipient.id(), + None, + None, + None, + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000 - 1337; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 1337; + assert_eq!(token_balance, Some(expected_amount)); + + //now let's try sending our balance + + let token_transfer_back_transition = + BatchTransition::new_token_transfer_transition( + token_id, + recipient.id(), + contract.id(), + 0, + 300, + identity.id(), + None, + None, + None, + &key2, + 2, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_back_serialized_transition = token_transfer_back_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_back_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::IdentityTokenAccountFrozenError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // We expect no change + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000 - 1337; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 1337; + assert_eq!(token_balance, Some(expected_amount)); + + let unfreeze_transition = BatchTransition::new_token_unfreeze_transition( + token_id, + identity.id(), + contract.id(), + 0, + recipient.id(), + None, + None, + &key, + 4, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let unfreeze_serialized_transition = unfreeze_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![unfreeze_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_frozen = platform + .drive + .fetch_identity_token_info( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token info") + .map(|info| info.frozen()); + assert_eq!(token_frozen, Some(false)); + + let token_transfer_transition = BatchTransition::new_token_transfer_transition( + token_id, + recipient.id(), + contract.id(), + 0, + 300, + identity.id(), + None, + None, + None, + &key2, + 3, + 0, + &signer2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let token_transfer_serialized_transition = token_transfer_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![token_transfer_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 100000 - 1337 + 300; + assert_eq!(token_balance, Some(expected_amount)); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id.to_buffer(), + recipient.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + let expected_amount = 1337 - 300; + assert_eq!(token_balance, Some(expected_amount)); + } + } + + mod token_config_update_tests { + use super::*; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention; + use dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; + + mod non_group { + use super::*; + #[test] + fn test_token_config_update_by_owner_changing_total_max_supply() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), Some(1000000)); + } + + #[test] + fn test_token_config_update_by_owner_changing_total_max_supply_to_less_than_current_supply( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000)), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::TokenSettingMaxSupplyToLessThanCurrentSupplyError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), None); + } + + #[test] + fn test_token_config_update_by_owner_change_admin_to_another_identity() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer_2, key_2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::ContractOwner, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::Identity(identity_2.id()), + ), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)), + None, + None, + &key_2, + 2, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), Some(1000000)); + } + + #[test] + fn test_token_config_update_by_owner_change_admin_to_a_non_existent_identity_error() + { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let identity_2_id = Identifier::random_with_rng(&mut rng); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::ContractOwner, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::Identity(identity_2_id), + ), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerIdentityDoesNotExistError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_token_config_update_by_owner_change_admin_to_a_non_existent_group_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::ContractOwner, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::Group(0), + ), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerGroupDoesNotExistError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_token_config_update_by_owner_change_admin_to_main_group_not_set_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: + AuthorizedActionTakers::ContractOwner, + admin_action_takers: AuthorizedActionTakers::ContractOwner, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + None, + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupplyControlGroup( + AuthorizedActionTakers::MainGroup, + ), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::NewAuthorizedActionTakerMainGroupNotSetError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } + + mod with_group { + use super::*; + + #[test] + fn test_token_config_update_by_group_member_changing_total_max_supply_not_using_group_gives_error( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, _, _) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)), + None, + None, + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), None); + } + + #[test] + fn test_token_config_update_by_group_member_changing_total_max_supply() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer_2, key_2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_max_supply_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::NoOne, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }), + ); + }), + Some( + [( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + )] + .into(), + ), + platform_version, + ); + + let action_id = TokenConfigUpdateTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)).u8_item_index(), + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0), + ), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), None); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::MaxSupply(Some(1000000)), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id, + action_is_proposer: false, + }, + ), + ), + &key_2, + 2, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!(updated_token_config.max_supply(), Some(1000000)); + } + + #[test] + fn test_token_config_change_own_admin_group_give_control_power_and_change_admin_back( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .with_latest_protocol_version() + .build_with_mock_rpc() + .set_genesis_state(); + + let mut rng = StdRng::seed_from_u64(49853); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_2, signer_2, key_2) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_3, signer_3, key_3) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_4, signer_4, key_4) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (identity_5, signer_5, key_5) = + setup_identity(&mut platform, rng.gen(), dash_to_credits!(0.5)); + + let (contract, token_id) = create_token_contract_with_owner_identity( + &mut platform, + identity.id(), + Some(|token_configuration: &mut TokenConfiguration| { + token_configuration.set_conventions_change_rules( + ChangeControlRules::V0(ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::Group(1), + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: true, + }), + ); + }), + Some( + [ + ( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [ + (identity_3.id(), 1), + (identity_4.id(), 1), + (identity_5.id(), 1), + ] + .into(), + required_power: 2, + }), + ), + ] + .into(), + ), + platform_version, + ); + + let action_id = TokenConfigUpdateTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity_3.id().as_bytes(), + 2, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(0), + ) + .u8_item_index(), + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_3.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(0), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(1), + ), + &key_3, + 2, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!( + updated_token_config + .conventions_change_rules() + .admin_action_takers(), + &AuthorizedActionTakers::Group(1) + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_4.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(0), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 1, + action_id, + action_is_proposer: false, + }, + ), + ), + &key_4, + 2, + 0, + &signer_4, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!( + updated_token_config + .conventions_change_rules() + .admin_action_takers(), + &AuthorizedActionTakers::Group(0) + ); + assert_eq!(new_contract.contract.version(), 2); + + // 5 is late to the game, admin control has already been transferred, he should get an error + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_5.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(0), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 1, + action_id, + action_is_proposer: false, + }, + ), + ), + &key_5, + 2, + 0, + &signer_5, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError( + StateError::GroupActionAlreadyCompletedError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Let's try if he proposes it now + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_5.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(0), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(1), + ), + &key_5, + 3, + 0, + &signer_5, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Now let's have Group 0 change the control of the conventions to identity 2 only + + let action_id_change_control = + TokenConfigUpdateTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 2, + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::Identity(identity_2.id()), + ) + .u8_item_index(), + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::Identity(identity_2.id()), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0), + ), + &key, + 2, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsControlGroup( + AuthorizedActionTakers::Identity(identity_2.id()), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id: action_id_change_control, + action_is_proposer: false, + }, + ), + ), + &key_2, + 2, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!( + updated_token_config + .conventions_change_rules() + .authorized_to_make_change_action_takers(), + &AuthorizedActionTakers::Identity(identity_2.id()) + ); + assert_eq!(new_contract.contract.version(), 3); + + // Now let's have Group 0 hand it back to Group 1 + + let action_id_return = + TokenConfigUpdateTransition::calculate_action_id_with_fields( + token_id.as_bytes(), + identity.id().as_bytes(), + 3, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(1), + ) + .u8_item_index(), + ); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(1), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoProposer(0), + ), + &key, + 3, + 0, + &signer, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::ConventionsAdminGroup( + AuthorizedActionTakers::Group(1), + ), + None, + Some( + GroupStateTransitionInfoStatus::GroupStateTransitionInfoOtherSigner( + GroupStateTransitionInfo { + group_contract_position: 0, + action_id: action_id_return, + action_is_proposer: false, + }, + ), + ), + &key_2, + 3, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let new_contract = platform + .drive + .fetch_contract( + contract.id().to_buffer(), + None, + None, + None, + platform_version, + ) + .unwrap() + .expect("expected to fetch token balance") + .expect("expected contract"); + let updated_token_config = new_contract + .contract + .expected_token_configuration(0) + .expect("expected token configuration"); + assert_eq!( + updated_token_config + .conventions_change_rules() + .admin_action_takers(), + &AuthorizedActionTakers::Group(1) + ); + assert_eq!(new_contract.contract.version(), 4); + + // Not let's try identity 3 to change the conventions (should fail) + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_3.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::Conventions( + TokenConfigurationConvention::V0(TokenConfigurationConventionV0 { + localizations: [( + "en".to_string(), + TokenConfigurationLocalizationsV0 { + should_capitalize: true, + singular_form: "garzon".to_string(), + plural_form: "garzons".to_string(), + }, + )] + .into(), + decimals: 8, + }), + ), + None, + None, + &key_3, + 3, + 0, + &signer_3, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::UnauthorizedTokenActionError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + // Not let's try identity 2 to change the conventions (should succeed) + + let config_update_transition = + BatchTransition::new_token_config_update_transition( + token_id, + identity_2.id(), + contract.id(), + 0, + TokenConfigurationChangeItem::Conventions( + TokenConfigurationConvention::V0(TokenConfigurationConventionV0 { + localizations: [( + "en".to_string(), + TokenConfigurationLocalizationsV0 { + should_capitalize: true, + singular_form: "garzon".to_string(), + plural_form: "garzons".to_string(), + }, + )] + .into(), + decimals: 8, + }), + ), + None, + None, + &key_2, + 4, + 0, + &signer_2, + platform_version, + None, + None, + None, + ) + .expect("expect to create documents batch transition"); + + let config_update_transition_serialized_transition = config_update_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![config_update_transition_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } } } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/data_triggers.rs similarity index 76% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/data_triggers.rs index 47a71a2e699..554fac68077 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/data_triggers.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/data_triggers.rs @@ -1,11 +1,11 @@ use crate::error::Error; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{ +use crate::execution::validation::state_transition::batch::data_triggers::{ data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutionResult, DataTriggerExecutor, }; use dpp::version::PlatformVersion; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; #[allow(dead_code)] #[deprecated(note = "This function is marked as unused.")] @@ -18,12 +18,6 @@ pub(super) fn execute_data_triggers( let data_trigger_bindings = data_trigger_bindings_list(platform_version)?; for document_transition_action in document_transition_actions { - if matches!( - document_transition_action, - DocumentTransitionAction::BumpIdentityDataContractNonce(_) - ) { - continue; - } let data_trigger_execution_result = document_transition_action .validate_with_data_triggers(&data_trigger_bindings, context, platform_version)?; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_contender.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_contender.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_contender.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_documents.rs similarity index 97% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_documents.rs index 8db9245d3f0..c206b54bd57 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/fetch_documents.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/fetch_documents.rs @@ -14,10 +14,10 @@ use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use dpp::document::Document; use dpp::fee::fee_result::FeeResult; use dpp::platform_value::{Identifier, Value}; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{ +use dpp::state_transition::batch_transition::batched_transition::document_transition::{ DocumentTransition, DocumentTransitionV0Methods, }; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; use dpp::validation::ConsensusValidationResult; use dpp::version::PlatformVersion; use drive::drive::document::query::query_contested_documents_storage::QueryContestedDocumentsOutcomeV0Methods; diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/mod.rs new file mode 100644 index 00000000000..6db47d9f743 --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/state/v0/mod.rs @@ -0,0 +1,313 @@ +use dpp::block::block_info::BlockInfo; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::state_error::StateError; +use dpp::prelude::ConsensusValidationResult; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransitionLike; +use drive::state_transition_action::StateTransitionAction; +use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; +use drive::grovedb::TransactionArg; +use drive::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use drive::state_transition_action::batch::BatchTransitionAction; +use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use crate::error::Error; +use crate::error::execution::ExecutionError; +use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; +use crate::execution::validation::state_transition::batch::action_validation::document::document_create_transition_action::DocumentCreateTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_delete_transition_action::DocumentDeleteTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_replace_transition_action::DocumentReplaceTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_transfer_transition_action::DocumentTransferTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::document::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_burn_transition_action::TokenBurnTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_config_update_transition_action::TokenConfigUpdateTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_emergency_action_transition_action::TokenEmergencyActionTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_freeze_transition_action::TokenFreezeTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_mint_transition_action::TokenMintTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_transfer_transition_action::TokenTransferTransitionActionValidation; +use crate::execution::validation::state_transition::batch::action_validation::token::token_unfreeze_transition_action::TokenUnfreezeTransitionActionValidation; +use crate::execution::validation::state_transition::batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; +use crate::platform_types::platform::{PlatformStateRef}; +use crate::execution::validation::state_transition::state_transitions::batch::transformer::v0::BatchTransitionTransformerV0; +use crate::execution::validation::state_transition::ValidationMode; +use crate::platform_types::platform_state::v0::PlatformStateV0Methods; + +mod data_triggers; +pub mod fetch_contender; +pub mod fetch_documents; + +pub(in crate::execution::validation::state_transition::state_transitions::batch) trait DocumentsBatchStateTransitionStateValidationV0 +{ + fn validate_state_v0( + &self, + action: BatchTransitionAction, + platform: &PlatformStateRef, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + tx: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; + + fn transform_into_action_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + validation_mode: ValidationMode, + tx: TransactionArg, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; +} + +impl DocumentsBatchStateTransitionStateValidationV0 for BatchTransition { + fn validate_state_v0( + &self, + mut state_transition_action: BatchTransitionAction, + platform: &PlatformStateRef, + block_info: &BlockInfo, + execution_context: &mut StateTransitionExecutionContext, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { + let mut validation_result = ConsensusValidationResult::<StateTransitionAction>::new(); + + let state_transition_execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version)?; + + let owner_id = state_transition_action.owner_id(); + + let mut validated_transitions = vec![]; + + let data_trigger_bindings = if platform.config.execution.use_document_triggers { + data_trigger_bindings_list(platform_version)? + } else { + vec![] + }; + + // Next we need to validate the structure of all actions (this means with the data contract) + for transition in state_transition_action.transitions_take() { + let transition_validation_result = match &transition { + BatchedTransitionAction::DocumentAction(document_action) => match document_action { + DocumentTransitionAction::CreateAction(create_action) => create_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + DocumentTransitionAction::ReplaceAction(replace_action) => replace_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + DocumentTransitionAction::TransferAction(transfer_action) => transfer_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + DocumentTransitionAction::DeleteAction(delete_action) => delete_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + DocumentTransitionAction::UpdatePriceAction(update_price_action) => { + update_price_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )? + } + DocumentTransitionAction::PurchaseAction(purchase_action) => purchase_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + }, + BatchedTransitionAction::TokenAction(token_action) => match token_action { + TokenTransitionAction::BurnAction(burn_action) => burn_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::MintAction(mint_action) => mint_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::TransferAction(transfer_action) => transfer_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::FreezeAction(freeze_action) => freeze_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::UnfreezeAction(unfreeze_action) => unfreeze_action + .validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::EmergencyActionAction(emergency_action_action) => { + emergency_action_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )? + } + TokenTransitionAction::DestroyFrozenFundsAction( + destroy_frozen_funds_action, + ) => destroy_frozen_funds_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )?, + TokenTransitionAction::ConfigUpdateAction(config_update_action) => { + config_update_action.validate_state( + platform, + owner_id, + block_info, + execution_context, + transaction, + platform_version, + )? + } + }, + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => { + return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( + "we should never start with a bump identity data contract nonce", + ))); + } + }; + + if !transition_validation_result.is_valid() { + // If a state transition isn't valid we still need to bump the identity data contract nonce + validation_result.add_errors(transition_validation_result.errors); + validated_transitions.push(BatchedTransitionAction::BumpIdentityDataContractNonce( + BumpIdentityDataContractNonceAction::try_from_batched_transition_action( + transition, + owner_id, + state_transition_action.user_fee_increase(), + )?, + )); + } else if platform.config.execution.use_document_triggers { + if let BatchedTransitionAction::DocumentAction(document_transition) = &transition { + // we should also validate document triggers + let data_trigger_execution_context = DataTriggerExecutionContext { + platform, + transaction, + owner_id: &self.owner_id(), + state_transition_execution_context: &state_transition_execution_context, + }; + let data_trigger_execution_result = document_transition + .validate_with_data_triggers( + &data_trigger_bindings, + &data_trigger_execution_context, + platform_version, + )?; + + if !data_trigger_execution_result.is_valid() { + // If a state transition isn't valid because of data triggers we still need + // to bump the identity data contract nonce + let consensus_errors: Vec<ConsensusError> = data_trigger_execution_result + .errors + .into_iter() + .map(|e| ConsensusError::StateError(StateError::DataTriggerError(e))) + .collect(); + validation_result.add_errors(consensus_errors); + validated_transitions + .push(BatchedTransitionAction::BumpIdentityDataContractNonce( + BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action( + document_transition.base(), + owner_id, + state_transition_action.user_fee_increase(), + ), + )); + } else { + validated_transitions.push(transition); + } + } else { + validated_transitions.push(transition); + } + } else { + validated_transitions.push(transition); + } + } + + state_transition_action.set_transitions(validated_transitions); + + validation_result.set_data(state_transition_action.into()); + + Ok(validation_result) + } + + fn transform_into_action_v0( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + validation_mode: ValidationMode, + tx: TransactionArg, + ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { + let platform_version = platform.state.current_platform_version()?; + + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version)?; + + let validation_result = self.try_into_action_v0( + platform, + block_info, + validation_mode.should_validate_batch_valid_against_state(), + tx, + &mut execution_context, + )?; + + Ok(validation_result.map(Into::into)) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/mod.rs similarity index 100% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/mod.rs diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs similarity index 59% rename from packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs rename to packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs index 68ec4de478e..4828d923f8d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/transformer/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/batch/transformer/v0/mod.rs @@ -21,41 +21,54 @@ use dpp::document::property_names::PRICE; use dpp::document::{Document, DocumentV0Getters}; use dpp::fee::Credits; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; -use dpp::prelude::Revision; +use dpp::prelude::{Revision, UserFeeIncrease}; use dpp::validation::SimpleConsensusValidationResult; use dpp::{consensus::ConsensusError, prelude::Identifier, validation::ConsensusValidationResult}; - -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; -use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::batched_transition::BatchedTransitionRef; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; use dpp::state_transition::StateTransitionLike; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use drive::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; -use drive::state_transition_action::document::documents_batch::v0::DocumentsBatchTransitionActionV0; - -use crate::execution::validation::state_transition::documents_batch::state::v0::fetch_documents::fetch_documents_for_transitions_knowing_contract_and_document_type; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::BatchTransitionAction; +use drive::state_transition_action::batch::v0::BatchTransitionActionV0; + +use crate::execution::validation::state_transition::batch::state::v0::fetch_documents::fetch_documents_for_transitions_knowing_contract_and_document_type; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; -use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::batch_transition::batched_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::token_transition::{TokenTransition, TokenTransitionV0Methods}; +use dpp::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; use drive::drive::contract::DataContractFetchInfo; use drive::drive::Drive; -use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use drive::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::TokenBurnTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::TokenConfigUpdateTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::TokenFreezeTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::TokenMintTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::TokenUnfreezeTransitionAction; +use drive::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; -pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchTransitionTransformerV0 +pub(in crate::execution::validation::state_transition::state_transitions::batch) trait BatchTransitionTransformerV0 { fn try_into_action_v0( &self, @@ -64,10 +77,10 @@ pub(in crate::execution::validation::state_transition::state_transitions::docume full_validation: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, - ) -> Result<ConsensusValidationResult<DocumentsBatchTransitionAction>, Error>; + ) -> Result<ConsensusValidationResult<BatchTransitionAction>, Error>; } -trait DocumentsBatchTransitionInternalTransformerV0 { +trait BatchTransitionInternalTransformerV0 { fn transform_document_transitions_within_contract_v0( platform: &PlatformStateRef, block_info: &BlockInfo, @@ -78,7 +91,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<Vec<DocumentTransitionAction>>, Error>; + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error>; fn transform_document_transitions_within_document_type_v0( platform: &PlatformStateRef, block_info: &BlockInfo, @@ -90,9 +103,34 @@ trait DocumentsBatchTransitionInternalTransformerV0 { execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<Vec<DocumentTransitionAction>>, Error>; + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error>; + fn transform_token_transitions_within_contract_v0( + platform: &PlatformStateRef, + data_contract_id: &Identifier, + block_info: &BlockInfo, + validate_against_state: bool, + owner_id: Identifier, + token_transitions: &Vec<&TokenTransition>, + user_fee_increase: UserFeeIncrease, + transaction: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error>; + /// Transfer token transition + fn transform_token_transition_v0( + drive: &Drive, + transaction: TransactionArg, + block_info: &BlockInfo, + validate_against_state: bool, + data_contract_fetch_info: Arc<DataContractFetchInfo>, + transition: &TokenTransition, + owner_id: Identifier, + user_fee_increase: UserFeeIncrease, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<BatchedTransitionAction>, Error>; /// The data contract can be of multiple difference versions - fn transform_transition_v0( + fn transform_document_transition_v0( drive: &Drive, transaction: TransactionArg, full_validation: bool, @@ -103,7 +141,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { owner_id: Identifier, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<DocumentTransitionAction>, Error>; + ) -> Result<ConsensusValidationResult<BatchedTransitionAction>, Error>; fn find_replaced_document_v0<'a>( document_transition: &'a DocumentTransition, fetched_documents: &'a [Document], @@ -120,7 +158,7 @@ trait DocumentsBatchTransitionInternalTransformerV0 { ) -> SimpleConsensusValidationResult; } -impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { +impl BatchTransitionTransformerV0 for BatchTransition { fn try_into_action_v0( &self, platform: &PlatformStateRef, @@ -128,39 +166,60 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { validate_against_state: bool, transaction: TransactionArg, execution_context: &mut StateTransitionExecutionContext, - ) -> Result<ConsensusValidationResult<DocumentsBatchTransitionAction>, Error> { + ) -> Result<ConsensusValidationResult<BatchTransitionAction>, Error> { let owner_id = self.owner_id(); let user_fee_increase = self.user_fee_increase(); let platform_version = platform.state.current_platform_version()?; - let mut transitions_by_contracts_and_types: BTreeMap< + let mut document_transitions_by_contracts_and_types: BTreeMap< &Identifier, BTreeMap<&String, Vec<&DocumentTransition>>, > = BTreeMap::new(); + let mut token_transitions_by_contracts: BTreeMap<&Identifier, Vec<&TokenTransition>> = + BTreeMap::new(); + // We want to validate by contract, and then for each document type within a contract - for document_transition in self.transitions().iter() { - let document_type = document_transition.base().document_type_name(); - let data_contract_id = document_transition.base().data_contract_id_ref(); + for transition in self.transitions_iter() { + match transition { + BatchedTransitionRef::Document(document_transition) => { + let document_type = document_transition.base().document_type_name(); + let data_contract_id = document_transition.base().data_contract_id_ref(); - match transitions_by_contracts_and_types.entry(data_contract_id) { - Entry::Vacant(v) => { - v.insert(BTreeMap::from([(document_type, vec![document_transition])])); + match document_transitions_by_contracts_and_types.entry(data_contract_id) { + Entry::Vacant(v) => { + v.insert(BTreeMap::from([(document_type, vec![document_transition])])); + } + Entry::Occupied(mut transitions_by_types_in_contract) => { + match transitions_by_types_in_contract + .get_mut() + .entry(document_type) + { + Entry::Vacant(v) => { + v.insert(vec![document_transition]); + } + Entry::Occupied(mut o) => o.get_mut().push(document_transition), + } + } + } } - Entry::Occupied(mut transitions_by_types_in_contract) => { - match transitions_by_types_in_contract - .get_mut() - .entry(document_type) - { + BatchedTransitionRef::Token(token_transition) => { + let data_contract_id = token_transition.base().data_contract_id_ref(); + + match token_transitions_by_contracts.entry(data_contract_id) { Entry::Vacant(v) => { - v.insert(vec![document_transition]); + v.insert(vec![token_transition]); + } + Entry::Occupied(mut transitions_by_tokens_in_contract) => { + transitions_by_tokens_in_contract + .get_mut() + .push(token_transition) } - Entry::Occupied(mut o) => o.get_mut().push(document_transition), } } } } - let validation_result = transitions_by_contracts_and_types + let validation_result_documents = document_transitions_by_contracts_and_types .iter() .map( |(data_contract_id, document_transitions_by_document_type)| { @@ -177,12 +236,37 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { ) }, ) - .collect::<Result<Vec<ConsensusValidationResult<Vec<DocumentTransitionAction>>>, Error>>()?; - let validation_result = ConsensusValidationResult::flatten(validation_result); + .collect::<Result<Vec<ConsensusValidationResult<Vec<BatchedTransitionAction>>>, Error>>( + )?; + + let mut validation_result_tokens = token_transitions_by_contracts + .iter() + .map(|(data_contract_id, token_transitions)| { + Self::transform_token_transitions_within_contract_v0( + platform, + data_contract_id, + block_info, + validate_against_state, + owner_id, + token_transitions, + user_fee_increase, + transaction, + execution_context, + platform_version, + ) + }) + .collect::<Result<Vec<ConsensusValidationResult<Vec<BatchedTransitionAction>>>, Error>>( + )?; + + let mut validation_results = validation_result_documents; + + validation_results.append(&mut validation_result_tokens); + + let validation_result = ConsensusValidationResult::flatten(validation_results); if validation_result.has_data() { let (transitions, errors) = validation_result.into_data_and_errors()?; - let batch_transition_action = DocumentsBatchTransitionActionV0 { + let batch_transition_action = BatchTransitionActionV0 { owner_id, transitions, user_fee_increase, @@ -200,7 +284,59 @@ impl DocumentsBatchTransitionTransformerV0 for DocumentsBatchTransition { } } -impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition { +impl BatchTransitionInternalTransformerV0 for BatchTransition { + fn transform_token_transitions_within_contract_v0( + platform: &PlatformStateRef, + data_contract_id: &Identifier, + block_info: &BlockInfo, + validate_against_state: bool, + owner_id: Identifier, + token_transitions: &Vec<&TokenTransition>, + user_fee_increase: UserFeeIncrease, + transaction: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error> { + let drive = platform.drive; + // Data Contract must exist + let Some(data_contract_fetch_info) = drive + .get_contract_with_fetch_info_and_fee( + data_contract_id.0 .0, + None, + false, + transaction, + platform_version, + )? + .1 + else { + return Ok(ConsensusValidationResult::new_with_error( + BasicError::DataContractNotPresentError(DataContractNotPresentError::new( + *data_contract_id, + )) + .into(), + )); + }; + + let validation_result = token_transitions + .iter() + .map(|token_transition| { + Self::transform_token_transition_v0( + platform.drive, + transaction, + block_info, + validate_against_state, + data_contract_fetch_info.clone(), + token_transition, + owner_id, + user_fee_increase, + execution_context, + platform_version, + ) + }) + .collect::<Result<Vec<ConsensusValidationResult<BatchedTransitionAction>>, Error>>()?; + let validation_result = ConsensusValidationResult::merge_many(validation_result); + Ok(validation_result) + } fn transform_document_transitions_within_contract_v0( platform: &PlatformStateRef, block_info: &BlockInfo, @@ -211,7 +347,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<Vec<DocumentTransitionAction>>, Error> { + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error> { let drive = platform.drive; // Data Contract must exist let Some(data_contract_fetch_info) = drive @@ -248,7 +384,8 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition platform_version, ) }) - .collect::<Result<Vec<ConsensusValidationResult<Vec<DocumentTransitionAction>>>, Error>>()?; + .collect::<Result<Vec<ConsensusValidationResult<Vec<BatchedTransitionAction>>>, Error>>( + )?; Ok(ConsensusValidationResult::flatten(validation_result)) } @@ -263,7 +400,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition execution_context: &mut StateTransitionExecutionContext, transaction: TransactionArg, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<Vec<DocumentTransitionAction>>, Error> { + ) -> Result<ConsensusValidationResult<Vec<BatchedTransitionAction>>, Error> { // We use temporary execution context without dry run, // because despite the dryRun, we need to get the // data contract to proceed with following logic @@ -325,7 +462,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition .iter() .map(|transition| { // we validate every transition in this document type - Self::transform_transition_v0( + Self::transform_document_transition_v0( platform.drive, transaction, validate_against_state, @@ -338,7 +475,7 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition platform_version, ) }) - .collect::<Result<Vec<ConsensusValidationResult<DocumentTransitionAction>>, Error>>( + .collect::<Result<Vec<ConsensusValidationResult<BatchedTransitionAction>>, Error>>( )?; let result = ConsensusValidationResult::merge_many( @@ -355,7 +492,108 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition } /// The data contract can be of multiple difference versions - fn transform_transition_v0<'a>( + fn transform_token_transition_v0( + drive: &Drive, + transaction: TransactionArg, + block_info: &BlockInfo, + validate_against_state: bool, + data_contract_fetch_info: Arc<DataContractFetchInfo>, + transition: &TokenTransition, + owner_id: Identifier, + user_fee_increase: UserFeeIncrease, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<BatchedTransitionAction>, Error> { + let approximate_for_costs = !validate_against_state; + match transition { + TokenTransition::Burn(token_burn_transition) => { + let (batched_action, fee_result) = TokenBurnTransitionAction::try_from_borrowed_token_burn_transition_with_contract_lookup(drive, owner_id, token_burn_transition, approximate_for_costs, transaction, block_info,user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::Mint(token_mint_transition) => { + let (batched_action, fee_result) = TokenMintTransitionAction::try_from_borrowed_token_mint_transition_with_contract_lookup(drive, owner_id, token_mint_transition, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::Transfer(token_transfer_transition) => { + let (token_transfer_action, fee_result) = TokenTransferTransitionAction::try_from_borrowed_token_transfer_transition_with_contract_lookup(drive, owner_id, token_transfer_transition, approximate_for_costs, transaction, block_info, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + let batched_action = BatchedTransitionAction::TokenAction( + TokenTransitionAction::TransferAction(token_transfer_action), + ); + Ok(batched_action.into()) + } + TokenTransition::Freeze(token_freeze_transition) => { + let (batched_action, fee_result) = TokenFreezeTransitionAction::try_from_borrowed_token_freeze_transition_with_contract_lookup(drive, owner_id, token_freeze_transition, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::Unfreeze(token_unfreeze_transition) => { + let (batched_action, fee_result) = TokenUnfreezeTransitionAction::try_from_borrowed_token_unfreeze_transition_with_contract_lookup(drive, owner_id, token_unfreeze_transition, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::DestroyFrozenFunds(destroy_frozen_funds) => { + let (batched_action, fee_result) = TokenDestroyFrozenFundsTransitionAction::try_from_borrowed_token_destroy_frozen_funds_transition_with_contract_lookup(drive, owner_id, destroy_frozen_funds, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::EmergencyAction(emergency_action) => { + let (batched_action, fee_result) = TokenEmergencyActionTransitionAction::try_from_borrowed_token_emergency_action_transition_with_contract_lookup(drive, owner_id, emergency_action, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + TokenTransition::ConfigUpdate(token_config_update) => { + let (batched_action, fee_result) = TokenConfigUpdateTransitionAction::try_from_borrowed_token_config_update_transition_with_contract_lookup(drive, owner_id, token_config_update, approximate_for_costs, transaction, block_info, user_fee_increase, |_identifier| { + Ok(data_contract_fetch_info.clone()) + }, platform_version)?; + + execution_context + .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); + + Ok(batched_action) + } + } + } + + /// The data contract can be of multiple difference versions + fn transform_document_transition_v0<'a>( drive: &Drive, transaction: TransactionArg, validate_against_state: bool, @@ -366,12 +604,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition owner_id: Identifier, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<DocumentTransitionAction>, Error> { + ) -> Result<ConsensusValidationResult<BatchedTransitionAction>, Error> { match transition { DocumentTransition::Create(document_create_transition) => { - let result = ConsensusValidationResult::<DocumentTransitionAction>::new(); - - let (document_create_action, fee_result) = DocumentCreateTransitionAction::from_document_borrowed_create_transition_with_contract_lookup( + let (document_create_action, fee_result) = DocumentCreateTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup( drive, transaction, document_create_transition, block_info, |_identifier| { Ok(data_contract_fetch_info.clone()) @@ -380,14 +616,13 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition execution_context .add_operation(ValidationOperation::PrecalculatedOperation(fee_result)); - if result.is_valid() { - Ok(DocumentTransitionAction::CreateAction(document_create_action).into()) - } else { - Ok(result) - } + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::CreateAction(document_create_action), + ); + Ok(batched_action.into()) } DocumentTransition::Replace(document_replace_transition) => { - let mut result = ConsensusValidationResult::<DocumentTransitionAction>::new(); + let mut result = ConsensusValidationResult::<BatchedTransitionAction>::new(); let validation_result = Self::find_replaced_document_v0(transition, replaced_documents); @@ -400,9 +635,11 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition owner_id, 0, ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action.into(), + batched_action.into(), validation_result.errors, )); } @@ -468,19 +705,25 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok(DocumentTransitionAction::ReplaceAction(document_replace_action).into()) + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::ReplaceAction(document_replace_action), + ); + Ok(batched_action.into()) } else { Ok(result) } } DocumentTransition::Delete(document_delete_transition) => { - let action = DocumentDeleteTransitionAction::from_document_borrowed_create_transition_with_contract_lookup(document_delete_transition, |_identifier| { + let action = DocumentDeleteTransitionAction::try_from_document_borrowed_create_transition_with_contract_lookup(document_delete_transition, |_identifier| { Ok(data_contract_fetch_info.clone()) })?; - Ok(DocumentTransitionAction::DeleteAction(action).into()) + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::DeleteAction(action), + ); + Ok(batched_action.into()) } DocumentTransition::Transfer(document_transfer_transition) => { - let mut result = ConsensusValidationResult::<DocumentTransitionAction>::new(); + let mut result = ConsensusValidationResult::<BatchedTransitionAction>::new(); let validation_result = Self::find_replaced_document_v0(transition, replaced_documents); @@ -528,13 +771,16 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok(DocumentTransitionAction::TransferAction(document_transfer_action).into()) + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::TransferAction(document_transfer_action), + ); + Ok(batched_action.into()) } else { Ok(result) } } DocumentTransition::UpdatePrice(document_update_price_transition) => { - let mut result = ConsensusValidationResult::<DocumentTransitionAction>::new(); + let mut result = ConsensusValidationResult::<BatchedTransitionAction>::new(); let validation_result = Self::find_replaced_document_v0(transition, replaced_documents); @@ -582,16 +828,16 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok( - DocumentTransitionAction::UpdatePriceAction(document_update_price_action) - .into(), - ) + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::UpdatePriceAction(document_update_price_action), + ); + Ok(batched_action.into()) } else { Ok(result) } } DocumentTransition::Purchase(document_purchase_transition) => { - let mut result = ConsensusValidationResult::<DocumentTransitionAction>::new(); + let mut result = ConsensusValidationResult::<BatchedTransitionAction>::new(); let validation_result = Self::find_replaced_document_v0(transition, replaced_documents); @@ -650,7 +896,10 @@ impl DocumentsBatchTransitionInternalTransformerV0 for DocumentsBatchTransition )?; if result.is_valid() { - Ok(DocumentTransitionAction::PurchaseAction(document_purchase_action).into()) + let batched_action = BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::PurchaseAction(document_purchase_action), + ); + Ok(batched_action.into()) } else { Ok(result) } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs index 9bdc1119eb6..f4ca13d3a20 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/advanced_structure/v0/mod.rs @@ -4,19 +4,22 @@ use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; use dpp::consensus::basic::data_contract::{ - InvalidDataContractIdError, InvalidDataContractVersionError, + InvalidDataContractIdError, InvalidDataContractVersionError, InvalidTokenBaseSupplyError, + NonContiguousContractTokenPositionsError, }; use dpp::consensus::basic::BasicError; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; use dpp::data_contract::INITIAL_DATA_CONTRACT_VERSION; use dpp::prelude::DataContract; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::validation::ConsensusValidationResult; +use dpp::version::PlatformVersion; use drive::state_transition_action::system::bump_identity_nonce_action::BumpIdentityNonceAction; use drive::state_transition_action::StateTransitionAction; pub(in crate::execution::validation::state_transition::state_transitions::data_contract_create) trait DataContractCreatedStateTransitionAdvancedStructureValidationV0 { - fn validate_advanced_structure_v0(&self, execution_context: &mut StateTransitionExecutionContext) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; + fn validate_advanced_structure_v0(&self, execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; } impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 @@ -25,6 +28,7 @@ impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 fn validate_advanced_structure_v0( &self, execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { if self.data_contract().version() != INITIAL_DATA_CONTRACT_VERSION { let bump_action = StateTransitionAction::BumpIdentityNonceAction( @@ -67,6 +71,69 @@ impl DataContractCreatedStateTransitionAdvancedStructureValidationV0 )); } + let groups = self.data_contract().groups(); + if !groups.is_empty() { + let validation_result = DataContract::validate_groups(groups, platform_version)?; + + if !validation_result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); + } + } + + let expected_position = 0; + + for (token_contract_position, token_configuration) in self.data_contract().tokens() { + if expected_position != *token_contract_position { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![NonContiguousContractTokenPositionsError::new( + expected_position, + *token_contract_position, + ) + .into()], + )); + } + + if token_configuration.base_supply() > i64::MAX as u64 { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + vec![ + InvalidTokenBaseSupplyError::new(token_configuration.base_supply()).into(), + ], + )); + } + + let validation_result = token_configuration.validate_token_config_groups_exist( + self.data_contract().groups(), + platform_version, + )?; + if !validation_result.is_valid() { + let bump_action = StateTransitionAction::BumpIdentityNonceAction( + BumpIdentityNonceAction::from_borrowed_data_contract_create_transition(self), + ); + + return Ok(ConsensusValidationResult::new_with_data_and_errors( + bump_action, + validation_result.errors, + )); + } + } + Ok(ConsensusValidationResult::default()) } } @@ -118,7 +185,7 @@ mod tests { .expect("failed to create execution context"); let result = transition - .validate_advanced_structure_v0(&mut execution_context) + .validate_advanced_structure_v0(&mut execution_context, platform_version) .expect("failed to validate advanced structure"); assert_matches!(execution_context.operations_slice(), []); @@ -168,7 +235,7 @@ mod tests { .expect("failed to create execution context"); let result = transition - .validate_advanced_structure_v0(&mut execution_context) + .validate_advanced_structure_v0(&mut execution_context, platform_version) .expect("failed to validate advanced structure"); assert_matches!( diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs index c22ef31de13..7069e90904f 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/mod.rs @@ -85,7 +85,7 @@ impl StateTransitionAdvancedStructureValidationV0 for DataContractCreateTransiti .contract_create_state_transition .basic_structure { - Some(0) => self.validate_advanced_structure_v0(execution_context), + Some(0) => self.validate_advanced_structure_v0(execution_context, platform_version), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "data contract create transition: validate_basic_structure".to_string(), known_versions: vec![0], @@ -145,16 +145,30 @@ mod tests { use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; use crate::test::helpers::setup::TestPlatformBuilder; use assert_matches::assert_matches; + use dpp::balances::credits::TokenAmount; use dpp::block::block_info::BlockInfo; use dpp::consensus::basic::BasicError; use dpp::consensus::ConsensusError; use dpp::dash_to_credits; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Setters; + use dpp::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers; + use dpp::data_contract::change_control_rules::v0::ChangeControlRulesV0; + use dpp::data_contract::change_control_rules::ChangeControlRules; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; + use dpp::data_contract::DataContract; + use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; + use dpp::identity::TimestampMillis; + use dpp::prelude::Identifier; use dpp::serialization::PlatformSerializable; use dpp::state_transition::data_contract_create_transition::methods::DataContractCreateTransitionMethodsV0; use dpp::state_transition::data_contract_create_transition::DataContractCreateTransition; use dpp::tests::json_document::json_document_to_contract_with_ids; + use dpp::tokens::calculate_token_id; use platform_version::version::PlatformVersion; + use std::collections::BTreeMap; #[test] fn test_data_contract_creation_with_contested_unique_index() { @@ -347,4 +361,1615 @@ mod tests { .unwrap() .expect("expected to commit transaction"); } + #[cfg(test)] + mod tokens { + use super::*; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; + use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Setters; + + mod basic_creation { + use super::*; + #[test] + fn test_data_contract_creation_with_single_token() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_base_supply(base_supply_start_amount); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_single_token_and_group() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_3.id(), 1), + (identity_2.id(), 2), + ] + .into(), + required_power: 2, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + // We have no group at position 1, we should get an error + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_single_token_with_starting_balance() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let base_supply_start_amount = 10000; + + { + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_base_supply(base_supply_start_amount); + } + + let identity_id = identity.id(); + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, Some(base_supply_start_amount)); + } + } + + mod pre_programmed_distribution { + use super::*; + use dpp::data_contract::associated_token::token_pre_programmed_distribution::v0::TokenPreProgrammedDistributionV0; + use dpp::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; + use drive::drive::Drive; + + #[test] + fn test_data_contract_pre_programmed_distribution() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 5456, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 123, dash_to_credits!(0.1)); + + let (identity_4, _, _) = setup_identity(&mut platform, 548, dash_to_credits!(0.1)); + + let (identity_5, _, _) = setup_identity(&mut platform, 467, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_base_supply(base_supply_start_amount); + + // Create a new BTreeMap to store distributions + let mut distributions: BTreeMap< + TimestampMillis, + BTreeMap<Identifier, TokenAmount>, + > = BTreeMap::new(); + + // Create distributions for different timestamps + distributions.insert( + 1700000000000, // Example timestamp (milliseconds) + BTreeMap::from([ + (identity.id(), 10), // Identity 1 gets 10 tokens + (identity_2.id(), 5), // Identity 2 gets 5 tokens + ]), + ); + + distributions.insert( + 1700005000000, // Another timestamp + BTreeMap::from([ + (identity_3.id(), 15), // Identity 3 gets 15 tokens + (identity_4.id(), 20), // Identity 4 gets 20 tokens + (identity_5.id(), 25), // Identity 5 gets 25 tokens + ]), + ); + + token_config + .distribution_rules_mut() + .set_pre_programmed_distribution(Some(TokenPreProgrammedDistribution::V0( + TokenPreProgrammedDistributionV0 { + distributions: distributions.clone(), + }, + ))); + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + + let fetched_distributions = platform + .drive + .fetch_token_pre_programmed_distributions( + token_id, + None, + None, + None, + platform_version, + ) + .expect("expected to fetch pre-programmed distributions"); + + assert_eq!(fetched_distributions, distributions); + + let proved_distributions = platform + .drive + .prove_token_pre_programmed_distributions( + token_id, + None, + None, + None, + platform_version, + ) + .expect("expected to prove pre-programmed distributions"); + + let verified_pre_programmed_distributions: BTreeMap< + TimestampMillis, + BTreeMap<Identifier, TokenAmount>, + > = Drive::verify_token_pre_programmed_distributions( + proved_distributions.as_slice(), + token_id, + None, + None, + false, + platform_version, + ) + .expect("expected to verify proof") + .1; + + assert_eq!(verified_pre_programmed_distributions, distributions); + } + } + + mod token_errors { + use super::*; + #[test] + fn test_data_contract_creation_with_single_token_with_starting_balance_over_limit_should_cause_error( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let base_supply_start_amount = u64::MAX; + + { + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_base_supply(base_supply_start_amount); + } + + let identity_id = identity.id(); + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::InvalidTokenBaseSupplyError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_single_token_needing_group_that_does_not_exist() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 564, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + // We have no group at position 1, we should get an error + admin_action_takers: AuthorizedActionTakers::Group(1), + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupPositionDoesNotExistError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_single_token_setting_main_group_that_does_not_exist( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = + setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 564, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + // We have no group at position 1, we should get an error + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupPositionDoesNotExistError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + } + } + + mod group_errors { + use super::*; + #[test] + fn test_data_contract_creation_with_non_contiguous_groups_should_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 2, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_3.id(), 1), + (identity_2.id(), 2), + ] + .into(), + required_power: 2, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(2)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + // We have no group at position 1, we should get an error + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::NonContiguousContractGroupPositionsError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_group_with_member_with_zero_power_should_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_3.id(), 0), //error + (identity_2.id(), 2), + ] + .into(), + required_power: 2, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupMemberHasPowerOfZeroError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_group_with_member_with_too_big_power_should_error() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 50000), + (identity_3.id(), 100000), //error + (identity_2.id(), 50000), + ] + .into(), + required_power: 100000, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupMemberHasPowerOverLimitError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_data_contract_creation_with_group_with_member_with_power_over_required_should_error( + ) { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 3), + (identity_3.id(), 6), //error + (identity_2.id(), 3), + ] + .into(), + required_power: 5, + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupMemberHasPowerOverLimitError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_dcc_group_with_member_power_not_reaching_threshold() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_3.id(), 1), + (identity_2.id(), 1), + ] + .into(), + required_power: 5, // 1 + 1 + 1 < 5 so we should error + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError(BasicError::GroupTotalPowerLessThanRequiredError(_)), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + + #[test] + fn test_dcc_group_with_non_unilateral_member_power_not_reaching_threshold() { + let platform_version = PlatformVersion::latest(); + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let platform_state = platform.state.load(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 234, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 45, dash_to_credits!(0.1)); + + let mut data_contract = json_document_to_contract_with_ids( + "tests/supporting_files/contract/basic-token/basic-token.json", + None, + None, + false, //no need to validate the data contracts in tests for drive + platform_version, + ) + .expect("expected to get json based contract"); + + let identity_id = identity.id(); + + let base_supply_start_amount = 0; + + { + let groups = data_contract.groups_mut().expect("expected tokens"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1), (identity_2.id(), 1)].into(), + required_power: 2, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_3.id(), 5), + (identity_2.id(), 1), + ] + .into(), + required_power: 5, // 1 + 1 < 5 so we should error + }), + ); + let token_config = data_contract + .tokens_mut() + .expect("expected tokens") + .get_mut(&0) + .expect("expected first token"); + token_config.set_main_control_group(Some(1)); + token_config.set_base_supply(base_supply_start_amount); + token_config.set_manual_minting_rules(ChangeControlRules::V0( + ChangeControlRulesV0 { + authorized_to_make_change: AuthorizedActionTakers::Group(0), + admin_action_takers: AuthorizedActionTakers::MainGroup, + changing_authorized_action_takers_to_no_one_allowed: false, + changing_admin_action_takers_to_no_one_allowed: false, + self_changing_admin_action_takers_allowed: false, + }, + )); + } + + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + let data_contract_create_transition = + DataContractCreateTransition::new_from_data_contract( + data_contract, + 1, + &identity.into_partial_identity_info(), + key.id(), + &signer, + platform_version, + None, + ) + .expect("expect to create documents batch transition"); + + let data_contract_create_serialized_transition = data_contract_create_transition + .serialize_to_bytes() + .expect("expected documents batch serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + + let token_balance = platform + .drive + .fetch_identity_token_balance( + token_id, + identity_id.to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch token balance"); + assert_eq!(token_balance, None); + } + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs index 27c7a5ce4ed..3385fd125d8 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/state/v0/mod.rs @@ -161,8 +161,8 @@ mod tests { use super::*; #[test] - fn should_return_invalid_result_when_transform_into_action_failed() { - let platform_version = PlatformVersion::latest(); + fn should_return_invalid_result_when_transform_into_action_failed_v7() { + let platform_version = PlatformVersion::get(7).expect("expected version 7"); let identity_nonce = IdentityNonce::default(); let platform = TestPlatformBuilder::new() @@ -193,7 +193,103 @@ mod tests { // Make the contract invalid let DataContractInSerializationFormat::V0(ref mut contract) = - data_contract_for_serialization; + data_contract_for_serialization + else { + panic!("expected serialization version 0") + }; + + contract + .document_schemas + .insert("invalidType".to_string(), Value::Null); + + let transition: DataContractCreateTransition = DataContractCreateTransitionV0 { + data_contract: data_contract_for_serialization, + identity_nonce, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + } + .into(); + + let mut execution_context = + StateTransitionExecutionContext::default_for_platform_version(platform_version) + .expect("failed to create execution context"); + + let state = platform.state.load_full(); + + let platform_ref = PlatformRef { + drive: &platform.drive, + state: &state, + config: &platform.config, + core_rpc: &platform.core_rpc, + }; + + let result = transition + .validate_state_v0::<MockCoreRPCLike>( + &platform_ref, + ValidationMode::Validator, + &Epoch::default(), + None, + &mut execution_context, + platform_version, + ) + .expect("failed to validate advanced structure"); + + assert_matches!( + result.errors.as_slice(), + [ConsensusError::BasicError( + BasicError::ContractError( + DataContractError::InvalidContractStructure(message) + ) + )] if message == "document schema must be an object: structure error: value is not a map" + ); + + assert_matches!( + result.data, + Some(StateTransitionAction::BumpIdentityNonceAction(action)) if action.identity_id() == identity_id && action.identity_nonce() == identity_nonce + ); + + // We have tons of operations here so not sure we want to assert all of them + assert!(!execution_context.operations_slice().is_empty()); + } + + #[test] + fn should_return_invalid_result_when_transform_into_action_failed_latest() { + let platform_version = PlatformVersion::latest(); + let identity_nonce = IdentityNonce::default(); + + let platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_genesis_state(); + + let data_contract = + get_data_contract_fixture(None, identity_nonce, platform_version.protocol_version) + .data_contract_owned(); + + let identity_id = data_contract.owner_id(); + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + None, + None, + platform_version, + ) + .expect("failed to apply contract"); + + let mut data_contract_for_serialization = data_contract + .try_into_platform_versioned(platform_version) + .expect("failed to convert data contract"); + + // Make the contract invalid + let DataContractInSerializationFormat::V1(ref mut contract) = + data_contract_for_serialization + else { + panic!("expected serialization version 1") + }; contract .document_schemas @@ -413,8 +509,11 @@ mod tests { .expect("failed to convert data contract"); // Make the contract invalid - let DataContractInSerializationFormat::V0(ref mut contract) = - data_contract_for_serialization; + let DataContractInSerializationFormat::V1(ref mut contract) = + data_contract_for_serialization + else { + panic!("expected serialization version 1") + }; contract .document_schemas diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs index 9cd512b6da2..a4abb0b9040 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/mod.rs @@ -81,6 +81,11 @@ mod tests { use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::state_transitions_processing_result::StateTransitionExecutionResult; + use assert_matches::assert_matches; + use dpp::consensus::basic::BasicError; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; use dpp::tests::fixtures::get_data_contract_fixture; use dpp::tests::json_document::json_document_to_contract; use dpp::version::PlatformVersion; @@ -665,4 +670,857 @@ mod tests { && error.additional_message() == "document type can not change creation restriction mode: changing from Owner Only to No Restrictions" )); } + + mod group_tests { + use super::*; + #[test] + fn test_data_contract_update_can_not_remove_groups() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + // Create an initial data contract with groups + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add groups to the contract + let groups = data_contract.groups_mut().expect("expected groups"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with one group removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + { + // Remove a group from the updated contract + let groups = updated_data_contract.groups_mut().expect("expected groups"); + groups.remove(&1).expect("expected to remove group"); + } + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // Extract the error and check the message + if let [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::DataContractUpdateActionNotAllowedError( + error, + )), + _, + )] = processing_result.execution_results().as_slice() + { + assert_eq!( + error.action(), + "remove group", + "expected error message to match 'remove group'" + ); + assert_eq!( + error.data_contract_id(), + data_contract.id(), + "expected the error to reference the correct data contract ID" + ); + } else { + panic!("Expected a DataContractUpdateActionNotAllowedError"); + } + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_data_contract_update_can_not_alter_group() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + // Create an initial data contract with groups + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add groups to the contract + let groups = data_contract.groups_mut().expect("expected groups"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with one group removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + { + // Remove a group from the updated contract + let groups = updated_data_contract.groups_mut().expect("expected groups"); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [(identity.id(), 2)].into(), + required_power: 2, + }), + ); + } + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // Extract the error and check the message + if let [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::DataContractUpdateActionNotAllowedError( + error, + )), + _, + )] = processing_result.execution_results().as_slice() + { + assert_eq!( + error.action(), + "change group at position 1 is not allowed", + "expected error message to match 'change group at position 1 is not allowed'" + ); + assert_eq!( + error.data_contract_id(), + data_contract.id(), + "expected the error to reference the correct data contract ID" + ); + } else { + panic!("Expected a DataContractUpdateActionNotAllowedError"); + } + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_data_contract_update_can_not_add_new_group_with_gap() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + // Create an initial data contract with groups + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add groups to the contract + let groups = data_contract.groups_mut().expect("expected groups"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with one group removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + { + // Remove a group from the updated contract + let groups = updated_data_contract.groups_mut().expect("expected groups"); + groups.insert( + 3, + Group::V0(GroupV0 { + members: [(identity.id(), 2)].into(), + required_power: 2, + }), + ); + } + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::BasicError( + BasicError::NonContiguousContractGroupPositionsError(_) + ), + _ + )] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_data_contract_update_can_add_new_group() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let (identity_2, _, _) = setup_identity(&mut platform, 928, dash_to_credits!(0.1)); + + let (identity_3, _, _) = setup_identity(&mut platform, 8, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + // Create an initial data contract with groups + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add groups to the contract + let groups = data_contract.groups_mut().expect("expected groups"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_2.id(), 1), + (identity_3.id(), 1), + ] + .into(), + required_power: 3, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_2.id(), 2), + (identity_3.id(), 1), + ] + .into(), + required_power: 3, + }), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with one group removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + { + // Remove a group from the updated contract + let groups = updated_data_contract.groups_mut().expect("expected groups"); + groups.insert( + 2, + Group::V0(GroupV0 { + members: [ + (identity.id(), 1), + (identity_2.id(), 2), + (identity_3.id(), 2), + ] + .into(), + required_power: 3, + }), + ); + } + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_matches!( + processing_result.execution_results().as_slice(), + [StateTransitionExecutionResult::SuccessfulExecution(_, _)] + ); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } + + mod token_tests { + use super::*; + use dpp::data_contract::accessors::v1::DataContractV1Setters; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Setters; + #[test] + fn test_data_contract_update_can_not_add_new_token() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + // Create an initial data contract with groups + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add groups to the contract + let groups = data_contract.groups_mut().expect("expected groups"); + groups.insert( + 0, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + groups.insert( + 1, + Group::V0(GroupV0 { + members: [(identity.id(), 1)].into(), + required_power: 1, + }), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with one group removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + updated_data_contract.add_token( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ); + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + // Extract the error and check the message + if let [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::DataContractUpdateActionNotAllowedError( + error, + )), + _, + )] = processing_result.execution_results().as_slice() + { + assert_eq!( + error.action(), + "add token at position 0", + "expected error message to match 'add token at position 0'" + ); + assert_eq!( + error.data_contract_id(), + data_contract.id(), + "expected the error to reference the correct data contract ID" + ); + } else { + panic!("Expected a DataContractUpdateActionNotAllowedError"); + } + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_data_contract_update_can_not_remove_token() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add a token to the contract + let tokens = data_contract.tokens_mut().expect("expected tokens"); + tokens.insert( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with the token removed + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + updated_data_contract.tokens_mut().unwrap().remove(&0); + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + if let [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::DataContractUpdateActionNotAllowedError( + error, + )), + _, + )] = processing_result.execution_results().as_slice() + { + assert_eq!( + error.action(), + "remove token at position 0", + "expected error message to match 'remove token at position 0'" + ); + assert_eq!( + error.data_contract_id(), + data_contract.id(), + "expected the error to reference the correct data contract ID" + ); + } else { + panic!("Expected a DataContractUpdateActionNotAllowedError"); + } + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + + #[test] + fn test_data_contract_update_can_not_modify_token() { + let mut platform = TestPlatformBuilder::new() + .build_with_mock_rpc() + .set_initial_state_structure(); + + let (identity, signer, key) = setup_identity(&mut platform, 958, dash_to_credits!(0.1)); + + let platform_state = platform.state.load(); + let platform_version = platform_state + .current_platform_version() + .expect("expected to get current platform version"); + + let mut data_contract = + get_data_contract_fixture(None, 0, platform_version.protocol_version) + .data_contract_owned(); + + data_contract.set_owner_id(identity.id()); + + { + // Add a token to the contract + let tokens = data_contract.tokens_mut().expect("expected tokens"); + tokens.insert( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ); + } + + platform + .drive + .apply_contract( + &data_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + // Create an updated contract with the token modified + let mut updated_data_contract = data_contract.clone(); + updated_data_contract.set_version(2); + + if let Some(TokenConfiguration::V0(config)) = + updated_data_contract.tokens_mut().unwrap().get_mut(&0) + { + config + .distribution_rules_mut() + .set_minting_allow_choosing_destination(false); //originally true + } + + let data_contract_update_transition = + DataContractUpdateTransition::new_from_data_contract( + updated_data_contract, + &identity.into_partial_identity_info(), + key.id(), + 2, + 0, + &signer, + platform_version, + None, + ) + .expect("expect to create data contract update transition"); + + let data_contract_update_serialized_transition = data_contract_update_transition + .serialize_to_bytes() + .expect("expected serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![data_contract_update_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + if let [StateTransitionExecutionResult::PaidConsensusError( + ConsensusError::StateError(StateError::DataContractUpdateActionNotAllowedError( + error, + )), + _, + )] = processing_result.execution_results().as_slice() + { + assert_eq!( + error.action(), + "update token at position 0", + "expected error message to match 'update token at position 0'" + ); + assert_eq!( + error.data_contract_id(), + data_contract.id(), + "expected the error to reference the correct data contract ID" + ); + } else { + panic!("Expected a DataContractUpdateActionNotAllowedError"); + } + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit transaction"); + } + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs index ef81c1a3650..5435c8ad18d 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/state/v0/mod.rs @@ -231,8 +231,11 @@ mod tests { .expect("failed to convert data contract"); // Make the contract invalid - let DataContractInSerializationFormat::V0(ref mut contract) = - data_contract_for_serialization; + let DataContractInSerializationFormat::V1(ref mut contract) = + data_contract_for_serialization + else { + panic!("expected serialization version 1") + }; contract .document_schemas @@ -553,8 +556,11 @@ mod tests { .expect("failed to convert data contract"); // Make the contract invalid - let DataContractInSerializationFormat::V0(ref mut contract) = - data_contract_for_serialization; + let DataContractInSerializationFormat::V1(ref mut contract) = + data_contract_for_serialization + else { + panic!("expected serialization version 1") + }; contract .document_schemas diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs deleted file mode 100644 index 5ac5d1630d2..00000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/advanced_structure/v0/mod.rs +++ /dev/null @@ -1,219 +0,0 @@ -use crate::error::Error; -use dpp::block::block_info::BlockInfo; -use dpp::consensus::basic::document::InvalidDocumentTransitionIdError; -use dpp::consensus::signature::{InvalidSignaturePublicKeySecurityLevelError, SignatureError}; -use dpp::dashcore::Network; -use dpp::document::Document; -use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; -use dpp::identity::PartialIdentity; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{ - DocumentTransition, DocumentTransitionV0Methods, -}; - -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::state_transition::{StateTransitionIdentitySigned, StateTransitionLike}; - -use dpp::validation::ConsensusValidationResult; - -use dpp::version::PlatformVersion; - -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use drive::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; -use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; -use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; -use crate::execution::validation::state_transition::state_transitions::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use drive::state_transition_action::StateTransitionAction; -use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; -use crate::error::execution::ExecutionError; -use crate::execution::types::execution_operation::ValidationOperation; -use crate::execution::types::state_transition_execution_context::{StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0}; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; - -pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStructureValidationV0 -{ - fn validate_advanced_structure_from_state_v0( - &self, - block_info: &BlockInfo, - network: Network, - action: &DocumentsBatchTransitionAction, - identity: &PartialIdentity, - execution_context: &mut StateTransitionExecutionContext, - platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; -} - -impl DocumentsBatchStateTransitionStructureValidationV0 for DocumentsBatchTransition { - fn validate_advanced_structure_from_state_v0( - &self, - block_info: &BlockInfo, - network: Network, - action: &DocumentsBatchTransitionAction, - identity: &PartialIdentity, - execution_context: &mut StateTransitionExecutionContext, - platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { - let security_levels = action.contract_based_security_level_requirement()?; - - let signing_key = identity.loaded_public_keys.get(&self.signature_public_key_id()).ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("the key must exist for advanced structure validation as we already fetched it during signature validation")))?; - - if !security_levels.contains(&signing_key.security_level()) { - // We only need to bump the first identity data contract nonce as that will make a replay - // attack not possible - - let first_transition = self.transitions().first().ok_or(Error::Execution(ExecutionError::CorruptedCodeExecution("There must be at least one state transition as this is already verified in basic validation")))?; - - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( - first_transition.base(), - self.owner_id(), - self.user_fee_increase(), - ), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![SignatureError::InvalidSignaturePublicKeySecurityLevelError( - InvalidSignaturePublicKeySecurityLevelError::new( - signing_key.security_level(), - security_levels, - ), - ) - .into()], - )); - } - - // We should validate that all newly created documents have valid ids - for transition in self.transitions() { - if let DocumentTransition::Create(create_transition) = transition { - // Validate the ID - let generated_document_id = Document::generate_document_id_v0( - create_transition.base().data_contract_id_ref(), - &self.owner_id(), - create_transition.base().document_type_name(), - &create_transition.entropy(), - ); - - // This hash will take 2 blocks (128 bytes) - execution_context.add_operation(ValidationOperation::DoubleSha256(2)); - - let id = create_transition.base().id(); - if generated_document_id != id { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition( - transition.base(), - self.owner_id(), - self.user_fee_increase(), - ), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - vec![ - InvalidDocumentTransitionIdError::new(generated_document_id, id).into(), - ], - )); - } - } - } - - // Next we need to validate the structure of all actions (this means with the data contract) - for transition in action.transitions() { - match transition { - DocumentTransitionAction::CreateAction(create_action) => { - let result = create_action.validate_structure( - identity.id, - block_info, - network, - platform_version, - )?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the create action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::ReplaceAction(replace_action) => { - let result = replace_action.validate_structure(platform_version)?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the replace action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::DeleteAction(delete_action) => { - let result = delete_action.validate_structure(platform_version)?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the delete action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::TransferAction(transfer_action) => { - let result = transfer_action.validate_structure(platform_version)?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the transfer action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::UpdatePriceAction(update_price_action) => { - let result = update_price_action.validate_structure(platform_version)?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the update price action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::PurchaseAction(purchase_action) => { - let result = purchase_action.validate_structure(platform_version)?; - if !result.is_valid() { - let bump_action = StateTransitionAction::BumpIdentityDataContractNonceAction( - BumpIdentityDataContractNonceAction::from_borrowed_document_base_transition_action(transition.base().expect("there is always a base for the purchase action"), self.owner_id(), self.user_fee_increase()), - ); - - return Ok(ConsensusValidationResult::new_with_data_and_errors( - bump_action, - result.errors, - )); - } - } - DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "we should not have a bump identity contract nonce at this stage", - ))); - } - } - } - Ok(ConsensusValidationResult::new()) - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs deleted file mode 100644 index 5ee90a17ab4..00000000000 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/documents_batch/state/v0/mod.rs +++ /dev/null @@ -1,231 +0,0 @@ -use dpp::block::block_info::BlockInfo; -use dpp::consensus::ConsensusError; -use dpp::consensus::state::state_error::StateError; -use dpp::prelude::ConsensusValidationResult; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; -use dpp::state_transition::StateTransitionLike; -use drive::state_transition_action::StateTransitionAction; -use dpp::version::{DefaultForPlatformVersion, PlatformVersion}; -use drive::grovedb::TransactionArg; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use drive::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; -use drive::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; -use crate::error::Error; -use crate::error::execution::ExecutionError; -use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_create_transition_action::DocumentCreateTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_delete_transition_action::DocumentDeleteTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_purchase_transition_action::DocumentPurchaseTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_replace_transition_action::DocumentReplaceTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_transfer_transition_action::DocumentTransferTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::action_validation::document_update_price_transition_action::DocumentUpdatePriceTransitionActionValidation; -use crate::execution::validation::state_transition::documents_batch::data_triggers::{data_trigger_bindings_list, DataTriggerExecutionContext, DataTriggerExecutor}; -use crate::platform_types::platform::{PlatformStateRef}; -use crate::execution::validation::state_transition::state_transitions::documents_batch::transformer::v0::DocumentsBatchTransitionTransformerV0; -use crate::execution::validation::state_transition::ValidationMode; -use crate::platform_types::platform_state::v0::PlatformStateV0Methods; - -mod data_triggers; -pub mod fetch_contender; -pub mod fetch_documents; - -pub(in crate::execution::validation::state_transition::state_transitions::documents_batch) trait DocumentsBatchStateTransitionStateValidationV0 -{ - fn validate_state_v0( - &self, - action: DocumentsBatchTransitionAction, - platform: &PlatformStateRef, - block_info: &BlockInfo, - execution_context: &mut StateTransitionExecutionContext, - tx: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; - - fn transform_into_action_v0( - &self, - platform: &PlatformStateRef, - block_info: &BlockInfo, - validation_mode: ValidationMode, - tx: TransactionArg, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error>; -} - -impl DocumentsBatchStateTransitionStateValidationV0 for DocumentsBatchTransition { - fn validate_state_v0( - &self, - mut state_transition_action: DocumentsBatchTransitionAction, - platform: &PlatformStateRef, - block_info: &BlockInfo, - execution_context: &mut StateTransitionExecutionContext, - transaction: TransactionArg, - platform_version: &PlatformVersion, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { - let mut validation_result = ConsensusValidationResult::<StateTransitionAction>::new(); - - let state_transition_execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - - let owner_id = state_transition_action.owner_id(); - - let mut validated_transitions = vec![]; - - let data_trigger_bindings = if platform.config.execution.use_document_triggers { - data_trigger_bindings_list(platform_version)? - } else { - vec![] - }; - - // Next we need to validate the structure of all actions (this means with the data contract) - for transition in state_transition_action.transitions_take() { - let transition_validation_result = match &transition { - DocumentTransitionAction::CreateAction(create_action) => create_action - .validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )?, - DocumentTransitionAction::ReplaceAction(replace_action) => replace_action - .validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )?, - DocumentTransitionAction::TransferAction(transfer_action) => transfer_action - .validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )?, - DocumentTransitionAction::DeleteAction(delete_action) => delete_action - .validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )?, - DocumentTransitionAction::UpdatePriceAction(update_price_action) => { - update_price_action.validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )? - } - DocumentTransitionAction::PurchaseAction(purchase_action) => purchase_action - .validate_state( - platform, - owner_id, - block_info, - execution_context, - transaction, - platform_version, - )?, - DocumentTransitionAction::BumpIdentityDataContractNonce(..) => { - return Err(Error::Execution(ExecutionError::CorruptedCodeExecution( - "we should never start with a bump identity data contract nonce", - ))); - } - }; - - if !transition_validation_result.is_valid() { - // If a state transition isn't valid we still need to bump the identity data contract nonce - validation_result.add_errors(transition_validation_result.errors); - validated_transitions.push( - DocumentTransitionAction::BumpIdentityDataContractNonce( - BumpIdentityDataContractNonceAction::from_document_base_transition_action( - transition.base_owned().ok_or(Error::Execution( - ExecutionError::CorruptedCodeExecution( - "base should always exist on transition", - ), - ))?, - owner_id, - state_transition_action.user_fee_increase(), - ), - ), - ); - } else if platform.config.execution.use_document_triggers { - // we should also validate document triggers - let data_trigger_execution_context = DataTriggerExecutionContext { - platform, - transaction, - owner_id: &self.owner_id(), - state_transition_execution_context: &state_transition_execution_context, - }; - let data_trigger_execution_result = transition.validate_with_data_triggers( - &data_trigger_bindings, - &data_trigger_execution_context, - platform_version, - )?; - - if !data_trigger_execution_result.is_valid() { - // If a state transition isn't valid because of data triggers we still need - // to bump the identity data contract nonce - let consensus_errors: Vec<ConsensusError> = data_trigger_execution_result - .errors - .into_iter() - .map(|e| ConsensusError::StateError(StateError::DataTriggerError(e))) - .collect(); - validation_result.add_errors(consensus_errors); - validated_transitions - .push(DocumentTransitionAction::BumpIdentityDataContractNonce( - BumpIdentityDataContractNonceAction::from_document_base_transition_action( - transition.base_owned().ok_or(Error::Execution( - ExecutionError::CorruptedCodeExecution( - "base should always exist on transition", - ), - ))?, - owner_id, - state_transition_action.user_fee_increase(), - ), - )); - } else { - validated_transitions.push(transition); - } - } else { - validated_transitions.push(transition); - } - } - - state_transition_action.set_transitions(validated_transitions); - - validation_result.set_data(state_transition_action.into()); - - Ok(validation_result) - } - - fn transform_into_action_v0( - &self, - platform: &PlatformStateRef, - block_info: &BlockInfo, - validation_mode: ValidationMode, - tx: TransactionArg, - ) -> Result<ConsensusValidationResult<StateTransitionAction>, Error> { - let platform_version = platform.state.current_platform_version()?; - - let mut execution_context = - StateTransitionExecutionContext::default_for_platform_version(platform_version)?; - - let validation_result = self.try_into_action_v0( - platform, - block_info, - validation_mode.should_validate_document_valid_against_state(), - tx, - &mut execution_context, - )?; - - Ok(validation_result.map(Into::into)) - } -} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs index 1e0d8bf4b00..4b9f5523457 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_create/mod.rs @@ -215,7 +215,121 @@ mod tests { use std::collections::BTreeMap; #[test] - fn test_identity_create_validation() { + fn test_identity_create_validation_first_protocol_version() { + let platform_version = PlatformVersion::first(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_initial_protocol_version(1) + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (key, private_key) = IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(key.clone(), private_key.clone()); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([(0, master_key.clone()), (1, key.clone())]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 1871240); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99913915760); + } + + #[test] + fn test_identity_create_validation_latest_protocol_version() { let platform_version = PlatformVersion::latest(); let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { @@ -309,7 +423,230 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 1871240); + assert_eq!(processing_result.aggregated_fees().processing_fee, 1919540); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99913867460); + } + + #[test] + fn test_identity_create_asset_lock_reuse_after_issue_first_protocol_version() { + let platform_version = PlatformVersion::first(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .with_initial_protocol_version(1) + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let mut identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10080700); // 10000000 penalty + 80700 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // Okay now let us try to reuse the asset lock + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + // let's set the new key to the identity (replacing the one that was causing the issue + identity.set_public_keys(BTreeMap::from([ + (0, master_key.clone()), + (1, new_public_key.clone()), + ])); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2146900); platform .drive @@ -324,11 +661,11 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 99913915760); + assert_eq!(identity_balance, 99909310400); // The identity balance is smaller than if there hadn't been any issue } #[test] - fn test_identity_create_asset_lock_reuse_after_issue() { + fn test_identity_create_asset_lock_reuse_after_issue_latest_protocol_version() { let platform_version = PlatformVersion::latest(); let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { @@ -531,7 +868,7 @@ mod tests { assert_eq!(processing_result.valid_count(), 1); - assert_eq!(processing_result.aggregated_fees().processing_fee, 2146900); + assert_eq!(processing_result.aggregated_fees().processing_fee, 2195200); platform .drive @@ -546,7 +883,7 @@ mod tests { .expect("expected to get identity balance") .expect("expected there to be an identity balance for this identity"); - assert_eq!(identity_balance, 99909310400); // The identity balance is smaller than if there hadn't been any issue + assert_eq!(identity_balance, 99909262100); // The identity balance is smaller than if there hadn't been any issue } #[test] @@ -1007,8 +1344,8 @@ mod tests { } #[test] - fn test_identity_create_asset_lock_replay_attack() { - let platform_version = PlatformVersion::latest(); + fn test_identity_create_asset_lock_replay_attack_first_protocol_version() { + let platform_version = PlatformVersion::first(); let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -1019,6 +1356,7 @@ mod tests { let platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(1) .build_with_mock_rpc() .set_initial_state_structure(); @@ -1252,4 +1590,251 @@ mod tests { assert_eq!(identity_balance, 99909310400); // The identity balance is smaller than if there hadn't been any issue } + + #[test] + fn test_identity_create_asset_lock_replay_attack_latest_protocol_version() { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key_that_is_already_in_system, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + // Let's start by adding this critical key to another identity + + let (another_master_key, _) = IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(53), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, another_master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 100000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system, + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key( + critical_public_key_that_is_already_in_system.clone(), + private_key.clone(), + ); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identifier = asset_lock_proof + .create_identifier() + .expect("expected an identifier"); + + let mut identity: Identity = IdentityV0 { + id: identifier, + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key_that_is_already_in_system.clone()), + ]), + balance: 1000000000, + revision: 0, + } + .into(); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof.clone(), + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 1); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 10080700); // 10000000 penalty + 80700 processing + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + // let's try to replay the bad transaction + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 1); + + assert_eq!(processing_result.valid_count(), 0); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 0); + + // Okay now let us try to reuse the asset lock + + let (new_public_key, new_private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(13), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(new_public_key.clone(), new_private_key.clone()); + + // let's set the new key to the identity (replacing the one that was causing the issue + identity.set_public_keys(BTreeMap::from([ + (0, master_key.clone()), + (1, new_public_key.clone()), + ])); + + let identity_create_transition: StateTransition = + IdentityCreateTransition::try_from_identity_with_signer( + &identity, + asset_lock_proof, + pk.as_slice(), + &signer, + &NativeBlsModule, + 0, + platform_version, + ) + .expect("expected an identity create transition"); + + let identity_create_serialized_transition = identity_create_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_create_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.invalid_paid_count(), 0); + + assert_eq!(processing_result.invalid_unpaid_count(), 0); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 2195200); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance(identity.id().into_buffer(), None, platform_version) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 99909262100); // The identity balance is smaller than if there hadn't been any issue + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs index e3fe3482073..1b35c361310 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/identity_top_up/mod.rs @@ -121,8 +121,8 @@ mod tests { use std::collections::BTreeMap; #[test] - fn test_identity_top_up_validation() { - let platform_version = PlatformVersion::latest(); + fn test_identity_top_up_validation_first_version() { + let platform_version = PlatformVersion::first(); let platform_config = PlatformConfig { testing_configs: PlatformTestConfig { disable_instant_lock_signature_verification: true, @@ -133,6 +133,7 @@ mod tests { let platform = TestPlatformBuilder::new() .with_config(platform_config) + .with_initial_protocol_version(1) .build_with_mock_rpc() .set_initial_state_structure(); @@ -249,4 +250,134 @@ mod tests { assert_eq!(identity_balance, 149993654420); // about 0.5 Dash starting balance + 1 Dash asset lock top up } + + #[test] + fn test_identity_top_up_validation_latest_version() { + let platform_version = PlatformVersion::latest(); + let platform_config = PlatformConfig { + testing_configs: PlatformTestConfig { + disable_instant_lock_signature_verification: true, + ..Default::default() + }, + ..Default::default() + }; + + let platform = TestPlatformBuilder::new() + .with_config(platform_config) + .build_with_mock_rpc() + .set_initial_state_structure(); + + let platform_state = platform.state.load(); + + let mut signer = SimpleSigner::default(); + + let mut rng = StdRng::seed_from_u64(567); + + let (master_key, master_private_key) = + IdentityPublicKey::random_ecdsa_master_authentication_key( + 0, + Some(58), + platform_version, + ) + .expect("expected to get key pair"); + + signer.add_key(master_key.clone(), master_private_key.clone()); + + let (critical_public_key, private_key) = + IdentityPublicKey::random_ecdsa_critical_level_authentication_key( + 1, + Some(999), + platform_version, + ) + .expect("expected to get key pair"); + + let identity_already_in_system: Identity = IdentityV0 { + id: Identifier::random_with_rng(&mut rng), + public_keys: BTreeMap::from([ + (0, master_key.clone()), + (1, critical_public_key.clone()), + ]), + balance: 50000000000, + revision: 0, + } + .into(); + + // We just add this identity to the system first + + platform + .drive + .add_new_identity( + identity_already_in_system.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add a new identity"); + + signer.add_key(critical_public_key.clone(), private_key.clone()); + + let (_, pk) = ECDSA_SECP256K1 + .random_public_and_private_key_data(&mut rng, platform_version) + .unwrap(); + + let asset_lock_proof = instant_asset_lock_proof_fixture( + Some(PrivateKey::from_slice(pk.as_slice(), Network::Testnet).unwrap()), + None, + ); + + let identity_top_up_transition: StateTransition = + IdentityTopUpTransition::try_from_identity( + &identity_already_in_system, + asset_lock_proof, + pk.as_slice(), + 0, + platform_version, + None, + ) + .expect("expected an identity create transition"); + + let identity_top_up_serialized_transition = identity_top_up_transition + .serialize_to_bytes() + .expect("serialized state transition"); + + let transaction = platform.drive.grove.start_transaction(); + + let processing_result = platform + .platform + .process_raw_state_transitions( + &vec![identity_top_up_serialized_transition.clone()], + &platform_state, + &BlockInfo::default(), + &transaction, + platform_version, + false, + None, + ) + .expect("expected to process state transition"); + + assert_eq!(processing_result.valid_count(), 1); + + assert_eq!(processing_result.aggregated_fees().processing_fee, 588840); + + platform + .drive + .grove + .commit_transaction(transaction) + .unwrap() + .expect("expected to commit"); + + let identity_balance = platform + .drive + .fetch_identity_balance( + identity_already_in_system.id().into_buffer(), + None, + platform_version, + ) + .expect("expected to get identity balance") + .expect("expected there to be an identity balance for this identity"); + + assert_eq!(identity_balance, 149993606160); // about 0.5 Dash starting balance + 1 Dash asset lock top up + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/mod.rs index 216c68a1ecb..79818202cde 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/mod.rs @@ -2,6 +2,7 @@ use crate::error::execution::ExecutionError; use crate::error::Error; use crate::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use crate::execution::validation::state_transition::masternode_vote::nonce::v0::MasternodeVoteTransitionIdentityNonceV0; +use crate::execution::validation::state_transition::masternode_vote::nonce::v1::MasternodeVoteTransitionIdentityNonceV1; use crate::execution::validation::state_transition::processor::v0::StateTransitionNonceValidationV0; use crate::platform_types::platform::PlatformStateRef; use dpp::block::block_info::BlockInfo; @@ -11,6 +12,8 @@ use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; pub(crate) mod v0; +pub(crate) mod v1; + impl StateTransitionNonceValidationV0 for MasternodeVoteTransition { fn validate_nonces( &self, @@ -34,14 +37,21 @@ impl StateTransitionNonceValidationV0 for MasternodeVoteTransition { execution_context, platform_version, ), + Some(1) => self.validate_nonce_v1( + platform, + block_info, + tx, + execution_context, + platform_version, + ), Some(version) => Err(Error::Execution(ExecutionError::UnknownVersionMismatch { method: "masternode vote transition: validate_nonces".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), None => Err(Error::Execution(ExecutionError::VersionNotActive { method: "masternode vote transition: validate_nonces".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], })), } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v0/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v0/mod.rs index bdb92a5a716..fd9ea2cc165 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v0/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v0/mod.rs @@ -14,6 +14,7 @@ use crate::execution::types::execution_operation::ValidationOperation; use crate::execution::types::state_transition_execution_context::{ StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, }; +use crate::execution::validation::state_transition::masternode_vote::nonce::v1::MasternodeVoteTransitionIdentityNonceV1; use crate::platform_types::platform::PlatformStateRef; use dpp::version::PlatformVersion; use drive::grovedb::TransactionArg; @@ -39,6 +40,17 @@ impl MasternodeVoteTransitionIdentityNonceV0 for MasternodeVoteTransition { execution_context: &mut StateTransitionExecutionContext, platform_version: &PlatformVersion, ) -> Result<SimpleConsensusValidationResult, Error> { + // We are introducing this as an emergency hard fork activating at epoch 13. + if block_info.epoch.index >= 13 { + return self.validate_nonce_v1( + platform, + block_info, + tx, + execution_context, + platform_version, + ); + } + let revision_nonce = self.nonce(); if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v1/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v1/mod.rs new file mode 100644 index 00000000000..6fa254f7fbe --- /dev/null +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/masternode_vote/nonce/v1/mod.rs @@ -0,0 +1,71 @@ +use crate::error::Error; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::basic::document::NonceOutOfBoundsError; +use dpp::consensus::basic::BasicError; +use dpp::identity::identity_nonce::{ + validate_identity_nonce_update, validate_new_identity_nonce, MISSING_IDENTITY_REVISIONS_FILTER, +}; +use dpp::state_transition::masternode_vote_transition::accessors::MasternodeVoteTransitionAccessorsV0; +use dpp::state_transition::masternode_vote_transition::MasternodeVoteTransition; + +use dpp::validation::SimpleConsensusValidationResult; + +use crate::execution::types::execution_operation::ValidationOperation; +use crate::execution::types::state_transition_execution_context::{ + StateTransitionExecutionContext, StateTransitionExecutionContextMethodsV0, +}; +use crate::platform_types::platform::PlatformStateRef; +use dpp::version::PlatformVersion; +use drive::grovedb::TransactionArg; + +pub(in crate::execution::validation::state_transition::state_transitions) trait MasternodeVoteTransitionIdentityNonceV1 +{ + fn validate_nonce_v1( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error>; +} + +impl MasternodeVoteTransitionIdentityNonceV1 for MasternodeVoteTransition { + fn validate_nonce_v1( + &self, + platform: &PlatformStateRef, + block_info: &BlockInfo, + tx: TransactionArg, + execution_context: &mut StateTransitionExecutionContext, + platform_version: &PlatformVersion, + ) -> Result<SimpleConsensusValidationResult, Error> { + let revision_nonce = self.nonce(); + + if revision_nonce & MISSING_IDENTITY_REVISIONS_FILTER > 0 { + return Ok(SimpleConsensusValidationResult::new_with_error( + BasicError::NonceOutOfBoundsError(NonceOutOfBoundsError::new(revision_nonce)) + .into(), + )); + } + + let voter_identity_id = self.voter_identity_id(); + + let (existing_nonce, fee) = platform.drive.fetch_identity_nonce_with_fees( + voter_identity_id.to_buffer(), + block_info, + true, + tx, + platform_version, + )?; + + execution_context.add_operation(ValidationOperation::PrecalculatedOperation(fee)); + + let result = if let Some(existing_nonce) = existing_nonce { + validate_identity_nonce_update(existing_nonce, revision_nonce, voter_identity_id) + } else { + validate_new_identity_nonce(revision_nonce, voter_identity_id) + }; + + Ok(result) + } +} diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs index b0986e026d5..0c7b345be77 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/mod.rs @@ -1,5 +1,5 @@ /// Module containing functionality related to batch processing of documents. -pub mod documents_batch; +pub mod batch; /// Module for creating an identity entity. pub mod identity_create; @@ -78,7 +78,8 @@ pub(in crate::execution) mod tests { use dpp::dashcore::{ProTxHash, Txid}; use dpp::dashcore::hashes::Hash; use dpp::data_contract::accessors::v0::DataContractV0Getters; - use dpp::data_contract::DataContract; + use dpp::data_contract::accessors::v1::{DataContractV1Getters, DataContractV1Setters}; + use dpp::data_contract::{DataContract, GroupContractPosition}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::random_document::{CreateRandomDocument, DocumentFieldFillSize, DocumentFieldFillType}; use dpp::document::{Document, DocumentV0Getters, DocumentV0Setters}; @@ -90,11 +91,12 @@ pub(in crate::execution) mod tests { use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; use dpp::platform_value::{Bytes32, Value}; use dpp::serialization::PlatformSerializable; - use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; - use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; + use dpp::state_transition::batch_transition::BatchTransition; + use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; use dpp::state_transition::masternode_vote_transition::MasternodeVoteTransition; use dpp::state_transition::masternode_vote_transition::methods::MasternodeVoteTransitionMethodsV0; use dpp::state_transition::StateTransition; + use dpp::tokens::calculate_token_id; use dpp::util::hash::hash_double; use dpp::util::strings::convert_to_homograph_safe_chars; use dpp::voting::contender_structs::{Contender, ContenderV0}; @@ -123,6 +125,8 @@ pub(in crate::execution) mod tests { use crate::platform_types::epoch_info::v0::EpochInfoV0; use crate::execution::types::block_fees::v0::BlockFeesV0; use crate::execution::types::processed_block_fees_outcome::v0::ProcessedBlockFeesOutcome; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::group::Group; /// We add an identity, but we also add the same amount to system credits pub(in crate::execution) fn setup_identity_with_system_credits( @@ -478,7 +482,7 @@ pub(in crate::execution) mod tests { // Process fees let processed_block_fees = platform - .process_block_fees( + .process_block_fees_and_validate_sum_trees( &block_execution_context, block_fees_v0.into(), &transaction, @@ -894,6 +898,9 @@ pub(in crate::execution) mod tests { "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let card_game = setup_contract( @@ -901,6 +908,9 @@ pub(in crate::execution) mod tests { "tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let (_, _, dpns_contract) = create_dpns_name_contest_on_identities_for_contract_records( @@ -1044,7 +1054,7 @@ pub(in crate::execution) mod tests { document_2.set("preorderSalt", salt_2.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1.clone(), preorder, entropy.0, @@ -1065,7 +1075,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_2.clone(), preorder, entropy.0, @@ -1086,7 +1096,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1.clone(), domain, entropy.0, @@ -1106,7 +1116,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_2.clone(), domain, entropy.0, @@ -1245,6 +1255,9 @@ pub(in crate::execution) mod tests { "tests/supporting_files/contract/dpns/dpns-contract-contested-unique-index-with-contract-id.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let preorder = dpns_contract @@ -1354,7 +1367,7 @@ pub(in crate::execution) mod tests { document_2.set("preorderSalt", salt_2.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1.clone(), preorder, entropy.0, @@ -1375,7 +1388,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_preorder_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_2.clone(), preorder, entropy.0, @@ -1396,7 +1409,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1.clone(), domain, entropy.0, @@ -1416,7 +1429,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_2 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_2.clone(), domain, entropy.0, @@ -1576,7 +1589,7 @@ pub(in crate::execution) mod tests { document_1.set("preorderSalt", salt_1.into()); let documents_batch_create_preorder_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( preorder_document_1, preorder, entropy.0, @@ -1597,7 +1610,7 @@ pub(in crate::execution) mod tests { .expect("expected documents batch serialized state transition"); let documents_batch_create_transition_1 = - DocumentsBatchTransition::new_document_creation_transition_from_document( + BatchTransition::new_document_creation_transition_from_document( document_1, domain, entropy.0, @@ -2274,4 +2287,38 @@ pub(in crate::execution) mod tests { finished_vote_info, ) } + + pub(in crate::execution) fn create_token_contract_with_owner_identity( + platform: &mut TempPlatform<MockCoreRPCLike>, + identity_id: Identifier, + token_configuration_modification: Option<impl FnOnce(&mut TokenConfiguration)>, + add_groups: Option<BTreeMap<GroupContractPosition, Group>>, + platform_version: &PlatformVersion, + ) -> (DataContract, Identifier) { + let data_contract_id = DataContract::generate_data_contract_id_v0(identity_id, 1); + + let basic_token_contract = setup_contract( + &platform.drive, + "tests/supporting_files/contract/basic-token/basic-token.json", + Some(data_contract_id.to_buffer()), + Some(identity_id.to_buffer()), + Some(|data_contract: &mut DataContract| { + if let Some(token_configuration_modification) = token_configuration_modification { + let token_configuration = data_contract + .token_configuration_mut(0) + .expect("expected token configuration"); + token_configuration_modification(token_configuration); + } + if let Some(add_groups) = add_groups { + data_contract.set_groups(add_groups); + } + }), + None, + Some(platform_version), + ); + + let token_id = calculate_token_id(data_contract_id.as_bytes(), 0); + + (basic_token_contract, token_id.into()) + } } diff --git a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs index e078e0c8b64..cb26dd4fbc3 100644 --- a/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs +++ b/packages/rs-drive-abci/src/execution/validation/state_transition/transformer/mod.rs @@ -98,7 +98,7 @@ impl StateTransitionActionTransformerV0 for StateTransition { execution_context, tx, ), - StateTransition::DocumentsBatch(st) => st.transform_into_action( + StateTransition::Batch(st) => st.transform_into_action( platform, block_info, validation_mode, diff --git a/packages/rs-drive-abci/src/main.rs b/packages/rs-drive-abci/src/main.rs index a8ae1adccdc..67a68a40914 100644 --- a/packages/rs-drive-abci/src/main.rs +++ b/packages/rs-drive-abci/src/main.rs @@ -468,10 +468,10 @@ mod test { let path = tempdir.join("db"); fs::create_dir(&path).expect("create db dir"); - let (drive, _) = Drive::open(&path, None).expect("open drive"); - let platform_version = PlatformVersion::latest(); + let (drive, _) = Drive::open(&path, None, Some(platform_version)).expect("open drive"); + drive .create_initial_state_structure(None, platform_version) .expect("should create root tree successfully"); diff --git a/packages/rs-drive-abci/src/mimic/mod.rs b/packages/rs-drive-abci/src/mimic/mod.rs index f0c5f895bca..0cf59e80e0f 100644 --- a/packages/rs-drive-abci/src/mimic/mod.rs +++ b/packages/rs-drive-abci/src/mimic/mod.rs @@ -34,11 +34,11 @@ use tenderdash_abci::proto::abci::{ ValidatorSetUpdate, }; use tenderdash_abci::proto::google::protobuf::Timestamp; -use tenderdash_abci::proto::serializers::timestamp::ToMilis; use tenderdash_abci::proto::types::{ Block, BlockId, CanonicalVote, Data, EvidenceList, Header, PartSetHeader, SignedMsgType, StateId, VoteExtension, VoteExtensionType, }; +use tenderdash_abci::proto::ToMillis; use tenderdash_abci::signatures::Hashable; use tenderdash_abci::{proto::version::Consensus, signatures::Signable, Application}; @@ -239,7 +239,9 @@ impl<'a, C: CoreRPCLike> FullAbciApplication<'a, C> { app_version, core_chain_locked_height: core_height, height, - time: time.to_milis(), + time: time + .to_millis() + .expect("expected to convert time to millis"), }; let state_id_hash = state_id .calculate_msg_hash(CHAIN_ID, height as i64, round as i32) diff --git a/packages/rs-drive-abci/src/mimic/test_quorum.rs b/packages/rs-drive-abci/src/mimic/test_quorum.rs index 389abf3bc1c..188cdeff668 100644 --- a/packages/rs-drive-abci/src/mimic/test_quorum.rs +++ b/packages/rs-drive-abci/src/mimic/test_quorum.rs @@ -1,11 +1,11 @@ use crate::platform_types::validator::v0::ValidatorV0; use crate::platform_types::validator_set::v0::ValidatorSetV0; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::{QuorumInfoResult, QuorumMember, QuorumType}; use dpp::bls_signatures::{ Bls12381G2Impl, PublicKey as BlsPublicKey, PublicKey, SecretKey as BlsPrivateKey, SecretKey, }; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{ProTxHash, PubkeyHash, QuorumHash}; use rand::rngs::StdRng; use rand::Rng; use std::collections::BTreeMap; diff --git a/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs b/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs index 7ed2273d95d..783dd18ace0 100644 --- a/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs +++ b/packages/rs-drive-abci/src/platform_types/block_proposal/v0.rs @@ -5,10 +5,12 @@ use dpp::dashcore::hashes::Hash; use dpp::dashcore::{BlockHash, ChainLock}; use dpp::platform_value::Bytes32; use std::fmt; -use tenderdash_abci::proto::abci::{RequestPrepareProposal, RequestProcessProposal}; -use tenderdash_abci::proto::serializers::timestamp::ToMilis; -use tenderdash_abci::proto::types::CoreChainLock; -use tenderdash_abci::proto::version::Consensus; +use tenderdash_abci::proto::{ + abci::{RequestPrepareProposal, RequestProcessProposal}, + types::CoreChainLock, + version::Consensus, + ToMillis, +}; /// The block proposal is the combination of information that a proposer will propose, /// Or that a validator or full node will process @@ -37,7 +39,7 @@ pub struct BlockProposal<'a> { pub raw_state_transitions: &'a Vec<Vec<u8>>, } -impl<'a> fmt::Debug for BlockProposal<'a> { +impl fmt::Debug for BlockProposal<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { writeln!(f, "BlockProposal {{")?; writeln!(f, " consensus_versions: {:?},", self.consensus_versions)?; @@ -96,18 +98,16 @@ impl<'a> TryFrom<&'a RequestPrepareProposal> for BlockProposal<'a> { version, quorum_hash, } = value; - let consensus_versions = version - .as_ref() - .ok_or(AbciError::BadRequest( - "request is missing version".to_string(), - ))? - .clone(); + let consensus_versions = version.as_ref().ok_or(AbciError::BadRequest( + "request is missing version".to_string(), + ))?; let block_time_ms = time .as_ref() .ok_or(AbciError::BadRequest( "request is missing block time".to_string(), ))? - .to_milis(); + .to_millis() + .map_err(|e| AbciError::BadRequest(format!("invalid block time: {}", e)))?; let proposer_pro_tx_hash: [u8; 32] = proposer_pro_tx_hash.clone().try_into().map_err(|e| { AbciError::BadRequestDataSize(format!( @@ -135,7 +135,7 @@ impl<'a> TryFrom<&'a RequestPrepareProposal> for BlockProposal<'a> { .into()); } Ok(Self { - consensus_versions, + consensus_versions: *consensus_versions, block_hash: None, height: *height as u64, round: *round as u32, @@ -171,18 +171,18 @@ impl<'a> TryFrom<&'a RequestProcessProposal> for BlockProposal<'a> { version, quorum_hash, } = value; - let consensus_versions = version - .as_ref() - .ok_or(AbciError::BadRequest( - "process proposal request is missing version".to_string(), - ))? - .clone(); + let consensus_versions = version.as_ref().ok_or(AbciError::BadRequest( + "process proposal request is missing version".to_string(), + ))?; let block_time_ms = time .as_ref() .ok_or(Error::Abci(AbciError::BadRequest( "missing proposal time".to_string(), )))? - .to_milis(); + .to_millis() + .map_err(|e| { + Error::Abci(AbciError::BadRequest(format!("invalid block time: {}", e))) + })?; let proposer_pro_tx_hash: [u8; 32] = proposer_pro_tx_hash.clone().try_into().map_err(|e| { Error::Abci(AbciError::BadRequestDataSize(format!( @@ -239,7 +239,7 @@ impl<'a> TryFrom<&'a RequestProcessProposal> for BlockProposal<'a> { }) .transpose()?; Ok(Self { - consensus_versions, + consensus_versions: *consensus_versions, block_hash: Some(block_hash), height: *height as u64, round: *round as u32, diff --git a/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs index cccbfb02342..886aa1fd574 100644 --- a/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/cleaned_abci_messages/request_init_chain_cleaned_params/v0/mod.rs @@ -38,7 +38,7 @@ use dpp::util::deserializer::ProtocolVersion; use drive::dpp::identity::TimestampMillis; use serde::{Deserialize, Serialize}; use tenderdash_abci::proto::abci::RequestInitChain; -use tenderdash_abci::proto::serializers::timestamp::ToMilis; +use tenderdash_abci::proto::ToMillis; /// A struct for handling chain initialization requests #[derive(Serialize, Deserialize)] @@ -65,7 +65,9 @@ impl TryFrom<RequestInitChain> for RequestInitChainCleanedParams { .ok_or(AbciError::BadRequest( "genesis time is required in init chain".to_string(), ))? - .to_milis() as TimestampMillis; + .to_millis() + .map_err(|e| AbciError::BadRequest(format!("genesis time is invalid: {}", e)))? + as TimestampMillis; let initial_core_height = match request.initial_core_height { 0 => None, h => Some(h), diff --git a/packages/rs-drive-abci/src/platform_types/platform/mod.rs b/packages/rs-drive-abci/src/platform_types/platform/mod.rs index d5d99f71b37..b7963382b26 100644 --- a/packages/rs-drive-abci/src/platform_types/platform/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform/mod.rs @@ -14,7 +14,7 @@ use std::str::FromStr; use std::sync::atomic::AtomicU64; use std::sync::Arc; -use dashcore_rpc::dashcore::BlockHash; +use dpp::dashcore::BlockHash; use crate::platform_types::platform_state::v0::PlatformStateV0Methods; use crate::platform_types::platform_state::PlatformState; @@ -180,12 +180,18 @@ impl<C> Platform<C> { { let config = config.unwrap_or(PlatformConfig::default_testnet()); - let (drive, current_protocol_version) = - Drive::open(path, Some(config.drive.clone())).map_err(Error::Drive)?; + let default_initial_platform_version = initial_protocol_version + .map(|protocol_version| PlatformVersion::get(protocol_version)) + .transpose()?; - if let Some(protocol_version) = current_protocol_version { - let platform_version = PlatformVersion::get(protocol_version)?; + let (drive, current_platform_version) = Drive::open( + path, + Some(config.drive.clone()), + default_initial_platform_version, + ) + .map_err(Error::Drive)?; + if let Some(platform_version) = current_platform_version { let Some(execution_state) = Platform::<C>::fetch_platform_state(&drive, None, platform_version)? else { diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs index d2236ef84cc..d2c89b7f5e2 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/mod.rs @@ -9,7 +9,6 @@ use crate::platform_types::platform_state::v0::{ }; use crate::platform_types::validator_set::ValidatorSet; -use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; use derive_more::From; use dpp::bincode::{config, Decode, Encode}; use dpp::block::epoch::Epoch; @@ -25,6 +24,7 @@ use indexmap::IndexMap; use crate::config::PlatformConfig; use crate::error::execution::ExecutionError; use crate::platform_types::signature_verification_quorum_set::SignatureVerificationQuorumSet; +use dashcore_rpc::json::MasternodeListItem; use dpp::block::block_info::BlockInfo; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::util::hash::hash_double; diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs index 9bb41bf2d67..151ef592f6d 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/mod.rs @@ -2,10 +2,10 @@ mod old_structures; use crate::error::execution::ExecutionError; use crate::error::Error; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::MasternodeListItem; use dpp::block::epoch::{Epoch, EPOCH_0}; use dpp::block::extended_block_info::ExtendedBlockInfo; +use dpp::dashcore::{ProTxHash, QuorumHash}; use dpp::bincode::{Decode, Encode}; use dpp::dashcore::hashes::Hash; @@ -145,7 +145,7 @@ pub(super) struct PlatformStateForSavingV0 { /// The validator set quorums are a subset of the quorums, but they also contain the list of /// all members #[bincode(with_serde)] - pub validator_sets: Vec<(Bytes32, old_structures::ValidatorSet)>, + pub validator_sets: Vec<(Bytes32, old_structures::OldStructureValidatorSet)>, /// The quorums used for validating chain locks pub chain_lock_validating_quorums: SignatureVerificationQuorumSetForSaving, diff --git a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs index ebd0e85875f..009c2de990c 100644 --- a/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/platform_state/v0/old_structures/mod.rs @@ -4,15 +4,17 @@ use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub(super) enum ValidatorSet { +pub enum OldStructureValidatorSet { /// Version 0 - V0(ValidatorSetV0), + V0(OldStructureValidatorSetV0), } -impl From<ValidatorSet> for dpp::core_types::validator_set::ValidatorSet { - fn from(value: ValidatorSet) -> Self { +impl From<OldStructureValidatorSet> for dpp::core_types::validator_set::ValidatorSet { + fn from(value: OldStructureValidatorSet) -> Self { match value { - ValidatorSet::V0(v0) => dpp::core_types::validator_set::ValidatorSet::V0(v0.into()), + OldStructureValidatorSet::V0(v0) => { + dpp::core_types::validator_set::ValidatorSet::V0(v0.into()) + } } } } @@ -20,7 +22,7 @@ impl From<ValidatorSet> for dpp::core_types::validator_set::ValidatorSet { /// The validator set is only slightly different from a quorum as it does not contain non valid /// members #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] -pub(super) struct ValidatorSetV0 { +pub(super) struct OldStructureValidatorSetV0 { /// The quorum hash pub quorum_hash: QuorumHash, /// Rotation quorum index is available only for DIP24 quorums @@ -30,17 +32,25 @@ pub(super) struct ValidatorSetV0 { /// The list of masternodes pub members: BTreeMap<ProTxHash, ValidatorV0>, /// The threshold quorum public key + #[cfg(feature = "bls-signatures")] pub threshold_public_key: bls_signatures::PublicKey, + + /// Extra fields for forward compatibility. + #[cfg(not(feature = "bls-signatures"))] + #[serde(flatten)] + pub extra_fields: std::collections::HashMap<String, serde_json::Value>, } -impl From<ValidatorSetV0> for dpp::core_types::validator_set::v0::ValidatorSetV0 { - fn from(value: ValidatorSetV0) -> Self { - let ValidatorSetV0 { +impl From<OldStructureValidatorSetV0> for dpp::core_types::validator_set::v0::ValidatorSetV0 { + fn from(value: OldStructureValidatorSetV0) -> Self { + let OldStructureValidatorSetV0 { quorum_hash, quorum_index, core_height, members, + #[cfg(feature = "bls-signatures")] threshold_public_key, + .. } = value; Self { quorum_hash, @@ -50,8 +60,11 @@ impl From<ValidatorSetV0> for dpp::core_types::validator_set::v0::ValidatorSetV0 .into_iter() .map(|(pro_tx_hash, validator)| (pro_tx_hash, validator.into())) .collect(), + #[cfg(feature = "bls-signatures")] threshold_public_key: PublicKey::try_from(threshold_public_key.to_bytes().as_slice()) .expect("this should not be possible to error as the threshold_public_key was already verified on disk"), + #[cfg(not(feature = "bls-signatures"))] + threshold_public_key: Default::default(), } } } @@ -62,6 +75,7 @@ pub(super) struct ValidatorV0 { /// The proTxHash pub pro_tx_hash: ProTxHash, /// The public key share of this validator for this quorum + #[cfg(feature = "bls-signatures")] pub public_key: Option<bls_signatures::PublicKey>, /// The node address pub node_ip: String, @@ -81,6 +95,7 @@ impl From<ValidatorV0> for dpp::core_types::validator::v0::ValidatorV0 { fn from(value: ValidatorV0) -> Self { let ValidatorV0 { pro_tx_hash, + #[cfg(feature = "bls-signatures")] public_key, node_ip, node_id, @@ -91,7 +106,10 @@ impl From<ValidatorV0> for dpp::core_types::validator::v0::ValidatorV0 { } = value; Self { pro_tx_hash, + #[cfg(feature = "bls-signatures")] public_key: public_key.map(|pk| PublicKey::try_from(pk.to_bytes().as_slice()).expect("this should not be possible to error as the public_key was already verified on disk")), + #[cfg(not(feature = "bls-signatures"))] + public_key: None, node_ip, node_id, core_port, diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs index a314829a7d7..9e5e17b9e7d 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/mod.rs @@ -3,8 +3,9 @@ mod v0; use crate::config::QuorumLikeConfig; use crate::error::execution::ExecutionError; use crate::error::Error; -use crate::platform_types::signature_verification_quorum_set::v0::for_saving::SignatureVerificationQuorumSetForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v0::SignatureVerificationQuorumSetForSavingV0; use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v1::SignatureVerificationQuorumSetForSavingV1; +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v2::SignatureVerificationQuorumSetForSavingV2; pub use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ QuorumConfig, QuorumsWithConfig, SelectedQuorumSetIterator, SignatureVerificationQuorumSetV0, SignatureVerificationQuorumSetV0Methods, SIGN_OFFSET, @@ -121,13 +122,15 @@ pub enum SignatureVerificationQuorumSetForSaving { V0(SignatureVerificationQuorumSetForSavingV0), /// Version 1 of the signature verification quorums V1(SignatureVerificationQuorumSetForSavingV1), + /// Version 2 of the signature verification quorums + V2(SignatureVerificationQuorumSetForSavingV2), } impl From<SignatureVerificationQuorumSet> for SignatureVerificationQuorumSetForSaving { fn from(value: SignatureVerificationQuorumSet) -> Self { match value { SignatureVerificationQuorumSet::V0(v0) => { - SignatureVerificationQuorumSetForSaving::V1(v0.into()) + SignatureVerificationQuorumSetForSaving::V2(v0.into()) } } } @@ -142,6 +145,9 @@ impl From<SignatureVerificationQuorumSetForSaving> for SignatureVerificationQuor SignatureVerificationQuorumSetForSaving::V1(v1) => { SignatureVerificationQuorumSet::V0(v1.into()) } + SignatureVerificationQuorumSetForSaving::V2(v2) => { + SignatureVerificationQuorumSet::V0(v2.into()) + } } } } diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v0.rs similarity index 80% rename from packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs rename to packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v0.rs index de69aff56d3..2800dc0683b 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v0.rs @@ -1,15 +1,12 @@ -use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::{ - PreviousPastQuorumsV0, QuorumConfig, -}; +use crate::platform_types::signature_verification_quorum_set::v0::quorum_config_for_saving_v0::QuorumConfigForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::PreviousPastQuorumsV0; use crate::platform_types::signature_verification_quorum_set::{ Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, VerificationQuorum, }; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::QuorumHash; -use dashcore_rpc::json::QuorumType; -use dpp::identity::state_transition::asset_lock_proof::Encode; -use dpp::platform_serialization::de::Decode; +use bincode::{Decode, Encode}; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::QuorumHash; use dpp::platform_value::Bytes32; #[derive(Debug, Clone, Encode, Decode)] @@ -57,36 +54,6 @@ impl From<SignatureVerificationQuorumSetForSavingV0> for SignatureVerificationQu } } -#[derive(Debug, Clone, Encode, Decode)] -pub struct QuorumConfigForSavingV0 { - quorum_type: QuorumType, - active_signers: u16, - rotation: bool, - window: u32, -} - -impl From<QuorumConfig> for QuorumConfigForSavingV0 { - fn from(config: QuorumConfig) -> Self { - Self { - quorum_type: config.quorum_type, - active_signers: config.active_signers, - rotation: config.rotation, - window: config.window, - } - } -} - -impl From<QuorumConfigForSavingV0> for QuorumConfig { - fn from(config: QuorumConfigForSavingV0) -> Self { - Self { - quorum_type: config.quorum_type, - active_signers: config.active_signers, - rotation: config.rotation, - window: config.window, - } - } -} - #[derive(Debug, Clone, Encode, Decode)] pub struct PreviousPastQuorumsForSavingV0 { quorums: Vec<QuorumForSavingV0>, @@ -134,6 +101,7 @@ impl From<PreviousPastQuorumsForSavingV0> for PreviousPastQuorumsV0 { #[derive(Debug, Clone, Encode, Decode)] pub struct QuorumForSavingV0 { hash: Bytes32, + #[cfg(feature = "bls-signatures")] #[bincode(with_serde)] public_key: bls_signatures::PublicKey, index: Option<u32>, @@ -145,10 +113,13 @@ impl From<Vec<QuorumForSavingV0>> for Quorums<VerificationQuorum> { ( QuorumHash::from_byte_array(quorum.hash.to_buffer()), VerificationQuorum { + #[cfg(feature = "bls-signatures")] public_key: dpp::bls_signatures::PublicKey::try_from( quorum.public_key.to_bytes().as_slice(), ) .expect("expected to convert between BLS key libraries (from chia)"), + #[cfg(not(feature = "bls-signatures"))] + public_key: Default::default(), index: quorum.index, }, ) @@ -162,6 +133,7 @@ impl From<Quorums<VerificationQuorum>> for Vec<QuorumForSavingV0> { .into_iter() .map(|(hash, quorum)| QuorumForSavingV0 { hash: Bytes32::from(hash.as_byte_array()), + #[cfg(feature = "bls-signatures")] public_key: bls_signatures::PublicKey::from_bytes( &quorum.public_key.0.to_compressed(), ) diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs index bfb596e451b..ba82678d7a5 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v1.rs @@ -1,21 +1,22 @@ -use crate::platform_types::signature_verification_quorum_set::v0::for_saving::{ - PreviousPastQuorumsForSavingV0, QuorumConfigForSavingV0, -}; +#[cfg(feature = "bls-signatures")] +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v0::PreviousPastQuorumsForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::quorum_config_for_saving_v0::QuorumConfigForSavingV0; +use crate::platform_types::signature_verification_quorum_set::v0::quorum_set::PreviousPastQuorumsV0; use crate::platform_types::signature_verification_quorum_set::{ Quorums, SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, ThresholdBlsPublicKey, VerificationQuorum, }; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::QuorumHash; +use bincode::{Decode, Encode}; use dpp::bls_signatures::Bls12381G2Impl; -use dpp::identity::state_transition::asset_lock_proof::Encode; -use dpp::platform_serialization::de::Decode; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::QuorumHash; use dpp::platform_value::Bytes32; #[derive(Debug, Clone, Encode, Decode)] pub struct SignatureVerificationQuorumSetForSavingV1 { config: QuorumConfigForSavingV0, current_quorums: Vec<QuorumForSavingV1>, + #[cfg(feature = "bls-signatures")] previous_quorums: Option<PreviousPastQuorumsForSavingV0>, } @@ -36,6 +37,7 @@ impl From<SignatureVerificationQuorumSetV0> for SignatureVerificationQuorumSetFo Self { config: config.into(), current_quorums: current_quorums.into(), + #[cfg(feature = "bls-signatures")] previous_quorums: previous.map(|previous| previous.into()), } } @@ -46,13 +48,17 @@ impl From<SignatureVerificationQuorumSetForSavingV1> for SignatureVerificationQu let SignatureVerificationQuorumSetForSavingV1 { config, current_quorums, + #[cfg(feature = "bls-signatures")] previous_quorums, } = value; Self { config: config.into(), current_quorums: current_quorums.into(), + #[cfg(feature = "bls-signatures")] previous: previous_quorums.map(|previous| previous.into()), + #[cfg(not(feature = "bls-signatures"))] + previous: None, } } } @@ -90,3 +96,47 @@ impl From<Quorums<VerificationQuorum>> for Vec<QuorumForSavingV1> { .collect() } } + +#[derive(Debug, Clone, Encode, Decode)] +pub struct PreviousPastQuorumsForSavingV1 { + quorums: Vec<QuorumForSavingV1>, + last_active_core_height: u32, + updated_at_core_height: u32, + previous_change_height: Option<u32>, +} + +impl From<PreviousPastQuorumsV0> for PreviousPastQuorumsForSavingV1 { + fn from(value: PreviousPastQuorumsV0) -> Self { + let PreviousPastQuorumsV0 { + quorums, + last_active_core_height, + updated_at_core_height, + previous_change_height, + } = value; + + Self { + quorums: quorums.into(), + last_active_core_height, + updated_at_core_height, + previous_change_height, + } + } +} + +impl From<PreviousPastQuorumsForSavingV1> for PreviousPastQuorumsV0 { + fn from(value: PreviousPastQuorumsForSavingV1) -> Self { + let PreviousPastQuorumsForSavingV1 { + quorums, + last_active_core_height, + updated_at_core_height, + previous_change_height, + } = value; + + Self { + quorums: quorums.into(), + last_active_core_height, + updated_at_core_height, + previous_change_height, + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v2.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v2.rs new file mode 100644 index 00000000000..60f0b4d7b9a --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/for_saving_v2.rs @@ -0,0 +1,57 @@ +use crate::platform_types::signature_verification_quorum_set::v0::for_saving_v1::{ + PreviousPastQuorumsForSavingV1, QuorumForSavingV1, +}; +use crate::platform_types::signature_verification_quorum_set::v0::quorum_config_for_saving_v0::QuorumConfigForSavingV0; +use crate::platform_types::signature_verification_quorum_set::{ + SignatureVerificationQuorumSetForSaving, SignatureVerificationQuorumSetV0, +}; +use bincode::{Decode, Encode}; + +// We needed to introduce this V2 because the PreviousPastQuorumsForSavingV1 were using a QuorumForSavingV0 +// This was an oversight in SignatureVerificationQuorumSetForSavingV1. +// This would cause the previous quorums to still use the old BLS sigs library for serialization/deserialization. + +#[derive(Debug, Clone, Encode, Decode)] +pub struct SignatureVerificationQuorumSetForSavingV2 { + config: QuorumConfigForSavingV0, + current_quorums: Vec<QuorumForSavingV1>, + previous_quorums: Option<PreviousPastQuorumsForSavingV1>, +} + +impl From<SignatureVerificationQuorumSetForSavingV2> for SignatureVerificationQuorumSetForSaving { + fn from(value: SignatureVerificationQuorumSetForSavingV2) -> Self { + SignatureVerificationQuorumSetForSaving::V2(value) + } +} + +impl From<SignatureVerificationQuorumSetV0> for SignatureVerificationQuorumSetForSavingV2 { + fn from(value: SignatureVerificationQuorumSetV0) -> Self { + let SignatureVerificationQuorumSetV0 { + config, + current_quorums, + previous, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous_quorums: previous.map(|previous| previous.into()), + } + } +} + +impl From<SignatureVerificationQuorumSetForSavingV2> for SignatureVerificationQuorumSetV0 { + fn from(value: SignatureVerificationQuorumSetForSavingV2) -> Self { + let SignatureVerificationQuorumSetForSavingV2 { + config, + current_quorums, + previous_quorums, + } = value; + + Self { + config: config.into(), + current_quorums: current_quorums.into(), + previous: previous_quorums.map(|previous| previous.into()), + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs index f38657c29ca..bc4511bd4cf 100644 --- a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/mod.rs @@ -1,4 +1,6 @@ -pub mod for_saving; +pub mod for_saving_v0; pub mod for_saving_v1; +pub mod for_saving_v2; +pub mod quorum_config_for_saving_v0; pub mod quorum_set; pub mod quorums; diff --git a/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorum_config_for_saving_v0.rs b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorum_config_for_saving_v0.rs new file mode 100644 index 00000000000..bd5c9ee97bd --- /dev/null +++ b/packages/rs-drive-abci/src/platform_types/signature_verification_quorum_set/v0/quorum_config_for_saving_v0.rs @@ -0,0 +1,34 @@ +use crate::platform_types::signature_verification_quorum_set::QuorumConfig; +use bincode::Encode; +use dashcore_rpc::dashcore_rpc_json::QuorumType; +use dpp::platform_serialization::de::Decode; + +#[derive(Debug, Clone, Encode, Decode)] +pub struct QuorumConfigForSavingV0 { + quorum_type: QuorumType, + active_signers: u16, + rotation: bool, + window: u32, +} + +impl From<QuorumConfig> for QuorumConfigForSavingV0 { + fn from(config: QuorumConfig) -> Self { + Self { + quorum_type: config.quorum_type, + active_signers: config.active_signers, + rotation: config.rotation, + window: config.window, + } + } +} + +impl From<QuorumConfigForSavingV0> for QuorumConfig { + fn from(config: QuorumConfigForSavingV0) -> Self { + Self { + quorum_type: config.quorum_type, + active_signers: config.active_signers, + rotation: config.rotation, + window: config.window, + } + } +} diff --git a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs index 6ce9f40c0b6..44fb1dad933 100644 --- a/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs +++ b/packages/rs-drive-abci/src/platform_types/validator_set/v0/mod.rs @@ -1,8 +1,8 @@ use crate::error::execution::ExecutionError; use crate::error::Error; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::ProTxHash; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::ProTxHash; use crate::platform_types::platform_state::PlatformState; use crate::platform_types::validator::v0::NewValidatorIfMasternodeInState; diff --git a/packages/rs-drive-abci/src/query/group_queries/group_action_signers/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_action_signers/mod.rs new file mode 100644 index 00000000000..00d22106981 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_action_signers/mod.rs @@ -0,0 +1,62 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_action_signers_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_group_action_signers_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetGroupActionSignersRequest, GetGroupActionSignersResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of group action signers + pub fn query_group_action_signers( + &self, + GetGroupActionSignersRequest { version }: GetGroupActionSignersRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupActionSignersResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode active group action signers query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .group_queries + .group_action_signers; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "group_action_signers".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_group_action_signers_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok(result.map(|response_v0| GetGroupActionSignersResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_action_signers/v0/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_action_signers/v0/mod.rs new file mode 100644 index 00000000000..ed1ca8c424b --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_action_signers/v0/mod.rs @@ -0,0 +1,110 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_action_signers_request::GetGroupActionSignersRequestV0; +use dapi_grpc::platform::v0::get_group_action_signers_response::{ + get_group_action_signers_response_v0, GetGroupActionSignersResponseV0, +}; +use dapi_grpc::platform::v0::get_group_action_signers_response::get_group_action_signers_response_v0::{GroupActionSigner, GroupActionSigners}; +use dpp::check_validation_result_with_data; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl<C> Platform<C> { + pub(super) fn query_group_action_signers_v0( + &self, + GetGroupActionSignersRequestV0 { + contract_id, + group_contract_position, + status, + action_id, + prove, + }: GetGroupActionSignersRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupActionSignersResponseV0>, Error> { + let config = &self.config.drive; + let contract_id: Identifier = + check_validation_result_with_data!(contract_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "contract id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let action_id: Identifier = + check_validation_result_with_data!(action_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "action id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + if group_contract_position > u16::MAX as u32 { + return Ok(QueryValidationResult::new_with_error(QueryError::Query( + QuerySyntaxError::InvalidParameter(format!( + "group contract position {} can not be over u16::MAX", + group_contract_position + )), + ))); + } + + let group_status: GroupActionStatus = + check_validation_result_with_data!(status.try_into().map_err(|_| { + QueryError::InvalidArgument( + "group action status must be Active or Closed".to_string(), + ) + })); + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_action_signers( + contract_id, + group_contract_position as GroupContractPosition, + group_status, + action_id, + None, + platform_version, + )); + + GetGroupActionSignersResponseV0 { + result: Some(get_group_action_signers_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let group_action_signers = self + .drive + .fetch_action_signers( + contract_id, + group_contract_position as GroupContractPosition, + group_status, + action_id, + None, + platform_version, + )? + .into_iter() + .map(|(signer_id, power)| GroupActionSigner { + signer_id: signer_id.to_vec(), + power, + }) + .collect(); + GetGroupActionSignersResponseV0 { + result: Some( + get_group_action_signers_response_v0::Result::GroupActionSigners( + GroupActionSigners { + signers: group_action_signers, + }, + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_actions/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_actions/mod.rs new file mode 100644 index 00000000000..51425507b78 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_actions/mod.rs @@ -0,0 +1,59 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_actions_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_group_actions_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetGroupActionsRequest, GetGroupActionsResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of active group actions + pub fn query_group_actions( + &self, + GetGroupActionsRequest { version }: GetGroupActionsRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupActionsResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode active group actions query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .group_queries + .group_actions; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "group_actions".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_group_actions_v0(request_v0, platform_state, platform_version)?; + Ok(result.map(|response_v0| GetGroupActionsResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_actions/v0/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_actions/v0/mod.rs new file mode 100644 index 00000000000..d9d8aa09b32 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_actions/v0/mod.rs @@ -0,0 +1,251 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_actions_request::GetGroupActionsRequestV0; +use dapi_grpc::platform::v0::get_group_actions_response::get_group_actions_response_v0::{ + emergency_action_event, group_action_event, token_event, BurnEvent, DestroyFrozenFundsEvent, + EmergencyActionEvent, FreezeEvent, GroupActionEntry, GroupActionEvent, GroupActions, MintEvent, + PersonalEncryptedNote, SharedEncryptedNote, TokenConfigUpdateEvent, + TokenEvent as TokenEventResponse, TransferEvent, UnfreezeEvent, +}; +use dapi_grpc::platform::v0::get_group_actions_response::{ + get_group_actions_response_v0, GetGroupActionsResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::data_contract::GroupContractPosition; +use dpp::group::action_event; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::tokens::emergency_action::TokenEmergencyAction; +use dpp::tokens::token_event::TokenEvent; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl<C> Platform<C> { + pub(super) fn query_group_actions_v0( + &self, + GetGroupActionsRequestV0 { + contract_id, + group_contract_position, + status, + start_at_action_id, + count, + prove, + }: GetGroupActionsRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupActionsResponseV0>, Error> { + let config = &self.config.drive; + let contract_id: Identifier = + check_validation_result_with_data!(contract_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "contract id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + if group_contract_position > u16::MAX as u32 { + return Ok(QueryValidationResult::new_with_error(QueryError::Query( + QuerySyntaxError::InvalidParameter(format!( + "group contract position {} can not be over u16::MAX", + group_contract_position + )), + ))); + } + + let limit = count + .map_or(Some(config.default_query_limit), |limit_value| { + if limit_value == 0 + || limit_value > u16::MAX as u32 + || limit_value as u16 > config.default_query_limit + { + None + } else { + Some(limit_value as u16) + } + }) + .ok_or(drive::error::Error::Query(QuerySyntaxError::InvalidLimit( + format!("limit greater than max limit {}", config.max_query_limit), + )))?; + + let maybe_start_at_action_id = match start_at_action_id { + None => None, + Some(start_at_action_id) => { + let start_at_action_id_identifier: Identifier = + check_validation_result_with_data!(start_at_action_id + .start_action_id + .try_into() + .map_err(|_| { + QueryError::InvalidArgument( + "start at action id must be a valid identifier (32 bytes long)" + .to_string(), + ) + })); + Some(( + start_at_action_id_identifier, + start_at_action_id.start_action_id_included, + )) + } + }; + + let group_status: GroupActionStatus = + check_validation_result_with_data!(status.try_into().map_err(|_| { + QueryError::InvalidArgument( + "group action status must be Active or Closed".to_string(), + ) + })); + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_action_infos( + contract_id, + group_contract_position as GroupContractPosition, + group_status, + maybe_start_at_action_id, + Some(limit), + None, + platform_version, + )); + + GetGroupActionsResponseV0 { + result: Some(get_group_actions_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let group_actions = self + .drive + .fetch_action_infos( + contract_id, + group_contract_position as GroupContractPosition, + group_status, + maybe_start_at_action_id, + Some(limit), + None, + platform_version, + )? + .into_iter() + .filter_map(|(action_id, group_action)| { + // Convert the fetched GroupAction into a GroupActionEntry + Some(GroupActionEntry { + action_id: action_id.to_vec(), + event: Some(GroupActionEvent { + event_type: Some(match group_action { + GroupAction::V0(group_action_v0) => match group_action_v0.event { + action_event::GroupActionEvent::TokenEvent(token_event) => match token_event { + TokenEvent::Mint(amount, recipient_id, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::Mint(MintEvent { + amount: amount as u64, + recipient_id: recipient_id.to_vec(), + public_note, + })), + }) + } + TokenEvent::Burn(amount, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::Burn(BurnEvent { + amount: amount as u64, + public_note, + })), + }) + } + TokenEvent::Freeze(frozen_id, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::Freeze(FreezeEvent { + frozen_id: frozen_id.to_vec(), + public_note, + })), + }) + } + TokenEvent::Unfreeze(frozen_id, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::Unfreeze(UnfreezeEvent { + frozen_id: frozen_id.to_vec(), + public_note, + })), + }) + } + TokenEvent::DestroyFrozenFunds(frozen_id, amount, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::DestroyFrozenFunds( + DestroyFrozenFundsEvent { + frozen_id: frozen_id.to_vec(), + amount, + public_note, + }, + )), + }) + } + TokenEvent::Transfer( + recipient_id, + public_note, + shared_encrypted_note, + personal_encrypted_note, + amount, + ) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::Transfer(TransferEvent { + recipient_id: recipient_id.to_vec(), + public_note, + shared_encrypted_note: shared_encrypted_note + .map(|(sender_key_index, recipient_key_index, note)| { + SharedEncryptedNote { + sender_key_index, + recipient_key_index, + encrypted_data: note, + } + }), + personal_encrypted_note: personal_encrypted_note + .map(|(root_encryption_key_index, derivation_encryption_key_index, note)| { + PersonalEncryptedNote { + root_encryption_key_index, + derivation_encryption_key_index, + encrypted_data: note, + } + }), + amount: amount as u64, + })), + }) + }, + TokenEvent::EmergencyAction(action, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::EmergencyAction(EmergencyActionEvent { + action_type: match action { + TokenEmergencyAction::Pause => emergency_action_event::ActionType::Pause.into(), + TokenEmergencyAction::Resume => emergency_action_event::ActionType::Resume.into(), + }, + public_note, + })), + }) + } + TokenEvent::ConfigUpdate(token_configuration_change_item, public_note) => { + group_action_event::EventType::TokenEvent(TokenEventResponse { + r#type: Some(token_event::Type::TokenConfigUpdate(TokenConfigUpdateEvent { + token_config_update_item: token_configuration_change_item.serialize_consume_to_bytes_with_platform_version(platform_version).ok()?, + public_note, + })), + }) + } + }, + }, + }), + }), + }) + }) + .collect(); + GetGroupActionsResponseV0 { + result: Some(get_group_actions_response_v0::Result::GroupActions( + GroupActions { group_actions }, + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_info/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_info/mod.rs new file mode 100644 index 00000000000..00dcdac6c42 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_info/mod.rs @@ -0,0 +1,53 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_info_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_group_info_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetGroupInfoRequest, GetGroupInfoResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of group info + pub fn query_group_info( + &self, + GetGroupInfoRequest { version }: GetGroupInfoRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupInfoResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError("could not decode group info query".to_string()), + )); + }; + + let feature_version_bounds = &platform_version.drive_abci.query.group_queries.group_info; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "group_info".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_group_info_v0(request_v0, platform_state, platform_version)?; + Ok(result.map(|response_v0| GetGroupInfoResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_info/v0/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_info/v0/mod.rs new file mode 100644 index 00000000000..84c55bfc609 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_info/v0/mod.rs @@ -0,0 +1,95 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_info_request::GetGroupInfoRequestV0; +use dapi_grpc::platform::v0::get_group_info_response::get_group_info_response_v0::{ + GroupInfo, GroupInfoEntry, GroupMemberEntry, +}; +use dapi_grpc::platform::v0::get_group_info_response::{ + get_group_info_response_v0, GetGroupInfoResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::data_contract::group::accessors::v0::GroupV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl<C> Platform<C> { + pub(super) fn query_group_info_v0( + &self, + GetGroupInfoRequestV0 { + contract_id, + group_contract_position, + prove, + }: GetGroupInfoRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupInfoResponseV0>, Error> { + let contract_id: Identifier = + check_validation_result_with_data!(contract_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "contract id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + if group_contract_position > u16::MAX as u32 { + return Ok(QueryValidationResult::new_with_error(QueryError::Query( + QuerySyntaxError::InvalidParameter(format!( + "group contract position {} can not be over u16::MAX", + group_contract_position + )), + ))); + } + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_group_info( + contract_id, + group_contract_position as u16, + None, + platform_version, + )); + + GetGroupInfoResponseV0 { + result: Some(get_group_info_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let group_info = self + .drive + .fetch_group_info( + contract_id, + group_contract_position as u16, + None, + platform_version, + )? + .map(|group| { + let members = group + .members() + .into_iter() + .map(|(member_id, power)| GroupMemberEntry { + member_id: member_id.to_vec(), + power: *power, + }) + .collect(); + GroupInfoEntry { + members, + group_required_power: group.required_power(), + } + }); + + GetGroupInfoResponseV0 { + result: Some(get_group_info_response_v0::Result::GroupInfo(GroupInfo { + group_info, + })), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_infos/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_infos/mod.rs new file mode 100644 index 00000000000..c21304bb75f --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_infos/mod.rs @@ -0,0 +1,53 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_infos_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_group_infos_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetGroupInfosRequest, GetGroupInfosResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of group infos + pub fn query_group_infos( + &self, + GetGroupInfosRequest { version }: GetGroupInfosRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupInfosResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError("could not decode group infos query".to_string()), + )); + }; + + let feature_version_bounds = &platform_version.drive_abci.query.group_queries.group_infos; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "group_infos".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_group_infos_v0(request_v0, platform_state, platform_version)?; + Ok(result.map(|response_v0| GetGroupInfosResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/group_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/group_queries/group_infos/v0/mod.rs new file mode 100644 index 00000000000..e9dc27aab46 --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/group_infos/v0/mod.rs @@ -0,0 +1,127 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_group_infos_request::GetGroupInfosRequestV0; +use dapi_grpc::platform::v0::get_group_infos_response::get_group_infos_response_v0::{ + GroupInfos, GroupMemberEntry, GroupPositionInfoEntry, +}; +use dapi_grpc::platform::v0::get_group_infos_response::{ + get_group_infos_response_v0, GetGroupInfosResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::data_contract::group::accessors::v0::GroupV0Getters; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::error::query::QuerySyntaxError; + +impl<C> Platform<C> { + pub(super) fn query_group_infos_v0( + &self, + GetGroupInfosRequestV0 { + contract_id, + start_at_group_contract_position, + count, + prove, + }: GetGroupInfosRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetGroupInfosResponseV0>, Error> { + let config = &self.config.drive; + let contract_id: Identifier = + check_validation_result_with_data!(contract_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "contract id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let limit = count + .map_or(Some(config.default_query_limit), |limit_value| { + if limit_value == 0 + || limit_value > u16::MAX as u32 + || limit_value as u16 > config.default_query_limit + { + None + } else { + Some(limit_value as u16) + } + }) + .ok_or(drive::error::Error::Query(QuerySyntaxError::InvalidLimit( + format!("limit greater than max limit {}", config.max_query_limit), + )))?; + + let start_at_group_contract_position = match start_at_group_contract_position { + None => None, + Some(start_at_group_contract_position) => { + if start_at_group_contract_position.start_group_contract_position > u16::MAX as u32 + { + return Ok(QueryValidationResult::new_with_error(QueryError::Query( + QuerySyntaxError::InvalidParameter(format!( + "start group contract position {} can not be over u16::MAX", + start_at_group_contract_position.start_group_contract_position + )), + ))); + } + Some(( + start_at_group_contract_position.start_group_contract_position as u16, + start_at_group_contract_position.start_group_contract_position_included, + )) + } + }; + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_group_infos( + contract_id, + start_at_group_contract_position, + Some(limit), + None, + platform_version, + )); + + GetGroupInfosResponseV0 { + result: Some(get_group_infos_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let group_infos = self + .drive + .fetch_group_infos( + contract_id, + start_at_group_contract_position, + Some(limit), + None, + platform_version, + )? + .into_iter() + .map(|(group_contract_position, group)| { + let members = group + .members() + .into_iter() + .map(|(member_id, power)| GroupMemberEntry { + member_id: member_id.to_vec(), + power: *power, + }) + .collect(); + GroupPositionInfoEntry { + group_contract_position: group_contract_position as u32, + members, + group_required_power: group.required_power(), + } + }) + .collect(); + + GetGroupInfosResponseV0 { + result: Some(get_group_infos_response_v0::Result::GroupInfos( + GroupInfos { group_infos }, + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/group_queries/mod.rs b/packages/rs-drive-abci/src/query/group_queries/mod.rs new file mode 100644 index 00000000000..d720872115a --- /dev/null +++ b/packages/rs-drive-abci/src/query/group_queries/mod.rs @@ -0,0 +1,4 @@ +mod group_action_signers; +mod group_actions; +mod group_info; +mod group_infos; diff --git a/packages/rs-drive-abci/src/query/mod.rs b/packages/rs-drive-abci/src/query/mod.rs index 6be97cc1cfa..0e161b1ae19 100644 --- a/packages/rs-drive-abci/src/query/mod.rs +++ b/packages/rs-drive-abci/src/query/mod.rs @@ -1,11 +1,13 @@ mod data_contract_based_queries; mod document_query; +mod group_queries; mod identity_based_queries; mod prefunded_specialized_balances; mod proofs; mod response_metadata; mod service; mod system; +mod token_queries; mod validator_queries; mod voting; diff --git a/packages/rs-drive-abci/src/query/prefunded_specialized_balances/balance/v0/mod.rs b/packages/rs-drive-abci/src/query/prefunded_specialized_balances/balance/v0/mod.rs index fed648c116a..410a9021959 100644 --- a/packages/rs-drive-abci/src/query/prefunded_specialized_balances/balance/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/prefunded_specialized_balances/balance/v0/mod.rs @@ -50,7 +50,7 @@ impl<C> Platform<C> { let Some(balance) = maybe_balance else { return Ok(ValidationResult::new_with_error(QueryError::NotFound( - "No Identity found".to_string(), + "No Specialized balance found".to_string(), ))); }; diff --git a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs index 7db4d012276..bdd37055003 100644 --- a/packages/rs-drive-abci/src/query/proofs/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/proofs/v0/mod.rs @@ -4,6 +4,9 @@ use crate::platform_types::platform::Platform; use crate::platform_types::platform_state::PlatformState; use crate::query::QueryValidationResult; use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::vote_status_request::RequestType; +use dapi_grpc::platform::v0::get_proofs_request::get_proofs_request_v0::{ + IdentityTokenBalanceRequest, IdentityTokenInfoRequest, TokenStatusRequest, +}; use dapi_grpc::platform::v0::get_proofs_request::GetProofsRequestV0; use dapi_grpc::platform::v0::get_proofs_response::{get_proofs_response_v0, GetProofsResponseV0}; use dpp::check_validation_result_with_data; @@ -13,6 +16,9 @@ use dpp::validation::ValidationResult; use dpp::version::PlatformVersion; use dpp::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll; use drive::drive::identity::{IdentityDriveQuery, IdentityProveRequestType}; +use drive::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery; +use drive::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery; +use drive::query::token_status_drive_query::TokenStatusDriveQuery; use drive::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery}; impl<C> Platform<C> { @@ -23,6 +29,9 @@ impl<C> Platform<C> { contracts, documents, votes, + identity_token_balances, + identity_token_infos, + token_statuses, }: GetProofsRequestV0, platform_state: &PlatformState, platform_version: &PlatformVersion, @@ -145,11 +154,72 @@ impl<C> Platform<C> { }) .collect::<Result<Vec<IdentityBasedVoteDriveQuery>, QueryError>>()); + let token_balance_queries = check_validation_result_with_data!(identity_token_balances + .into_iter() + .map(|identity_token_balance_request| { + let IdentityTokenBalanceRequest { + token_id, + identity_id, + } = identity_token_balance_request; + Ok(IdentityTokenBalanceDriveQuery { + identity_id: Identifier::try_from(identity_id).map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + })?, + token_id: Identifier::try_from(token_id).map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })?, + }) + }) + .collect::<Result<Vec<IdentityTokenBalanceDriveQuery>, QueryError>>()); + + let token_info_queries = check_validation_result_with_data!(identity_token_infos + .into_iter() + .map(|identity_token_info_request| { + let IdentityTokenInfoRequest { + token_id, + identity_id, + } = identity_token_info_request; + Ok(IdentityTokenInfoDriveQuery { + identity_id: Identifier::try_from(identity_id).map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + })?, + token_id: Identifier::try_from(token_id).map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })?, + }) + }) + .collect::<Result<Vec<IdentityTokenInfoDriveQuery>, QueryError>>()); + + let token_status_queries = check_validation_result_with_data!(token_statuses + .into_iter() + .map(|token_status_request| { + let TokenStatusRequest { token_id } = token_status_request; + Ok(TokenStatusDriveQuery { + token_id: Identifier::try_from(token_id).map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })?, + }) + }) + .collect::<Result<Vec<TokenStatusDriveQuery>, QueryError>>()); + let proof = self.drive.prove_multiple_state_transition_results( &identity_requests, &contract_ids, &document_queries, &vote_queries, + &token_balance_queries, + &token_info_queries, + &token_status_queries, None, platform_version, )?; @@ -190,6 +260,9 @@ mod tests { contracts: vec![], documents: vec![], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let result = platform @@ -213,6 +286,9 @@ mod tests { contracts: vec![], documents: vec![], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let result = platform @@ -239,6 +315,9 @@ mod tests { }], documents: vec![], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let result = platform @@ -263,6 +342,9 @@ mod tests { document_contested_status: 0, }], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let result = platform @@ -287,6 +369,9 @@ mod tests { document_contested_status: 0, }], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let result = platform @@ -311,6 +396,9 @@ mod tests { document_contested_status: 0, }], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let validation_result = platform @@ -363,6 +451,9 @@ mod tests { }, )), }], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let validation_result = platform @@ -395,6 +486,9 @@ mod tests { document_contested_status: 0, }], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; let validation_result = platform diff --git a/packages/rs-drive-abci/src/query/service.rs b/packages/rs-drive-abci/src/query/service.rs index 54e51348c0a..156ae629983 100644 --- a/packages/rs-drive-abci/src/query/service.rs +++ b/packages/rs-drive-abci/src/query/service.rs @@ -20,20 +20,27 @@ use dapi_grpc::platform::v0::{ GetDataContractResponse, GetDataContractsRequest, GetDataContractsResponse, GetDocumentsRequest, GetDocumentsResponse, GetEpochsInfoRequest, GetEpochsInfoResponse, GetEvonodesProposedEpochBlocksByIdsRequest, GetEvonodesProposedEpochBlocksByRangeRequest, - GetEvonodesProposedEpochBlocksResponse, GetIdentitiesBalancesRequest, - GetIdentitiesBalancesResponse, GetIdentitiesContractKeysRequest, - GetIdentitiesContractKeysResponse, GetIdentityBalanceAndRevisionRequest, + GetEvonodesProposedEpochBlocksResponse, GetGroupActionSignersRequest, + GetGroupActionSignersResponse, GetGroupActionsRequest, GetGroupActionsResponse, + GetGroupInfoRequest, GetGroupInfoResponse, GetGroupInfosRequest, GetGroupInfosResponse, + GetIdentitiesBalancesRequest, GetIdentitiesBalancesResponse, GetIdentitiesContractKeysRequest, + GetIdentitiesContractKeysResponse, GetIdentitiesTokenBalancesRequest, + GetIdentitiesTokenBalancesResponse, GetIdentitiesTokenInfosRequest, + GetIdentitiesTokenInfosResponse, GetIdentityBalanceAndRevisionRequest, GetIdentityBalanceAndRevisionResponse, GetIdentityBalanceRequest, GetIdentityBalanceResponse, GetIdentityByPublicKeyHashRequest, GetIdentityByPublicKeyHashResponse, GetIdentityContractNonceRequest, GetIdentityContractNonceResponse, GetIdentityKeysRequest, GetIdentityKeysResponse, GetIdentityNonceRequest, GetIdentityNonceResponse, GetIdentityRequest, - GetIdentityResponse, GetPathElementsRequest, GetPathElementsResponse, - GetPrefundedSpecializedBalanceRequest, GetPrefundedSpecializedBalanceResponse, - GetProofsRequest, GetProofsResponse, GetProtocolVersionUpgradeStateRequest, - GetProtocolVersionUpgradeStateResponse, GetProtocolVersionUpgradeVoteStatusRequest, - GetProtocolVersionUpgradeVoteStatusResponse, GetStatusRequest, GetStatusResponse, - GetTotalCreditsInPlatformRequest, GetTotalCreditsInPlatformResponse, - GetVotePollsByEndDateRequest, GetVotePollsByEndDateResponse, + GetIdentityResponse, GetIdentityTokenBalancesRequest, GetIdentityTokenBalancesResponse, + GetIdentityTokenInfosRequest, GetIdentityTokenInfosResponse, GetPathElementsRequest, + GetPathElementsResponse, GetPrefundedSpecializedBalanceRequest, + GetPrefundedSpecializedBalanceResponse, GetProofsRequest, GetProofsResponse, + GetProtocolVersionUpgradeStateRequest, GetProtocolVersionUpgradeStateResponse, + GetProtocolVersionUpgradeVoteStatusRequest, GetProtocolVersionUpgradeVoteStatusResponse, + GetStatusRequest, GetStatusResponse, GetTokenPreProgrammedDistributionsRequest, + GetTokenPreProgrammedDistributionsResponse, GetTokenStatusesRequest, GetTokenStatusesResponse, + GetTokenTotalSupplyRequest, GetTokenTotalSupplyResponse, GetTotalCreditsInPlatformRequest, + GetTotalCreditsInPlatformResponse, GetVotePollsByEndDateRequest, GetVotePollsByEndDateResponse, WaitForStateTransitionResultRequest, WaitForStateTransitionResultResponse, }; use dapi_grpc::tonic::{Code, Request, Response, Status}; @@ -609,6 +616,138 @@ impl PlatformService for QueryService { ) .await } + + async fn get_identity_token_balances( + &self, + request: Request<GetIdentityTokenBalancesRequest>, + ) -> Result<Response<GetIdentityTokenBalancesResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_identity_token_balances, + "query_identity_token_balances", + ) + .await + } + + async fn get_identities_token_balances( + &self, + request: Request<GetIdentitiesTokenBalancesRequest>, + ) -> Result<Response<GetIdentitiesTokenBalancesResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_identities_token_balances, + "query_identities_token_balances", + ) + .await + } + + async fn get_identity_token_infos( + &self, + request: Request<GetIdentityTokenInfosRequest>, + ) -> Result<Response<GetIdentityTokenInfosResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_identity_token_infos, + "query_identity_token_infos", + ) + .await + } + + async fn get_identities_token_infos( + &self, + request: Request<GetIdentitiesTokenInfosRequest>, + ) -> Result<Response<GetIdentitiesTokenInfosResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_identities_token_infos, + "query_identities_token_infos", + ) + .await + } + + async fn get_token_statuses( + &self, + request: Request<GetTokenStatusesRequest>, + ) -> Result<Response<GetTokenStatusesResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_token_statuses, + "get_token_statuses", + ) + .await + } + + async fn get_token_pre_programmed_distributions( + &self, + request: Request<GetTokenPreProgrammedDistributionsRequest>, + ) -> Result<Response<GetTokenPreProgrammedDistributionsResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_token_pre_programmed_distributions, + "get_token_pre_programmed_distributions", + ) + .await + } + + async fn get_token_total_supply( + &self, + request: Request<GetTokenTotalSupplyRequest>, + ) -> Result<Response<GetTokenTotalSupplyResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_token_total_supply, + "get_token_total_supply", + ) + .await + } + + async fn get_group_info( + &self, + request: Request<GetGroupInfoRequest>, + ) -> Result<Response<GetGroupInfoResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_group_info, + "get_group_info", + ) + .await + } + + async fn get_group_infos( + &self, + request: Request<GetGroupInfosRequest>, + ) -> Result<Response<GetGroupInfosResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_group_infos, + "get_group_infos", + ) + .await + } + + async fn get_group_actions( + &self, + request: Request<GetGroupActionsRequest>, + ) -> Result<Response<GetGroupActionsResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_group_actions, + "get_group_actions", + ) + .await + } + + async fn get_group_action_signers( + &self, + request: Request<GetGroupActionSignersRequest>, + ) -> Result<Response<GetGroupActionSignersResponse>, Status> { + self.handle_blocking_query( + request, + Platform::<DefaultCoreRPC>::query_group_action_signers, + "get_group_action_signers", + ) + .await + } } fn query_error_into_status(error: QueryError) -> Status { diff --git a/packages/rs-drive-abci/src/query/system/total_credits_in_platform/v0/mod.rs b/packages/rs-drive-abci/src/query/system/total_credits_in_platform/v0/mod.rs index 829950e1f16..1554d7f73cf 100644 --- a/packages/rs-drive-abci/src/query/system/total_credits_in_platform/v0/mod.rs +++ b/packages/rs-drive-abci/src/query/system/total_credits_in_platform/v0/mod.rs @@ -138,8 +138,8 @@ mod tests { use super::*; use crate::query::tests::setup_platform; use crate::test::helpers::fast_forward_to_block::fast_forward_to_block; - use dashcore_rpc::dashcore::Network; use dpp::block::epoch::EpochIndex; + use dpp::dashcore::Network; use dpp::fee::Credits; use dpp::prelude::CoreBlockHeight; use drive::drive::Drive; diff --git a/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/mod.rs new file mode 100644 index 00000000000..f600317ce6c --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/mod.rs @@ -0,0 +1,66 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identities_token_balances_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identities_token_balances_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetIdentitiesTokenBalancesRequest, GetIdentitiesTokenBalancesResponse, +}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of an identity's token balances by a public key hash + pub fn query_identities_token_balances( + &self, + GetIdentitiesTokenBalancesRequest { version }: GetIdentitiesTokenBalancesRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentitiesTokenBalancesResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token balances query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .identities_token_balances; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identities_token_balances".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_identities_token_balances_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok( + result.map(|response_v0| GetIdentitiesTokenBalancesResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/v0/mod.rs new file mode 100644 index 00000000000..b655fdd99f0 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identities_token_balances/v0/mod.rs @@ -0,0 +1,88 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identities_token_balances_request::GetIdentitiesTokenBalancesRequestV0; +use dapi_grpc::platform::v0::get_identities_token_balances_response::{get_identities_token_balances_response_v0, GetIdentitiesTokenBalancesResponseV0}; +use dapi_grpc::platform::v0::get_identities_token_balances_response::get_identities_token_balances_response_v0::{IdentityTokenBalanceEntry, IdentityTokenBalances}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_identities_token_balances_v0( + &self, + GetIdentitiesTokenBalancesRequestV0 { + token_id, + identity_ids, + prove, + }: GetIdentitiesTokenBalancesRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentitiesTokenBalancesResponseV0>, Error> { + let token_id: Identifier = + check_validation_result_with_data!(token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let identity_ids: Vec<[u8; 32]> = check_validation_result_with_data!(identity_ids + .into_iter() + .map(|identity_id| { + identity_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + }) + }) + .collect::<Result<Vec<[u8; 32]>, QueryError>>()); + + let response = if prove { + let proof = + check_validation_result_with_data!(self.drive.prove_identities_token_balances( + token_id.into_buffer(), + identity_ids.as_slice(), + None, + platform_version, + )); + + GetIdentitiesTokenBalancesResponseV0 { + result: Some(get_identities_token_balances_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let identity_token_balances = self + .drive + .fetch_identities_token_balances( + token_id.into_buffer(), + identity_ids.as_slice(), + None, + platform_version, + )? + .into_iter() + .map(|(identity_id, amount)| IdentityTokenBalanceEntry { + identity_id: identity_id.to_vec(), + balance: amount, + }) + .collect(); + + GetIdentitiesTokenBalancesResponseV0 { + result: Some( + get_identities_token_balances_response_v0::Result::IdentityTokenBalances( + IdentityTokenBalances { + identity_token_balances, + }, + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/mod.rs new file mode 100644 index 00000000000..a1746ff1a0c --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/mod.rs @@ -0,0 +1,62 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identities_token_infos_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identities_token_infos_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentitiesTokenInfosRequest, GetIdentitiesTokenInfosResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of an identity's token infos by a public key hash + pub fn query_identities_token_infos( + &self, + GetIdentitiesTokenInfosRequest { version }: GetIdentitiesTokenInfosRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentitiesTokenInfosResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token infos query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .identities_token_infos; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identities_token_infos".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_identities_token_infos_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok(result.map(|response_v0| GetIdentitiesTokenInfosResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/v0/mod.rs new file mode 100644 index 00000000000..e6a0786e78d --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identities_token_infos/v0/mod.rs @@ -0,0 +1,94 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identities_token_infos_request::GetIdentitiesTokenInfosRequestV0; +use dapi_grpc::platform::v0::get_identities_token_infos_response::{get_identities_token_infos_response_v0, GetIdentitiesTokenInfosResponseV0}; +use dapi_grpc::platform::v0::get_identities_token_infos_response::get_identities_token_infos_response_v0::{IdentityTokenInfos, TokenIdentityInfoEntry, TokenInfoEntry}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_identities_token_infos_v0( + &self, + GetIdentitiesTokenInfosRequestV0 { + token_id, + identity_ids, + prove, + }: GetIdentitiesTokenInfosRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentitiesTokenInfosResponseV0>, Error> { + let token_id: Identifier = + check_validation_result_with_data!(token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let identity_ids: Vec<[u8; 32]> = check_validation_result_with_data!(identity_ids + .into_iter() + .map(|identity_id| { + identity_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + }) + }) + .collect::<Result<Vec<[u8; 32]>, QueryError>>()); + + let response = if prove { + let proof = + check_validation_result_with_data!(self.drive.prove_identities_token_infos( + token_id.into_buffer(), + identity_ids.as_slice(), + None, + platform_version, + )); + + GetIdentitiesTokenInfosResponseV0 { + result: Some(get_identities_token_infos_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let identity_token_infos = self + .drive + .fetch_identities_token_infos( + token_id.into_buffer(), + identity_ids.as_slice(), + None, + platform_version, + )? + .into_iter() + .map(|(identity_id, info)| { + let info = info.map(|identity_token_info| TokenIdentityInfoEntry { + frozen: identity_token_info.frozen(), + }); + TokenInfoEntry { + identity_id: identity_id.to_vec(), + info, + } + }) + .collect(); + + GetIdentitiesTokenInfosResponseV0 { + result: Some( + get_identities_token_infos_response_v0::Result::IdentityTokenInfos( + IdentityTokenInfos { + token_infos: identity_token_infos, + }, + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/mod.rs new file mode 100644 index 00000000000..acc357d809a --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/mod.rs @@ -0,0 +1,62 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_token_balances_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_token_balances_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityTokenBalancesRequest, GetIdentityTokenBalancesResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of an identity's token balances by a public key hash + pub fn query_identity_token_balances( + &self, + GetIdentityTokenBalancesRequest { version }: GetIdentityTokenBalancesRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentityTokenBalancesResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token balances query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .identity_token_balances; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identity_token_balances".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_identity_token_balances_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok(result.map(|response_v0| GetIdentityTokenBalancesResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/v0/mod.rs new file mode 100644 index 00000000000..45a54c731ca --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identity_token_balances/v0/mod.rs @@ -0,0 +1,86 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_token_balances_request::GetIdentityTokenBalancesRequestV0; +use dapi_grpc::platform::v0::get_identity_token_balances_response::{get_identity_token_balances_response_v0, GetIdentityTokenBalancesResponseV0}; +use dapi_grpc::platform::v0::get_identity_token_balances_response::get_identity_token_balances_response_v0::{TokenBalanceEntry, TokenBalances}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_identity_token_balances_v0( + &self, + GetIdentityTokenBalancesRequestV0 { + identity_id, + token_ids, + prove, + }: GetIdentityTokenBalancesRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentityTokenBalancesResponseV0>, Error> { + let identity_id: Identifier = + check_validation_result_with_data!(identity_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let token_ids: Vec<[u8; 32]> = check_validation_result_with_data!(token_ids + .into_iter() + .map(|token_id| { + token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + }) + }) + .collect::<Result<Vec<[u8; 32]>, QueryError>>()); + + let response = if prove { + let proof = + check_validation_result_with_data!(self.drive.prove_identity_token_balances( + token_ids.as_slice(), + identity_id.into_buffer(), + None, + platform_version, + )); + + GetIdentityTokenBalancesResponseV0 { + result: Some(get_identity_token_balances_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let token_balances = self + .drive + .fetch_identity_token_balances( + token_ids.as_slice(), + identity_id.into_buffer(), + None, + platform_version, + )? + .into_iter() + .map(|(token_id, amount)| TokenBalanceEntry { + token_id: token_id.to_vec(), + balance: amount, + }) + .collect(); + + GetIdentityTokenBalancesResponseV0 { + result: Some( + get_identity_token_balances_response_v0::Result::TokenBalances(TokenBalances { + token_balances, + }), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/mod.rs new file mode 100644 index 00000000000..c0abc1a21e6 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/mod.rs @@ -0,0 +1,62 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_token_infos_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_identity_token_infos_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetIdentityTokenInfosRequest, GetIdentityTokenInfosResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of an identity's token infos by a public key hash + pub fn query_identity_token_infos( + &self, + GetIdentityTokenInfosRequest { version }: GetIdentityTokenInfosRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentityTokenInfosResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token infos query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .identity_token_infos; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "identity_token_infos".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_identity_token_infos_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok(result.map(|response_v0| GetIdentityTokenInfosResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/v0/mod.rs new file mode 100644 index 00000000000..c013f8e9d9c --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/identity_token_infos/v0/mod.rs @@ -0,0 +1,89 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_identity_token_infos_request::GetIdentityTokenInfosRequestV0; +use dapi_grpc::platform::v0::get_identity_token_infos_response::{get_identity_token_infos_response_v0, GetIdentityTokenInfosResponseV0}; +use dapi_grpc::platform::v0::get_identity_token_infos_response::get_identity_token_infos_response_v0::{TokenIdentityInfoEntry, TokenInfoEntry, TokenInfos}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_identity_token_infos_v0( + &self, + GetIdentityTokenInfosRequestV0 { + identity_id, + token_ids, + prove, + }: GetIdentityTokenInfosRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetIdentityTokenInfosResponseV0>, Error> { + let identity_id: Identifier = + check_validation_result_with_data!(identity_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "identity_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let token_ids: Vec<[u8; 32]> = check_validation_result_with_data!(token_ids + .into_iter() + .map(|token_id| { + token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + }) + }) + .collect::<Result<Vec<[u8; 32]>, QueryError>>()); + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_identity_token_infos( + token_ids.as_slice(), + identity_id.into_buffer(), + None, + platform_version, + )); + + GetIdentityTokenInfosResponseV0 { + result: Some(get_identity_token_infos_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let token_infos = self + .drive + .fetch_identity_token_infos( + token_ids.as_slice(), + identity_id.into_buffer(), + None, + platform_version, + )? + .into_iter() + .map(|(token_id, info)| { + let info = info.map(|identity_token_info| TokenIdentityInfoEntry { + frozen: identity_token_info.frozen(), + }); + TokenInfoEntry { + token_id: token_id.to_vec(), + info, + } + }) + .collect(); + + GetIdentityTokenInfosResponseV0 { + result: Some(get_identity_token_infos_response_v0::Result::TokenInfos( + TokenInfos { token_infos }, + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/mod.rs b/packages/rs-drive-abci/src/query/token_queries/mod.rs new file mode 100644 index 00000000000..9b4efdf4707 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/mod.rs @@ -0,0 +1,7 @@ +mod identities_token_balances; +mod identities_token_infos; +mod identity_token_balances; +mod identity_token_infos; +mod token_pre_programmed_distributions; +mod token_status; +mod token_total_supply; diff --git a/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/mod.rs new file mode 100644 index 00000000000..52acb851640 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/mod.rs @@ -0,0 +1,66 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{ + GetTokenPreProgrammedDistributionsRequest, GetTokenPreProgrammedDistributionsResponse, +}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of an identity's token infos by a public key hash + pub fn query_token_pre_programmed_distributions( + &self, + GetTokenPreProgrammedDistributionsRequest { version }: GetTokenPreProgrammedDistributionsRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenPreProgrammedDistributionsResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token infos query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .token_pre_programmed_distributions; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "token_pre_programmed_distributions".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = self.query_token_pre_programmed_distributions_v0( + request_v0, + platform_state, + platform_version, + )?; + Ok( + result.map(|response_v0| GetTokenPreProgrammedDistributionsResponse { + version: Some(ResponseVersion::V0(response_v0)), + }), + ) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/v0/mod.rs new file mode 100644 index 00000000000..0f7cd34f2bb --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_pre_programmed_distributions/v0/mod.rs @@ -0,0 +1,140 @@ +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_request::get_token_pre_programmed_distributions_request_v0::StartAtInfo; +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_request::GetTokenPreProgrammedDistributionsRequestV0; +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_response::{get_token_pre_programmed_distributions_response_v0, GetTokenPreProgrammedDistributionsResponseV0}; +use dapi_grpc::platform::v0::get_token_pre_programmed_distributions_response::get_token_pre_programmed_distributions_response_v0::{TokenDistributions, TokenDistributionEntry, TokenTimedDistributionEntry}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; +use drive::drive::tokens::distribution::queries::QueryPreProgrammedDistributionStartAt; +use drive::error::query::QuerySyntaxError; + +impl<C> Platform<C> { + pub(super) fn query_token_pre_programmed_distributions_v0( + &self, + GetTokenPreProgrammedDistributionsRequestV0 { + token_id, + start_at_info, + limit, + prove, + }: GetTokenPreProgrammedDistributionsRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenPreProgrammedDistributionsResponseV0>, Error> { + let config = &self.config.drive; + let token_id: Identifier = + check_validation_result_with_data!(token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let limit = limit + .map_or(Some(config.default_query_limit), |limit_value| { + if limit_value == 0 + || limit_value > u16::MAX as u32 + || limit_value as u16 > config.default_query_limit + { + None + } else { + Some(limit_value as u16) + } + }) + .ok_or(drive::error::Error::Query(QuerySyntaxError::InvalidLimit( + format!("limit greater than max limit {}", config.max_query_limit), + )))?; + + let start_at = match start_at_info { + None => None, + Some(StartAtInfo { + start_time_ms, + start_recipient, + start_recipient_included, + }) => { + let start_at_recipient = match start_recipient { + None => None, + Some(identifier) => { + let recipient_id: Identifier = check_validation_result_with_data!( + identifier.try_into().map_err(|_| { + QueryError::InvalidArgument( + "start_recipient must be a valid identifier (32 bytes long)" + .to_string(), + ) + }) + ); + Some((recipient_id, start_recipient_included.unwrap_or(true))) + } + }; + + Some(QueryPreProgrammedDistributionStartAt { + start_at_time: start_time_ms, + start_at_recipient, + }) + } + }; + + let response = if prove { + let proof = check_validation_result_with_data!(self + .drive + .prove_token_pre_programmed_distributions( + token_id.into_buffer(), + start_at, + Some(limit), + None, + platform_version, + )); + + GetTokenPreProgrammedDistributionsResponseV0 { + result: Some( + get_token_pre_programmed_distributions_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let token_distributions = self + .drive + .fetch_token_pre_programmed_distributions( + token_id.into_buffer(), + start_at, + Some(limit), + None, + platform_version, + )? + .into_iter() + .map(|(timestamp, distributions_for_time)| { + let distributions = distributions_for_time + .into_iter() + .map(|(recipient, amount)| TokenDistributionEntry { + recipient_id: recipient.to_vec(), + amount, + }) + .collect(); + TokenTimedDistributionEntry { + timestamp, + distributions, + } + }) + .collect(); + + GetTokenPreProgrammedDistributionsResponseV0 { + result: Some( + get_token_pre_programmed_distributions_response_v0::Result::TokenDistributions( + TokenDistributions { + token_distributions, + }, + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/token_status/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_status/mod.rs new file mode 100644 index 00000000000..ba68930d0d7 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_status/mod.rs @@ -0,0 +1,59 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_statuses_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_token_statuses_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetTokenStatusesRequest, GetTokenStatusesResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of token statuses + pub fn query_token_statuses( + &self, + GetTokenStatusesRequest { version }: GetTokenStatusesRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenStatusesResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token statuses query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .token_statuses; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "token_statuses".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_token_statuses_v0(request_v0, platform_state, platform_version)?; + Ok(result.map(|response_v0| GetTokenStatusesResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/token_status/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_status/v0/mod.rs new file mode 100644 index 00000000000..8f801b8d57b --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_status/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_statuses_request::GetTokenStatusesRequestV0; +use dapi_grpc::platform::v0::get_token_statuses_response::get_token_statuses_response_v0::{ + TokenStatusEntry, TokenStatuses, +}; +use dapi_grpc::platform::v0::get_token_statuses_response::{ + get_token_statuses_response_v0, GetTokenStatusesResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::tokens::status::v0::TokenStatusV0Accessors; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_token_statuses_v0( + &self, + GetTokenStatusesRequestV0 { token_ids, prove }: GetTokenStatusesRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenStatusesResponseV0>, Error> { + let token_ids: Vec<[u8; 32]> = check_validation_result_with_data!(token_ids + .into_iter() + .map(|token_id| { + token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + }) + }) + .collect::<Result<Vec<[u8; 32]>, QueryError>>()); + + let response = if prove { + let proof = check_validation_result_with_data!(self.drive.prove_token_statuses( + token_ids.as_slice(), + None, + platform_version, + )); + + GetTokenStatusesResponseV0 { + result: Some(get_token_statuses_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let token_statuses = self + .drive + .fetch_token_statuses(token_ids.as_slice(), None, platform_version)? + .into_iter() + .map(|(token_id, status)| { + let paused = status.map(|token_status| token_status.paused()); + TokenStatusEntry { + token_id: token_id.to_vec(), + paused, + } + }) + .collect(); + + GetTokenStatusesResponseV0 { + result: Some(get_token_statuses_response_v0::Result::TokenStatuses( + TokenStatuses { token_statuses }, + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/token_total_supply/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_total_supply/mod.rs new file mode 100644 index 00000000000..2100f9bfe77 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_total_supply/mod.rs @@ -0,0 +1,59 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_total_supply_request::Version as RequestVersion; +use dapi_grpc::platform::v0::get_token_total_supply_response::Version as ResponseVersion; +use dapi_grpc::platform::v0::{GetTokenTotalSupplyRequest, GetTokenTotalSupplyResponse}; +use dpp::version::PlatformVersion; +mod v0; + +impl<C> Platform<C> { + /// Querying of token total supply + pub fn query_token_total_supply( + &self, + GetTokenTotalSupplyRequest { version }: GetTokenTotalSupplyRequest, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenTotalSupplyResponse>, Error> { + let Some(version) = version else { + return Ok(QueryValidationResult::new_with_error( + QueryError::DecodingError( + "could not decode identity token total supply query".to_string(), + ), + )); + }; + + let feature_version_bounds = &platform_version + .drive_abci + .query + .token_queries + .token_total_supply; + + let feature_version = match &version { + RequestVersion::V0(_) => 0, + }; + if !feature_version_bounds.check_version(feature_version) { + return Ok(QueryValidationResult::new_with_error( + QueryError::UnsupportedQueryVersion( + "token_total_supply".to_string(), + feature_version_bounds.min_version, + feature_version_bounds.max_version, + platform_version.protocol_version, + feature_version, + ), + )); + } + + match version { + RequestVersion::V0(request_v0) => { + let result = + self.query_token_total_supply_v0(request_v0, platform_state, platform_version)?; + Ok(result.map(|response_v0| GetTokenTotalSupplyResponse { + version: Some(ResponseVersion::V0(response_v0)), + })) + } + } + } +} diff --git a/packages/rs-drive-abci/src/query/token_queries/token_total_supply/v0/mod.rs b/packages/rs-drive-abci/src/query/token_queries/token_total_supply/v0/mod.rs new file mode 100644 index 00000000000..d24a5533089 --- /dev/null +++ b/packages/rs-drive-abci/src/query/token_queries/token_total_supply/v0/mod.rs @@ -0,0 +1,81 @@ +use crate::error::query::QueryError; +use crate::error::Error; +use crate::platform_types::platform::Platform; +use crate::platform_types::platform_state::PlatformState; +use crate::query::QueryValidationResult; +use dapi_grpc::platform::v0::get_token_total_supply_request::GetTokenTotalSupplyRequestV0; +use dapi_grpc::platform::v0::get_token_total_supply_response::get_token_total_supply_response_v0::TokenTotalSupplyEntry; +use dapi_grpc::platform::v0::get_token_total_supply_response::{ + get_token_total_supply_response_v0, GetTokenTotalSupplyResponseV0, +}; +use dpp::check_validation_result_with_data; +use dpp::identifier::Identifier; +use dpp::validation::ValidationResult; +use dpp::version::PlatformVersion; + +impl<C> Platform<C> { + pub(super) fn query_token_total_supply_v0( + &self, + GetTokenTotalSupplyRequestV0 { token_id, prove }: GetTokenTotalSupplyRequestV0, + platform_state: &PlatformState, + platform_version: &PlatformVersion, + ) -> Result<QueryValidationResult<GetTokenTotalSupplyResponseV0>, Error> { + let token_id: [u8; 32] = + check_validation_result_with_data!(token_id.try_into().map_err(|_| { + QueryError::InvalidArgument( + "token_id must be a valid identifier (32 bytes long)".to_string(), + ) + })); + + let response = if prove { + let proof = check_validation_result_with_data!(self + .drive + .prove_token_total_supply_and_aggregated_identity_balances( + token_id, + None, + platform_version, + )); + + GetTokenTotalSupplyResponseV0 { + result: Some(get_token_total_supply_response_v0::Result::Proof( + self.response_proof_v0(platform_state, proof), + )), + metadata: Some(self.response_metadata_v0(platform_state)), + } + } else { + let Some(token_total_aggregated_identity_balances) = self + .drive + .fetch_token_total_aggregated_identity_balances(token_id, None, platform_version)? + else { + return Ok(QueryValidationResult::new_with_error(QueryError::NotFound( + format!("Token {} not found", Identifier::new(token_id)), + ))); + }; + + let Some(token_total_supply) = + self.drive + .fetch_token_total_supply(token_id, None, platform_version)? + else { + return Ok(QueryValidationResult::new_with_error(QueryError::NotFound( + format!("Token {} total supply not found", Identifier::new(token_id)), + ))); + }; + + GetTokenTotalSupplyResponseV0 { + result: Some( + get_token_total_supply_response_v0::Result::TokenTotalSupply( + TokenTotalSupplyEntry { + token_id: token_id.to_vec(), + total_aggregated_amount_in_user_accounts: + token_total_aggregated_identity_balances, + total_system_amount: token_total_supply, + }, + ), + ), + metadata: Some(self.response_metadata_v0(platform_state)), + } + }; + + Ok(QueryValidationResult::new_with_data(response)) + } +} diff --git a/packages/rs-drive-abci/src/rpc/core.rs b/packages/rs-drive-abci/src/rpc/core.rs index a16f0341dc6..633132a489c 100644 --- a/packages/rs-drive-abci/src/rpc/core.rs +++ b/packages/rs-drive-abci/src/rpc/core.rs @@ -1,11 +1,11 @@ -use dashcore_rpc::dashcore::ephemerealdata::chain_lock::ChainLock; -use dashcore_rpc::dashcore::{Block, BlockHash, QuorumHash, Transaction, Txid}; use dashcore_rpc::dashcore_rpc_json::{ AssetUnlockStatusResult, ExtendedQuorumDetails, ExtendedQuorumListResult, GetChainTipsResult, MasternodeListDiff, MnSyncStatus, QuorumInfoResult, QuorumType, SoftforkInfo, }; use dashcore_rpc::json::GetRawTransactionResult; use dashcore_rpc::{Auth, Client, Error, RpcApi}; +use dpp::dashcore::ephemerealdata::chain_lock::ChainLock; +use dpp::dashcore::{Block, BlockHash, QuorumHash, Transaction, Txid}; use dpp::dashcore::{Header, InstantLock}; use dpp::prelude::TimestampMillis; use serde_json::Value; @@ -152,11 +152,6 @@ pub const CORE_RPC_INVALID_ADDRESS_OR_KEY: i32 = -5; /// Invalid, missing or duplicate parameter pub const CORE_RPC_INVALID_PARAMETER: i32 = -8; -/// Asset Unlock consensus error "bad-assetunlock-not-active-quorum" -pub const CORE_RPC_ERROR_ASSET_UNLOCK_NO_ACTIVE_QUORUM: &str = "bad-assetunlock-not-active-quorum"; -/// Asset Unlock consensus error "bad-assetunlock-not-active-quorum" -pub const CORE_RPC_ERROR_ASSET_UNLOCK_EXPIRED: &str = "bad-assetunlock-too-late"; - macro_rules! retry { ($action:expr) => {{ /// Maximum number of retry attempts diff --git a/packages/rs-drive-abci/tests/strategy_tests/execution.rs b/packages/rs-drive-abci/tests/strategy_tests/execution.rs index d02a11e9500..854404e9307 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/execution.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/execution.rs @@ -6,8 +6,6 @@ use crate::strategy::{ StrategyRandomness, ValidatorVersionMigration, }; use crate::verify_state_transitions::verify_state_transitions_were_or_were_not_executed; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::{BlockHash, ProTxHash, QuorumHash}; use dashcore_rpc::dashcore_rpc_json::{ Bip9SoftforkInfo, Bip9SoftforkStatus, DMNStateDiff, ExtendedQuorumDetails, MasternodeListDiff, MasternodeListItem, QuorumInfoResult, QuorumType, SoftforkType, @@ -15,6 +13,8 @@ use dashcore_rpc::dashcore_rpc_json::{ use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{BlockHash, ProTxHash, QuorumHash}; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; @@ -43,7 +43,7 @@ use std::collections::{BTreeMap, HashMap}; use tenderdash_abci::proto::abci::{ResponseInitChain, ValidatorSetUpdate}; use tenderdash_abci::proto::crypto::public_key::Sum::Bls12381; use tenderdash_abci::proto::google::protobuf::Timestamp; -use tenderdash_abci::proto::serializers::timestamp::FromMilis; +use tenderdash_abci::proto::FromMillis; use tenderdash_abci::Application; pub const GENESIS_TIME_MS: u64 = 1681094380000; @@ -1137,7 +1137,7 @@ pub(crate) fn continue_chain_for_strategy( verify_state_transitions_were_or_were_not_executed( &abci_app, &root_app_hash, - &state_transaction_results, + state_transaction_results.as_slice(), &expected_validation_errors, platform_version, ); @@ -1156,7 +1156,7 @@ pub(crate) fn continue_chain_for_strategy( height: state_id.height as i64, block_hash: &block_hash, app_hash: &root_app_hash, - time: Timestamp::from_milis(state_id.time), + time: Timestamp::from_millis(state_id.time).expect("must convert to millis"), signature: &signature, public_key: &current_quorum_with_test_info.public_key, }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/main.rs b/packages/rs-drive-abci/tests/strategy_tests/main.rs index 4194e306896..38fc21253b7 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/main.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/main.rs @@ -27,6 +27,7 @@ mod masternodes; mod patch_platform_tests; mod query; mod strategy; +mod token_tests; mod upgrade_fork_tests; mod verify_state_transitions; mod voting_tests; @@ -47,10 +48,10 @@ mod tests { use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; use crate::query::QueryStrategy; use crate::strategy::{FailureStrategy, MasternodeListChangesStrategy}; - use dashcore_rpc::dashcore::hashes::Hash; - use dashcore_rpc::dashcore::BlockHash; use dashcore_rpc::json::QuorumType; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::BlockHash; use strategy_tests::operations::DocumentAction::{ DocumentActionReplaceRandom, DocumentActionTransferRandom, }; @@ -462,8 +463,8 @@ mod tests { } #[test] - fn run_chain_one_identity_in_solitude() { - let platform_version = PlatformVersion::latest(); + fn run_chain_one_identity_in_solitude_first_protocol_version() { + let platform_version = PlatformVersion::first(); let strategy = NetworkStrategy { strategy: Strategy { start_contracts: vec![], @@ -508,9 +509,10 @@ mod tests { }; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(1) .build_with_mock_rpc(); - let outcome = run_chain_for_strategy(&mut platform, 100, strategy, config, 15, &mut None); + let outcome = run_chain_for_strategy(&mut platform, 2, strategy, config, 15, &mut None); let balance = outcome .abci_app @@ -527,6 +529,84 @@ mod tests { assert_eq!(balance, 99864012200) } + #[test] + fn run_chain_one_identity_in_solitude_latest_protocol_version() { + // This is different because in the root tree we added GroupActions + // DataContract_Documents 64 + // / \ + // Identities 32 Balances 96 + // / \ / \ + // Token_Balances 16 Pools 48 WithdrawalTransactions 80 Votes 112 + // / \ / \ / \ / \ + // NUPKH->I 8 UPKH->I 24 PreFundedSpecializedBalances 40 Masternode Lists 56 (reserved) SpentAssetLockTransactions 72 GroupActions 88 Misc 104 Versions 120 + + // This will cause the costs of insertion of a spent asset lock transition, since group actions now exist we will see a slight difference in processing costs + // This is because WithdrawalTransactions will have a right element in the tree. + + let platform_version = PlatformVersion::latest(); + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: IdentityInsertInfo { + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + ..Default::default() + }, + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: 3000, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = run_chain_for_strategy(&mut platform, 2, strategy, config, 15, &mut None); + + let balance = outcome + .abci_app + .platform + .drive + .fetch_identity_balance( + outcome.identities.first().unwrap().id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch balances") + .expect("expected to have an identity to get balance from"); + + assert_eq!(balance, 99864009940) + } + #[test] fn run_chain_core_height_randomly_increasing() { let strategy = NetworkStrategy { @@ -2270,10 +2350,7 @@ mod tests { for tx_results_per_block in outcome.state_transition_results_per_block.values() { for (state_transition, _unused_result) in tx_results_per_block { // We can't ever get a documents batch transition, because the proposer will remove it from a block - assert!(!matches!( - state_transition, - StateTransition::DocumentsBatch(_) - )); + assert!(!matches!(state_transition, StateTransition::Batch(_))); } } } @@ -2576,28 +2653,22 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); - let (identity2, keys2) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys2); let start_identities = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs index 4084e7f065f..4df6191ae15 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternode_list_item_helpers.rs @@ -74,9 +74,9 @@ impl UpdateMasternodeListItem for MasternodeListItem { #[cfg(test)] mod tests { use super::*; - use dashcore_rpc::dashcore::hashes::Hash; - use dashcore_rpc::dashcore::{ProTxHash, Txid}; use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeType}; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::{ProTxHash, Txid}; use rand::SeedableRng; use std::net::SocketAddr; diff --git a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs index 02a647b66ca..e8715f5f076 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/masternodes.rs @@ -1,8 +1,8 @@ use crate::masternode_list_item_helpers::UpdateMasternodeListItem; -use dashcore_rpc::dashcore::hashes::Hash; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash, Txid}; use dashcore_rpc::dashcore_rpc_json::{DMNState, MasternodeListItem, MasternodeType}; use dpp::bls_signatures::{Bls12381G2Impl, SecretKey as BlsPrivateKey}; +use dpp::dashcore::hashes::Hash; +use dpp::dashcore::{ProTxHash, QuorumHash, Txid}; use dpp::identity::hash::IdentityPublicKeyHashMethodsV0; use dpp::identity::IdentityPublicKey; use drive_abci::mimic::test_quorum::TestQuorumInfo; @@ -587,7 +587,7 @@ impl MasternodeListItemWithUpdates { match closest_height { Some(h) => &self.updates[&h], - None => &self.masternode, + Option::None => &self.masternode, } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/query.rs b/packages/rs-drive-abci/tests/strategy_tests/query.rs index 56f166ab749..4a4103c4dbc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/query.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/query.rs @@ -24,8 +24,8 @@ use rand::{Rng, SeedableRng}; use std::collections::HashMap; use strategy_tests::frequency::Frequency; use tenderdash_abci::proto::google::protobuf::Timestamp; -use tenderdash_abci::proto::serializers::timestamp::ToMilis; use tenderdash_abci::proto::types::{CanonicalVote, SignedMsgType, StateId}; +use tenderdash_abci::proto::ToMillis; use tenderdash_abci::signatures::{Hashable, Signable}; #[derive(Clone, Debug, Default)] @@ -72,7 +72,7 @@ pub struct ProofVerification<'a> { pub public_key: &'a dpp::bls_signatures::PublicKey<Bls12381G2Impl>, } -impl<'a> ProofVerification<'a> { +impl ProofVerification<'_> { /// Verify proof signature /// /// Constructs new signature for provided state ID and checks if signature is still valid. @@ -157,7 +157,7 @@ impl<'a> ProofVerification<'a> { app_version: self.app_version, core_chain_locked_height: self.core_chain_locked_height, height: self.height as u64, - time: self.time.to_milis(), + time: self.time.to_millis().expect("time as milliseconds"), }; self.verify_signature(state_id, proof.round) @@ -168,7 +168,7 @@ impl QueryStrategy { pub(crate) fn query_chain_for_strategy( &self, proof_verification: &ProofVerification, - current_identities: &Vec<Identity>, + current_identities: &[Identity], abci_app: &FullAbciApplication<MockCoreRPCLike>, seed: StrategyRandomness, platform_version: &PlatformVersion, @@ -194,7 +194,7 @@ impl QueryStrategy { pub(crate) fn query_identities_by_public_key_hashes( proof_verification: &ProofVerification, - current_identities: &Vec<Identity>, + current_identities: &[Identity], frequency: &Frequency, abci_app: &FullAbciApplication<MockCoreRPCLike>, rng: &mut StdRng, diff --git a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs index bf3235ea788..64680b4cd37 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/strategy.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/strategy.rs @@ -1,9 +1,9 @@ use crate::masternodes::MasternodeListItemWithUpdates; use crate::query::QueryStrategy; use crate::BlockHeight; -use dashcore_rpc::dashcore::{Network, PrivateKey}; -use dashcore_rpc::dashcore::{ProTxHash, QuorumHash}; use dpp::block::block_info::BlockInfo; +use dpp::dashcore::{Network, PrivateKey}; +use dpp::dashcore::{ProTxHash, QuorumHash}; use dpp::state_transition::identity_topup_transition::methods::IdentityTopUpTransitionMethodsV0; use dpp::ProtocolError; @@ -15,7 +15,7 @@ use strategy_tests::frequency::Frequency; use strategy_tests::operations::FinalizeBlockOperation::IdentityAddKeys; use strategy_tests::operations::{ AmountRange, DocumentAction, DocumentOp, FinalizeBlockOperation, IdentityUpdateOp, - OperationType, + OperationType, TokenOp, }; use dpp::document::DocumentV0Getters; @@ -31,57 +31,72 @@ use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyRequestType}; use drive::drive::Drive; use drive::util::storage_flags::StorageFlags::SingleEpoch; -use dpp::identity::KeyType::ECDSA_SECP256K1; -use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; -use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; -use drive::query::DriveDocumentQuery; -use drive_abci::mimic::test_quorum::TestQuorumInfo; -use drive_abci::platform_types::platform::Platform; -use drive_abci::rpc::core::MockCoreRPCLike; -use rand::prelude::{IteratorRandom, SliceRandom, StdRng}; -use rand::Rng; -use strategy_tests::Strategy; -use strategy_tests::transitions::{create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, instant_asset_lock_proof_fixture_with_dynamic_range}; -use std::borrow::Cow; -use std::collections::{BTreeMap, HashMap, HashSet}; -use std::ops::RangeInclusive; -use std::str::FromStr; -use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; +use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; use dpp::dashcore::hashes::Hash; +use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::v0::DocumentTypeV0; use dpp::identifier::MasternodeIdentifiers; use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::identity_public_key::v0::IdentityPublicKeyV0; use dpp::identity::state_transition::asset_lock_proof::InstantAssetLockProof; +use dpp::identity::KeyType::ECDSA_SECP256K1; use dpp::platform_value::{BinaryData, Value}; use dpp::prelude::{AssetLockProof, Identifier, IdentityNonce}; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; -use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; -use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; -use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition}; -use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::DocumentTransferTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::{ + BatchedTransition, DocumentDeleteTransition, DocumentReplaceTransition, + DocumentTransferTransition, +}; +use dpp::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dpp::state_transition::batch_transition::document_create_transition::{ + DocumentCreateTransition, DocumentCreateTransitionV0, +}; +use dpp::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; +use dpp::state_transition::batch_transition::token_mint_transition::TokenMintTransitionV0; +use dpp::state_transition::batch_transition::token_transfer_transition::TokenTransferTransitionV0; +use dpp::state_transition::batch_transition::{ + BatchTransition, BatchTransitionV0, BatchTransitionV1, TokenMintTransition, + TokenTransferTransition, +}; use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; -use dpp::state_transition::masternode_vote_transition::MasternodeVoteTransition; +use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; use dpp::state_transition::masternode_vote_transition::methods::MasternodeVoteTransitionMethodsV0; +use dpp::state_transition::masternode_vote_transition::MasternodeVoteTransition; +use dpp::tokens::calculate_token_id; +use dpp::tokens::token_event::TokenEvent; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use dpp::voting::vote_polls::VotePoll; -use dpp::voting::votes::resource_vote::ResourceVote; use dpp::voting::votes::resource_vote::v0::ResourceVoteV0; +use dpp::voting::votes::resource_vote::ResourceVote; use dpp::voting::votes::Vote; +use drive::drive::document::query::QueryDocumentsOutcomeV0Methods; +use drive::query::DriveDocumentQuery; use drive_abci::abci::app::FullAbciApplication; -use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::config::PlatformConfig; +use drive_abci::mimic::test_quorum::TestQuorumInfo; +use drive_abci::platform_types::platform::Platform; +use drive_abci::platform_types::platform_state::v0::PlatformStateV0Methods; use drive_abci::platform_types::signature_verification_quorum_set::{ QuorumConfig, Quorums, SigningQuorum, }; use drive_abci::platform_types::withdrawal::unsigned_withdrawal_txs::v0::UnsignedWithdrawalTxs; - -use crate::strategy::CoreHeightIncrease::NoCoreHeightIncrease; +use drive_abci::rpc::core::MockCoreRPCLike; +use rand::prelude::{IteratorRandom, SliceRandom, StdRng}; +use rand::Rng; use simple_signer::signer::SimpleSigner; +use std::borrow::Cow; +use std::collections::{BTreeMap, HashMap, HashSet}; +use std::ops::RangeInclusive; +use std::str::FromStr; +use strategy_tests::transitions::{ + create_state_transitions_for_identities, create_state_transitions_for_identities_and_proofs, + instant_asset_lock_proof_fixture_with_dynamic_range, +}; +use strategy_tests::Strategy; +use tenderdash_abci::proto::abci::{ExecTxResult, ValidatorSetUpdate}; #[derive(Clone, Debug, Default)] pub struct MasternodeListChangesStrategy { @@ -483,6 +498,15 @@ impl NetworkStrategy { .expect("document type must exist") .to_owned_document_type(); } + } else if let OperationType::Token(token_op) = &mut operation.op_type { + if token_op.contract.id() == old_id { + token_op.contract.set_id(contract.id()); + token_op.token_id = calculate_token_id( + contract.id_ref().as_bytes(), + token_op.token_pos, + ) + .into(); + } } }); @@ -648,8 +672,8 @@ impl NetworkStrategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { + let document_batch_transition: BatchTransition = + BatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], user_fee_increase: 0, @@ -778,8 +802,8 @@ impl NetworkStrategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { + let document_batch_transition: BatchTransition = + BatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], user_fee_increase: 0, @@ -884,15 +908,14 @@ impl NetworkStrategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_delete_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_delete_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -987,15 +1010,14 @@ impl NetworkStrategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_replace_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_replace_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -1098,15 +1120,14 @@ impl NetworkStrategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_transfer_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 0, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -1404,6 +1425,166 @@ impl NetworkStrategy { operations.push(state_transition); } } + OperationType::Token(TokenOp { + contract, + token_id, + token_pos, + use_identity_with_id, + action: TokenEvent::Mint(amount, recipient, note), + }) if current_identities.len() > 1 => { + let operation_owner_id = if let Some(identity_id) = use_identity_with_id { + *identity_id + } else { + let random_index = rng.gen_range(0..current_identities.len()); + current_identities[random_index].id() + }; + + let request = IdentityKeysRequest { + identity_id: operation_owner_id.to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity for token mint operation"); + let identity_contract_nonce = contract_nonce_counter + .entry((operation_owner_id, contract.id())) + .or_default(); + *identity_contract_nonce += 1; + let token_mint_transition: TokenMintTransition = TokenMintTransitionV0 { + base: TokenBaseTransitionV0 { + identity_contract_nonce: *identity_contract_nonce, + token_contract_position: *token_pos, + data_contract_id: contract.id(), + token_id: *token_id, + using_group_info: None, + } + .into(), + issued_to_identity_id: Some(*recipient), + amount: *amount, + public_note: note.clone(), + } + .into(); + + let batch_transition: BatchTransition = BatchTransitionV1 { + owner_id: identity.id, + transitions: vec![BatchedTransition::Token( + token_mint_transition.into(), + )], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut batch_transition: StateTransition = batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(batch_transition); + } + OperationType::Token(TokenOp { + contract, + token_id, + token_pos, + use_identity_with_id, + action: + TokenEvent::Transfer( + recipient, + public_note, + shared_encrypted_note, + private_encrypted_note, + amount, + ), + }) if current_identities.len() > 1 => { + let operation_owner_id = if let Some(identity_id) = use_identity_with_id { + *identity_id + } else { + let random_index = rng.gen_range(0..current_identities.len()); + current_identities[random_index].id() + }; + + let request = IdentityKeysRequest { + identity_id: operation_owner_id.to_buffer(), + request_type: KeyRequestType::SpecificKeys(vec![1]), + limit: Some(1), + offset: None, + }; + let identity = platform + .drive + .fetch_identity_balance_with_keys(request, None, platform_version) + .expect("expected to be able to get identity") + .expect("expected to get an identity for token mint operation"); + let identity_contract_nonce = contract_nonce_counter + .entry((operation_owner_id, contract.id())) + .or_default(); + *identity_contract_nonce += 1; + let token_transfer_transition: TokenTransferTransition = + TokenTransferTransitionV0 { + base: TokenBaseTransitionV0 { + identity_contract_nonce: *identity_contract_nonce, + token_contract_position: *token_pos, + data_contract_id: contract.id(), + token_id: *token_id, + using_group_info: None, + } + .into(), + amount: *amount, + recipient_id: *recipient, + public_note: public_note.clone(), + shared_encrypted_note: shared_encrypted_note.clone(), + private_encrypted_note: private_encrypted_note.clone(), + } + .into(); + + let batch_transition: BatchTransition = BatchTransitionV1 { + owner_id: identity.id, + transitions: vec![BatchedTransition::Token( + token_transfer_transition.into(), + )], + user_fee_increase: 0, + signature_public_key_id: 0, + signature: BinaryData::default(), + } + .into(); + + let mut batch_transition: StateTransition = batch_transition.into(); + + let identity_public_key = identity + .loaded_public_keys + .values() + .next() + .expect("expected a key"); + + batch_transition + .sign_external( + identity_public_key, + signer, + Some(|_data_contract_id, _document_type_name| { + Ok(SecurityLevel::HIGH) + }), + ) + .expect("expected to sign"); + + operations.push(batch_transition); + } _ => {} } } @@ -1553,7 +1734,7 @@ impl NetworkStrategy { ) } else { create_state_transitions_for_identities( - identities, + &mut identities, balance_range, signer, rng, diff --git a/packages/rs-drive-abci/tests/strategy_tests/token_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/token_tests.rs new file mode 100644 index 00000000000..d2a2607c92d --- /dev/null +++ b/packages/rs-drive-abci/tests/strategy_tests/token_tests.rs @@ -0,0 +1,333 @@ +#[cfg(test)] +mod tests { + use crate::execution::run_chain_for_strategy; + use crate::strategy::NetworkStrategy; + use dpp::dash_to_duffs; + use dpp::data_contract::accessors::v0::DataContractV0Setters; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; + use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Setters; + use dpp::data_contract::DataContract; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::state_transition::StateTransition; + use dpp::tests::json_document::json_document_to_created_contract; + use dpp::tokens::token_event::TokenEvent; + use drive_abci::config::{ + ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig, + ValidatorSetConfig, + }; + use drive_abci::test::helpers::setup::TestPlatformBuilder; + use platform_version::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::SeedableRng; + use simple_signer::signer::SimpleSigner; + use strategy_tests::frequency::Frequency; + use strategy_tests::operations::{Operation, OperationType, TokenOp}; + use strategy_tests::transitions::create_state_transitions_for_identities; + use strategy_tests::{IdentityInsertInfo, StartIdentities, Strategy}; + + #[test] + fn run_chain_insert_one_new_identity_per_block_and_a_token_mint() { + let platform_version = PlatformVersion::latest(); + let mut created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/basic-token/basic-token.json", + 1, + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let mut rng = StdRng::seed_from_u64(567); + + let mut simple_signer = SimpleSigner::default(); + + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys1); + simple_signer.add_keys(keys2); + + let start_identities: Vec<(Identity, Option<StateTransition>)> = + create_state_transitions_for_identities( + vec![&mut identity1, &mut identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), + &simple_signer, + &mut rng, + platform_version, + ) + .into_iter() + .map(|(identity, transition)| (identity, Some(transition))) + .collect(); + + let contract = created_contract.data_contract_mut(); + let token_configuration = contract + .token_configuration_mut(0) + .expect("expected to get token configuration"); + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(true); + contract.set_owner_id(identity1.id()); + let new_id = DataContract::generate_data_contract_id_v0(identity1.id(), 1); + contract.set_id(new_id); + let token_id = contract.token_id(0).expect("expected to get token_id"); + + let token_op = TokenOp { + contract: contract.clone(), + token_id, + token_pos: 0, + use_identity_with_id: Some(identity1.id()), + action: TokenEvent::Mint(1000, identity2.id(), None), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![(created_contract, None)], + operations: vec![Operation { + op_type: OperationType::Token(token_op), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }], + start_identities: StartIdentities { + hard_coded: start_identities.clone(), + ..Default::default() + }, + identity_inserts: IdentityInsertInfo::default(), + + identity_contract_nonce_gaps: None, + signer: Some(simple_signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + let block_count = 12; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = + run_chain_for_strategy(&mut platform, block_count, strategy, config, 15, &mut None); + + let drive = &outcome.abci_app.platform.drive; + let identity_ids = vec![identity1.id().to_buffer(), identity2.id().to_buffer()]; + let balances = drive + .fetch_identities_token_balances( + token_id.to_buffer(), + identity_ids.as_slice(), + None, + platform_version, + ) + .expect("expected to get balances"); + + for (identity_id, token_balance) in balances { + assert!(token_balance.is_some()) + } + + let identity_1_token_balance = drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity1.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch"); + let identity_2_token_balance = drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch"); + + assert_eq!(identity_1_token_balance, Some(100000)); // The initial amount from creating the contract + assert_eq!(identity_2_token_balance, Some(11000)); // 11 blocks of 1000 + } + + #[test] + fn run_chain_insert_one_new_identity_per_block_and_a_token_transfer() { + let platform_version = PlatformVersion::latest(); + let mut created_contract = json_document_to_created_contract( + "tests/supporting_files/contract/basic-token/basic-token.json", + 1, + true, + platform_version, + ) + .expect("expected to get contract from a json document"); + + let mut rng = StdRng::seed_from_u64(567); + + let mut simple_signer = SimpleSigner::default(); + + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys1); + simple_signer.add_keys(keys2); + + let start_identities: Vec<(Identity, Option<StateTransition>)> = + create_state_transitions_for_identities( + vec![&mut identity1, &mut identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), + &simple_signer, + &mut rng, + platform_version, + ) + .into_iter() + .map(|(identity, transition)| (identity, Some(transition))) + .collect(); + + let contract = created_contract.data_contract_mut(); + let token_configuration = contract + .token_configuration_mut(0) + .expect("expected to get token configuration"); + token_configuration + .distribution_rules_mut() + .set_minting_allow_choosing_destination(true); + contract.set_owner_id(identity1.id()); + let new_id = DataContract::generate_data_contract_id_v0(identity1.id(), 1); + contract.set_id(new_id); + let token_id = contract.token_id(0).expect("expected to get token_id"); + + let token_op = TokenOp { + contract: contract.clone(), + token_id, + token_pos: 0, + use_identity_with_id: Some(identity1.id()), + action: TokenEvent::Transfer(identity2.id(), None, None, None, 1000), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![(created_contract, None)], + operations: vec![Operation { + op_type: OperationType::Token(token_op), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }], + start_identities: StartIdentities { + hard_coded: start_identities.clone(), + ..Default::default() + }, + identity_inserts: IdentityInsertInfo::default(), + + identity_contract_nonce_gaps: None, + signer: Some(simple_signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + validator_set: ValidatorSetConfig::default_100_67(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + verify_sum_trees: true, + + ..Default::default() + }, + block_spacing_ms: day_in_ms, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + ..Default::default() + }; + let block_count = 12; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let outcome = + run_chain_for_strategy(&mut platform, block_count, strategy, config, 15, &mut None); + + let drive = &outcome.abci_app.platform.drive; + let identity_ids = vec![identity1.id().to_buffer(), identity2.id().to_buffer()]; + let balances = drive + .fetch_identities_token_balances( + token_id.to_buffer(), + identity_ids.as_slice(), + None, + platform_version, + ) + .expect("expected to get balances"); + + assert_eq!( + balances.get(&identity1.id()).copied(), + Some(Some(100000 - 11000)) + ); + assert_eq!(balances.get(&identity2.id()).copied(), Some(Some(11000))); + + // Let's also try this fetching + + let identity_1_token_balance = drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity1.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch"); + let identity_2_token_balance = drive + .fetch_identity_token_balance( + token_id.to_buffer(), + identity2.id().to_buffer(), + None, + platform_version, + ) + .expect("expected to fetch"); + + assert_eq!(identity_1_token_balance, Some(100000 - 11000)); // The initial amount from creating the contract less 11 times 1000 that we transferred + assert_eq!(identity_2_token_balance, Some(11000)); // 11 blocks of 1000 + } +} diff --git a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs index 554394956be..6cc875c18fc 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/upgrade_fork_tests.rs @@ -783,7 +783,7 @@ mod tests { chain_lock: ChainLockConfig::default_100_67(), instant_lock: InstantLockConfig::default_100_67(), execution: ExecutionConfig { - verify_sum_trees: true, + verify_sum_trees: false, //faster without this epoch_time_length_s: 1576800, ..Default::default() }, @@ -1369,7 +1369,7 @@ mod tests { chain_lock: ChainLockConfig::default_100_67(), instant_lock: InstantLockConfig::default_100_67(), execution: ExecutionConfig { - verify_sum_trees: true, + verify_sum_trees: false, epoch_time_length_s: 1576800, ..Default::default() }, diff --git a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs index 57f347f9775..a7f8b30c999 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/verify_state_transitions.rs @@ -15,24 +15,29 @@ use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::IdentityKeysRequest; use drive::drive::Drive; use drive::query::{SingleDocumentDriveQuery, SingleDocumentDriveQueryContestedStatus}; -use drive::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use drive::state_transition_action::StateTransitionAction; use drive_abci::execution::validation::state_transition::transformer::StateTransitionActionTransformerV0; use drive_abci::platform_types::platform::PlatformRef; use drive_abci::rpc::core::MockCoreRPCLike; use tenderdash_abci::proto::abci::ExecTxResult; - -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contracts::SystemDataContract; +use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; +use dpp::prelude::Identifier; use dpp::voting::votes::Vote; use drive::drive::votes::resolved::vote_polls::ResolvedVotePoll; use drive::drive::votes::resolved::votes::resolved_resource_vote::accessors::v0::ResolvedResourceVoteGettersV0; use drive::drive::votes::resolved::votes::ResolvedVote; -use drive::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; -use drive::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; -use drive::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; -use drive::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; +use drive::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::DocumentFromReplaceTransitionAction; +use drive::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::DocumentTransferTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionActionAccessorsV0; +use drive::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; use drive_abci::abci::app::FullAbciApplication; use drive_abci::execution::types::state_transition_execution_context::StateTransitionExecutionContext; use drive_abci::execution::validation::state_transition::ValidationMode; @@ -59,11 +64,11 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( .iter() .enumerate() .map(|(num, (state_transition, result))| { - if let StateTransition::DocumentsBatch(batch) = state_transition { - let _first = batch.transitions().first().unwrap(); - - // dbg!(batch.transitions().len(), hex::encode(first.base().id()), state.height(), first.to_string()); - } + // if let StateTransition::DocumentsBatch(batch) = state_transition { + // let _first = batch.document_transitions().first().unwrap(); + // + // // dbg!(batch.transitions().len(), hex::encode(first.base().id()), state.height(), first.to_string()); + // } let mut execution_context = StateTransitionExecutionContext::default_for_platform_version(platform_version) @@ -108,6 +113,9 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( contracts: vec![], documents: vec![], votes: vec![], + identity_token_balances: vec![], + identity_token_infos: vec![], + token_statuses: vec![], }; if let Some(action) = action { @@ -209,59 +217,87 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( ); } } - StateTransitionAction::DocumentsBatchAction(documents_batch_transition) => { - documents_batch_transition + StateTransitionAction::BatchAction(batch_transition) => { + batch_transition .transitions() .iter() - .for_each(|transition| { - let document_contested_status = - if let DocumentTransitionAction::CreateAction(create_action) = - transition - { - if create_action.prefunded_voting_balance().is_some() { - SingleDocumentDriveQueryContestedStatus::Contested as u8 + .for_each(|transition| match transition { + BatchedTransitionAction::DocumentAction(document_transition_action) => { + let document_contested_status = + if let DocumentTransitionAction::CreateAction(create_action) = + document_transition_action + { + if create_action.prefunded_voting_balance().is_some() { + SingleDocumentDriveQueryContestedStatus::Contested as u8 + } else { + SingleDocumentDriveQueryContestedStatus::NotContested + as u8 + } } else { SingleDocumentDriveQueryContestedStatus::NotContested as u8 - } - } else { - SingleDocumentDriveQueryContestedStatus::NotContested as u8 - }; - proofs_request - .documents - .push(get_proofs_request_v0::DocumentRequest { - contract_id: transition - .base() - .expect("expected a base for the document transition") - .data_contract_id() - .to_vec(), - document_type: transition - .base() - .expect("expected a base for the document transition") - .document_type_name() - .clone(), - document_type_keeps_history: transition - .base() - .expect("expected a base for the document transition") - .data_contract_fetch_info() - .contract - .document_type_for_name( - transition - .base() - .expect( - "expected a base for the document transition", + }; + proofs_request.documents.push( + get_proofs_request_v0::DocumentRequest { + contract_id: document_transition_action + .base() + .data_contract_id() + .to_vec(), + document_type: document_transition_action + .base() + .document_type_name() + .clone(), + document_type_keeps_history: document_transition_action + .base() + .data_contract_fetch_info() + .contract + .document_type_for_name( + document_transition_action + .base() + .document_type_name() + .as_str(), + ) + .expect("get document type") + .documents_keep_history(), + document_id: document_transition_action + .base() + .id() + .to_vec(), + document_contested_status: document_contested_status as i32, + }, + ); + } + BatchedTransitionAction::TokenAction(token_transition_action) => { + if token_transition_action + .base() + .token_configuration() + .expect("expected token configuration") + .keeps_history() + { + // if we keep history we just need to check the historical document + proofs_request.documents.push( + get_proofs_request_v0::DocumentRequest { + contract_id: SystemDataContract::TokenHistory + .id() + .to_vec(), + document_type: token_transition_action + .historical_document_type_name() + .to_string(), + document_type_keeps_history: false, + document_id: token_transition_action + .historical_document_id( + batch_transition.owner_id(), + token_transition_action + .base() + .identity_contract_nonce(), ) - .document_type_name() - .as_str(), - ) - .expect("get document type") - .documents_keep_history(), - document_id: transition - .base() - .expect("expected a base for the document transition") - .id() - .to_vec(), - document_contested_status: document_contested_status as i32, - }); + .to_vec(), + document_contested_status: 0, + }, + ); + } else { + } + } + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => {} }); let versioned_request = GetProofsRequest { version: Some(get_proofs_request::Version::V0(proofs_request)), @@ -274,211 +310,296 @@ pub(crate) fn verify_state_transitions_were_or_were_not_executed( let response_proof = response.proof_owned().expect("proof should be present"); - for document_transition_action in - documents_batch_transition.transitions().iter() - { - let contract_fetch_info = document_transition_action - .base() - .expect("expected a base for the document transition") - .data_contract_fetch_info(); - - let document_type = contract_fetch_info - .contract - .document_type_for_name( - document_transition_action - .base() - .expect("expected a base for the document transition") - .document_type_name() - .as_str(), - ) - .expect("get document type"); - let contested_status = - if let DocumentTransitionAction::CreateAction(create_action) = - document_transition_action - { - if create_action.prefunded_voting_balance().is_some() { - SingleDocumentDriveQueryContestedStatus::Contested - } else { - SingleDocumentDriveQueryContestedStatus::NotContested - } - } else { - SingleDocumentDriveQueryContestedStatus::NotContested - }; - - let query = SingleDocumentDriveQuery { - contract_id: document_transition_action - .base() - .expect("expected a base for the document transition") - .data_contract_id() - .into_buffer(), - document_type_name: document_transition_action - .base() - .expect("expected a base for the document transition") - .document_type_name() - .clone(), - document_type_keeps_history: document_type.documents_keep_history(), - document_id: document_transition_action - .base() - .expect("expected a base for the document transition") - .id() - .into_buffer(), - block_time_ms: None, //None because we want latest - contested_status, - }; - - // dbg!( - // platform.state.height(), - // document_transition_action.action_type(), - // document_transition_action - // .base() - // .id() - // .to_string(Encoding::Base58) - // ); - - let (root_hash, document) = query - .verify_proof( - false, - &response_proof.grovedb_proof, - document_type, - platform_version, - ) - .expect("expected to verify a document"); + for transition_action in batch_transition.transitions().iter() { + match transition_action { + BatchedTransitionAction::DocumentAction(document_action) => { + let contract_fetch_info = + document_action.base().data_contract_fetch_info(); + + let document_type = contract_fetch_info + .contract + .document_type_for_name( + document_action.base().document_type_name().as_str(), + ) + .expect("get document type"); + let contested_status = + if let DocumentTransitionAction::CreateAction(create_action) = + document_action + { + if create_action.prefunded_voting_balance().is_some() { + SingleDocumentDriveQueryContestedStatus::Contested + } else { + SingleDocumentDriveQueryContestedStatus::NotContested + } + } else { + SingleDocumentDriveQueryContestedStatus::NotContested + }; - assert_eq!( - &root_hash, - expected_root_hash, - "state last block info {:?}", - platform.state.last_committed_block_info() - ); + let query = SingleDocumentDriveQuery { + contract_id: document_action + .base() + .data_contract_id() + .into_buffer(), + document_type_name: document_action + .base() + .document_type_name() + .clone(), + document_type_keeps_history: document_type + .documents_keep_history(), + document_id: document_action.base().id().into_buffer(), + block_time_ms: None, //None because we want latest + contested_status, + }; - match document_transition_action { - DocumentTransitionAction::CreateAction(creation_action) => { - if *was_executed { - let document = document.unwrap_or_else(|| { - panic!( - "expected a document on block {}", - platform.state.last_committed_block_height() - ) - }); - // dbg!( - // &document, - // Document::try_from_create_transition( - // creation_action, - // documents_batch_transition.owner_id(), - // platform_version, - // ) - // .expect("expected to get document") - // ); - assert_eq!( - document, - Document::try_from_create_transition_action( - creation_action, - documents_batch_transition.owner_id(), - platform_version, - ) - .expect("expected to get document") - ); - } else { - //there is the possibility that the state transition was not executed because it already existed, - // we can discount that for now in tests - assert!(document.is_none()); - } - } - DocumentTransitionAction::ReplaceAction(replace_action) => { - if *was_executed { - // it's also possible we deleted something we replaced - if let Some(document) = document { - assert_eq!( - document, - Document::try_from_replace_transition_action( - replace_action, - documents_batch_transition.owner_id(), - platform_version, - ) - .expect("expected to get document") - ); + // dbg!( + // platform.state.height(), + // document_transition_action.action_type(), + // document_transition_action + // .base() + // .id() + // .to_string(Encoding::Base58) + // ); + + let (root_hash, document) = query + .verify_proof( + false, + &response_proof.grovedb_proof, + document_type, + platform_version, + ) + .expect("expected to verify a document"); + + assert_eq!( + &root_hash, + expected_root_hash, + "state last block info {:?}", + platform.state.last_committed_block_info() + ); + + match document_action { + DocumentTransitionAction::CreateAction(creation_action) => { + if *was_executed { + let document = document.unwrap_or_else(|| { + panic!( + "expected a document on block {}", + platform.state.last_committed_block_height() + ) + }); + // dbg!( + // &document, + // Document::try_from_create_transition( + // creation_action, + // documents_batch_transition.owner_id(), + // platform_version, + // ) + // .expect("expected to get document") + // ); + assert_eq!( + document, + Document::try_from_create_transition_action( + creation_action, + batch_transition.owner_id(), + platform_version, + ) + .expect("expected to get document") + ); + } else { + //there is the possibility that the state transition was not executed because it already existed, + // we can discount that for now in tests + assert!(document.is_none()); + } } - } else { - //there is the possibility that the state transition was not executed and the state is equal to the previous - // state, aka there would have been no change anyways, we can discount that for now - if let Some(document) = document { - assert_ne!( - document, - Document::try_from_replace_transition_action( - replace_action, - documents_batch_transition.owner_id(), - platform_version, - ) - .expect("expected to get document") - ); + DocumentTransitionAction::ReplaceAction(replace_action) => { + if *was_executed { + // it's also possible we deleted something we replaced + if let Some(document) = document { + assert_eq!( + document, + Document::try_from_replace_transition_action( + replace_action, + batch_transition.owner_id(), + platform_version, + ) + .expect("expected to get document") + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document, + Document::try_from_replace_transition_action( + replace_action, + batch_transition.owner_id(), + platform_version, + ) + .expect("expected to get document") + ); + } + } } - } - } - DocumentTransitionAction::DeleteAction(_) => { - // we expect no document - assert!(document.is_none()); - } - DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { - panic!("we should not have a bump identity data contract nonce"); - } - DocumentTransitionAction::TransferAction(transfer_action) => { - if *was_executed { - // it's also possible we deleted something we replaced - if let Some(document) = document { - assert_eq!( - document.owner_id(), - transfer_action.document().owner_id() - ); + DocumentTransitionAction::DeleteAction(_) => { + // we expect no document + assert!(document.is_none()); } - } else { - //there is the possibility that the state transition was not executed and the state is equal to the previous - // state, aka there would have been no change anyways, we can discount that for now - if let Some(document) = document { - assert_ne!( - document.owner_id(), - transfer_action.document().owner_id() - ); + DocumentTransitionAction::TransferAction(transfer_action) => { + if *was_executed { + // it's also possible we deleted something we replaced + if let Some(document) = document { + assert_eq!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + transfer_action.document().owner_id() + ); + } + } } - } - } - DocumentTransitionAction::PurchaseAction(purchase_action) => { - if *was_executed { - if let Some(document) = document { - assert_eq!( - document.owner_id(), - purchase_action.document().owner_id() - ); + DocumentTransitionAction::PurchaseAction(purchase_action) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.owner_id(), + purchase_action.document().owner_id() + ); + } + } } - } else { - //there is the possibility that the state transition was not executed and the state is equal to the previous - // state, aka there would have been no change anyways, we can discount that for now - if let Some(document) = document { - assert_ne!( - document.owner_id(), - purchase_action.document().owner_id() - ); + DocumentTransitionAction::UpdatePriceAction( + update_price_action, + ) => { + if *was_executed { + if let Some(document) = document { + assert_eq!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } else { + //there is the possibility that the state transition was not executed and the state is equal to the previous + // state, aka there would have been no change anyways, we can discount that for now + if let Some(document) = document { + assert_ne!( + document.get(PRICE), + update_price_action.document().get(PRICE) + ); + } + } } } } - DocumentTransitionAction::UpdatePriceAction(update_price_action) => { - if *was_executed { - if let Some(document) = document { - assert_eq!( - document.get(PRICE), - update_price_action.document().get(PRICE) - ); - } + BatchedTransitionAction::TokenAction(token_transition_action) => { + if token_transition_action + .base() + .token_configuration() + .expect("expected token configuration") + .keeps_history() + { + let token_id = token_transition_action.base().token_id(); + let document_type_name = token_transition_action + .historical_document_type_name() + .to_string(); + + let token_history = platform + .drive + .cache + .system_data_contracts + .load_token_history(); + + let query = SingleDocumentDriveQuery { + contract_id: SystemDataContract::TokenHistory + .id() + .to_buffer(), + document_type_name, + document_type_keeps_history: false, + document_id: token_transition_action + .historical_document_id( + batch_transition.owner_id(), + token_transition_action + .base() + .identity_contract_nonce(), + ) + .to_buffer(), + block_time_ms: None, //None because we want latest + contested_status: + SingleDocumentDriveQueryContestedStatus::NotContested, + }; + + let (root_hash, serialized_document) = query + .verify_proof_keep_serialized( + false, + &response_proof.grovedb_proof, + platform_version, + ) + .expect("expected to verify a document"); + + assert_eq!( + &root_hash, + expected_root_hash, + "state last block info {:?}", + platform.state.last_committed_block_info() + ); + + assert!( + serialized_document.is_some(), + "we expect a token history document" + ); + + let expected_document = token_transition_action + .build_historical_document( + &token_history, + token_id, + batch_transition.owner_id(), + token_transition_action + .base() + .identity_contract_nonce(), + platform + .state + .last_committed_block_info() + .as_ref() + .expect("expected last commited block info") + .basic_info(), + platform_version, + ) + .expect("expected to build historical document"); + + let serialized_expected_document = expected_document + .serialize( + token_transition_action + .historical_document_type(&token_history) + .expect("expected document type"), + platform_version, + ) + .expect("expected to serialize"); + + assert_eq!( + serialized_document.unwrap(), + serialized_expected_document + ); } else { - //there is the possibility that the state transition was not executed and the state is equal to the previous - // state, aka there would have been no change anyways, we can discount that for now - if let Some(document) = document { - assert_ne!( - document.get(PRICE), - update_price_action.document().get(PRICE) - ); - } + todo!(); } } + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => { + panic!("we should not have a bump identity data contract nonce"); + } } } } diff --git a/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs b/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs index 83834520c0c..d0e804dfa93 100644 --- a/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs +++ b/packages/rs-drive-abci/tests/strategy_tests/voting_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { use crate::execution::{continue_chain_for_strategy, run_chain_for_strategy}; - use crate::strategy::{ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness}; + use crate::strategy::{ChainExecutionOutcome, ChainExecutionParameters, NetworkStrategy, StrategyRandomness, UpgradingInfo}; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::random_document::{ DocumentFieldFillSize, DocumentFieldFillType, @@ -9,7 +9,7 @@ mod tests { use dpp::identity::accessors::IdentityGettersV0; use dpp::identity::Identity; use dpp::platform_value::Value; - use drive_abci::config::{ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig}; + use drive_abci::config::{ChainLockConfig, ExecutionConfig, InstantLockConfig, PlatformConfig, PlatformTestConfig, ValidatorSetConfig}; use drive_abci::test::helpers::setup::TestPlatformBuilder; use platform_version::version::PlatformVersion; use rand::prelude::StdRng; @@ -23,6 +23,7 @@ mod tests { use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::{get_contested_resource_vote_state_response_v0, GetContestedResourceVoteStateResponseV0}; use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::get_contested_resource_vote_state_response_v0::FinishedVoteInfo; use dapi_grpc::platform::v0::get_contested_resource_vote_state_response::get_contested_resource_vote_state_response_v0::finished_vote_info::FinishedVoteOutcome; + use dpp::block::epoch::Epoch; use dpp::block::extended_block_info::v0::ExtendedBlockInfoV0Getters; use dpp::dash_to_duffs; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -69,19 +70,16 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); let start_identities: Vec<(Identity, Option<StateTransition>)> = create_state_transitions_for_identities( - vec![identity1], + vec![&mut identity1], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, @@ -315,7 +313,7 @@ mod tests { .first() .expect("expected a document insert"); - assert_matches!(state_transition, StateTransition::DocumentsBatch(_)); + assert_matches!(state_transition, StateTransition::Batch(_)); assert_eq!(execution_result.code, 0); } @@ -347,29 +345,23 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); - let (identity2, keys2) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys2); let start_identities: Vec<(Identity, Option<StateTransition>)> = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, @@ -623,29 +615,23 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); - let (identity2, keys2) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys2); let start_identities: Vec<(Identity, Option<StateTransition>)> = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, @@ -980,29 +966,23 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); - let (identity2, keys2) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys2); let start_identities: Vec<(Identity, Option<StateTransition>)> = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, @@ -1322,7 +1302,7 @@ mod tests { } #[test] - fn run_chain_with_voting_on_conflicting_index_distribution_after_won_by_identity() { + fn run_chain_with_voting_after_won_by_identity_no_specialized_funds_distribution() { // In this test we try to insert two state transitions with the same unique index // We use the DPNS contract, and we insert two documents both with the same "name" // This is a common scenario we should see quite often @@ -1341,37 +1321,32 @@ mod tests { }; let mut platform = TestPlatformBuilder::new() .with_config(config.clone()) + .with_initial_protocol_version(7) .build_with_mock_rpc(); - let platform_version = PlatformVersion::latest(); + let platform_version = PlatformVersion::get(7).unwrap(); let mut rng = StdRng::seed_from_u64(567); let mut simple_signer = SimpleSigner::default(); - let (identity1, keys1) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys1); - let (identity2, keys2) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys2); let start_identities: Vec<(Identity, Option<StateTransition>)> = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &simple_signer, &mut rng, @@ -1708,5 +1683,1149 @@ mod tests { finished_at_epoch: 1 }) ); + + // not let's see how much is in processing pools + + let processing_fees = platform + .drive + .get_epoch_processing_credits_for_distribution( + &Epoch::new(1).unwrap(), + None, + platform_version, + ) + .expect("expected to get processing fees made in epoch"); + + // A vote costs 10_000_000 + // Hence we did 5 votes in this epoch + assert_eq!(processing_fees, 50_000_000); + } + + #[test] + fn run_chain_with_voting_after_won_by_identity_with_specialized_funds_distribution() { + // In this test we try to insert two state transitions with the same unique index + // We use the DPNS contract, and we insert two documents both with the same "name" + // This is a common scenario we should see quite often + let config = PlatformConfig { + testing_configs: PlatformTestConfig::default_minimal_verifications(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + //we disable document triggers because we are using dpns and dpns needs a preorder + use_document_triggers: false, + + ..Default::default() + }, + block_spacing_ms: 3000, + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .build_with_mock_rpc(); + + let platform_version = PlatformVersion::latest(); + + let mut rng = StdRng::seed_from_u64(567); + + let mut simple_signer = SimpleSigner::default(); + + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys1); + + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys2); + + let start_identities: Vec<(Identity, Option<StateTransition>)> = + create_state_transitions_for_identities( + vec![&mut identity1, &mut identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), + &simple_signer, + &mut rng, + platform_version, + ) + .into_iter() + .map(|(identity, transition)| (identity, Some(transition))) + .collect(); + + let dpns_contract = platform + .drive + .cache + .system_data_contracts + .load_dpns() + .as_ref() + .clone(); + + let document_type = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type") + .to_owned_document_type(); + + let identity1_id = start_identities.first().unwrap().0.id(); + let identity2_id = start_identities.last().unwrap().0.id(); + let document_op_1 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "quantum".into()), + ("normalizedLabel".into(), "quantum".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([("identity", Value::from(identity1_id))]).into(), + ), + ]), + Some(start_identities.first().unwrap().0.id()), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let document_op_2 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "quantum".into()), + ("normalizedLabel".into(), "quantum".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([( + "identity", + Value::from(start_identities.last().unwrap().0.id()), + )]) + .into(), + ), + ]), + Some(start_identities.last().unwrap().0.id()), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![ + Operation { + op_type: OperationType::Document(document_op_1), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_op_2), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities { + hard_coded: start_identities, + ..Default::default() + }, + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: Some(simple_signer), + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let mut voting_signer = Some(SimpleSigner::default()); + + // On the first block we only have identities and contracts + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + state_transition_results_per_block, + .. + } = run_chain_for_strategy( + &mut platform, + 2, + strategy.clone(), + config.clone(), + 15, + &mut voting_signer, + ); + + let platform = abci_app.platform; + + let platform_state = platform.state.load(); + + let state_transitions_block_2 = state_transition_results_per_block + .get(&2) + .expect("expected to get block 2"); + + let first_document_insert_result = &state_transitions_block_2 + .first() + .as_ref() + .expect("expected a document insert") + .1; + assert_eq!(first_document_insert_result.code, 0); + + let second_document_insert_result = &state_transitions_block_2 + .get(1) + .as_ref() + .expect("expected a document insert") + .1; + + assert_eq!(second_document_insert_result.code, 0); // we expect the second to also be insertable as they are both contested + + let block_start = platform_state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info() + .height + + 1; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + //we disable document triggers because we are using dpns and dpns needs a preorder + use_document_triggers: false, + + ..Default::default() + }, + block_spacing_ms: day_in_ms, + ..Default::default() + }; + + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start, + core_height_start: 1, + block_count: 16, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions: Some(current_proposer_versions.clone()), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: 1681094380000, + current_time_ms: end_time_ms, + current_identities: Vec::new(), + }, + NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::ResourceVote(ResourceVoteOp { + resolved_vote_poll: ContestedDocumentResourceVotePollWithContractInfo { + contract: DataContractOwnedResolvedInfo::OwnedDataContract( + dpns_contract.clone(), + ), + document_type_name: "domain".to_string(), + index_name: "parentNameAndLabel".to_string(), + index_values: vec!["dash".into(), "quantum".into()], + }, + action: VoteAction { + vote_choices_with_weights: vec![ + (ResourceVoteChoice::Abstain, 1), + (ResourceVoteChoice::Lock, 1), + (ResourceVoteChoice::TowardsIdentity(identity1_id), 2), + (ResourceVoteChoice::TowardsIdentity(identity2_id), 10), + ], + }, + }), + frequency: Frequency { + times_per_block_range: 1..3, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: voting_signer, + }, + total_hpmns: 100, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: None, + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }, + config.clone(), + StrategyRandomness::SeedEntropy(9), + ); + + let platform = outcome.abci_app.platform; + + // Now let's run a query for the vote totals + + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + + let dash_encoded = bincode::encode_to_vec(Value::Text("dash".to_string()), config) + .expect("expected to encode the word dash"); + + let quantum_encoded = bincode::encode_to_vec(Value::Text("quantum".to_string()), config) + .expect("expected to encode the word quantum"); + + let index_name = "parentNameAndLabel".to_string(); + + let query_validation_result = platform + .query_contested_resource_vote_state( + GetContestedResourceVoteStateRequest { + version: Some(get_contested_resource_vote_state_request::Version::V0( + GetContestedResourceVoteStateRequestV0 { + contract_id: dpns_contract.id().to_vec(), + document_type_name: document_type.name().clone(), + index_name: index_name.clone(), + index_values: vec![dash_encoded.clone(), quantum_encoded.clone()], + result_type: ResultType::DocumentsAndVoteTally as i32, + allow_include_locked_and_abstaining_vote_tally: true, + start_at_identifier_info: None, + count: None, + prove: false, + }, + )), + }, + &platform_state, + platform_version, + ) + .expect("expected to execute query") + .into_data() + .expect("expected query to be valid"); + + let get_contested_resource_vote_state_response::Version::V0( + GetContestedResourceVoteStateResponseV0 { + metadata: _, + result, + }, + ) = query_validation_result.version.expect("expected a version"); + + let Some( + get_contested_resource_vote_state_response_v0::Result::ContestedResourceContenders( + get_contested_resource_vote_state_response_v0::ContestedResourceContenders { + contenders, + abstain_vote_tally, + lock_vote_tally, + finished_vote_info, + }, + ), + ) = result + else { + panic!("expected contenders") + }; + + assert_eq!(contenders.len(), 2); + + let first_contender = contenders.first().unwrap(); + + let second_contender = contenders.last().unwrap(); + + assert_eq!(first_contender.identifier, identity2_id.to_vec()); + + assert_eq!(second_contender.identifier, identity1_id.to_vec()); + + // All vote counts are weighted, so for evonodes, these are in multiples of 4 + + // 19 votes were cast + + assert_eq!(first_contender.vote_count, Some(60)); + + assert_eq!(second_contender.vote_count, Some(4)); + + assert_eq!(lock_vote_tally, Some(4)); + + assert_eq!(abstain_vote_tally, Some(8)); + + assert_eq!( + finished_vote_info, + Some(FinishedVoteInfo { + finished_vote_outcome: FinishedVoteOutcome::TowardsIdentity.into(), + won_by_identity_id: Some(identity2_id.to_vec()), + finished_at_block_height: 17, + finished_at_core_block_height: 1, + finished_at_block_time_ms: 1682303986000, + finished_at_epoch: 1 + }) + ); + + // not let's see how much is in processing pools + + let processing_fees = platform + .drive + .get_epoch_processing_credits_for_distribution( + &Epoch::new(1).unwrap(), + None, + platform_version, + ) + .expect("expected to get processing fees made in epoch"); + + // A vote costs 10_000_000 + // We did 5 votes in this epoch, + // We had 39_810_000_000 left over, which is only the cost of 19 votes + // So we basically have 39_810_000_000 + 50_000_000 + assert_eq!(processing_fees, 39_860_000_000); + } + + #[test] + fn run_chain_with_voting_after_won_by_identity_no_specialized_funds_distribution_until_version_8( + ) { + // In this test the goal is to verify that when we hit version 8 that the specialized balances + // that hadn't been properly distributed are distributed. + let config = PlatformConfig { + validator_set: ValidatorSetConfig { + quorum_size: 10, + ..Default::default() + }, + testing_configs: PlatformTestConfig::default_minimal_verifications(), + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + //we disable document triggers because we are using dpns and dpns needs a preorder + use_document_triggers: false, + + ..Default::default() + }, + block_spacing_ms: 3000, + ..Default::default() + }; + let mut platform = TestPlatformBuilder::new() + .with_config(config.clone()) + .with_initial_protocol_version(7) + .build_with_mock_rpc(); + + let platform_version = PlatformVersion::get(7).unwrap(); + + let mut rng = StdRng::seed_from_u64(567); + + let mut simple_signer = SimpleSigner::default(); + + let (mut identity1, keys1) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys1); + + let (mut identity2, keys2) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); + + simple_signer.add_keys(keys2); + + let start_identities: Vec<(Identity, Option<StateTransition>)> = + create_state_transitions_for_identities( + vec![&mut identity1, &mut identity2], + &(dash_to_duffs!(1)..=dash_to_duffs!(1)), + &simple_signer, + &mut rng, + platform_version, + ) + .into_iter() + .map(|(identity, transition)| (identity, Some(transition))) + .collect(); + + let dpns_contract = platform + .drive + .cache + .system_data_contracts + .load_dpns() + .as_ref() + .clone(); + + let document_type = dpns_contract + .document_type_for_name("domain") + .expect("expected a profile document type") + .to_owned_document_type(); + + let identity1_id = start_identities.first().unwrap().0.id(); + let identity2_id = start_identities.last().unwrap().0.id(); + let document_op_1 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "quantum".into()), + ("normalizedLabel".into(), "quantum".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([("identity", Value::from(identity1_id))]).into(), + ), + ]), + Some(identity1_id), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let document_op_2 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "quantum".into()), + ("normalizedLabel".into(), "quantum".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([( + "identity", + Value::from(start_identities.last().unwrap().0.id()), + )]) + .into(), + ), + ]), + Some(identity2_id), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let strategy = NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![ + Operation { + op_type: OperationType::Document(document_op_1), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_op_2), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities { + hard_coded: start_identities, + ..Default::default() + }, + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: Some(simple_signer.clone()), + }, + total_hpmns: 20, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: 7, + proposed_protocol_versions_with_weight: vec![(7, 1)], + upgrade_three_quarters_life: 0.2, + }), + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }; + + let mut voting_signer = Some(SimpleSigner::default()); + + // On the first block we only have identities and contracts + let ChainExecutionOutcome { + abci_app, + identities, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + state_transition_results_per_block, + .. + } = run_chain_for_strategy( + &mut platform, + 2, + strategy.clone(), + config.clone(), + 15, + &mut voting_signer, + ); + + let platform = abci_app.platform; + + let platform_state = platform.state.load(); + + let state_transitions_block_2 = state_transition_results_per_block + .get(&2) + .expect("expected to get block 2"); + + let first_document_insert_result = &state_transitions_block_2 + .first() + .as_ref() + .expect("expected a document insert") + .1; + assert_eq!(first_document_insert_result.code, 0); + + let second_document_insert_result = &state_transitions_block_2 + .get(1) + .as_ref() + .expect("expected a document insert") + .1; + + assert_eq!(second_document_insert_result.code, 0); // we expect the second to also be insertable as they are both contested + + let block_start = platform_state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info() + .height + + 1; + let day_in_ms = 1000 * 60 * 60 * 24; + let config = PlatformConfig { + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + //we disable document triggers because we are using dpns and dpns needs a preorder + use_document_triggers: false, + + ..Default::default() + }, + block_spacing_ms: day_in_ms, + ..Default::default() + }; + + // On the first block we only have identities and contracts + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + .. + } = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start, + core_height_start: 1, + block_count: 16, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions: Some(current_proposer_versions.clone()), + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: 1681094380000, + current_time_ms: end_time_ms, + current_identities: Vec::new(), + }, + NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![Operation { + op_type: OperationType::ResourceVote(ResourceVoteOp { + resolved_vote_poll: ContestedDocumentResourceVotePollWithContractInfo { + contract: DataContractOwnedResolvedInfo::OwnedDataContract( + dpns_contract.clone(), + ), + document_type_name: "domain".to_string(), + index_name: "parentNameAndLabel".to_string(), + index_values: vec!["dash".into(), "quantum".into()], + }, + action: VoteAction { + vote_choices_with_weights: vec![ + (ResourceVoteChoice::Abstain, 1), + (ResourceVoteChoice::Lock, 1), + (ResourceVoteChoice::TowardsIdentity(identity1_id), 2), + (ResourceVoteChoice::TowardsIdentity(identity2_id), 10), + ], + }, + }), + frequency: Frequency { + times_per_block_range: 1..3, + chance_per_block: None, + }, + }], + start_identities: StartIdentities::default(), + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: voting_signer, + }, + total_hpmns: 20, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: 7, + proposed_protocol_versions_with_weight: vec![(7, 1)], + upgrade_three_quarters_life: 0.2, + }), + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: true, + ..Default::default() + }, + config.clone(), + StrategyRandomness::SeedEntropy(9), + ); + + let platform = abci_app.platform; + + // Now let's run a query for the vote totals + + let bincode_config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + + let dash_encoded = bincode::encode_to_vec(Value::Text("dash".to_string()), bincode_config) + .expect("expected to encode the word dash"); + + let quantum_encoded = + bincode::encode_to_vec(Value::Text("quantum".to_string()), bincode_config) + .expect("expected to encode the word quantum"); + + let index_name = "parentNameAndLabel".to_string(); + + let query_validation_result = platform + .query_contested_resource_vote_state( + GetContestedResourceVoteStateRequest { + version: Some(get_contested_resource_vote_state_request::Version::V0( + GetContestedResourceVoteStateRequestV0 { + contract_id: dpns_contract.id().to_vec(), + document_type_name: document_type.name().clone(), + index_name: index_name.clone(), + index_values: vec![dash_encoded.clone(), quantum_encoded.clone()], + result_type: ResultType::DocumentsAndVoteTally as i32, + allow_include_locked_and_abstaining_vote_tally: true, + start_at_identifier_info: None, + count: None, + prove: false, + }, + )), + }, + &platform_state, + platform_version, + ) + .expect("expected to execute query") + .into_data() + .expect("expected query to be valid"); + + let get_contested_resource_vote_state_response::Version::V0( + GetContestedResourceVoteStateResponseV0 { + metadata: _, + result, + }, + ) = query_validation_result.version.expect("expected a version"); + + let Some( + get_contested_resource_vote_state_response_v0::Result::ContestedResourceContenders( + get_contested_resource_vote_state_response_v0::ContestedResourceContenders { + contenders, + abstain_vote_tally, + lock_vote_tally, + finished_vote_info, + }, + ), + ) = result + else { + panic!("expected contenders") + }; + + assert_eq!(contenders.len(), 2); + + let first_contender = contenders.first().unwrap(); + + let second_contender = contenders.last().unwrap(); + + assert_eq!(first_contender.identifier, identity2_id.to_vec()); + + assert_eq!(second_contender.identifier, identity1_id.to_vec()); + + // All vote counts are weighted, so for evonodes, these are in multiples of 4 + + assert_eq!( + ( + first_contender.vote_count, + second_contender.vote_count, + lock_vote_tally, + abstain_vote_tally + ), + (Some(64), Some(8), Some(0), Some(0)) + ); + + assert_eq!( + finished_vote_info, + Some(FinishedVoteInfo { + finished_vote_outcome: FinishedVoteOutcome::TowardsIdentity.into(), + won_by_identity_id: Some(identity2_id.to_vec()), + finished_at_block_height: 17, + finished_at_core_block_height: 1, + finished_at_block_time_ms: 1682303986000, + finished_at_epoch: 1 + }) + ); + + // not let's see how much is in processing pools + + let processing_fees = platform + .drive + .get_epoch_processing_credits_for_distribution( + &Epoch::new(1).unwrap(), + None, + platform_version, + ) + .expect("expected to get processing fees made in epoch"); + + // A vote costs 10_000_000 + // Hence we did 4 votes in this epoch + assert_eq!(processing_fees, 40_000_000); + + // Now let's upgrade to version 8 + + let platform = abci_app.platform; + + let platform_state = platform.state.load(); + + let block_start = platform_state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info() + .height + + 1; + + let ten_hours_in_ms = 1000 * 60 * 60 * 10; + let config = PlatformConfig { + chain_lock: ChainLockConfig::default_100_67(), + instant_lock: InstantLockConfig::default_100_67(), + execution: ExecutionConfig { + //we disable document triggers because we are using dpns and dpns needs a preorder + use_document_triggers: false, + + ..Default::default() + }, + block_spacing_ms: ten_hours_in_ms, + ..Default::default() + }; + + // We go 45 blocks later + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + .. + } = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start, + core_height_start: 1, + block_count: 45, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions: None, + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: 1681094380000, + current_time_ms: end_time_ms, + current_identities: Vec::new(), + }, + NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 20, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: 8, + proposed_protocol_versions_with_weight: vec![(8, 1)], + upgrade_three_quarters_life: 0.1, + }), + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: false, + ..Default::default() + }, + config.clone(), + StrategyRandomness::SeedEntropy(9203), + ); + + let platform = abci_app.platform; + + let platform_state = platform.state.load(); + + let mut block_start = platform_state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info() + .height + + 1; + + // We need to create a few more contests + + let document_op_1 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "sam".into()), + ("normalizedLabel".into(), "sam".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ("parentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([("identity", Value::from(identity1_id))]).into(), + ), + ]), + Some(identity1_id), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let document_op_2 = DocumentOp { + contract: dpns_contract.clone(), + action: DocumentAction::DocumentActionInsertSpecific( + BTreeMap::from([ + ("label".into(), "sam".into()), + ("normalizedLabel".into(), "sam".into()), + ("normalizedParentDomainName".into(), "dash".into()), + ("parentDomainName".into(), "dash".into()), + ( + "records".into(), + BTreeMap::from([("identity", Value::from(identity2_id))]).into(), + ), + ]), + Some(identity2_id), + DocumentFieldFillType::FillIfNotRequired, + DocumentFieldFillSize::AnyDocumentFillSize, + ), + document_type: document_type.clone(), + }; + + let ChainExecutionOutcome { + abci_app, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + end_time_ms, + identity_nonce_counter, + identity_contract_nonce_counter, + .. + } = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start, + core_height_start: 1, + block_count: 1, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions: None, + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: 1681094380000, + current_time_ms: end_time_ms, + current_identities: identities, + }, + NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![ + Operation { + op_type: OperationType::Document(document_op_1), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + Operation { + op_type: OperationType::Document(document_op_2), + frequency: Frequency { + times_per_block_range: 1..2, + chance_per_block: None, + }, + }, + ], + start_identities: StartIdentities::default(), + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: Some(simple_signer), + }, + total_hpmns: 20, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: 8, + proposed_protocol_versions_with_weight: vec![(8, 1)], + upgrade_three_quarters_life: 0.1, + }), + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: false, + ..Default::default() + }, + config.clone(), + StrategyRandomness::SeedEntropy(9203), + ); + + block_start += 1; + + // We go 14 blocks later till version 8 is active + let outcome = continue_chain_for_strategy( + abci_app, + ChainExecutionParameters { + block_start, + core_height_start: 1, + block_count: 14, + proposers, + validator_quorums, + current_validator_quorum_hash, + instant_lock_quorums, + current_proposer_versions: None, + current_identity_nonce_counter: identity_nonce_counter, + current_identity_contract_nonce_counter: identity_contract_nonce_counter, + current_votes: BTreeMap::default(), + start_time_ms: 1681094380000, + current_time_ms: end_time_ms, + current_identities: Vec::new(), + }, + NetworkStrategy { + strategy: Strategy { + start_contracts: vec![], + operations: vec![], + start_identities: StartIdentities::default(), + identity_inserts: Default::default(), + + identity_contract_nonce_gaps: None, + signer: None, + }, + total_hpmns: 20, + extra_normal_mns: 0, + validator_quorum_count: 24, + chain_lock_quorum_count: 24, + upgrading_info: Some(UpgradingInfo { + current_protocol_version: 8, + proposed_protocol_versions_with_weight: vec![(8, 1)], + upgrade_three_quarters_life: 0.1, + }), + + proposer_strategy: Default::default(), + rotate_quorums: false, + failure_testing: None, + query_testing: None, + verify_state_transition_results: false, + ..Default::default() + }, + config.clone(), + StrategyRandomness::SeedEntropy(9203), + ); + + let platform = outcome.abci_app.platform; + platform + .drive + .fetch_versions_with_counter(None, &platform_version.drive) + .expect("expected to get versions"); + + let state = platform.state.load(); + assert_eq!( + state + .last_committed_block_info() + .as_ref() + .unwrap() + .basic_info() + .epoch + .index, + 4 + ); + assert_eq!(state.current_protocol_version_in_consensus(), 8); + + let processing_fees = platform + .drive + .get_epoch_processing_credits_for_distribution( + &Epoch::new(4).unwrap(), + None, + platform_version, + ) + .expect("expected to get processing fees made in epoch"); + + // A vote costs 10_000_000 + // There were 23 votes total so that means that there would have been 39_780_000_000 left over + // We see that there is 39_780_000_000 to distribute + assert_eq!(processing_fees, 39_780_000_000); } } diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json new file mode 100644 index 00000000000..ec2a3fd928e --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/basic-token/basic-token.json @@ -0,0 +1,19 @@ +{ + "$format_version": "1", + "id": "EbL1zYg1JrpPX9rYbASihRsSEgwKbqZAJu6B1Z2SKKU2", + "ownerId": "F1Ue2M5PfDjDX69NqrZdChdEbwF2SYZ8UF4qNjsCQu1d", + "version": 1, + "documentSchemas": {}, + "tokens": { + "0": { + "$format_version": "0", + "conventions": { + "$format_version": "0", + "decimals": 8 + }, + "baseSupply": 100000, + "maxSupply": null, + "keepsHistory": true + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-documents-mutable.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-documents-mutable.json new file mode 100644 index 00000000000..f4833eed719 --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-direct-purchase-documents-mutable.json @@ -0,0 +1,134 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": true, + "canBeDeleted": true, + "transferable": 1, + "tradeMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-in-game-currency.json b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-in-game-currency.json new file mode 100644 index 00000000000..3a1c2daeccd --- /dev/null +++ b/packages/rs-drive-abci/tests/supporting_files/contract/crypto-card-game/crypto-card-game-in-game-currency.json @@ -0,0 +1,135 @@ +{ + "$format_version": "0", + "id": "86LHvdC1Tqx5P97LQUSibGFqf2vnKFpB6VkqQ7oso86e", + "ownerId": "2QjL594djCH2NyDsn45vd6yQjEDHupMKo7CEGVTHtQxU", + "version": 1, + "documentSchemas": { + "card": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": true, + "transferable": 1, + "tradeMode": 1, + "creationRestrictionMode": 1, + "properties": { + "name": { + "type": "string", + "description": "Name of the card", + "maxLength": 63, + "position": 0 + }, + "description": { + "type": "string", + "description": "Description of the card", + "maxLength": 256, + "position": 1 + }, + "imageUrl": { + "type": "string", + "description": "URL of the image associated with the card", + "maxLength": 2048, + "format": "uri", + "position": 2 + }, + "imageHash": { + "type": "array", + "description": "SHA256 hash of the bytes of the image specified by imageUrl", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "position": 3 + }, + "imageFingerprint": { + "type": "array", + "description": "dHash of the image specified by imageUrl", + "byteArray": true, + "minItems": 8, + "maxItems": 8, + "position": 4 + }, + "attack": { + "type": "integer", + "description": "Attack power of the card", + "minimum": 0, + "position": 5 + }, + "defense": { + "type": "integer", + "description": "Defense level of the card", + "minimum": 0, + "position": 6 + } + }, + "indices": [ + { + "name": "owner", + "properties": [ + { + "$ownerId": "asc" + } + ] + }, + { + "name": "attack", + "properties": [ + { + "attack": "asc" + } + ] + }, + { + "name": "defense", + "properties": [ + { + "defense": "asc" + } + ] + }, + { + "name": "transferredAt", + "properties": [ + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "ownerTransferredAt", + "properties": [ + { + "$ownerId": "asc" + }, + { + "$transferredAt": "asc" + } + ] + }, + { + "name": "transferredAtBlockHeight", + "properties": [ + { + "$transferredAtBlockHeight": "asc" + } + ] + }, + { + "name": "transferredAtCoreBlockHeight", + "properties": [ + { + "$transferredAtCoreBlockHeight": "asc" + } + ] + } + ], + "required": [ + "name", + "$transferredAt", + "$transferredAtBlockHeight", + "$transferredAtCoreBlockHeight", + "attack", + "defense" + ], + "additionalProperties": false + } + } +} \ No newline at end of file diff --git a/packages/rs-drive-proof-verifier/Cargo.toml b/packages/rs-drive-proof-verifier/Cargo.toml index 1b91f2586f0..f27d58db77c 100644 --- a/packages/rs-drive-proof-verifier/Cargo.toml +++ b/packages/rs-drive-proof-verifier/Cargo.toml @@ -1,19 +1,15 @@ [package] name = "drive-proof-verifier" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true -crate-type = ["cdylib"] - [features] -default = ["mocks"] +default = [] mocks = [ "dep:serde", "dep:serde_json", - "dep:bincode", "dep:platform-serialization-derive", - "dep:platform-serialization", "dpp/document-serde-conversion", "indexmap/serde", ] @@ -21,20 +17,23 @@ mocks = [ [dependencies] thiserror = { version = "1.0.63" } -dapi-grpc = { path = "../dapi-grpc" } +dapi-grpc = { path = "../dapi-grpc", default-features = false, features = [ + "platform", +] } + drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } dpp = { path = "../rs-dpp", features = [ "bls-signatures", - "document-value-conversion", - "extended-document", + # "document-value-conversion", + # "extended-document", "core-types-serialization", ], default-features = false } -bincode = { version = "2.0.0-rc.3", features = ["serde"], optional = true } +bincode = { version = "2.0.0-rc.3", features = ["serde"] } platform-serialization-derive = { path = "../rs-platform-serialization-derive", optional = true } -platform-serialization = { path = "../rs-platform-serialization", optional = true } -tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.2.1", tag = "v1.2.1+1.3.0", features = [ +platform-serialization = { path = "../rs-platform-serialization" } +tenderdash-abci = { git = "https://github.com/dashpay/rs-tenderdash-abci", version = "1.3.0", tag = "v1.3.0+1.3.0", features = [ "crypto", ], default-features = false } tracing = { version = "0.1.37" } diff --git a/packages/rs-drive-proof-verifier/src/types.rs b/packages/rs-drive-proof-verifier/src/types.rs index 40fa528a546..a482f6ddc12 100644 --- a/packages/rs-drive-proof-verifier/src/types.rs +++ b/packages/rs-drive-proof-verifier/src/types.rs @@ -35,10 +35,11 @@ use drive::grovedb::Element; pub use indexmap::IndexMap; use std::collections::{BTreeMap, BTreeSet}; +use dpp::dashcore::hashes::Hash; #[cfg(feature = "mocks")] use { bincode::{Decode, Encode}, - dpp::{dashcore::hashes::Hash, version as platform_version, ProtocolError}, + dpp::{version as platform_version, ProtocolError}, platform_serialization::{PlatformVersionEncode, PlatformVersionedDecode}, platform_serialization_derive::{PlatformDeserialize, PlatformSerialize}, }; @@ -239,6 +240,7 @@ pub type IdentityBalanceAndRevision = (u64, Revision); #[derive(Debug, Clone, PartialEq)] pub struct ContestedResource(pub Value); +#[cfg(feature = "mocks")] impl ContestedResource { /// Get the value. pub fn encode_to_vec( diff --git a/packages/rs-drive/Cargo.toml b/packages/rs-drive/Cargo.toml index 26ec8c66e18..741425585ed 100644 --- a/packages/rs-drive/Cargo.toml +++ b/packages/rs-drive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "drive" description = "Dash drive built on top of GroveDB" -version = "1.6.2" +version = "1.8.0" authors = [ "Samuel Westrich <sam@dash.org>", "Ivan Shumkov <ivan@shumkov.ru>", @@ -26,7 +26,7 @@ indexmap = { version = "2.0.2" } sqlparser = { version = "0.38.0" } # used for int maps and needed in the verifier nohash-hasher = { version = "0.2.0" } -dpp = { path = "../rs-dpp", features = [ +dpp = { package = "dpp", path = "../rs-dpp", features = [ "state-transitions", ], default-features = false, optional = true } thiserror = { version = "1.0.63" } @@ -36,7 +36,7 @@ hex = { version = "0.4.3" } # optional dependencies parking_lot = { version = "0.12.1", optional = true } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +ciborium = { version = "0.2.2", optional = true } arc-swap = { version = "1.7.0", optional = true } serde = { version = "1.0.197", features = ["derive"], optional = true } rand = { version = "0.8.4", features = ["small_rng"], optional = true } @@ -49,15 +49,15 @@ bs58 = { version = "0.5.0", optional = true } base64 = { version = "0.22.1", optional = true } tempfile = { version = "3", optional = true } enum-map = { version = "2.0.3", optional = true } -intmap = { version = "2.0.0", features = ["serde"], optional = true } +intmap = { version = "3.0.1", features = ["serde"], optional = true } chrono = { version = "0.4.35", optional = true } itertools = { version = "0.13", optional = true } -grovedb = { version = "2.1.0", optional = true, default-features = false } -grovedb-costs = { version = "2.1.0", optional = true } -grovedb-path = { version = "2.1.0" } -grovedb-storage = { version = "2.1.0", optional = true } -grovedb-version = { version = "2.1.0" } -grovedb-epoch-based-storage-flags = { version = "2.1.0" } +grovedb = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70", optional = true, default-features = false } +grovedb-costs = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70", optional = true } +grovedb-path = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70" } +grovedb-storage = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70", optional = true } +grovedb-version = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70" } +grovedb-epoch-based-storage-flags = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70" } [dev-dependencies] criterion = "0.5" @@ -100,11 +100,12 @@ server = [ "parking_lot", "arc-swap", "moka", + "dpp/validation", "dpp/platform-value-json", "dpp/system_contracts", "dpp/state-transitions", "fee-distribution", - "grovedb/full", + "grovedb/minimal", "grovedb/estimated_costs", "grovedb-storage", "grovedb-costs", diff --git a/packages/rs-drive/src/cache/system_contracts.rs b/packages/rs-drive/src/cache/system_contracts.rs index c1a2785c3c4..7de44da36bd 100644 --- a/packages/rs-drive/src/cache/system_contracts.rs +++ b/packages/rs-drive/src/cache/system_contracts.rs @@ -15,6 +15,8 @@ pub struct SystemDataContracts { dashpay: ArcSwap<DataContract>, /// Masternode reward shares contract masternode_reward_shares: ArcSwap<DataContract>, + /// Token history contract + token_history: ArcSwap<DataContract>, } impl SystemDataContracts { @@ -39,6 +41,10 @@ impl SystemDataContracts { SystemDataContract::MasternodeRewards, platform_version, )?), + token_history: ArcSwap::from_pointee(load_system_data_contract( + SystemDataContract::TokenHistory, + platform_version, + )?), }) } @@ -47,6 +53,11 @@ impl SystemDataContracts { self.withdrawals.load() } + /// Returns token history contract + pub fn load_token_history(&self) -> Guard<Arc<DataContract>> { + self.token_history.load() + } + /// Returns DPNS contract pub fn load_dpns(&self) -> Guard<Arc<DataContract>> { self.dpns.load() diff --git a/packages/rs-drive/src/drive/asset_lock/estimation_costs/add_estimation_costs_for_adding_asset_lock/v0/mod.rs b/packages/rs-drive/src/drive/asset_lock/estimation_costs/add_estimation_costs_for_adding_asset_lock/v0/mod.rs index 1110b448445..1d8cb180eea 100644 --- a/packages/rs-drive/src/drive/asset_lock/estimation_costs/add_estimation_costs_for_adding_asset_lock/v0/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/estimation_costs/add_estimation_costs_for_adding_asset_lock/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::asset_lock::asset_lock_storage_path; use grovedb::EstimatedSumTrees::SomeSumTrees; @@ -61,12 +61,15 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(3, false), estimated_layer_sizes: AllSubtrees( 12, // 32 + 1 + 1 / 3 SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 2, }, None, @@ -77,7 +80,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(asset_lock_storage_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems( 36, //The size of an outpoint diff --git a/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs index eb929eda17f..c85e0dc84d3 100644 --- a/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/asset_lock/fetch_asset_lock_outpoint_info/v0/mod.rs @@ -13,7 +13,7 @@ use dpp::asset_lock::reduced_asset_lock_value::AssetLockValue; use dpp::asset_lock::StoredAssetLockInfo; use dpp::platform_value::Bytes36; use dpp::serialization::PlatformDeserializable; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Checks if a given `outpoint` is present as an asset lock in the transaction. @@ -68,7 +68,7 @@ impl Drive { StatefulDirectQuery } else { StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue(36), } }; diff --git a/packages/rs-drive/src/drive/balances/mod.rs b/packages/rs-drive/src/drive/balances/mod.rs index 39f15f42985..23c74cd12ac 100644 --- a/packages/rs-drive/src/drive/balances/mod.rs +++ b/packages/rs-drive/src/drive/balances/mod.rs @@ -22,10 +22,14 @@ use crate::drive::RootTree; use crate::query::Query; use grovedb::{PathQuery, SizedQuery}; -/// Storage fee pool key +/// Total system credits storage #[cfg(any(feature = "server", feature = "verify"))] pub const TOTAL_SYSTEM_CREDITS_STORAGE_KEY: &[u8; 1] = b"D"; +/// Total token supplies storage +#[cfg(any(feature = "server", feature = "verify"))] +pub const TOTAL_TOKEN_SUPPLIES_STORAGE_KEY: &[u8; 1] = b"T"; + /// The path for all the credits in the system #[cfg(any(feature = "server", feature = "verify"))] pub fn total_credits_path() -> [&'static [u8]; 2] { @@ -57,6 +61,60 @@ pub fn total_credits_on_platform_path_query() -> PathQuery { } } +/// The path for the root of all token supplies +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_tokens_root_supply_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::Misc), + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY, + ] +} + +/// The path as a vec for the root of all token supplies +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_tokens_root_supply_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Misc as u8], + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY.to_vec(), + ] +} + +/// The path for the token supply for a given token +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_token_supply_path(token_id: &[u8; 32]) -> [&[u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Misc), + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY, + token_id, + ] +} + +/// The path as a vec for the token supply for a given token +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_token_supply_path_vec(token_id: [u8; 32]) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Misc as u8], + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY.to_vec(), + token_id.to_vec(), + ] +} + +/// A path query helper to get the total token supply for a given token on Platform +#[cfg(any(feature = "server", feature = "verify"))] +pub fn total_supply_for_token_on_platform_path_query(token_id: [u8; 32]) -> PathQuery { + PathQuery { + path: vec![ + vec![RootTree::Misc as u8], + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY.to_vec(), + ], + query: SizedQuery { + query: Query::new_single_key(token_id.to_vec()), + limit: Some(1), + offset: None, + }, + } +} + /// The path for the balances tree #[cfg(any(feature = "server", feature = "verify"))] pub(crate) fn balance_path() -> [&'static [u8]; 1] { diff --git a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs index 816b660e324..8a7289995e2 100644 --- a/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/apply/apply_contract_with_serialization/v0/mod.rs @@ -18,7 +18,7 @@ use dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersion use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::borrow::Cow; use std::collections::HashMap; @@ -99,7 +99,7 @@ impl Drive { DirectQueryType::StatefulDirectQuery } else { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, // we can ignore flags as this is just an approximation // and it's doubtful that contracts will always be inserted at max size query_target: QueryTargetValue( @@ -208,6 +208,7 @@ impl Drive { block_info, estimated_costs_only_with_layer_info, &mut drive_operations, + transaction, platform_version, )?; } diff --git a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs index ba04d65bc61..c1acab18020 100644 --- a/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/estimation_costs/add_estimation_costs_for_contract_insertion/v0/mod.rs @@ -16,9 +16,9 @@ use crate::util::type_constants::{DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U8}; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -61,7 +61,7 @@ impl Drive { ), ), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_INDEX_NAME_SIZE, @@ -80,7 +80,7 @@ impl Drive { document_type_name.as_str(), )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(0, true), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_INDEX_NAME_SIZE, @@ -103,7 +103,7 @@ impl Drive { contract.id_ref().as_bytes(), )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(AVERAGE_NUMBER_OF_UPDATES as u32), estimated_layer_sizes: Mix { subtrees_size: None, diff --git a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs index fa3a6fa1a88..0d40cd945e0 100644 --- a/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/get_fetch/fetch_contract/v0/mod.rs @@ -77,7 +77,7 @@ impl Drive { match value { Ok(Element::Item(stored_contract_bytes, element_flag)) => { let contract = cost_return_on_error_no_add!( - &cost, + cost, DataContract::versioned_deserialize( &stored_contract_bytes, false, @@ -88,7 +88,7 @@ impl Drive { let drive_operation = CalculatedCostOperation(cost.clone()); let fee = if let Some(epoch) = epoch { Some(cost_return_on_error_no_add!( - &cost, + cost, Drive::calculate_fee( None, Some(vec![drive_operation]), @@ -103,7 +103,7 @@ impl Drive { }; let storage_flags = cost_return_on_error_no_add!( - &cost, + cost, StorageFlags::map_some_element_flags_ref(&element_flag) .map_err(Error::StorageFlags) ); @@ -134,7 +134,7 @@ impl Drive { match value { Ok(Element::Item(stored_contract_bytes, element_flag)) => { let contract = cost_return_on_error_no_add!( - &cost, + cost, DataContract::versioned_deserialize( &stored_contract_bytes, false, @@ -145,7 +145,7 @@ impl Drive { let drive_operation = CalculatedCostOperation(cost.clone()); let fee = if let Some(epoch) = epoch { Some(cost_return_on_error_no_add!( - &cost, + cost, Drive::calculate_fee( None, Some(vec![drive_operation]), @@ -160,7 +160,7 @@ impl Drive { }; let storage_flags = cost_return_on_error_no_add!( - &cost, + cost, StorageFlags::map_some_element_flags_ref(&element_flag) .map_err(Error::StorageFlags) ); diff --git a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs index 8844fe39bcc..07e33e9be1f 100644 --- a/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/add_contract_to_storage/v0/mod.rs @@ -19,7 +19,7 @@ use dpp::version::drive_versions::DriveVersion; use grovedb::batch::key_info::KeyInfo; use grovedb::batch::KeyInfoPath; use grovedb::reference_path::ReferencePathType::SiblingReference; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -64,8 +64,8 @@ impl Drive { } else { let apply_type = if estimated_costs_only_with_layer_info.is_some() { BatchInsertTreeApplyType::StatelessBatchInsertTree { - is_sum_tree: false, - in_tree_using_sums: false, + tree_type: TreeType::NormalTree, + in_tree_type: TreeType::NormalTree, flags_len: storage_flags .as_ref() .map(|flags| flags.to_element_flags().len()) @@ -79,7 +79,7 @@ impl Drive { self.batch_insert_empty_tree_if_not_exists( key_info, - false, + TreeType::NormalTree, storage_flags.as_ref().map(|flags| flags.as_ref()), apply_type, transaction, diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/mod.rs index 8b39715cbb7..9d6eac54379 100644 --- a/packages/rs-drive/src/drive/contract/insert/insert_contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -51,9 +52,12 @@ impl Drive { 0 => { self.insert_contract_v0(contract, block_info, apply, transaction, platform_version) } + 1 => { + self.insert_contract_v1(contract, block_info, apply, transaction, platform_version) + } version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "insert_contract".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } @@ -86,6 +90,7 @@ impl Drive { HashMap<KeyInfoPath, EstimatedLayerInformation>, >, drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<(), Error> { match platform_version @@ -103,9 +108,18 @@ impl Drive { drive_operations, platform_version, ), + 1 => self.insert_contract_add_operations_v1( + contract_element, + contract, + block_info, + estimated_costs_only_with_layer_info, + drive_operations, + transaction, + platform_version, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "insert_contract_add_operations".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs index 207626f0641..635e315e86e 100644 --- a/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/v0/mod.rs @@ -145,7 +145,7 @@ impl Drive { /// The operations for adding a contract. /// These operations add a contract to storage using `add_contract_to_storage` /// and insert the empty trees which will be necessary to later insert documents. - fn insert_contract_operations_v0( + pub(in crate::drive::contract::insert::insert_contract) fn insert_contract_operations_v0( &self, contract_element: Element, contract: &DataContract, diff --git a/packages/rs-drive/src/drive/contract/insert/insert_contract/v1/mod.rs b/packages/rs-drive/src/drive/contract/insert/insert_contract/v1/mod.rs new file mode 100644 index 00000000000..93e6707a2c0 --- /dev/null +++ b/packages/rs-drive/src/drive/contract/insert/insert_contract/v1/mod.rs @@ -0,0 +1,312 @@ +use crate::drive::Drive; +use crate::util::storage_flags::StorageFlags; + +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::config::v0::DataContractConfigGettersV0; +use dpp::data_contract::DataContract; +use dpp::fee::fee_result::FeeResult; + +use crate::drive::balances::total_tokens_root_supply_path_vec; +use crate::drive::tokens::paths::{ + token_balances_path_vec, token_balances_root_path, token_identity_infos_root_path, +}; +use crate::error::contract::DataContractError; +use crate::util::object_size_info::DriveKeyInfo; +use crate::util::object_size_info::PathKeyElementInfo::PathKeyElement; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use dpp::serialization::PlatformSerializableWithPlatformVersion; +use dpp::version::PlatformVersion; +use dpp::ProtocolError; +use grovedb::batch::KeyInfoPath; +use grovedb::Element::SumItem; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Insert a contract. + #[inline(always)] + pub(super) fn insert_contract_v1( + &self, + contract: &DataContract, + block_info: BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + + let storage_flags = if contract.config().can_be_deleted() || !contract.config().readonly() { + Some(StorageFlags::new_single_epoch( + block_info.epoch.index, + Some(contract.owner_id().to_buffer()), + )) + } else { + None + }; + + let serialized_contract = + contract.serialize_to_bytes_with_platform_version(platform_version)?; + + if serialized_contract.len() as u64 > u32::MAX as u64 + || serialized_contract.len() as u32 + > platform_version.dpp.contract_versions.max_serialized_size + { + // This should normally be caught by DPP, but there is a rare possibility that the + // re-serialized size is bigger than the original serialized data contract. + return Err(Error::DataContract(DataContractError::ContractTooBig(format!("Trying to insert a data contract of size {} that is over the max allowed insertion size {}", serialized_contract.len(), platform_version.dpp.contract_versions.max_serialized_size)))); + } + + let contract_element = Element::Item( + serialized_contract, + StorageFlags::map_to_some_element_flags(storage_flags.as_ref()), + ); + + self.insert_contract_element_v1( + contract_element, + contract, + &block_info, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + ) + } + + /// Adds a contract to storage using `add_contract_to_storage` + /// and inserts the empty trees which will be necessary to later insert documents. + fn insert_contract_element_v1( + &self, + contract_element: Element, + contract: &DataContract, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + let batch_operations = self.insert_contract_operations_v1( + contract_element, + contract, + block_info, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + /// The operations for adding a contract. + /// These operations add a contract to storage using `add_contract_to_storage` + /// and insert the empty trees which will be necessary to later insert documents. + #[inline(always)] + pub(super) fn insert_contract_add_operations_v1( + &self, + contract_element: Element, + contract: &DataContract, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let batch_operations = self.insert_contract_operations_v1( + contract_element, + contract, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + drive_operations.extend(batch_operations); + Ok(()) + } + + /// The operations for adding a contract. + /// These operations add a contract to storage using `add_contract_to_storage` + /// and insert the empty trees which will be necessary to later insert documents. + fn insert_contract_operations_v1( + &self, + contract_element: Element, + contract: &DataContract, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut batch_operations: Vec<LowLevelDriveOperation> = self + .insert_contract_operations_v0( + contract_element, + contract, + block_info, + estimated_costs_only_with_layer_info, + platform_version, + )?; + + for (token_pos, token_config) in contract.tokens() { + let token_id = contract.token_id(*token_pos).ok_or(Error::DataContract( + DataContractError::CorruptedDataContract(format!( + "data contract has a token at position {}, but can not find it", + token_pos + )), + ))?; + + let token_id_bytes = token_id.to_buffer(); + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info + { + Drive::add_estimation_costs_for_token_balances( + token_id_bytes, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + Drive::add_estimation_costs_for_token_identity_infos( + token_id_bytes, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + Drive::add_estimation_costs_for_token_total_supply( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + self.batch_insert_empty_sum_tree( + token_balances_root_path(), + DriveKeyInfo::KeyRef(token_id_bytes.as_slice()), + None, + &mut batch_operations, + &platform_version.drive, + )?; + + self.batch_insert_empty_tree( + token_identity_infos_root_path(), + DriveKeyInfo::KeyRef(token_id_bytes.as_slice()), + None, + &mut batch_operations, + &platform_version.drive, + )?; + + if let Some(perpetual_distribution) = + token_config.distribution_rules().perpetual_distribution() + { + self.add_perpetual_distribution( + token_id.to_buffer(), + contract.owner_id().to_buffer(), + perpetual_distribution, + block_info, + estimated_costs_only_with_layer_info, + &mut batch_operations, + transaction, + platform_version, + )?; + } + + if let Some(pre_programmed_distribution) = token_config + .distribution_rules() + .pre_programmed_distribution() + { + self.add_pre_programmed_distributions( + token_id.to_buffer(), + contract.owner_id().to_buffer(), + pre_programmed_distribution, + block_info, + estimated_costs_only_with_layer_info, + &mut batch_operations, + transaction, + platform_version, + )?; + } + + let path_holding_total_token_supply = total_tokens_root_supply_path_vec(); + + if token_config.base_supply() > 0 { + // We have a base supply that needs to be distributed on contract creation + let destination_identity_id = token_config + .distribution_rules() + .new_tokens_destination_identity() + .copied() + .unwrap_or(contract.owner_id()); + let token_balance_path = token_balances_path_vec(token_id_bytes); + + if token_config.base_supply() > i64::MAX as u64 { + return Err( + ProtocolError::CriticalCorruptedCreditsCodeExecution(format!( + "Token base supply over i64 max, is {}", + token_config.base_supply() + )) + .into(), + ); + } + self.batch_insert::<0>( + PathKeyElement(( + token_balance_path, + destination_identity_id.to_vec(), + Element::new_sum_item(token_config.base_supply() as i64), + )), + &mut batch_operations, + &platform_version.drive, + )?; + self.batch_insert::<0>( + PathKeyElement(( + path_holding_total_token_supply, + token_id.to_vec(), + Element::new_sum_item(token_config.base_supply() as i64), + )), + &mut batch_operations, + &platform_version.drive, + )?; + } else { + self.batch_insert::<0>( + PathKeyElement(( + path_holding_total_token_supply, + token_id.to_vec(), + SumItem(0, None), + )), + &mut batch_operations, + &platform_version.drive, + )?; + } + } + + if !contract.groups().is_empty() { + batch_operations.extend(self.add_new_groups_operations( + contract.id(), + contract.groups(), + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + } + + Ok(batch_operations) + } +} diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs index 8d22fc40435..f9f682d74ac 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -64,9 +65,17 @@ impl Drive { platform_version, previous_fee_versions, ), + 1 => self.update_contract_v1( + contract, + block_info, + apply, + transaction, + platform_version, + previous_fee_versions, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_contract".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } @@ -125,9 +134,18 @@ impl Drive { drive_operations, platform_version, ), + 1 => self.update_contract_element_v1( + contract_element, + contract, + original_contract, + block_info, + transaction, + drive_operations, + platform_version, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_contract_element".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } @@ -192,9 +210,19 @@ impl Drive { drive_operations, platform_version, ), + 1 => self.update_contract_add_operations_v1( + contract_element, + contract, + original_contract, + block_info, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "update_contract_add_operations".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs index d95decc3f96..141749a2ffb 100644 --- a/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/contract/update/update_contract/v0/mod.rs @@ -19,7 +19,7 @@ use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::fee::default_costs::CachedEpochIndexFeeVersions; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::{HashMap, HashSet}; impl Drive { @@ -198,7 +198,7 @@ impl Drive { } /// operations for updating a contract. - fn update_contract_operations_v0( + pub(in crate::drive::contract::update::update_contract) fn update_contract_operations_v0( &self, contract_element: Element, contract: &DataContract, @@ -300,8 +300,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: element_flags .as_ref() .map(|e| e.len() as u32) @@ -317,7 +317,7 @@ impl Drive { if !index_cache.contains(index_bytes) { self.batch_insert_empty_tree_if_not_exists( PathFixedSizeKeyRef((type_path, index.name.as_bytes())), - false, + TreeType::NormalTree, storage_flags.as_ref().map(|flags| flags.as_ref()), apply_type, transaction, diff --git a/packages/rs-drive/src/drive/contract/update/update_contract/v1/mod.rs b/packages/rs-drive/src/drive/contract/update/update_contract/v1/mod.rs new file mode 100644 index 00000000000..ccd0cde5f1a --- /dev/null +++ b/packages/rs-drive/src/drive/contract/update/update_contract/v1/mod.rs @@ -0,0 +1,253 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::storage_flags::StorageFlags; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::config::v0::DataContractConfigGettersV0; +use dpp::data_contract::DataContract; +use dpp::fee::fee_result::FeeResult; + +use dpp::serialization::PlatformSerializableWithPlatformVersion; + +use crate::error::contract::DataContractError; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Updates a data contract. + /// + /// This function updates a given data contract in the storage. The fee for updating + /// the contract is also calculated and returned. + /// + /// # Arguments + /// + /// * `contract` - A reference to the `DataContract` to be updated. + /// * `block_info` - A `BlockInfo` object containing information about the block where + /// the contract is being updated. + /// * `apply` - A boolean indicating whether the contract update should be applied (`true`) or not (`false`). Passing `false` would only tell the fees but won't interact with the state. + /// * `transaction` - A `TransactionArg` object representing the transaction to be used + /// for updating the contract. + /// + /// # Returns + /// + /// * `Result<FeeResult, Error>` - If successful, returns a `FeeResult` representing the fee + /// for updating the contract. If an error occurs during the contract update or fee calculation, + /// returns an `Error`. + /// + /// # Errors + /// + /// This function returns an error if the contract update or fee calculation fails. + #[inline(always)] + pub(super) fn update_contract_v1( + &self, + contract: &DataContract, + block_info: BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, + ) -> Result<FeeResult, Error> { + if !apply { + return self.insert_contract( + contract, + block_info, + false, + transaction, + platform_version, + ); + } + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + + let contract_bytes = contract.serialize_to_bytes_with_platform_version(platform_version)?; + + // Since we can update the contract by definition it already has storage flags + let storage_flags = Some(StorageFlags::new_single_epoch( + block_info.epoch.index, + Some(contract.owner_id().to_buffer()), + )); + + let contract_element = Element::Item( + contract_bytes, + StorageFlags::map_to_some_element_flags(storage_flags.as_ref()), + ); + + let original_contract_fetch_info = self + .get_contract_with_fetch_info_and_add_to_operations( + contract.id().to_buffer(), + Some(&block_info.epoch), + true, + transaction, + &mut drive_operations, + platform_version, + )? + .ok_or(Error::Drive(DriveError::CorruptedCodeExecution( + "contract should exist", + )))?; + + if original_contract_fetch_info.contract.config().readonly() { + return Err(Error::Drive(DriveError::UpdatingReadOnlyImmutableContract( + "original contract is readonly", + ))); + } + + self.update_contract_element_v1( + contract_element, + contract, + &original_contract_fetch_info.contract, + &block_info, + transaction, + &mut drive_operations, + platform_version, + )?; + + // Update DataContracts cache with the new contract + let updated_contract_fetch_info = self + .fetch_contract_and_add_operations( + contract.id().to_buffer(), + Some(&block_info.epoch), + transaction, + &mut drive_operations, + platform_version, + )? + .ok_or(Error::Drive(DriveError::CorruptedCodeExecution( + "contract should exist", + )))?; + + self.cache + .data_contracts + .insert(updated_contract_fetch_info, transaction.is_some()); + + Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + previous_fee_versions, + ) + } + + /// Updates a contract. + #[inline(always)] + pub(super) fn update_contract_element_v1( + &self, + contract_element: Element, + contract: &DataContract, + original_contract: &DataContract, + block_info: &BlockInfo, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>>; + let batch_operations = self.update_contract_operations_v1( + contract_element, + contract, + original_contract, + block_info, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + /// Updates a contract. + #[inline(always)] + pub(super) fn update_contract_add_operations_v1( + &self, + contract_element: Element, + contract: &DataContract, + original_contract: &DataContract, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let batch_operations = self.update_contract_operations_v1( + contract_element, + contract, + original_contract, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + drive_operations.extend(batch_operations); + Ok(()) + } + + /// operations for updating a contract. + fn update_contract_operations_v1( + &self, + contract_element: Element, + contract: &DataContract, + original_contract: &DataContract, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut batch_operations: Vec<LowLevelDriveOperation> = self + .update_contract_operations_v0( + contract_element, + contract, + original_contract, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + for (token_pos, configuration) in contract.tokens() { + let token_id = contract.token_id(*token_pos).ok_or(Error::DataContract( + DataContractError::CorruptedDataContract(format!( + "data contract has a token at position {}, but can not find it", + token_pos + )), + ))?; + + batch_operations.extend(self.create_token_trees_operations( + token_id.to_buffer(), + configuration.start_as_paused(), + true, + &mut None, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + } + + if !contract.groups().is_empty() { + batch_operations.extend(self.add_new_groups_operations( + contract.id(), + contract.groups(), + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + } + + Ok(batch_operations) + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/mod.rs new file mode 100644 index 00000000000..51d7d325873 --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/mod.rs @@ -0,0 +1,56 @@ +mod v0; + +use grovedb::TransactionArg; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::block::epoch::Epoch; +use dpp::fee::Credits; + +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; + +impl Drive { + /// Adds to the amount of processing fees to be distributed for the Epoch. + /// + /// # Arguments + /// + /// * `epoch_tree` - A reference to the Epoch. + /// * `amount` - The amount to add. + /// * `transaction` - A TransactionArg instance. + /// * `platform_version` - A PlatformVersion instance representing the version of the drive. + /// + /// # Returns + /// + /// A Result containing either the processing fee for the epoch, if found, + /// or an Error if something goes wrong. + pub fn add_epoch_processing_credits_for_distribution_operation( + &self, + epoch: &Epoch, + amount: Credits, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<LowLevelDriveOperation, Error> { + match platform_version + .drive + .methods + .credit_pools + .epochs + .add_epoch_processing_credits_for_distribution_operation + { + 0 => self.add_epoch_processing_credits_for_distribution_operation_v0( + epoch, + amount, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_epoch_processing_credits_for_distribution_operation".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/v0/mod.rs new file mode 100644 index 00000000000..f163236b475 --- /dev/null +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/add_epoch_processing_credits_for_distribution_operation/v0/mod.rs @@ -0,0 +1,60 @@ +use grovedb::{Element, TransactionArg}; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use crate::drive::credit_pools::epochs::epoch_key_constants; +use crate::drive::credit_pools::epochs::paths::EpochProposers; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use dpp::block::epoch::Epoch; +use dpp::fee::Credits; +use dpp::ProtocolError; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Gets the amount of processing fees to be distributed for the Epoch and adds to it. + pub(super) fn add_epoch_processing_credits_for_distribution_operation_v0( + &self, + epoch: &Epoch, + amount: Credits, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<LowLevelDriveOperation, Error> { + let epoch_tree_path = epoch.get_path(); + let element = self.grove_get_raw_optional( + (&epoch_tree_path).into(), + epoch_key_constants::KEY_POOL_PROCESSING_FEES.as_slice(), + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )?; + + let existing_value = match element { + None => 0, + Some(Element::SumItem(existing_value, _)) => existing_value, + _ => { + return Err(Error::Drive(DriveError::UnexpectedElementType( + "epochs processing fee must be an item", + ))) + } + }; + + if amount > i64::MAX as u64 { + return Err(Error::Protocol(ProtocolError::Overflow( + "adding over i64::Max to processing fee pool", + ))); + } + + let updated_value = existing_value + .checked_add(amount as i64) + .ok_or(ProtocolError::Overflow("overflow when adding to sum item"))?; + Ok(LowLevelDriveOperation::insert_for_known_path_key_element( + epoch_tree_path.iter().map(|a| a.to_vec()).collect(), + epoch_key_constants::KEY_POOL_PROCESSING_FEES.to_vec(), + Element::new_sum_item(updated_value), + )) + } +} diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/mod.rs index 8e790b846bf..db40e29f00b 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/mod.rs @@ -26,7 +26,7 @@ impl Drive { /// or an Error if something goes wrong. pub fn get_epoch_processing_credits_for_distribution( &self, - epoch_tree: &Epoch, + epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<Credits, Error> { @@ -38,7 +38,7 @@ impl Drive { .get_epoch_processing_credits_for_distribution { 0 => self.get_epoch_processing_credits_for_distribution_v0( - epoch_tree, + epoch, transaction, platform_version, ), diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs index 05782b23b2b..ae0265d3930 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/get_epoch_processing_credits_for_distribution/v0/mod.rs @@ -15,14 +15,14 @@ impl Drive { /// Gets the amount of processing fees to be distributed for the Epoch. pub(super) fn get_epoch_processing_credits_for_distribution_v0( &self, - epoch_tree: &Epoch, + epoch: &Epoch, transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<Credits, Error> { let element = self .grove .get( - &epoch_tree.get_path(), + &epoch.get_path(), epoch_key_constants::KEY_POOL_PROCESSING_FEES.as_slice(), transaction, &platform_version.drive.grove_version, diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/mod.rs b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/mod.rs index f0a061ce024..2096f129060 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/credit_distribution_pools/mod.rs @@ -3,6 +3,7 @@ //! This module implements functions in Drive to distribute fees for a given Epoch. //! +mod add_epoch_processing_credits_for_distribution_operation; mod get_epoch_fee_multiplier; mod get_epoch_processing_credits_for_distribution; mod get_epoch_storage_credits_for_distribution; diff --git a/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs b/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs index 81248a8e5a6..b6ea2661eae 100644 --- a/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs +++ b/packages/rs-drive/src/drive/credit_pools/epochs/operations_factory.rs @@ -20,7 +20,7 @@ use dpp::fee::Credits; use dpp::util::deserializer::ProtocolVersion; use dpp::version::PlatformVersion; use grovedb::batch::QualifiedGroveDbOp; -use grovedb::{Element, TransactionArg}; +use grovedb::{Element, TransactionArg, TreeType}; /// Operations on Epochs pub trait EpochOperations { @@ -288,7 +288,11 @@ impl EpochOperations for Epoch { /// Returns a groveDB op which deletes the epoch proposers tree. fn delete_proposers_tree_operation(&self) -> QualifiedGroveDbOp { - QualifiedGroveDbOp::delete_tree_op(self.get_path_vec(), KEY_PROPOSERS.to_vec(), false) + QualifiedGroveDbOp::delete_tree_op( + self.get_path_vec(), + KEY_PROPOSERS.to_vec(), + TreeType::NormalTree, + ) } /// Adds a groveDB op to the batch which deletes the given epoch proposers from the proposers tree. @@ -421,7 +425,7 @@ mod tests { #[test] fn test_error_if_fee_pools_not_initialized() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); @@ -445,10 +449,9 @@ mod tests { #[test] fn test_values_are_set() { - let drive = setup_drive_with_initial_state_structure(None); - let transaction = drive.grove.start_transaction(); - let platform_version = PlatformVersion::first(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let transaction = drive.grove.start_transaction(); let epoch = Epoch::new(1042).unwrap(); @@ -480,10 +483,9 @@ mod tests { #[test] fn test_values_are_set() { - let drive = setup_drive_with_initial_state_structure(None); - let transaction = drive.grove.start_transaction(); - let platform_version = PlatformVersion::first(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + let transaction = drive.grove.start_transaction(); let epoch = Epoch::new(1042).unwrap(); diff --git a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs index ee90eec06c4..bf740821f00 100644 --- a/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/storage_fee_distribution_pool/get_storage_fees_from_distribution_pool/v0/mod.rs @@ -52,7 +52,7 @@ mod tests { #[test] fn test_error_if_epoch_is_not_initiated() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs index bcfdaf59b1b..def6c7f229d 100644 --- a/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs +++ b/packages/rs-drive/src/drive/credit_pools/unpaid_epoch/get_unpaid_epoch_index/v0/mod.rs @@ -57,7 +57,7 @@ mod tests { #[test] fn test_error_if_fee_pools_tree_is_not_initiated() { let platform_version = PlatformVersion::latest(); - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); let result = drive.get_unpaid_epoch_index_v0(Some(&transaction), platform_version); diff --git a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs index cec20f624ae..3f13cfcc6bb 100644 --- a/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/delete_document_for_contract_operations/v0/mod.rs @@ -1,6 +1,6 @@ use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use dpp::data_contract::document_type::DocumentTypeRef; @@ -83,7 +83,7 @@ impl Drive { &platform_version.drive, )?; DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue( document_type.estimated_size(platform_version)? as u32 ), diff --git a/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs index 2f2863cd4ac..ce3ca4d6e5b 100644 --- a/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/internal/add_estimation_costs_for_remove_document_to_primary_storage/v0/mod.rs @@ -1,8 +1,8 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllItems; +use grovedb::{EstimatedLayerInformation, TreeType}; use dpp::data_contract::document_type::DocumentTypeRef; @@ -67,7 +67,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(primary_key_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems( DEFAULT_HASH_SIZE_U8, diff --git a/packages/rs-drive/src/drive/document/delete/mod.rs b/packages/rs-drive/src/drive/document/delete/mod.rs index c2da69240b2..5a1d2ebbb2d 100644 --- a/packages/rs-drive/src/drive/document/delete/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/mod.rs @@ -69,6 +69,7 @@ mod tests { use crate::query::DriveDocumentQuery; use dpp::block::epoch::Epoch; use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::DataContract; use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; use dpp::document::Document; use dpp::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; @@ -86,10 +87,11 @@ mod tests { fn test_add_and_remove_family_one_document_no_transaction() { let tmp_dir = TempDir::new().unwrap(); - let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); - let platform_version = PlatformVersion::latest(); + let (drive, _) = Drive::open(tmp_dir, None, Some(platform_version)) + .expect("expected to open Drive successfully"); + drive .create_initial_state_structure(None, platform_version) .expect("expected to create root tree successfully"); @@ -99,6 +101,9 @@ mod tests { "tests/supporting_files/contract/family/family-contract-reduced.json", None, None, + None::<fn(&mut DataContract)>, + None, + None, ); let document_type = contract @@ -192,7 +197,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract-reduced.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -333,7 +341,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract-reduced.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -517,7 +528,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract-reduced.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -792,7 +806,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); @@ -892,7 +909,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract diff --git a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs index b3ea51c398a..07d0b4f5642 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_document_from_primary_storage/v0/mod.rs @@ -1,6 +1,6 @@ use grovedb::batch::KeyInfoPath; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, MaybeTree, TransactionArg, TreeType}; use dpp::data_contract::document_type::DocumentTypeRef; @@ -38,14 +38,14 @@ impl Drive { ) -> Result<(), Error> { let apply_type = if estimated_costs_only_with_layer_info.is_some() { StatelessBatchDelete { - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, estimated_key_size: DEFAULT_HASH_SIZE_U32, estimated_value_size: document_type.estimated_size(platform_version)? as u32, } } else { // we know we are not deleting a subtree StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), } }; self.batch_delete( diff --git a/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs index 6ad033a0f41..7ac28b84ec0 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_indices_for_index_level_for_contract_operations/v0/mod.rs @@ -2,7 +2,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::AllSubtrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use dpp::data_contract::document_type::IndexLevel; @@ -51,7 +51,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(sub_level_index_count + 1), estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -105,7 +105,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -116,7 +116,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( sub_level_index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, diff --git a/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs index 332e9214519..050982c266f 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_indices_for_top_index_level_for_contract_operations/v0/mod.rs @@ -2,7 +2,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::AllSubtrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use grovedb::EstimatedSumTrees::NoSumTrees; use std::collections::HashMap; @@ -69,7 +69,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(contract_document_type_path.clone()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(sub_level_index_count + 1), estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -107,7 +107,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -119,7 +119,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(index_path.clone()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, diff --git a/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs index 0ee9619ac03..171af548196 100644 --- a/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/delete/remove_reference_for_index_level_for_contract_operations/v0/mod.rs @@ -3,7 +3,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; use grovedb::EstimatedLayerSizes::{AllReference, AllSubtrees}; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, MaybeTree, TransactionArg, TreeType}; use dpp::data_contract::document_type::IndexLevelTypeInfo; use dpp::data_contract::document_type::IndexType::{ContestedResourceIndex, NonUniqueIndex}; @@ -64,7 +64,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( key_info_path.clone(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -83,7 +83,7 @@ impl Drive { ), &key_info_path, // we know we are not deleting a tree - Some((false, false)), + Some(MaybeTree::NotTree), estimated_costs_only_with_layer_info, platform_version, )?; @@ -112,7 +112,7 @@ impl Drive { ), &key_info_path, // we know we are not deleting a tree - Some((false, false)), + Some(MaybeTree::NotTree), estimated_costs_only_with_layer_info, platform_version, )?; diff --git a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_contested_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_contested_document_to_primary_storage/v0/mod.rs index 3de9414bc08..2bcaf9ccbc4 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_contested_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_contested_document_to_primary_storage/v0/mod.rs @@ -11,8 +11,8 @@ use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllItems; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; use std::collections::HashMap; @@ -77,7 +77,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(primary_key_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems( DEFAULT_HASH_SIZE_U8, diff --git a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs index a43d53d1bfc..9b5bb29ebde 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/add_estimation_costs_for_add_document_to_primary_storage/v0/mod.rs @@ -15,9 +15,9 @@ use dpp::document::DocumentV0Getters; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees, Mix}; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::util::type_constants::{ DEFAULT_FLOAT_SIZE, DEFAULT_FLOAT_SIZE_U8, DEFAULT_HASH_SIZE_U8, @@ -84,7 +84,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(primary_key_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -108,7 +108,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(document_id_in_primary_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(AVERAGE_NUMBER_OF_UPDATES as u32), estimated_layer_sizes: Mix { subtrees_size: None, @@ -137,7 +137,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(primary_key_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems( DEFAULT_HASH_SIZE_U8, diff --git a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/mod.rs index 4d8a852d845..d31bad5cf55 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/mod.rs @@ -1,6 +1,6 @@ mod v0; -use crate::util::grove_operations::{BatchDeleteUpTreeApplyType, IsSubTree, IsSumSubTree}; +use crate::util::grove_operations::BatchDeleteUpTreeApplyType; use crate::drive::Drive; @@ -10,7 +10,7 @@ use crate::error::drive::DriveError; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{EstimatedLayerInformation, EstimatedLayerSizes}; +use grovedb::{EstimatedLayerInformation, EstimatedLayerSizes, MaybeTree}; use std::collections::HashMap; @@ -39,7 +39,7 @@ impl Drive { pub(crate) fn stateless_delete_of_non_tree_for_costs( element_estimated_sizes: EstimatedLayerSizes, key_info_path: &KeyInfoPath, - is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + is_known_to_be_subtree_with_sum: Option<MaybeTree>, estimated_costs_only_with_layer_info: &mut Option< HashMap<KeyInfoPath, EstimatedLayerInformation>, >, diff --git a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs index 7d70f79819e..bcd8ac056f5 100644 --- a/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/estimation_costs/stateless_delete_of_non_tree_for_costs/v0/mod.rs @@ -1,6 +1,6 @@ use crate::drive::constants::CONTRACT_DOCUMENTS_PATH_HEIGHT; -use crate::util::grove_operations::{BatchDeleteUpTreeApplyType, IsSubTree, IsSumSubTree}; +use crate::util::grove_operations::BatchDeleteUpTreeApplyType; use crate::drive::Drive; use crate::error::fee::FeeError; @@ -8,7 +8,7 @@ use crate::error::Error; use grovedb::batch::KeyInfoPath; -use grovedb::{EstimatedLayerInformation, EstimatedLayerSizes}; +use grovedb::{EstimatedLayerInformation, EstimatedLayerSizes, MaybeTree}; use intmap::IntMap; use itertools::Itertools; use std::collections::HashMap; @@ -41,7 +41,7 @@ impl Drive { pub(super) fn stateless_delete_of_non_tree_for_costs_v0( element_estimated_sizes: EstimatedLayerSizes, key_info_path: &KeyInfoPath, - is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + is_known_to_be_subtree_with_sum: Option<MaybeTree>, estimated_costs_only_with_layer_info: &mut Option< HashMap<KeyInfoPath, EstimatedLayerInformation>, >, @@ -77,17 +77,17 @@ impl Drive { )), ))?; - Ok((s as u64, layer_info.clone())) + Ok((s, layer_info.clone())) }) - .collect::<Result<IntMap<EstimatedLayerInformation>, Error>>()?; + .collect::<Result<IntMap<u16, EstimatedLayerInformation>, Error>>()?; // We need to update the current layer to only have 1 element that we want to delete let mut last_layer_information = layer_map - .remove((key_info_path.len() - 1) as u64) + .remove((key_info_path.len() - 1) as u16) .ok_or(Error::Fee(FeeError::CorruptedEstimatedLayerInfoMissing( "last layer info missing".to_owned(), )))?; last_layer_information.estimated_layer_sizes = element_estimated_sizes; - layer_map.insert((key_info_path.len() - 1) as u64, last_layer_information); + layer_map.insert((key_info_path.len() - 1) as u16, last_layer_information); Ok(BatchDeleteUpTreeApplyType::StatelessBatchDelete { estimated_layer_info: layer_map, }) diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs index 0af032f910e..8ffb92bdcc7 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/mod.rs @@ -13,7 +13,7 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionAction; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs index 5f9c96d1ab5..33a1fdcc9de 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_create_transition_action_uniqueness/v0/mod.rs @@ -19,8 +19,8 @@ use dpp::document::property_names::{ }; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs index a4e3bc9d05c..75baec39ad8 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/mod.rs @@ -13,7 +13,7 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionAction; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs index a9673724cfc..05bee3b7e1e 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_purchase_transition_action_uniqueness/v0/mod.rs @@ -14,8 +14,8 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::document::DocumentV0Getters; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs index 4b16308fd41..05deb0d4877 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/mod.rs @@ -13,7 +13,7 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::DocumentReplaceTransitionAction; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs index 8930e78be5c..5dbea707624 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_replace_transition_action_uniqueness/v0/mod.rs @@ -13,8 +13,8 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs index b72f8d55ae2..16c272b5414 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/mod.rs @@ -13,7 +13,7 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::DocumentTransferTransitionAction; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs index a4a2551716c..638fcdd852a 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_transfer_transition_action_uniqueness/v0/mod.rs @@ -14,8 +14,8 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::document::DocumentV0Getters; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs index 6d412a95ab8..f60019f474f 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/mod.rs @@ -13,7 +13,7 @@ use dpp::validation::SimpleConsensusValidationResult; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::DocumentUpdatePriceTransitionAction; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs index 21b3d94564d..feb615a5046 100644 --- a/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/index_uniqueness/validate_document_update_price_transition_action_uniqueness/v0/mod.rs @@ -14,8 +14,8 @@ use dpp::validation::SimpleConsensusValidationResult; use dpp::document::DocumentV0Getters; use grovedb::TransactionArg; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; impl Drive { diff --git a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs index 1faf95a1dc2..f072477da87 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_for_contract_operations/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::data_contract::document_type::methods::DocumentTypeV0Methods; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -41,7 +41,7 @@ impl Drive { StatefulDirectQuery } else { StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue( document_and_contract_info .document_type diff --git a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs index f0ecde6e3ee..ea1ae0f2a7c 100644 --- a/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_document_to_primary_storage/v0/mod.rs @@ -5,7 +5,7 @@ use grovedb::batch::key_info::KeyInfo::KnownKey; use grovedb::batch::KeyInfoPath; use grovedb::reference_path::ReferencePathType::SiblingReference; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; use std::option::Option::None; @@ -125,8 +125,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -135,7 +135,7 @@ impl Drive { // we first insert an empty tree if the document is new self.batch_insert_empty_tree_if_not_exists( path_key_info, - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, @@ -425,7 +425,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, target: QueryTargetValue(document_type.estimated_size(platform_version)? as u32), } }; diff --git a/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs index 2725cc80b1c..06b6b816c48 100644 --- a/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_indices_for_index_level_for_contract_operations/v0/mod.rs @@ -14,7 +14,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::AllSubtrees; use grovedb::EstimatedSumTrees::NoSumTrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -62,7 +62,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(sub_level_index_count + 1), estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -77,8 +77,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -109,7 +109,7 @@ impl Drive { // here we are inserting an empty tree that will have a subtree of all other index properties self.batch_insert_empty_tree_if_not_exists( path_key_info.clone(), - false, + TreeType::NormalTree, *storage_flags, apply_type, transaction, @@ -125,7 +125,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -136,7 +136,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( sub_level_index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, @@ -157,7 +157,7 @@ impl Drive { // here we are inserting an empty tree that will have a subtree of all other index properties self.batch_insert_empty_tree_if_not_exists( path_key_info.clone(), - false, + TreeType::NormalTree, *storage_flags, apply_type, transaction, diff --git a/packages/rs-drive/src/drive/document/insert/add_indices_for_top_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_indices_for_top_index_level_for_contract_operations/v0/mod.rs index c21146a1832..e7d56f81d7e 100644 --- a/packages/rs-drive/src/drive/document/insert/add_indices_for_top_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_indices_for_top_index_level_for_contract_operations/v0/mod.rs @@ -20,7 +20,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::AllSubtrees; use grovedb::EstimatedSumTrees::NoSumTrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -70,7 +70,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(contract_document_type_path.clone()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(sub_level_index_count + 1), estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -85,8 +85,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -120,7 +120,7 @@ impl Drive { // here we are inserting an empty tree that will have a subtree of all other index properties self.batch_insert_empty_tree_if_not_exists( path_key_info.clone(), - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, @@ -134,7 +134,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -146,7 +146,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(index_path.clone()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, diff --git a/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs index 00d3f872cd4..c3744cbcdcb 100644 --- a/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/add_reference_for_index_level_for_contract_operations/v0/mod.rs @@ -23,7 +23,7 @@ use grovedb::batch::key_info::KeyInfo; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; use grovedb::EstimatedLayerSizes::AllReference; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -61,8 +61,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -75,7 +75,7 @@ impl Drive { // a contested resource index self.batch_insert_empty_tree_if_not_exists( path_key_info, - false, + TreeType::NormalTree, *storage_flags, apply_type, transaction, @@ -94,7 +94,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllReference( DEFAULT_HASH_SIZE_U8, @@ -194,7 +194,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, target: QueryTargetValue( document_reference_size(document_and_contract_info.document_type) + storage_flags diff --git a/packages/rs-drive/src/drive/document/insert/mod.rs b/packages/rs-drive/src/drive/document/insert/mod.rs index f0eb33b8a78..9b430e8a85b 100644 --- a/packages/rs-drive/src/drive/document/insert/mod.rs +++ b/packages/rs-drive/src/drive/document/insert/mod.rs @@ -51,11 +51,11 @@ mod tests { use once_cell::sync::Lazy; use std::collections::BTreeMap; - use dpp::block::epoch::Epoch; - use dpp::data_contract::accessors::v0::DataContractV0Getters; - use crate::util::object_size_info::DocumentInfo::DocumentRefInfo; use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::epoch::Epoch; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::DataContract; use dpp::fee::default_costs::KnownCostItem::StorageDiskUsageCreditPerByte; use dpp::fee::default_costs::{CachedEpochIndexFeeVersions, EpochCosts}; use dpp::fee::fee_result::FeeResult; @@ -165,7 +165,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -261,7 +264,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -315,91 +321,103 @@ mod tests { } #[test] - fn test_add_dashpay_profile_with_fee() { - let drive = setup_drive_with_initial_state_structure(None); + fn test_add_dashpay_profile_with_fee_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 1305 + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 900400, + ..Default::default() + }; + + do_test_add_dashpay_profile_with_fee(true, platform_version, expected_fee_result); + } - let db_transaction = drive.grove.start_transaction(); + #[test] + fn test_add_dashpay_profile_with_fee_first_version_estimated() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 1305 + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 73253660, + ..Default::default() + }; + + do_test_add_dashpay_profile_with_fee(false, platform_version, expected_fee_result); + } + #[test] + fn test_add_dashpay_profile_with_fee_latest_version_apply() { let platform_version = PlatformVersion::latest(); - - let contract = setup_contract( - &drive, - "tests/supporting_files/contract/dashpay/dashpay-contract.json", - None, - Some(&db_transaction), - ); - - let document_type = contract - .document_type_for_name("profile") - .expect("expected to get document type"); - - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); - - let dashpay_profile_document = json_document_to_document( - "tests/supporting_files/contract/dashpay/profile0.json", - Some(random_owner_id.into()), - document_type, - platform_version, - ) - .expect("expected to get cbor document"); - - let fee_result = drive - .add_document_for_contract( - DocumentAndContractInfo { - owned_document_info: OwnedDocumentInfo { - document_info: DocumentRefInfo(( - &dashpay_profile_document, - StorageFlags::optional_default_as_cow(), - )), - owner_id: Some(random_owner_id), - }, - contract: &contract, - document_type, - }, - false, - BlockInfo::default(), - true, - Some(&db_transaction), - platform_version, - None, - ) - .expect("expected to insert a document successfully"); - - assert_eq!( - fee_result, - FeeResult { - storage_fee: 1305 - * Epoch::new(0).unwrap().cost_for_known_cost_item( - &EPOCH_CHANGE_FEE_VERSION_TEST, - StorageDiskUsageCreditPerByte, - ), - processing_fee: 900400, - ..Default::default() - } - ); + let expected_fee_result = FeeResult { + storage_fee: 1305 + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 900400, + ..Default::default() + }; + + do_test_add_dashpay_profile_with_fee(true, platform_version, expected_fee_result); } #[test] - fn test_add_dashpay_profile_average_case_cost_fee() { + fn test_add_dashpay_profile_with_fee_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 1305 + * Epoch::new(0).unwrap().cost_for_known_cost_item( + &EPOCH_CHANGE_FEE_VERSION_TEST, + StorageDiskUsageCreditPerByte, + ), + processing_fee: 73253660, + ..Default::default() + }; + + do_test_add_dashpay_profile_with_fee(false, platform_version, expected_fee_result); + } + + /// This helper sets up the environment, adds a dashpay profile document, + /// and either applies or just estimates the cost. + /// + /// `apply`: if true, we commit the transaction (applying the changes). + /// if false, we do not commit, so changes are only estimated. + /// `platform_version`: which PlatformVersion to use. + /// `expected_fee_result`: the FeeResult we expect in the test assertion. + fn do_test_add_dashpay_profile_with_fee( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { let drive = setup_drive_with_initial_state_structure(None); let db_transaction = drive.grove.start_transaction(); - let platform_version = PlatformVersion::latest(); - + // Setup contract let contract = setup_contract( &drive, "tests/supporting_files/contract/dashpay/dashpay-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract .document_type_for_name("profile") .expect("expected to get document type"); - let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); + let random_owner_id = random::<[u8; 32]>(); + // Build dashpay profile doc let dashpay_profile_document = json_document_to_document( "tests/supporting_files/contract/dashpay/profile0.json", Some(random_owner_id.into()), @@ -408,12 +426,8 @@ mod tests { ) .expect("expected to get cbor document"); - let FeeResult { - storage_fee, - processing_fee, - fee_refunds: _, - removed_bytes_from_system: _, - } = drive + // Perform the add operation, with either an apply or a dry run + let fee_result = drive .add_document_for_contract( DocumentAndContractInfo { owned_document_info: OwnedDocumentInfo { @@ -426,22 +440,15 @@ mod tests { contract: &contract, document_type, }, - false, + false, // override BlockInfo::default(), - false, + apply, Some(&db_transaction), platform_version, None, ) .expect("expected to insert a document successfully"); - - let added_bytes = storage_fee - / Epoch::new(0).unwrap().cost_for_known_cost_item( - &EPOCH_CHANGE_FEE_VERSION_TEST, - StorageDiskUsageCreditPerByte, - ); - assert_eq!(1305, added_bytes); - assert_eq!(73253660, processing_fee); + assert_eq!(fee_result, expected_fee_result); } #[test] @@ -456,7 +463,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let random_owner_id = random::<[u8; 32]>(); @@ -532,7 +542,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract-all-mutable.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let random_owner_id = random::<[u8; 32]>(); @@ -625,7 +638,10 @@ mod tests { &drive, "tests/supporting_files/contract/dpns/dpns-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let random_owner_id = rand::thread_rng().gen::<[u8; 32]>(); diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_to_primary_storage/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_to_primary_storage/v0/mod.rs index 5df447b5ef5..5a18464be37 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_to_primary_storage/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_document_to_primary_storage/v0/mod.rs @@ -1,7 +1,7 @@ use grovedb::batch::key_info::KeyInfo; use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; @@ -203,7 +203,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, target: QueryTargetValue(document_type.estimated_size(platform_version)? as u32), } }; diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_contract_operations/v0/mod.rs index 1881419fdd2..9eed9dee870 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_contract_operations/v0/mod.rs @@ -23,7 +23,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::AllSubtrees; use grovedb::EstimatedSumTrees::NoSumTrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -74,8 +74,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -111,7 +111,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -123,7 +123,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, @@ -153,7 +153,7 @@ impl Drive { document_top_field .clone() .add_path_info(index_path_info.clone()), - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, @@ -187,7 +187,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(16), // very seldom would more than 16 people want the resource estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -200,7 +200,7 @@ impl Drive { self.batch_insert_empty_tree_if_not_exists( DriveKeyInfo::Key(owner_id.to_vec()).add_path_info(index_path_info.clone()), - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, @@ -212,7 +212,7 @@ impl Drive { let inserted_abstain = self.batch_insert_empty_tree_if_not_exists( DriveKeyInfo::Key(RESOURCE_ABSTAIN_VOTE_TREE_KEY_U8_32.to_vec()) .add_path_info(index_path_info.clone()), - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, @@ -224,7 +224,7 @@ impl Drive { let inserted_lock = self.batch_insert_empty_tree_if_not_exists( DriveKeyInfo::Key(RESOURCE_LOCK_VOTE_TREE_KEY_U8_32.to_vec()) .add_path_info(index_path_info.clone()), - false, + TreeType::NormalTree, storage_flags, apply_type, transaction, diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_index_level_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_index_level_for_contract_operations/v0/mod.rs index a989dd3997b..1ead80bba85 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_index_level_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_indices_for_index_level_for_contract_operations/v0/mod.rs @@ -60,7 +60,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(sub_level_index_count + 1), estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, @@ -76,7 +76,7 @@ impl Drive { } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { in_tree_using_sums: false, - is_sum_tree: false, + tree_type: TreeType::NormalTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -123,7 +123,7 @@ impl Drive { let document_top_field_estimated_size = document_and_contract_info .owned_document_info .document_info - .get_estimated_size_for_document_type(name, document_type)?; + .get_estimated_size_for_document_type(name, document_type, platform_version)?; if document_top_field_estimated_size > u8::MAX as u16 { return Err(Error::Fee(FeeError::Overflow( @@ -134,7 +134,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( sub_level_index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( document_top_field_estimated_size as u8, diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_reference_and_vote_subtree_to_document_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_reference_and_vote_subtree_to_document_operations/v0/mod.rs index 3bc068d4f11..cd4fa6ecd11 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_reference_and_vote_subtree_to_document_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_reference_and_vote_subtree_to_document_operations/v0/mod.rs @@ -21,7 +21,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::{AllItems, Mix}; use grovedb::EstimatedSumTrees::AllSumTrees; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -53,7 +53,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: Mix { // The votes don't have storage flags @@ -144,7 +144,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( votes_path_key_info.clone().convert_to_key_info_path()?, EstimatedLayerInformation { - is_sum_tree: true, + tree_type: TreeType::SumTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, U8_SIZE_U32, None), }, @@ -155,8 +155,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: true, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::SumTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -166,7 +166,7 @@ impl Drive { // here we are the tree that will contain the voting tree let inserted = self.batch_insert_empty_tree_if_not_exists( votes_path_key_info, - true, + TreeType::SumTree, storage_flags, apply_type, transaction, diff --git a/packages/rs-drive/src/drive/document/insert_contested/add_contested_vote_subtrees_for_non_identities_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/insert_contested/add_contested_vote_subtrees_for_non_identities_operations/v0/mod.rs index bb036014bd5..c6d8faedcbb 100644 --- a/packages/rs-drive/src/drive/document/insert_contested/add_contested_vote_subtrees_for_non_identities_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/insert_contested/add_contested_vote_subtrees_for_non_identities_operations/v0/mod.rs @@ -12,7 +12,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; use grovedb::EstimatedLayerSizes::{AllItems, Mix}; use grovedb::EstimatedSumTrees::AllSumTrees; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -43,7 +43,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( index_path_info.clone().convert_to_key_info_path(), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(1), estimated_layer_sizes: Mix { // The votes don't have storage flags @@ -71,7 +71,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( votes_path_key_info.clone().convert_to_key_info_path()?, EstimatedLayerInformation { - is_sum_tree: true, + tree_type: TreeType::SumTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, U8_SIZE_U32, None), }, @@ -82,8 +82,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: true, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::SumTree, flags_len: storage_flags .map(|s| s.serialized_size()) .unwrap_or_default(), @@ -93,7 +93,7 @@ impl Drive { // here we are the tree that will contain the voting tree let inserted = self.batch_insert_empty_tree_if_not_exists( votes_path_key_info.clone(), - true, + TreeType::SumTree, storage_flags, apply_type, transaction, diff --git a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs index 0c92a15651f..5a6a14e759e 100644 --- a/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/document/update/internal/update_document_for_contract_operations/v0/mod.rs @@ -34,7 +34,7 @@ use dpp::version::PlatformVersion; use grovedb::batch::key_info::KeyInfo; use grovedb::batch::key_info::KeyInfo::KnownKey; use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, MaybeTree, TransactionArg, TreeType}; use std::borrow::Cow; use std::collections::{HashMap, HashSet}; @@ -227,7 +227,7 @@ impl Drive { index_path.clone(), document_top_field.as_slice(), )), - false, + TreeType::NormalTree, storage_flags, BatchInsertTreeApplyType::StatefulBatchInsertTree, transaction, @@ -300,7 +300,7 @@ impl Drive { index_path.clone(), index_property.name.as_bytes(), )), - false, + TreeType::NormalTree, storage_flags, BatchInsertTreeApplyType::StatefulBatchInsertTree, transaction, @@ -332,7 +332,7 @@ impl Drive { index_path.clone(), document_index_field.as_slice(), )), - false, + TreeType::NormalTree, storage_flags, BatchInsertTreeApplyType::StatefulBatchInsertTree, transaction, @@ -380,7 +380,7 @@ impl Drive { document.id().as_slice(), Some(CONTRACT_DOCUMENTS_PATH_HEIGHT), BatchDeleteUpTreeApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, previous_batch_operations, @@ -394,7 +394,7 @@ impl Drive { &[0], Some(CONTRACT_DOCUMENTS_PATH_HEIGHT), BatchDeleteUpTreeApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, previous_batch_operations, @@ -409,7 +409,7 @@ impl Drive { // here we are inserting an empty tree that will have a subtree of all other index properties self.batch_insert_empty_tree_if_not_exists( PathKeyInfo::PathKeyRef::<0>((index_path.clone(), &[0])), - false, + TreeType::NormalTree, storage_flags, BatchInsertTreeApplyType::StatefulBatchInsertTree, transaction, diff --git a/packages/rs-drive/src/drive/document/update/mod.rs b/packages/rs-drive/src/drive/document/update/mod.rs index fccb43e3e84..478921f994e 100644 --- a/packages/rs-drive/src/drive/document/update/mod.rs +++ b/packages/rs-drive/src/drive/document/update/mod.rs @@ -684,7 +684,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -773,7 +776,10 @@ mod tests { &drive, "tests/supporting_files/contract/dashpay/dashpay-contract-with-profile-history.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -846,7 +852,7 @@ mod tests { let platform_version = PlatformVersion::latest(); - let drive: Drive = setup_drive(Some(config)); + let drive: Drive = setup_drive(Some(config), None); let transaction = if using_transaction { Some(drive.grove.start_transaction()) @@ -865,7 +871,15 @@ mod tests { }; // setup code - let contract = setup_contract(&drive, path, None, transaction.as_ref()); + let contract = setup_contract( + &drive, + path, + None, + None, + None::<fn(&mut DataContract)>, + transaction.as_ref(), + None, + ); let id = Identifier::from([1u8; 32]); let owner_id = Identifier::from([2u8; 32]); @@ -1141,7 +1155,7 @@ mod tests { let platform_version = PlatformVersion::latest(); - let drive: Drive = setup_drive(Some(config)); + let drive: Drive = setup_drive(Some(config), None); let transaction = if using_transaction { Some(drive.grove.start_transaction()) @@ -1160,7 +1174,15 @@ mod tests { }; // setup code - let contract = setup_contract(&drive, path, None, transaction.as_ref()); + let contract = setup_contract( + &drive, + path, + None, + None, + None::<fn(&mut DataContract)>, + transaction.as_ref(), + None, + ); let id = Identifier::from([1u8; 32]); let owner_id = Identifier::from([2u8; 32]); @@ -1340,7 +1362,7 @@ mod tests { let platform_version = PlatformVersion::latest(); - let drive: Drive = setup_drive(Some(config)); + let drive: Drive = setup_drive(Some(config), None); let transaction = if using_transaction { Some(drive.grove.start_transaction()) @@ -1359,7 +1381,15 @@ mod tests { }; // setup code - let contract = setup_contract(&drive, path, None, transaction.as_ref()); + let contract = setup_contract( + &drive, + path, + None, + None, + None::<fn(&mut DataContract)>, + transaction.as_ref(), + None, + ); let id = Identifier::from([1u8; 32]); let owner_id = Identifier::from([2u8; 32]); @@ -1675,7 +1705,7 @@ mod tests { let platform_version = PlatformVersion::latest(); - let drive: Drive = setup_drive(Some(config)); + let drive: Drive = setup_drive(Some(config), None); let transaction = if using_transaction { Some(drive.grove.start_transaction()) @@ -1694,7 +1724,15 @@ mod tests { }; // setup code - let contract = setup_contract(&drive, path, None, transaction.as_ref()); + let contract = setup_contract( + &drive, + path, + None, + None, + None::<fn(&mut DataContract)>, + transaction.as_ref(), + None, + ); let person_0_original = Person { id: Identifier::from([0u8; 32]), diff --git a/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/mod.rs b/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/mod.rs new file mode 100644 index 00000000000..efef30d2dfe --- /dev/null +++ b/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/mod.rs @@ -0,0 +1,79 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::data_contract::GroupContractPosition; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for adding a group action based on the specified contract and version. + /// + /// This function selects the appropriate version of cost estimation for adding a group action, depending on the + /// `drive_version` provided. It then delegates the cost estimation to the relevant method for that version. + /// + /// Currently, it supports version `0` which uses the `add_estimation_costs_for_add_group_action_v0` method to estimate + /// the computational costs associated with adding a group action. If an unsupported version is passed in the `drive_version`, + /// the function will return an error indicating a version mismatch. + /// + /// # Parameters + /// + /// - `contract_id`: The unique identifier of the contract for which the group action is being added. + /// This is used to form paths and calculate relevant costs. + /// - `group_contract_position`: The position of the group contract within the system, influencing the paths used for cost estimation. + /// - `action_id`: An optional identifier for the specific action being added. If provided, the estimation for this action and its signers is included. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a `HashMap` where the estimated costs for updating + /// the group action and its associated data will be stored. The keys in the map represent paths to the trees, + /// and the values represent the estimated computational costs for those trees. + /// - `drive_version`: The version of the drive being used. It determines which method to use for cost estimation. + /// This is a versioned API, so different versions may have different cost estimation methods. + /// + /// # Return Value + /// + /// - Returns `Ok(())` if the version of the `drive_version` matches the supported versions and the estimation is successfully added. + /// - Returns an error (`Error::Drive(DriveError::UnknownVersionMismatch)`) if the version is not supported. + /// + /// # Logic Breakdown + /// + /// - **Version Selection**: The function first checks the version provided in `drive_version`. If the version is `0`, + /// it uses the `add_estimation_costs_for_add_group_action_v0` method for cost estimation. + /// - **Version Mismatch**: If the version does not match the supported versions, an error is returned with details + /// about the expected versions and the received version. + /// + /// # Errors + /// + /// - `Error::Drive(DriveError::UnknownVersionMismatch)` will be returned if the `drive_version` does not match the + /// known versions supported for this method (currently only version `0`). + pub(crate) fn add_estimation_costs_for_add_group_action( + contract_id: [u8; 32], + group_contract_position: GroupContractPosition, + action_id: Option<[u8; 32]>, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .group + .cost_estimation + .for_add_group_action + { + 0 => { + Self::add_estimation_costs_for_add_group_action_v0( + contract_id, + group_contract_position, + action_id, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_add_group_action".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/v0/mod.rs b/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/v0/mod.rs new file mode 100644 index 00000000000..6a9a63b68e3 --- /dev/null +++ b/packages/rs-drive/src/drive/group/estimated_costs/for_add_group_action/v0/mod.rs @@ -0,0 +1,173 @@ +use crate::drive::Drive; + +use crate::drive::group::paths::{ + group_action_path, group_action_signers_path, group_active_action_root_path, + group_contract_path, group_path, group_root_path, +}; +use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; +use dpp::data_contract::GroupContractPosition; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::EstimatedLevel; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees, Mix}; +use grovedb::EstimatedSumTrees::{AllSumTrees, NoSumTrees, SomeSumTrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// Adds estimated costs for the layer information of group action updates in a contract. + /// + /// This function updates the `estimated_costs_only_with_layer_info` map with the layer information for + /// the trees involved in adding or updating a group action in the context of a contract. The trees are + /// organized hierarchically based on their role in the system, such as "Group Actions", "Withdrawal Transactions", + /// "Balances", and "Contract/Documents". This estimation is used to determine the computational costs associated + /// with updating these trees, considering whether they are sum trees or normal trees and their expected layer counts. + /// + /// The function breaks down the tree layers and their corresponding costs as follows: + /// 1. **Group Actions Tree**: A normal tree that holds information about group actions in the contract. + /// 2. **Withdrawal Transactions Tree**: A normal tree that holds withdrawal transaction data. + /// 3. **Balances Tree**: A sum tree that holds balance information, which is crucial for cost estimation. + /// 4. **Contract/Documents Tree**: A normal tree that holds contract and document-related data. + /// + /// Each tree's cost is estimated based on its depth and whether it's a sum tree or not. The function inserts the + /// estimated layer information for each relevant tree in the `estimated_costs_only_with_layer_info` map, where + /// the key represents the path to the specific tree and the value represents its estimated layer information. + /// + /// # Parameters + /// + /// - `contract_id`: The unique identifier of the contract being updated. Used to construct paths for the trees. + /// - `group_contract_position`: The position of the group contract in the system, used to further specify paths. + /// - `action_id`: An optional identifier for the specific action being added. If provided, additional paths for + /// the action and its associated signers will be included. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a `HashMap` where the estimated layer information + /// will be inserted. The keys represent paths to the trees, and the values represent their estimated layer information. + /// + /// # Logic Breakdown + /// + /// - **Top Layer (Contract/Documents)**: The contract and documents tree is at the top level, with a weight of 2. + /// - **Balance Tree (Sum Tree)**: The balance tree is a sum tree with a weight of 1. + /// - **Withdrawal Transactions**: This tree is a normal tree, and it is expected to have a weight of 2. + /// - **Group Action Tree**: The group action tree is also a normal tree, with an expected weight of 2. + /// - **Additional Layer Costs**: For specific paths related to actions, signers, etc., further estimations are added with + /// appropriate layer counts and subtree size estimations. + /// + /// The function constructs the paths based on the contract ID, group contract position, and action ID (if provided). + /// It then populates the `estimated_costs_only_with_layer_info` map with the estimated costs for each relevant tree + /// involved in the group action update. + + pub(super) fn add_estimation_costs_for_add_group_action_v0( + contract_id: [u8; 32], + group_contract_position: GroupContractPosition, + action_id: Option<[u8; 32]>, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // DataContract_Documents 64 + // / \ + // Identities 32 Balances 96 + // / \ / \ + // Token_Balances 16 Pools 48 WithdrawalTransactions 80 Votes 112 + // / \ / \ / \ / \ + // NUPKH->I 8 UPKH->I 24 PreFundedSpecializedBalances 40 Masternode Lists 56 (reserved) SpentAssetLockTransactions 72 GroupActions 88 Misc 104 Versions 120 + + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 3 (level 2 on left then left) + // updating will mean we will update: + // 1 normal tree (group actions) + // 1 normal tree (withdrawal transactions) + // 1 sum tree (balances) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(3, false), + estimated_layer_sizes: AllSubtrees( + 1, + SomeSumTrees { + sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, + non_sum_trees_weight: 2, + }, + None, + ), + }, + ); + + // there is one tree for the root path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // We estimate that on average we need to update 10 nodes + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_contract_path(contract_id.as_slice())), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllSubtrees(2, NoSumTrees, None), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_path( + contract_id.as_slice(), + &group_contract_position.to_be_bytes(), + )), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_active_action_root_path( + contract_id.as_slice(), + &group_contract_position.to_be_bytes(), + )), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + if let Some(action_id) = action_id { + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_action_path( + contract_id.as_slice(), + &group_contract_position.to_be_bytes(), + action_id.as_slice(), + )), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: Mix { + subtrees_size: Some((1, AllSumTrees, None, 1)), + items_size: Some((1, 8, Some(36), 1)), + references_size: None, + }, + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_action_signers_path( + contract_id.as_slice(), + &group_contract_position.to_be_bytes(), + action_id.as_slice(), + )), + EstimatedLayerInformation { + tree_type: TreeType::SumTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllItems(8, 1, None), + }, + ); + } + } +} diff --git a/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/mod.rs b/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/mod.rs new file mode 100644 index 00000000000..4c11fd514c9 --- /dev/null +++ b/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/mod.rs @@ -0,0 +1,74 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::{BTreeMap, HashMap}; + +impl Drive { + /// Adds estimated costs for the layer information of group updates in a contract. + /// + /// This function updates the `estimated_costs_only_with_layer_info` map with the layer information for + /// the trees involved in adding or updating a group action in the context of a contract. The trees are + /// organized hierarchically based on their role in the system, such as "Group Actions", "Withdrawal Transactions", + /// "Balances", and "Contract/Documents". This estimation is used to determine the computational costs associated + /// with updating these trees, considering whether they are sum trees or normal trees and their expected layer counts. + /// + /// The function breaks down the tree layers and their corresponding costs as follows: + /// 1. **Group Actions Tree**: A normal tree that holds information about group actions in the contract. + /// 2. **Withdrawal Transactions Tree**: A normal tree that holds withdrawal transaction data. + /// 3. **Balances Tree**: A sum tree that holds balance information, which is crucial for cost estimation. + /// 4. **Contract/Documents Tree**: A normal tree that holds contract and document-related data. + /// + /// Each tree's cost is estimated based on its depth and whether it's a sum tree or not. The function inserts the + /// estimated layer information for each relevant tree in the `estimated_costs_only_with_layer_info` map, where + /// the key represents the path to the specific tree and the value represents its estimated layer information. + /// + /// # Parameters + /// + /// - `contract_id`: The unique identifier of the contract being updated. Used to construct paths for the trees. + /// - `groups`: The groups that we will insert. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a `HashMap` where the estimated layer information + /// will be inserted. The keys represent paths to the trees, and the values represent their estimated layer information. + /// + /// # Logic Breakdown + /// + /// - **Top Layer (Contract/Documents)**: The contract and documents tree is at the top level, with a weight of 2. + /// - **Balance Tree (Sum Tree)**: The balance tree is a sum tree with a weight of 1. + /// - **Withdrawal Transactions**: This tree is a normal tree, and it is expected to have a weight of 2. + /// - **Group Action Tree**: The group action tree is also a normal tree, with an expected weight of 2. + /// - **Additional Layer Costs**: For specific paths related to actions, signers, etc., further estimations are added with + /// appropriate layer counts and subtree size estimations. + /// + /// The function constructs the paths based on the contract ID, group contract position, and action ID (if provided). + /// It then populates the `estimated_costs_only_with_layer_info` map with the estimated costs for each relevant tree + /// involved in the group action update. + + pub(crate) fn add_estimation_costs_for_add_groups( + contract_id: [u8; 32], + groups: &BTreeMap<GroupContractPosition, Group>, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version.methods.group.cost_estimation.for_add_group { + 0 => { + Self::add_estimation_costs_for_add_groups_v0( + contract_id, + groups, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_add_group".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/v0/mod.rs b/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/v0/mod.rs new file mode 100644 index 00000000000..b87806d4ab9 --- /dev/null +++ b/packages/rs-drive/src/drive/group/estimated_costs/for_add_groups/v0/mod.rs @@ -0,0 +1,88 @@ +use crate::drive::Drive; + +use crate::drive::group::paths::{group_contract_path, group_path, group_root_path}; +use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::EstimatedLevel; +use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; +use std::collections::{BTreeMap, HashMap}; + +impl Drive { + pub(super) fn add_estimation_costs_for_add_groups_v0( + contract_id: [u8; 32], + groups: &BTreeMap<GroupContractPosition, Group>, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // DataContract_Documents 64 + // / \ + // Identities 32 Balances 96 + // / \ / \ + // Token_Balances 16 Pools 48 WithdrawalTransactions 80 Votes 112 + // / \ / \ / \ / \ + // NUPKH->I 8 UPKH->I 24 PreFundedSpecializedBalances 40 Masternode Lists 56 (reserved) SpentAssetLockTransactions 72 GroupActions 88 Misc 104 Versions 120 + + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 3 (level 2 on left then left) + // updating will mean we will update: + // 1 normal tree (group actions) + // 1 normal tree (withdrawal transactions) + // 1 sum tree (balances) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(3, false), + estimated_layer_sizes: AllSubtrees( + 1, + SomeSumTrees { + sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, + non_sum_trees_weight: 2, + }, + None, + ), + }, + ); + + // there is one tree for the root path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // We estimate that on average we need to update 10 nodes + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_contract_path(contract_id.as_slice())), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllSubtrees(2, NoSumTrees, None), + }, + ); + + for group_contract_position in groups.keys() { + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(group_path( + contract_id.as_slice(), + &group_contract_position.to_be_bytes(), + )), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + } + } +} diff --git a/packages/rs-drive/src/drive/group/estimated_costs/mod.rs b/packages/rs-drive/src/drive/group/estimated_costs/mod.rs new file mode 100644 index 00000000000..95370133750 --- /dev/null +++ b/packages/rs-drive/src/drive/group/estimated_costs/mod.rs @@ -0,0 +1,2 @@ +mod for_add_group_action; +mod for_add_groups; diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/mod.rs new file mode 100644 index 00000000000..1aa5d30a107 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/mod.rs @@ -0,0 +1,118 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::GroupContractPosition; +use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Fetches if an identity has already signed in an action + pub fn fetch_action_id_has_signer( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<bool, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_has_signer + { + 0 => self.fetch_action_id_has_signer_v0( + contract_id, + group_contract_position, + action_id, + signer_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_has_signer".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + /// Fetches if an identity has already signed in an action with costs + + pub fn fetch_action_id_has_signer_with_costs( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(bool, FeeResult), Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_has_signer + { + 0 => self.fetch_action_id_has_signer_with_costs_v0( + contract_id, + group_contract_position, + action_id, + signer_id, + block_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_has_signer_with_costs".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + pub(crate) fn fetch_action_id_has_signer_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + estimate_costs_only: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<bool, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_has_signer + { + 0 => self.fetch_action_id_has_signer_and_add_operations_v0( + contract_id, + group_contract_position, + action_id, + signer_id, + estimate_costs_only, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_has_signer_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/v0/mod.rs new file mode 100644 index 00000000000..de19a8cc86b --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_has_signer/v0/mod.rs @@ -0,0 +1,165 @@ +use crate::drive::group::paths::group_action_signers_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::GroupContractPosition; +use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::{TransactionArg, TreeType}; + +impl Drive { + /// v0 implementation of fetching the signers' power for a given action ID within a group contract. + /// + /// This function retrieves the signers' power associated with a specific action ID in a group contract. + /// It constructs the appropriate GroveDB path, fetches the relevant data, deserializes it, and + /// calculates any applicable fees based on the provided epoch. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `apply` - A boolean flag indicating whether to apply certain operations during the fetch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_has_signer_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<bool, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_signers_path( + contract_id.as_slice(), + &group_contract_position_bytes, + action_id.as_slice(), + ); + + let value = self.grove_has_raw( + (&path).into(), + signer_id.as_slice(), + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )?; + + Ok(value) + } + + /// Fetches the Identity's balance from the backing store + /// Passing apply as false get the estimated cost instead + pub(super) fn fetch_action_id_has_signer_with_costs_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(bool, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_action_id_has_signer_and_add_operations_v0( + contract_id, + group_contract_position, + action_id, + signer_id, + false, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + Ok((value, fees)) + } + + /// v0 implementation of fetching the signers' power for a given action ID within a group contract and adding related operations. + /// + /// This function not only fetches the signers' power but also appends necessary low-level drive operations based on the provided epoch. + /// It ensures that fees are calculated and added to the `drive_operations` vector when applicable. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `epoch` - An optional reference to an `Epoch` object. If provided, fees will be calculated based on the epoch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `drive_operations` - A mutable reference to a vector where low-level drive operations and fees will be appended. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::Drive(DriveError::NotSupportedPrivate)` if stateful batch insertions are attempted. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_has_signer_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + signer_id: Identifier, + estimate_costs_only: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<bool, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_signers_path( + contract_id.as_slice(), + &group_contract_position_bytes, + action_id.as_slice(), + ); + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimate_costs_only { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::SumTree, + query_target: QueryTargetValue(8), + } + } else { + DirectQueryType::StatefulDirectQuery + }; + + let value = self.grove_has_raw( + (&path).into(), + signer_id.as_slice(), + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + + Ok(value) + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/mod.rs new file mode 100644 index 00000000000..515c1d0e4a4 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/mod.rs @@ -0,0 +1,120 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Fetches the serialized `GroupAction` for the given action ID and group contract position. + /// + /// This function retrieves the serialized bytes of the `GroupAction` associated with a specific + /// action ID and group contract position from the GroveDB. The method selects the appropriate version + /// of `fetch_action_id_info_keep_serialized` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_id`: The identifier of the action whose serialized `GroupAction` is being fetched. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Vec<u8>)`: The serialized `GroupAction` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn fetch_action_id_info_keep_serialized( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_info_keep_serialized + { + 0 => self.fetch_action_id_info_keep_serialized_v0( + contract_id, + group_contract_position, + action_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_info_keep_serialized".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the serialized `GroupAction` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `fetch_action_id_info_keep_serialized`, but also adds operations to the drive for state changes + /// or queries. Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_id`: The identifier of the action whose serialized `GroupAction` is being fetched. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to an optional `HashMap` containing + /// layer information used for cost estimation. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Vec<u8>)`: The serialized `GroupAction` for the specified action ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn fetch_action_id_info_keep_serialized_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_info_keep_serialized + { + 0 => self.fetch_action_id_info_keep_serialized_and_add_operations_v0( + contract_id, + group_contract_position, + action_id, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_signers_keep_serialized_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/v0/mod.rs new file mode 100644 index 00000000000..504ade4fa56 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_info_keep_serialized/v0/mod.rs @@ -0,0 +1,132 @@ +use std::collections::HashMap; + +use crate::drive::group::paths::{group_action_path, ACTION_INFO_KEY}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; + +impl Drive { + /// v0 implementation of fetching the signers' power for a given action ID within a group contract. + /// + /// This function retrieves the signers' power associated with a specific action ID in a group contract. + /// It constructs the appropriate GroveDB path, fetches the relevant data, deserializes it, and + /// calculates any applicable fees based on the provided epoch. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `apply` - A boolean flag indicating whether to apply certain operations during the fetch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_info_keep_serialized_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + let value = self.grove_get_raw_item( + (&path).into(), + ACTION_INFO_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )?; + + Ok(value) + } + + /// v0 implementation of fetching the signers' power for a given action ID within a group contract and adding related operations. + /// + /// This function not only fetches the signers' power but also appends necessary low-level drive operations based on the provided epoch. + /// It ensures that fees are calculated and added to the `drive_operations` vector when applicable. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `epoch` - An optional reference to an `Epoch` object. If provided, fees will be calculated based on the epoch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `drive_operations` - A mutable reference to a vector where low-level drive operations and fees will be appended. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::Drive(DriveError::NotSupportedPrivate)` if stateful batch insertions are attempted. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_info_keep_serialized_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let value = self.grove_get_raw_item( + (&path).into(), + ACTION_INFO_KEY, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + + Ok(value) + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/mod.rs new file mode 100644 index 00000000000..12684997430 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/mod.rs @@ -0,0 +1,78 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::GroupSumPower; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Fetches the action id signers power + pub fn fetch_action_id_signers_power( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<GroupSumPower>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_signers_power + { + 0 => self.fetch_action_id_signers_power_v0( + contract_id, + group_contract_position, + action_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_signers_power".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + pub(crate) fn fetch_action_id_signers_power_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimate_costs_only: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<GroupSumPower>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_id_signers_power + { + 0 => self.fetch_action_id_signers_power_and_add_operations_v0( + contract_id, + group_contract_position, + action_id, + estimate_costs_only, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_id_signers_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/v0/mod.rs new file mode 100644 index 00000000000..dfd611757e8 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_id_signers_power/v0/mod.rs @@ -0,0 +1,132 @@ +use crate::drive::group::paths::{group_action_path, ACTION_SIGNERS_KEY}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::data_contract::group::GroupSumPower; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::{TransactionArg, TreeType}; + +impl Drive { + /// v0 implementation of fetching the signers' power for a given action ID within a group contract. + /// + /// This function retrieves the signers' power associated with a specific action ID in a group contract. + /// It constructs the appropriate GroveDB path, fetches the relevant data, deserializes it, and + /// calculates any applicable fees based on the provided epoch. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `apply` - A boolean flag indicating whether to apply certain operations during the fetch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_signers_power_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<GroupSumPower>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + let value = self + .grove_get_optional_sum_tree_total_value( + (&path).into(), + ACTION_SIGNERS_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )? + .map(|v| v as GroupSumPower); + + Ok(value) + } + + /// v0 implementation of fetching the signers' power for a given action ID within a group contract and adding related operations. + /// + /// This function not only fetches the signers' power but also appends necessary low-level drive operations based on the provided epoch. + /// It ensures that fees are calculated and added to the `drive_operations` vector when applicable. + /// + /// # Parameters + /// * `contract_id` - The identifier of the contract. + /// * `group_contract_position` - The position of the group contract within the data contract. + /// * `action_id` - The identifier of the action whose signers' power is to be fetched. + /// * `epoch` - An optional reference to an `Epoch` object. If provided, fees will be calculated based on the epoch. + /// * `transaction` - The GroveDB transaction argument for executing the fetch operation. + /// * `drive_operations` - A mutable reference to a vector where low-level drive operations and fees will be appended. + /// * `platform_version` - The current platform version, used to ensure compatibility. + /// + /// # Returns + /// * `Ok(Some(Arc<DataContractFetchInfo>))` if the signers' power is successfully fetched. + /// * `Ok(None)` if the signers' power does not exist. + /// * `Err(Error)` if an error occurs during the fetch operation. + /// + /// # Errors + /// * `Error::Drive(DriveError::CorruptedContractPath)` if the fetched path does not refer to a valid sum item. + /// * `Error::Drive(DriveError::CorruptedCodeExecution)` if the element type is unexpected. + /// * `Error::Drive(DriveError::NotSupportedPrivate)` if stateful batch insertions are attempted. + /// * `Error::GroveDB` for any underlying GroveDB errors. + pub(super) fn fetch_action_id_signers_power_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimate_costs_only: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<GroupSumPower>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimate_costs_only { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + } else { + DirectQueryType::StatefulDirectQuery + }; + + let value = self + .grove_get_optional_sum_tree_total_value( + (&path).into(), + ACTION_SIGNERS_KEY, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )? + .map(|v| v as GroupSumPower); + + Ok(value) + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/mod.rs new file mode 100644 index 00000000000..6b02d74e94a --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/mod.rs @@ -0,0 +1,128 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; + +impl Drive { + /// Fetches the `GroupAction` for the given action ID and group contract position. + /// + /// This function queries the GroveDB to fetch `GroupAction`s associated with a specific + /// group contract position and `action_status`. The method selects the appropriate version of + /// `fetch_action_infos` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_status`: The status of the group actions to fetch. + /// - `start_action_id`: An optional starting action ID and inclusion flag. + /// - `limit`: An optional limit on the number of group actions to fetch. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(GroupAction)`: The `GroupAction` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn fetch_action_infos( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupAction>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_infos + { + 0 => self.fetch_action_infos_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the `GroupAction` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `fetch_action_infos` but also adds operations to the drive for state changes or queries. + /// It fetches `GroupAction`s based on the specified `action_status`. Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_status`: The status of the group actions to fetch. + /// - `start_action_id`: An optional starting action ID and inclusion flag. + /// - `limit`: An optional limit on the number of group actions to fetch. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(GroupAction)`: The `GroupAction` for the specified action ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn fetch_action_infos_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupAction>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_infos + { + 0 => self.fetch_action_infos_and_add_operations_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_infos_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/v0/mod.rs new file mode 100644 index 00000000000..d8086476af9 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_infos/v0/mod.rs @@ -0,0 +1,86 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::serialization::PlatformDeserializable; +use dpp::version::PlatformVersion; +use grovedb::query_result_type::QueryResultType; +use grovedb::Element::Item; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_action_infos_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupAction>, Error> { + self.fetch_action_infos_and_add_operations_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_action_infos_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupAction>, Error> { + let path_query = Drive::group_action_infos_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + start_action_id.map(|(s, i)| (s.to_buffer(), i)), + limit, + ); + + self.grove_get_raw_path_query( + &path_query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + drive_operations, + &platform_version.drive, + )? + .0 + .to_path_key_elements() + .into_iter() + .map(|(path, _, element)| { + let Some(last_path_component) = path.last() else { + return Err(Error::Drive(DriveError::CorruptedDriveState( + "we should always have a path not be empty".to_string(), + ))); + }; + let action_id = Identifier::from_bytes(last_path_component)?; + + match element { + Item(value, ..) => Ok((action_id, GroupAction::deserialize_from_bytes(&value)?)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "element should be an item representing the group action".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/mod.rs new file mode 100644 index 00000000000..0556350c6e3 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/mod.rs @@ -0,0 +1,133 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; + +impl Drive { + /// Fetches the signers and their respective powers for a specific action in a group. + /// + /// This method retrieves the list of signers for an action associated with a given contract, + /// group, and action status. It selects the appropriate version of the method based on the + /// provided platform version. + /// + /// # Arguments + /// + /// * `contract_id` - The identifier of the contract associated with the action. + /// * `group_contract_position` - The position of the group within the contract. + /// * `action_status` - The status of the action (e.g., active or closed). + /// * `action_id` - The identifier of the action for which to fetch signers. + /// * `transaction` - An optional transaction argument for database operations. + /// * `platform_version` - The platform version to determine which method version to call. + /// + /// # Returns + /// + /// A `Result` containing a `BTreeMap` where the keys are the signer identifiers and the values + /// are their respective powers, or an `Error` if the operation fails. + /// + /// # Errors + /// + /// This method returns an `Error` if: + /// * The platform version is unknown. + /// * An internal issue occurs during the fetching process. + pub fn fetch_action_signers( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupMemberPower>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_signers + { + 0 => self.fetch_action_signers_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_signers".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the signers and their respective powers for a specific action and adds the + /// associated operations for database queries. + /// + /// This method extends the functionality of `fetch_action_signers` by including additional + /// database operations that can be executed as part of a larger transaction. The appropriate + /// version of the method is selected based on the provided platform version. + /// + /// # Arguments + /// + /// * `contract_id` - The identifier of the contract associated with the action. + /// * `group_contract_position` - The position of the group within the contract. + /// * `action_status` - The status of the action (e.g., active or closed). + /// * `action_id` - The identifier of the action for which to fetch signers. + /// * `transaction` - An optional transaction argument for database operations. + /// * `drive_operations` - A mutable vector to which low-level database operations will be added. + /// * `platform_version` - The platform version to determine which method version to call. + /// + /// # Returns + /// + /// A `Result` containing a `BTreeMap` where the keys are the signer identifiers and the values + /// are their respective powers, or an `Error` if the operation fails. + /// + /// # Errors + /// + /// This method returns an `Error` if: + /// * The platform version is unknown. + /// * An internal issue occurs during the fetching process. + pub(crate) fn fetch_action_signers_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupMemberPower>, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_action_signers + { + 0 => self.fetch_action_signers_and_add_operations_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_action_signers_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/v0/mod.rs new file mode 100644 index 00000000000..864a6fff3ed --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_action_signers/v0/mod.rs @@ -0,0 +1,78 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::query_result_type::QueryResultType; +use grovedb::Element::SumItem; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_action_signers_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupMemberPower>, Error> { + self.fetch_action_signers_and_add_operations_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_action_signers_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, GroupMemberPower>, Error> { + let path_query = Drive::group_action_signers_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + action_id.to_buffer(), + ); + + self.grove_get_raw_path_query( + &path_query, + transaction, + QueryResultType::QueryKeyElementPairResultType, + drive_operations, + &platform_version.drive, + )? + .0 + .to_key_elements_btree_map() + .into_iter() + .map(|(key, element)| match element { + SumItem(value, ..) => Ok(( + key.try_into()?, + value.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "signed power should be encodable on a u32 integer".to_string(), + )) + })?, + )), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "element should be a sum item representing member signed power".to_string(), + ))), + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/mod.rs new file mode 100644 index 00000000000..7f99fad7f5a --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/mod.rs @@ -0,0 +1,121 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::identifier::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Fetches the `GroupAction` for the given action ID and group contract position. + /// + /// This function queries the GroveDB to fetch the `GroupAction` associated with a specific + /// group contract position and action ID. The method selects the appropriate version of + /// `fetch_action_id_info` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_id`: The identifier of the action whose `GroupAction` is being fetched. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(GroupAction)`: The `GroupAction` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn fetch_active_action_info( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<GroupAction, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_active_action_info + { + 0 => self.fetch_active_action_info_v0( + contract_id, + group_contract_position, + action_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_active_action_info".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the `GroupAction` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `fetch_action_id_info` but also adds operations to the drive for state changes or queries. + /// Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `action_id`: The identifier of the action whose `GroupAction` is being fetched. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to an optional `HashMap` containing + /// layer information used for cost estimation. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(GroupAction)`: The `GroupAction` for the specified action ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn fetch_active_action_info_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<GroupAction, Error> { + match platform_version + .drive + .methods + .group + .fetch + .fetch_active_action_info + { + 0 => self.fetch_active_action_info_and_add_operations_v0( + contract_id, + group_contract_position, + action_id, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_active_action_info_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/v0/mod.rs new file mode 100644 index 00000000000..1e807d289e4 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_active_action_info/v0/mod.rs @@ -0,0 +1,91 @@ +use std::collections::HashMap; + +use crate::drive::group::paths::{group_action_path, ACTION_INFO_KEY}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformDeserializable; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; + +impl Drive { + pub(super) fn fetch_active_action_info_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<GroupAction, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + let value = self.grove_get_raw_item( + (&path).into(), + ACTION_INFO_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )?; + + let group_action = GroupAction::deserialize_from_bytes(&value)?; + + Ok(group_action) + } + + pub(super) fn fetch_active_action_info_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<GroupAction, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_action_path( + contract_id.as_ref(), + &group_contract_position_bytes, + action_id.as_ref(), + ); + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let value = self.grove_get_raw_item( + (&path).into(), + ACTION_INFO_KEY, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + + let group_action = GroupAction::deserialize_from_bytes(&value)?; + + Ok(group_action) + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_group_info/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_group_info/mod.rs new file mode 100644 index 00000000000..b67a145b526 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_group_info/mod.rs @@ -0,0 +1,103 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Fetches the `Group` for the given contract and group contract position. + /// + /// This function queries the GroveDB to fetch the `Group` associated with a specific contract + /// and group contract position. The method selects the appropriate version of + /// `fetch_group_info` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn fetch_group_info( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<Group>, Error> { + match platform_version.drive.methods.group.fetch.fetch_group_info { + 0 => self.fetch_group_info_v0( + contract_id, + group_contract_position, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_group_info".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the `Group` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `fetch_group_info` but also adds operations to the drive for state changes or queries. + /// Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to an optional `HashMap` containing + /// layer information used for cost estimation. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified contract ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn fetch_group_info_and_add_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<Group>, Error> { + match platform_version.drive.methods.group.fetch.fetch_group_info { + 0 => self.fetch_group_info_and_add_operations_v0( + contract_id, + group_contract_position, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_group_info_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_group_info/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_group_info/v0/mod.rs new file mode 100644 index 00000000000..312a6c4be7d --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_group_info/v0/mod.rs @@ -0,0 +1,83 @@ +use std::collections::HashMap; + +use crate::drive::group::paths::{group_path, GROUP_INFO_KEY}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformDeserializable; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; + +impl Drive { + pub(super) fn fetch_group_info_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<Group>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_path(contract_id.as_ref(), &group_contract_position_bytes); + + let maybe_group = self + .grove_get_raw_optional_item( + (&path).into(), + GROUP_INFO_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut vec![], + &platform_version.drive, + )? + .map(|value| Group::deserialize_from_bytes(&value)) + .transpose()?; + + Ok(maybe_group) + } + + pub(super) fn fetch_group_info_and_add_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<Group>, Error> { + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + // Construct the GroveDB path for the action signers + let path = group_path(contract_id.as_ref(), &group_contract_position_bytes); + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let maybe_group = self + .grove_get_raw_optional_item( + (&path).into(), + GROUP_INFO_KEY, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )? + .map(|value| Group::deserialize_from_bytes(&value)) + .transpose()?; + + Ok(maybe_group) + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/mod.rs new file mode 100644 index 00000000000..b05c9a24a3d --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/mod.rs @@ -0,0 +1,99 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +mod v0; +impl Drive { + /// Fetches the `Group` for the given contract. + /// + /// This function queries the GroveDB to fetch the potentially many `Group`s associated with a + /// specific contract. The method selects the appropriate version of + /// `fetch_group_infos` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn fetch_group_infos( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<GroupContractPosition, Group>, Error> { + match platform_version.drive.methods.group.fetch.fetch_group_infos { + 0 => self.fetch_group_infos_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_group_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the `Group` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `fetch_group_info` but also adds operations to the drive for state changes or queries. + /// Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified contract ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn fetch_group_infos_operations( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<GroupContractPosition, Group>, Error> { + match platform_version.drive.methods.group.fetch.fetch_group_infos { + 0 => self.fetch_group_infos_operations_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_group_infos_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/v0/mod.rs b/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/v0/mod.rs new file mode 100644 index 00000000000..f4b42fded44 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/fetch_group_infos/v0/mod.rs @@ -0,0 +1,79 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::serialization::PlatformDeserializable; +use dpp::version::PlatformVersion; +use grovedb::query_result_type::QueryResultType; +use grovedb::Element::Item; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_group_infos_v0( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<GroupContractPosition, Group>, Error> { + self.fetch_group_infos_operations_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_group_infos_operations_v0( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<GroupContractPosition, Group>, Error> { + let path_query = Self::group_infos_for_contract_id_query( + contract_id.to_buffer(), + start_group_contract_position, + limit, + ); + + self.grove_get_raw_path_query( + &path_query, + transaction, + QueryResultType::QueryKeyElementPairResultType, + drive_operations, + &platform_version.drive, + )? + .0 + .to_key_elements_btree_map() + .into_iter() + .map(|(key, element)| { + let group_contract_position: GroupContractPosition = + GroupContractPosition::from_be_bytes(key.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "group contract position not encoded on 2 bytes as expected".to_string(), + )) + })?); + match element { + Item(value, ..) => Ok(( + group_contract_position, + Group::deserialize_from_bytes(&value)?, + )), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for infos should contain only items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/group/fetch/mod.rs b/packages/rs-drive/src/drive/group/fetch/mod.rs new file mode 100644 index 00000000000..473e9dfa488 --- /dev/null +++ b/packages/rs-drive/src/drive/group/fetch/mod.rs @@ -0,0 +1,8 @@ +mod fetch_action_id_has_signer; +mod fetch_action_id_info_keep_serialized; +mod fetch_action_id_signers_power; +mod fetch_action_infos; +mod fetch_action_signers; +mod fetch_active_action_info; +mod fetch_group_info; +mod fetch_group_infos; diff --git a/packages/rs-drive/src/drive/group/insert/add_group_action/mod.rs b/packages/rs-drive/src/drive/group/insert/add_group_action/mod.rs new file mode 100644 index 00000000000..adfbb1c6434 --- /dev/null +++ b/packages/rs-drive/src/drive/group/insert/add_group_action/mod.rs @@ -0,0 +1,128 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; + +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::prelude::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Adds an action to the state + pub fn add_group_action( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.group.insert.add_group_action { + 0 => self.add_group_action_v0( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_group_action".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds action creation operations to drive operations + pub fn add_group_action_add_to_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.group.insert.add_group_action { + 0 => self.add_group_action_add_to_operations_v0( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_group_action_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// The operations needed to create a new group action + pub fn add_group_action_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.group.insert.add_new_groups { + 0 => self.add_group_action_operations_v0( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_new_group_action_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/insert/add_group_action/v0/mod.rs b/packages/rs-drive/src/drive/group/insert/add_group_action/v0/mod.rs new file mode 100644 index 00000000000..f7d1dea6d4e --- /dev/null +++ b/packages/rs-drive/src/drive/group/insert/add_group_action/v0/mod.rs @@ -0,0 +1,244 @@ +use crate::drive::group::paths::{ + group_action_path, group_action_signers_path_vec, group_active_action_root_path, + ACTION_INFO_KEY, ACTION_SIGNERS_KEY, +}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::{BatchInsertApplyType, BatchInsertTreeApplyType, QueryTarget}; +use crate::util::object_size_info::PathKeyInfo::PathFixedSizeKeyRef; +use crate::util::object_size_info::{DriveKeyInfo, PathKeyElementInfo}; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::fee::fee_result::FeeResult; +use dpp::group::group_action::GroupAction; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformSerializable; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::element::SumValue; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use grovedb_epoch_based_storage_flags::StorageFlags; +use std::collections::HashMap; + +impl Drive { + pub(super) fn add_group_action_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + self.add_group_action_add_to_operations_v0( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + Ok(fees) + } + + /// Adds group creation operations to drive operations + pub(super) fn add_group_action_add_to_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + + let batch_operations = self.add_group_action_operations( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + /// The operations needed to create a group + pub(super) fn add_group_action_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + initialize_with_insert_action_info: Option<GroupAction>, + action_id: Identifier, + signer_identity_id: Identifier, + signer_power: GroupMemberPower, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut batch_operations: Vec<LowLevelDriveOperation> = vec![]; + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Drive::add_estimation_costs_for_add_group_action( + contract_id.to_buffer(), + group_contract_position, + Some(action_id.to_buffer()), + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let group_contract_position_bytes = group_contract_position.to_be_bytes().to_vec(); + let group_action_root_path = group_active_action_root_path( + contract_id.as_slice(), + group_contract_position_bytes.as_slice(), + ); + let apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, + flags_len: 0, + } + }; + + let storage_flags = Some(StorageFlags::new_single_epoch( + block_info.epoch.index, + Some(signer_identity_id.to_buffer()), + )); + + let element_flags = StorageFlags::map_to_some_element_flags(storage_flags.as_ref()); + + let mut inserted_root_action = false; + + if let Some(initialize_with_insert_action_info) = initialize_with_insert_action_info { + // We insert the contract root into the group tree + inserted_root_action = self.batch_insert_empty_tree_if_not_exists( + PathFixedSizeKeyRef((group_action_root_path, action_id.as_slice())), + TreeType::NormalTree, + None, + apply_type, + transaction, + &mut None, + &mut batch_operations, + &platform_version.drive, + )?; + + if inserted_root_action { + let group_action_path = group_action_path( + contract_id.as_slice(), + group_contract_position_bytes.as_slice(), + action_id.as_slice(), + ); + + self.batch_insert_empty_sum_tree( + group_action_path, + DriveKeyInfo::KeyRef(ACTION_SIGNERS_KEY), + None, + &mut batch_operations, + &platform_version.drive, + )?; + + let serialized = initialize_with_insert_action_info.serialize_consume_to_bytes()?; + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<5>(( + group_action_path, + ACTION_INFO_KEY, + Element::Item(serialized, element_flags.clone()), + )), + &mut batch_operations, + &platform_version.drive, + )?; + } + } + + let signers_path = group_action_signers_path_vec( + contract_id.as_slice(), + group_contract_position, + action_id.as_slice(), + ); + + let signer_apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertApplyType::StatefulBatchInsert + } else { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_type: TreeType::SumTree, + target: QueryTarget::QueryTargetValue(8), + } + }; + + if inserted_root_action { + self.batch_insert( + PathKeyElementInfo::PathKeyElement::<0>(( + signers_path, + signer_identity_id.to_vec(), + Element::SumItem(signer_power as SumValue, element_flags), + )), + &mut batch_operations, + &platform_version.drive, + )?; + } else { + // we should verify it doesn't yet exist + self.batch_insert_sum_item_if_not_exists( + PathKeyElementInfo::PathKeyElement::<0>(( + signers_path, + signer_identity_id.to_vec(), + Element::SumItem(signer_power as SumValue, element_flags), + )), + true, + signer_apply_type, + transaction, + &mut batch_operations, + &platform_version.drive, + )?; + } + + Ok(batch_operations) + } +} diff --git a/packages/rs-drive/src/drive/group/insert/add_new_groups/mod.rs b/packages/rs-drive/src/drive/group/insert/add_new_groups/mod.rs new file mode 100644 index 00000000000..a5fe50e5458 --- /dev/null +++ b/packages/rs-drive/src/drive/group/insert/add_new_groups/mod.rs @@ -0,0 +1,99 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; + +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::prelude::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::{BTreeMap, HashMap}; + +mod v0; + +impl Drive { + /// Adds groups to the state. + pub fn add_new_groups( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.group.insert.add_new_groups { + 0 => self.add_new_groups_v0( + contract_id, + groups, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_new_groups".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds groups creation operations to drive operations + pub fn add_new_groups_add_to_operations( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.group.insert.add_new_groups { + 0 => self.add_new_groups_add_to_operations_v0( + contract_id, + groups, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_new_groups_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// The operations needed to create groups + pub fn add_new_groups_operations( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.group.insert.add_new_groups { + 0 => self.add_new_groups_operations_v0( + contract_id, + groups, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_new_groups_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/insert/add_new_groups/v0/mod.rs b/packages/rs-drive/src/drive/group/insert/add_new_groups/v0/mod.rs new file mode 100644 index 00000000000..7838be39bdd --- /dev/null +++ b/packages/rs-drive/src/drive/group/insert/add_new_groups/v0/mod.rs @@ -0,0 +1,226 @@ +use crate::drive::group::paths::{ + group_contract_path, group_path, group_root_path, GROUP_ACTIVE_ACTIONS_KEY, + GROUP_CLOSED_ACTIONS_KEY, GROUP_INFO_KEY, +}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::BatchInsertTreeApplyType; +use crate::util::object_size_info::PathKeyInfo::{PathFixedSizeKey, PathFixedSizeKeyRef}; +use crate::util::object_size_info::{DriveKeyInfo, PathKeyElementInfo}; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformSerializable; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::{BTreeMap, HashMap}; + +impl Drive { + /// Adds a group by inserting a new group subtree structure to the `Identities` subtree. + pub(super) fn add_new_groups_v0( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + self.add_new_groups_add_to_operations_v0( + contract_id, + groups, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + Ok(fees) + } + + /// Adds group creation operations to drive operations + pub(super) fn add_new_groups_add_to_operations_v0( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + + let batch_operations = self.add_new_groups_operations( + contract_id, + groups, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + /// The operations needed to create a group + pub(super) fn add_new_groups_operations_v0( + &self, + contract_id: Identifier, + groups: &BTreeMap<GroupContractPosition, Group>, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Drive::add_estimation_costs_for_add_groups( + contract_id.to_buffer(), + groups, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let mut batch_operations: Vec<LowLevelDriveOperation> = vec![]; + + let group_tree_path = group_root_path(); + + let apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, + flags_len: 0, + } + }; + + // We insert the contract root into the group tree + let inserted = self.batch_insert_empty_tree_if_not_exists( + PathFixedSizeKey((group_tree_path, contract_id.to_vec())), + TreeType::NormalTree, + None, + apply_type, + transaction, + &mut None, + &mut batch_operations, + &platform_version.drive, + )?; + + if inserted { + for (group_pos, group) in groups { + let group_pos_bytes = group_pos.to_be_bytes().to_vec(); + let path = group_contract_path(contract_id.as_slice()); + self.batch_insert_empty_tree( + path, + DriveKeyInfo::Key(group_pos_bytes.clone()), + None, + &mut batch_operations, + &platform_version.drive, + )?; + let group_path = group_path(contract_id.as_slice(), group_pos_bytes.as_slice()); + + let serialized_group_info = group.serialize_to_bytes()?; + let info_item = Element::Item(serialized_group_info, None); + + self.batch_insert_empty_tree( + group_path, + DriveKeyInfo::KeyRef(GROUP_ACTIVE_ACTIONS_KEY), + None, + &mut batch_operations, + &platform_version.drive, + )?; + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<3>(( + group_path, + GROUP_INFO_KEY, + info_item, + )), + &mut batch_operations, + &platform_version.drive, + )?; + + self.batch_insert_empty_tree( + group_path, + DriveKeyInfo::KeyRef(GROUP_CLOSED_ACTIONS_KEY), + None, + &mut batch_operations, + &platform_version.drive, + )?; + } + } else { + for (group_pos, group) in groups { + let group_pos_bytes = group_pos.to_be_bytes().to_vec(); + let path = group_contract_path(contract_id.as_slice()); + let inserted = self.batch_insert_empty_tree_if_not_exists( + PathFixedSizeKeyRef((path, group_pos_bytes.as_slice())), + TreeType::NormalTree, + None, + apply_type, + transaction, + &mut None, + &mut batch_operations, + &platform_version.drive, + )?; + + if inserted { + let group_path = group_path(contract_id.as_slice(), group_pos_bytes.as_slice()); + + let serialized_group_info = group.serialize_to_bytes()?; + let info_item = Element::Item(serialized_group_info, None); + + self.batch_insert_empty_tree( + group_path, + DriveKeyInfo::KeyRef(GROUP_ACTIVE_ACTIONS_KEY), + None, + &mut batch_operations, + &platform_version.drive, + )?; + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<3>(( + group_path, + GROUP_INFO_KEY, + info_item, + )), + &mut batch_operations, + &platform_version.drive, + )?; + + self.batch_insert_empty_tree( + group_path, + DriveKeyInfo::KeyRef(GROUP_CLOSED_ACTIONS_KEY), + None, + &mut batch_operations, + &platform_version.drive, + )?; + } + } + } + + Ok(batch_operations) + } +} diff --git a/packages/rs-drive/src/drive/group/insert/mod.rs b/packages/rs-drive/src/drive/group/insert/mod.rs new file mode 100644 index 00000000000..344133883d6 --- /dev/null +++ b/packages/rs-drive/src/drive/group/insert/mod.rs @@ -0,0 +1,2 @@ +mod add_group_action; +mod add_new_groups; diff --git a/packages/rs-drive/src/drive/group/mod.rs b/packages/rs-drive/src/drive/group/mod.rs new file mode 100644 index 00000000000..156fc42f0cf --- /dev/null +++ b/packages/rs-drive/src/drive/group/mod.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "server")] +mod estimated_costs; +#[cfg(feature = "server")] +mod fetch; +#[cfg(feature = "server")] +mod insert; +/// Group paths +pub mod paths; +#[cfg(feature = "server")] +mod prove; +mod queries; diff --git a/packages/rs-drive/src/drive/group/paths.rs b/packages/rs-drive/src/drive/group/paths.rs new file mode 100644 index 00000000000..b4cbe648714 --- /dev/null +++ b/packages/rs-drive/src/drive/group/paths.rs @@ -0,0 +1,256 @@ +use crate::drive::RootTree; +use dpp::data_contract::GroupContractPosition; + +// We should have +// GROUP_ACTIVE_ACTIONS_TREE +// / \ +// GROUP_INFO GROUP_CLOSED_ACTIONS_TREE + +/// The key used to identify the group information in storage. +pub const GROUP_INFO_KEY: &[u8; 1] = b"I"; +/// The key used to identify the group actions in storage. +pub const GROUP_ACTIVE_ACTIONS_KEY: &[u8; 1] = b"M"; +/// The key used to identify the group actions in storage. +pub const GROUP_CLOSED_ACTIONS_KEY: &[u8; 1] = b"X"; +/// The key used to identify the action information in storage. +pub const ACTION_INFO_KEY: &[u8; 1] = b"I"; +/// The key used to identify the action signers in storage. +pub const ACTION_SIGNERS_KEY: &[u8; 1] = b"S"; + +/// Group root path + +pub fn group_root_path() -> [&'static [u8]; 1] { + [Into::<&[u8; 1]>::into(RootTree::GroupActions)] +} + +/// Group root path vector + +pub fn group_root_path_vec() -> Vec<Vec<u8>> { + vec![vec![RootTree::GroupActions as u8]] +} + +/// Group path + +pub fn group_contract_path(contract_id: &[u8]) -> [&[u8]; 2] { + [Into::<&[u8; 1]>::into(RootTree::GroupActions), contract_id] +} + +/// Group path vector + +pub fn group_contract_path_vec(contract_id: &[u8]) -> Vec<Vec<u8>> { + vec![vec![RootTree::GroupActions as u8], contract_id.to_vec()] +} + +/// Group path + +pub fn group_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], +) -> [&'a [u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + ] +} + +/// Group path vector + +pub fn group_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + ] +} + +/// Group action path + +pub fn group_active_action_root_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], +) -> [&'a [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_ACTIVE_ACTIONS_KEY, + ] +} + +/// Group action path vector + +pub fn group_active_action_root_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_ACTIVE_ACTIONS_KEY.to_vec(), + ] +} + +/// Group path + +pub fn group_action_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], + action_id: &'a [u8], +) -> [&'a [u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_ACTIVE_ACTIONS_KEY, + action_id, + ] +} + +/// Group path vector + +pub fn group_action_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, + action_id: &[u8], +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_ACTIVE_ACTIONS_KEY.to_vec(), + action_id.to_vec(), + ] +} + +/// Group path + +pub fn group_action_signers_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], + action_id: &'a [u8], +) -> [&'a [u8]; 6] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_ACTIVE_ACTIONS_KEY, + action_id, + ACTION_SIGNERS_KEY, + ] +} + +/// Group path vector + +pub fn group_action_signers_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, + action_id: &[u8], +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_ACTIVE_ACTIONS_KEY.to_vec(), + action_id.to_vec(), + ACTION_SIGNERS_KEY.to_vec(), + ] +} + +/// Group action path + +pub fn group_closed_action_root_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], +) -> [&'a [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_CLOSED_ACTIONS_KEY, + ] +} + +/// Group action path vector + +pub fn group_closed_action_root_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_CLOSED_ACTIONS_KEY.to_vec(), + ] +} + +/// Group path + +pub fn group_closed_action_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], + action_id: &'a [u8], +) -> [&'a [u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_CLOSED_ACTIONS_KEY, + action_id, + ] +} + +/// Group path vector + +pub fn group_closed_action_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, + action_id: &[u8], +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_CLOSED_ACTIONS_KEY.to_vec(), + action_id.to_vec(), + ] +} + +/// Group path + +pub fn group_closed_action_signers_path<'a>( + contract_id: &'a [u8], + group_contract_position_bytes: &'a [u8], + action_id: &'a [u8], +) -> [&'a [u8]; 6] { + [ + Into::<&[u8; 1]>::into(RootTree::GroupActions), + contract_id, + group_contract_position_bytes, + GROUP_CLOSED_ACTIONS_KEY, + action_id, + ACTION_SIGNERS_KEY, + ] +} + +/// Group path vector + +pub fn group_closed_action_signers_path_vec( + contract_id: &[u8], + group_contract_position: GroupContractPosition, + action_id: &[u8], +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::GroupActions as u8], + contract_id.to_vec(), + group_contract_position.to_be_bytes().to_vec(), + GROUP_CLOSED_ACTIONS_KEY.to_vec(), + action_id.to_vec(), + ACTION_SIGNERS_KEY.to_vec(), + ] +} diff --git a/packages/rs-drive/src/drive/group/prove/mod.rs b/packages/rs-drive/src/drive/group/prove/mod.rs new file mode 100644 index 00000000000..dc5360bb8c2 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/mod.rs @@ -0,0 +1,4 @@ +mod prove_action_infos; +mod prove_action_signers; +mod prove_group_info; +mod prove_group_infos; diff --git a/packages/rs-drive/src/drive/group/prove/prove_action_infos/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_action_infos/mod.rs new file mode 100644 index 00000000000..f5b6cec806a --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_action_infos/mod.rs @@ -0,0 +1,132 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; +impl Drive { + /// Generates a proof of active action information within a specific group of a contract. + /// + /// This method produces a cryptographic proof that validates and retrieves active action information + /// associated with a specific group in the given contract based on the `action_status`. The proof can be limited to a subset of actions + /// based on the `start_action_id` and `limit` parameters. It supports multiple versions for backward + /// compatibility and forwards the request to the appropriate versioned implementation. + /// + /// # Arguments + /// - `contract_id`: The identifier of the contract containing the group. + /// - `group_contract_position`: The position of the group within the contract whose actions are to be proven. + /// - `action_status`: The status of the group actions to prove. + /// - `start_action_id`: An optional starting action ID, combined with a [`StartAtIncluded`] flag to specify whether + /// the start position is inclusive. + /// - `limit`: An optional limit on the number of actions to include in the proof. + /// - `transaction`: The transaction context for the operation. + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok(Vec<u8>)`: On success, returns a serialized proof as a vector of bytes. + /// - `Err(Error)`: If the operation fails, returns an [`Error`] indicating the cause of failure. + /// + /// # Errors + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - Any other errors propagated from the versioned implementation. + pub fn prove_action_infos( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .prove + .prove_action_infos + { + 0 => self.prove_action_infos_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_action_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Generates a proof of active action information within a specific group of a contract and adds operations. + /// + /// This method extends the functionality of `prove_action_infos` by additionally allowing + /// operations to be added to a provided `drive_operations` list. It produces a cryptographic proof + /// of active action information associated with a specific group in the given contract based on the `action_status`, and supports + /// different versions for backward compatibility. + /// + /// # Arguments + /// - `contract_id`: The identifier of the contract containing the group. + /// - `group_contract_position`: The position of the group within the contract whose actions are to be proven. + /// - `action_status`: The status of the group actions to prove. + /// - `start_action_id`: An optional starting action ID, combined with a [`StartAtIncluded`] flag to specify whether + /// the start position is inclusive. + /// - `limit`: An optional limit on the number of actions to include in the proof. + /// - `transaction`: The transaction context for the operation. + /// - `drive_operations`: A mutable reference to a vector where additional low-level operations can be appended. + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok(Vec<u8>)`: On success, returns a serialized proof as a vector of bytes. + /// - `Err(Error)`: If the operation fails, returns an [`Error`] indicating the cause of failure. + /// + /// # Errors + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - Any other errors propagated from the versioned implementation. + pub(crate) fn prove_action_infos_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .prove + .prove_action_infos + { + 0 => self.prove_action_infos_operations_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_action_infos_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_action_infos/v0/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_action_infos/v0/mod.rs new file mode 100644 index 00000000000..1deadafda50 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_action_infos/v0/mod.rs @@ -0,0 +1,536 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_action_infos_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_action_infos_operations_v0( + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_action_infos_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Drive::group_action_infos_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + start_action_id.map(|(s, i)| (s.to_buffer(), i)), + limit, + ); + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; + use dpp::data_contract::v1::DataContractV1; + use dpp::data_contract::DataContract; + use dpp::group::action_event::GroupActionEvent; + use dpp::group::group_action::v0::GroupActionV0; + use dpp::group::group_action::GroupAction; + use dpp::identifier::Identifier; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::tokens::token_event::TokenEvent; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_action_infos_with_multiple_actions() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + let identity_3 = Identity::random_identity(3, Some(9), platform_version) + .expect("expected a platform identity"); + + let identity_3_id = identity_3.id(); + + // Create a data contract with multiple tokens + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ]), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Contract and group details + let contract_id = contract.id(); + let group_contract_position = 0; + + // Create actions + let action_id_1 = Identifier::random(); + let action_id_2 = Identifier::random(); + + let action_1 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Mint(100, identity_1_id, None)), + }); + + let action_2 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Burn(50, None)), + }); + + // Add actions using `add_group_action` + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_1.clone()), + action_id_1, + identity_1_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 1"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_2.clone()), + action_id_2, + identity_2_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 2"); + + // Fetch actions directly + let fetched_actions = drive + .fetch_action_infos( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + None, + Some(10), + None, + platform_version, + ) + .expect("expected to fetch active actions"); + + assert_eq!( + fetched_actions, + BTreeMap::from([ + (action_id_1, action_1.clone()), + (action_id_2, action_2.clone()) + ]), + "unexpected fetched actions" + ); + + // Prove actions + let proof = drive + .prove_action_infos_v0( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + None, + Some(10), + None, + platform_version, + ) + .expect("should not error when proving active actions"); + + // Verify proof + let proved_actions: BTreeMap<Identifier, GroupAction> = + Drive::verify_action_infos_in_contract( + proof.as_slice(), + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + None, + Some(10), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert proved actions match fetched actions + assert_eq!(proved_actions, fetched_actions, "unexpected proved actions"); + } + + #[test] + fn should_prove_no_action_infos_for_non_existent_contract() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let non_existent_contract_id = Identifier::random(); + let group_contract_position = 0; + + // Prove actions for non-existent contract + let proof = drive + .prove_action_infos_v0( + non_existent_contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + None, + Some(10), + None, + platform_version, + ) + .expect("should not error when proving active actions for non-existent contract"); + + // Verify proof + let proved_actions: BTreeMap<Identifier, GroupAction> = + Drive::verify_action_infos_in_contract( + proof.as_slice(), + non_existent_contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + None, + Some(10), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert no actions exist + assert_eq!( + proved_actions, + BTreeMap::new(), + "expected no proved actions" + ); + } + + #[test] + fn should_fetch_and_prove_action_infos_with_start_action_id() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + let identity_2_id = identity_2.id(); + + let identity_3 = Identity::random_identity(3, Some(9), platform_version) + .expect("expected a platform identity"); + + let identity_3_id = identity_3.id(); + + // Create a data contract with multiple tokens + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ]), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Contract and group details + let contract_id = contract.id(); + let group_contract_position = 0; + + // Create actions + let action_id_1 = Identifier::new([1; 32]); + let action_id_2 = Identifier::new([2; 32]); + let action_id_3 = Identifier::new([3; 32]); + let action_id_4 = Identifier::new([4; 32]); + + let action_1 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Mint(200, identity_1_id, None)), + }); + + let action_2 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Burn(50, None)), + }); + + let action_3 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Transfer( + identity_2_id, + None, + None, + None, + 150, + )), + }); + + let action_4 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Transfer( + identity_3_id, + None, + None, + None, + 150, + )), + }); + + // Add actions using `add_group_action` + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_1.clone()), + action_id_1, + identity_1_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 1"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_2.clone()), + action_id_2, + identity_1_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 2"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_3.clone()), + action_id_3, + identity_2_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 3"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_4.clone()), + action_id_4, + identity_3_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 3"); + + // Fetch actions starting from action_id_2 + let fetched_actions = drive + .fetch_action_infos( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + Some((action_id_2, true)), + Some(2), + None, + platform_version, + ) + .expect("expected to fetch active actions"); + + assert_eq!( + fetched_actions, + BTreeMap::from([ + (action_id_2, action_2.clone()), + (action_id_3, action_3.clone()) + ]), + "unexpected fetched actions" + ); + + // Prove actions starting from action_id_2 + let proof = drive + .prove_action_infos_v0( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + Some((action_id_2, true)), + Some(2), + None, + platform_version, + ) + .expect("should not error when proving active actions"); + + // Verify proof + let proved_actions: BTreeMap<Identifier, GroupAction> = + Drive::verify_action_infos_in_contract( + proof.as_slice(), + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + Some((action_id_2, true)), + Some(2), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert proved actions match fetched actions + assert_eq!(proved_actions, fetched_actions, "unexpected proved actions"); + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_action_signers/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_action_signers/mod.rs new file mode 100644 index 00000000000..cd6ee8d520e --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_action_signers/mod.rs @@ -0,0 +1,124 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; +impl Drive { + /// Generates a cryptographic proof of the signers for a specified action in a group within a contract. + /// + /// # Arguments + /// + /// * `contract_id` - The unique identifier of the contract containing the group. + /// * `group_contract_position` - The position of the group within the contract. + /// * `action_status` - The status of the action (e.g., active or closed). + /// * `action_id` - The unique identifier of the action for which to prove signers. + /// * `transaction` - The transaction context for this operation. + /// * `platform_version` - The platform version to use for determining method compatibility. + /// + /// # Returns + /// + /// Returns a `Result` containing: + /// * `Vec<u8>` - The serialized cryptographic proof of the signers. + /// * `Error` - An error if the operation fails or if the platform version is unsupported. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// * The specified platform version is not supported. + /// * Internal database or transaction errors occur. + pub fn prove_action_signers( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .prove + .prove_action_signers + { + 0 => self.prove_action_signers_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_action_signers".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Generates a cryptographic proof of the signers for a specified action in a group within a contract + /// and appends the required operations for this proof to the provided list of drive operations. + /// + /// # Arguments + /// + /// * `contract_id` - The unique identifier of the contract containing the group. + /// * `group_contract_position` - The position of the group within the contract. + /// * `action_status` - The status of the action (e.g., active or closed). + /// * `action_id` - The unique identifier of the action for which to prove signers. + /// * `transaction` - The transaction context for this operation. + /// * `drive_operations` - A mutable reference to a list of low-level drive operations to which this operation will be appended. + /// * `platform_version` - The platform version to use for determining method compatibility. + /// + /// # Returns + /// + /// Returns a `Result` containing: + /// * `Vec<u8>` - The serialized cryptographic proof of the signers. + /// * `Error` - An error if the operation fails or if the platform version is unsupported. + /// + /// # Errors + /// + /// Returns an `Error` if: + /// * The specified platform version is not supported. + /// * Internal database or transaction errors occur. + pub(crate) fn prove_action_signers_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .group + .prove + .prove_action_signers + { + 0 => self.prove_action_signers_operations_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_action_signers_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_action_signers/v0/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_action_signers/v0/mod.rs new file mode 100644 index 00000000000..509b3749319 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_action_signers/v0/mod.rs @@ -0,0 +1,479 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_action_signers_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_action_signers_operations_v0( + contract_id, + group_contract_position, + action_status, + action_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_action_signers_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Drive::group_action_signers_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + action_id.to_buffer(), + ); + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::{Group, GroupMemberPower}; + use dpp::data_contract::v1::DataContractV1; + use dpp::data_contract::DataContract; + use dpp::group::action_event::GroupActionEvent; + use dpp::group::group_action::v0::GroupActionV0; + use dpp::group::group_action::GroupAction; + use dpp::identifier::Identifier; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::tokens::token_event::TokenEvent; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_action_signers_with_multiple_actions() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + let identity_3 = Identity::random_identity(3, Some(9), platform_version) + .expect("expected a platform identity"); + + let identity_3_id = identity_3.id(); + + // Create a data contract with multiple tokens + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ]), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Contract and group details + let contract_id = contract.id(); + let group_contract_position = 0; + + // Create actions + let action_id_1 = Identifier::random(); + let action_id_2 = Identifier::random(); + + let action_1 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Mint(100, identity_1_id, None)), + }); + + let action_2 = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Burn(50, None)), + }); + + // Add actions using `add_group_action` + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_1.clone()), + action_id_1, + identity_1_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 1"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_1.clone()), + action_id_1, + identity_2_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 1"); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action_2.clone()), + action_id_2, + identity_2_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action 2"); + + // Fetch actions directly + let fetched_actions = drive + .fetch_action_signers( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + action_id_1, + None, + platform_version, + ) + .expect("expected to fetch active actions"); + + assert_eq!( + fetched_actions, + BTreeMap::from([(identity_1_id, 1), (identity_2_id, 1)]), + "unexpected fetched powers" + ); + + // Prove actions + let proof = drive + .prove_action_signers_v0( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + action_id_1, + None, + platform_version, + ) + .expect("should not error when proving active actions"); + + // Verify proof + let proved_actions: BTreeMap<Identifier, GroupMemberPower> = Drive::verify_action_signers( + proof.as_slice(), + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + action_id_1, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert proved actions match fetched actions + assert_eq!(proved_actions, fetched_actions, "unexpected proved actions"); + } + + #[test] + fn should_prove_no_action_signers_for_non_existent_action() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + // Create a data contract with groups + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + )]), + tokens: BTreeMap::new(), + }); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Contract and group details + let contract_id = contract.id(); + let group_contract_position = 0; + let non_existent_action_id = Identifier::random(); + + // Prove action signers for a non-existent action + let proof = drive + .prove_action_signers_v0( + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + non_existent_action_id, + None, + platform_version, + ) + .expect("should not error when proving action signers for non-existent action"); + + // Verify proof + let proved_signers: BTreeMap<Identifier, GroupMemberPower> = Drive::verify_action_signers( + proof.as_slice(), + contract_id, + group_contract_position, + GroupActionStatus::ActionActive, + non_existent_action_id, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert no signers exist + assert!(proved_signers.is_empty(), "expected no signers"); + } + + #[test] + fn should_prove_action_signers_for_closed_action_if_still_active() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + // Create a data contract with groups + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + )]), + tokens: BTreeMap::new(), + }); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Contract and group details + let contract_id = contract.id(); + let group_contract_position = 0; + + // Create a closed action + let action_id = Identifier::random(); + let action = GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(TokenEvent::Burn(50, None)), + }); + + drive + .add_group_action( + contract_id, + group_contract_position, + Some(action.clone()), + action_id, + identity_2_id, + 1, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add action"); + + // Fetch closed action signers + let fetched_signers = drive + .fetch_action_signers( + contract_id, + group_contract_position, + GroupActionStatus::ActionClosed, + action_id, + None, + platform_version, + ) + .expect("expected to fetch closed action signers"); + + assert_eq!( + fetched_signers, + BTreeMap::new(), + "unexpected fetched powers" + ); + + // Prove closed action signers + let proof = drive + .prove_action_signers_v0( + contract_id, + group_contract_position, + GroupActionStatus::ActionClosed, + action_id, + None, + platform_version, + ) + .expect("should not error when proving closed action signers"); + + // Verify proof + let proved_signers: BTreeMap<Identifier, GroupMemberPower> = Drive::verify_action_signers( + proof.as_slice(), + contract_id, + group_contract_position, + GroupActionStatus::ActionClosed, + action_id, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert proved signers match fetched signers + assert_eq!(proved_signers, fetched_signers, "unexpected proved signers"); + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_group_info/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_group_info/mod.rs new file mode 100644 index 00000000000..a985301f6d5 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_group_info/mod.rs @@ -0,0 +1,96 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; + +impl Drive { + /// Proves the `Group` for the given contract and group contract position. + /// + /// This function queries the GroveDB to prove the `Group` associated with a specific contract + /// and group contract position. The method selects the appropriate version of + /// `prove_group_info` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn prove_group_info( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.group.prove.prove_group_info { + 0 => self.prove_group_info_v0( + contract_id, + group_contract_position, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_group_info".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Proves the `Group` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `prove_group_info` but also adds operations to the drive for state changes or queries. + /// Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to an optional `HashMap` containing + /// layer information used for cost estimation. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified contract ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn prove_group_info_operations( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.group.prove.prove_group_info { + 0 => self.prove_group_info_operations_v0( + contract_id, + group_contract_position, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_group_info_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_group_info/v0/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_group_info/v0/mod.rs new file mode 100644 index 00000000000..189cc63a2a0 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_group_info/v0/mod.rs @@ -0,0 +1,199 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_group_info_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_group_info_operations_v0( + contract_id, + group_contract_position, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_group_info_operations_v0( + &self, + contract_id: Identifier, + group_contract_position: GroupContractPosition, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Drive::group_info_for_contract_id_and_group_contract_position_query( + contract_id.to_buffer(), + group_contract_position, + ); + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; + use dpp::data_contract::v1::DataContractV1; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::DataContract; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_group_info_for_existing_group() { + let drive = setup_drive_with_initial_state_structure(None); + let platform_version = PlatformVersion::latest(); + + // Create identities for group members + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + let identity_2_id = identity_2.id(); + + // Create a data contract with a single group + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 2)].into(), + required_power: 3, + }), + )]), + tokens: Default::default(), + }); + + let contract_id = contract.id(); + + // Insert the contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Prove group info for group at position 0 + let proof = drive + .prove_group_info_v0(contract_id, 0, None, platform_version) + .expect("should not error when proving group info"); + + // Verify the proof + let (root_hash, group) = + Drive::verify_group_info(proof.as_slice(), contract_id, 0, false, platform_version) + .expect("expected proof verification to succeed"); + + // Assert root hash is valid + assert!(!root_hash.is_empty(), "root hash should not be empty"); + + // Assert group matches the expected value + assert_eq!( + group, + Some(Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 2)].into(), + required_power: 3, + })), + "unexpected group info" + ); + } + + #[test] + fn should_prove_no_group_info_for_non_existent_group() { + let drive = setup_drive_with_initial_state_structure(None); + let platform_version = PlatformVersion::latest(); + + // Create a data contract without groups + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: Default::default(), + }); + + let contract_id = contract.id(); + + // Insert the contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Prove group info for a non-existent group at position 0 + let proof = drive + .prove_group_info_v0(contract_id, 0, None, platform_version) + .expect("should not error when proving group info for a non-existent group"); + + // Verify the proof + let (root_hash, group) = + Drive::verify_group_info(proof.as_slice(), contract_id, 0, false, platform_version) + .expect("expected proof verification to succeed"); + + // Assert root hash is valid + assert!(!root_hash.is_empty(), "root hash should not be empty"); + + // Assert group is None + assert!(group.is_none(), "expected no group info, but got some"); + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_group_infos/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_group_infos/mod.rs new file mode 100644 index 00000000000..3b882557dea --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_group_infos/mod.rs @@ -0,0 +1,97 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +mod v0; +impl Drive { + /// Proves the `Group` for the given contract. + /// + /// This function queries the GroveDB to prove the potentially many `Group`s associated with a + /// specific contract. The method selects the appropriate version of + /// `prove_group_infos` based on the `platform_version` provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `transaction`: The transaction argument used for the query. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified action ID and contract position. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub fn prove_group_infos( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.group.prove.prove_group_infos { + 0 => self.prove_group_infos_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_group_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Proves the `Group` and adds corresponding operations to the drive for the given action ID and group contract position. + /// + /// This function is similar to `prove_group_info` but also adds operations to the drive for state changes or queries. + /// Additionally, it supports cost estimation by interacting with the layer information if provided. + /// + /// # Parameters + /// - `contract_id`: The identifier of the contract that the action belongs to. + /// - `group_contract_position`: The position of the group contract in the data structure. + /// - `transaction`: The transaction argument used for the query. + /// - `drive_operations`: A mutable reference to a vector that stores low-level drive operations. + /// - `platform_version`: The version of the platform that determines the correct method version. + /// + /// # Returns + /// - `Ok(Group)`: The `Group` for the specified contract ID and contract position, along with any added operations. + /// - `Err(Error)`: If an error occurs, a generic error is returned. + /// + /// # Errors + /// - `DriveError::UnknownVersionMismatch`: If the `platform_version` does not match any known versions. + pub(crate) fn prove_group_infos_operations( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.group.prove.prove_group_infos { + 0 => self.prove_group_infos_operations_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_group_infos_and_add_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/group/prove/prove_group_infos/v0/mod.rs b/packages/rs-drive/src/drive/group/prove/prove_group_infos/v0/mod.rs new file mode 100644 index 00000000000..cf65df54006 --- /dev/null +++ b/packages/rs-drive/src/drive/group/prove/prove_group_infos/v0/mod.rs @@ -0,0 +1,367 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_group_infos_v0( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_group_infos_operations_v0( + contract_id, + start_group_contract_position, + limit, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_group_infos_operations_v0( + &self, + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::group_infos_for_contract_id_query( + contract_id.to_buffer(), + start_group_contract_position, + limit, + ); + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::group::v0::GroupV0; + use dpp::data_contract::group::Group; + use dpp::data_contract::v1::DataContractV1; + use dpp::data_contract::GroupContractPosition; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::DataContract; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_group_infos_with_multiple_groups() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + let identity_3 = Identity::random_identity(3, Some(9), platform_version) + .expect("expected a platform identity"); + + let identity_3_id = identity_3.id(); + + // Create a data contract with groups + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ]), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let contract_id = contract.id(); + + // Insert contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Prove group infos + let proof = drive + .prove_group_infos_v0( + contract_id, + None, // No start position + Some(10), // Limit + None, + platform_version, + ) + .expect("should not error when proving group infos"); + + println!("{}", hex::encode(&proof)); + + // Verify proof + let proved_group_infos: BTreeMap<GroupContractPosition, Group> = + Drive::verify_group_infos_in_contract( + proof.as_slice(), + contract_id, + None, + Some(10), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert group infos match expected values + assert_eq!( + proved_group_infos, + BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ]), + "unexpected group infos" + ); + } + + #[test] + fn should_prove_group_infos_with_start_position_and_limit() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id(); + + let identity_2 = Identity::random_identity(3, Some(506), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id(); + + let identity_3 = Identity::random_identity(3, Some(9), platform_version) + .expect("expected a platform identity"); + + let identity_3_id = identity_3.id(); + + // Create a data contract with groups + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: BTreeMap::from([ + ( + 0, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_2_id, 1)].into(), + required_power: 2, + }), + ), + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }), + ), + ( + 2, + Group::V0(GroupV0 { + members: [(identity_2_id, 1), (identity_3_id, 2)].into(), + required_power: 3, + }), + ), + ( + 3, + Group::V0(GroupV0 { + members: [(identity_1_id, 1), (identity_3_id, 1)].into(), + required_power: 2, + }), + ), + ]), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let contract_id = contract.id(); + + // Insert contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Prove group infos starting from position 1 with a limit of 2 + let proof = drive + .prove_group_infos_v0( + contract_id, + Some((1, true)), + Some(2), + None, + platform_version, + ) + .expect("should not error when proving group infos"); + + // Verify proof + let proved_group_infos: BTreeMap<GroupContractPosition, Group> = + Drive::verify_group_infos_in_contract( + proof.as_slice(), + contract_id, + Some((1, true)), + Some(2), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert group infos match expected values + assert_eq!( + proved_group_infos, + BTreeMap::from([ + ( + 1, + Group::V0(GroupV0 { + members: [(identity_1_id, 2), (identity_2_id, 1), (identity_3_id, 1)] + .into(), + required_power: 2, + }) + ), + ( + 2, + Group::V0(GroupV0 { + members: [(identity_2_id, 1), (identity_3_id, 2)].into(), + required_power: 3, + }), + ), + ]), + "unexpected group infos" + ); + } + + #[test] + fn should_prove_no_group_infos_for_empty_contract() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let contract_id = Identifier::random(); + + // Prove group infos for an empty contract + let proof = drive + .prove_group_infos_v0(contract_id, None, Some(10), None, platform_version) + .expect("should not error when proving group infos for an empty contract"); + + // Verify proof + let proved_group_infos: BTreeMap<GroupContractPosition, Group> = + Drive::verify_group_infos_in_contract( + proof.as_slice(), + contract_id, + None, + Some(10), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert no group infos exist for the empty contract + assert!( + proved_group_infos.is_empty(), + "expected no group infos, but got: {:?}", + proved_group_infos + ); + } +} diff --git a/packages/rs-drive/src/drive/group/queries.rs b/packages/rs-drive/src/drive/group/queries.rs new file mode 100644 index 00000000000..e78e6cca882 --- /dev/null +++ b/packages/rs-drive/src/drive/group/queries.rs @@ -0,0 +1,122 @@ +use crate::drive::group::paths::{ + group_contract_path_vec, group_path_vec, ACTION_INFO_KEY, ACTION_SIGNERS_KEY, + GROUP_ACTIVE_ACTIONS_KEY, GROUP_CLOSED_ACTIONS_KEY, GROUP_INFO_KEY, +}; +use crate::drive::Drive; +use crate::query::{Query, QueryItem}; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use grovedb::{PathQuery, SizedQuery}; +use std::ops::RangeFull; + +impl Drive { + /// The query for a single group info inside a contract. + pub fn group_info_for_contract_id_and_group_contract_position_query( + contract_id: [u8; 32], + group_contract_position: GroupContractPosition, + ) -> PathQuery { + let group_path = group_path_vec(&contract_id, group_contract_position); + let mut path_query = PathQuery::new_single_key(group_path, GROUP_INFO_KEY.to_vec()); + path_query.query.limit = Some(1); + path_query + } + + /// The query for the group infos inside a contract. + pub fn group_infos_for_contract_id_query( + contract_id: [u8; 32], + start_at: Option<(GroupContractPosition, bool)>, + limit: Option<u16>, + ) -> PathQuery { + let group_contract_path = group_contract_path_vec(&contract_id); + let mut query = Query::new_with_direction(true); + if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeFrom(start_at.to_be_bytes().to_vec()..)) + } else { + query.insert_item(QueryItem::RangeAfter(start_at.to_be_bytes().to_vec()..)) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + + query.set_subquery_key(GROUP_INFO_KEY.to_vec()); + PathQuery { + path: group_contract_path, + query: SizedQuery { + query, + limit, + offset: None, + }, + } + } + + /// Gets the active group actions + pub fn group_action_infos_query( + contract_id: [u8; 32], + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_at: Option<([u8; 32], bool)>, + limit: Option<u16>, + ) -> PathQuery { + let mut group_actions_path = group_path_vec(&contract_id, group_contract_position); + match action_status { + GroupActionStatus::ActionActive => { + group_actions_path.push(GROUP_ACTIVE_ACTIONS_KEY.to_vec()) + } + GroupActionStatus::ActionClosed => { + group_actions_path.push(GROUP_CLOSED_ACTIONS_KEY.to_vec()) + } + } + let mut query = Query::new_with_direction(true); + if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeFrom(start_at.to_vec()..)) + } else { + query.insert_item(QueryItem::RangeAfter(start_at.to_vec()..)) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + + query.set_subquery_key(ACTION_INFO_KEY.to_vec()); + + PathQuery { + path: group_actions_path, + query: SizedQuery { + query, + limit, + offset: None, + }, + } + } + + /// Gets the action signers query + pub fn group_action_signers_query( + contract_id: [u8; 32], + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: [u8; 32], + ) -> PathQuery { + let mut group_actions_path = group_path_vec(&contract_id, group_contract_position); + match action_status { + GroupActionStatus::ActionActive => { + group_actions_path.push(GROUP_ACTIVE_ACTIONS_KEY.to_vec()) + } + GroupActionStatus::ActionClosed => { + group_actions_path.push(GROUP_CLOSED_ACTIONS_KEY.to_vec()) + } + } + group_actions_path.push(action_id.to_vec()); + group_actions_path.push(ACTION_SIGNERS_KEY.to_vec()); + let query = Query::new_range_full(); + + PathQuery { + path: group_actions_path, + query: SizedQuery { + query, + limit: None, + offset: None, + }, + } + } +} diff --git a/packages/rs-drive/src/drive/identity/balance/update.rs b/packages/rs-drive/src/drive/identity/balance/update.rs index dc7c94e3e76..aed30f9b248 100644 --- a/packages/rs-drive/src/drive/identity/balance/update.rs +++ b/packages/rs-drive/src/drive/identity/balance/update.rs @@ -21,10 +21,61 @@ mod tests { use super::*; #[test] - fn should_add_to_balance() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_add_to_balance_first_version_apply() { + let platform_version = PlatformVersion::first(); + // Use the same fee result if you want, or adjust if needed: + let expected_fee_result = FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + }; + do_should_add_to_balance(true, platform_version, expected_fee_result); + } + + #[test] + fn should_add_to_balance_first_version_estimated() { + let platform_version = PlatformVersion::first(); + // Use the same fee result if you want, or adjust if needed: + let expected_fee_result = FeeResult { + processing_fee: 4278840, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_add_to_balance(false, platform_version, expected_fee_result); + } + + #[test] + fn should_add_to_balance_latest_version_apply() { let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_add_to_balance(true, platform_version, expected_fee_result); + } + + #[test] + fn should_add_to_balance_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + processing_fee: 4278840, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_add_to_balance(false, platform_version, expected_fee_result); + } + + fn do_should_add_to_balance( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(None); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); @@ -33,6 +84,7 @@ mod tests { let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + // Add new identity (always apply here so it actually gets inserted) drive .add_new_identity( identity.clone(), @@ -48,43 +100,41 @@ mod tests { let amount = 300; + // Add to the identity balance, either applying or estimating let fee_result = drive .add_to_identity_balance( identity.id().to_buffer(), amount, &block_info, - true, + apply, Some(&db_transaction), platform_version, ) .expect("expected to add to identity balance"); - assert_eq!( - fee_result, - FeeResult { - processing_fee: 174660, - removed_bytes_from_system: 0, - ..Default::default() - } - ); - - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); - - let (balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block_info, - true, - None, - platform_version, - ) - .expect("expected to get balance"); - - assert_eq!(balance.unwrap(), old_balance + amount); + assert_eq!(fee_result, expected_fee_result); + + if apply { + // Commit if we are applying + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + // Check the updated balance + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!(balance.unwrap(), old_balance + amount); + } } #[test] @@ -110,9 +160,45 @@ mod tests { } #[test] - fn should_deduct_from_debt_if_balance_is_nil() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_deduct_from_debt_if_balance_is_nil_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 385160, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_deduct_from_debt_if_balance_is_nil( + true, + platform_version, + expected_fee_result, + ); + } + + #[test] + fn should_deduct_from_debt_if_balance_is_nil_latest_version_apply() { let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 385160, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_deduct_from_debt_if_balance_is_nil( + true, + platform_version, + expected_fee_result, + ); + } + + fn do_should_deduct_from_debt_if_balance_is_nil( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(None); let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) .expect("expected an identity"); @@ -147,55 +233,86 @@ mod tests { identity.id().to_buffer(), added_balance, &block_info, - true, + apply, None, platform_version, ) .expect("expected to add to identity balance"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 0, - processing_fee: 385160, - removed_bytes_from_system: 0, - ..Default::default() - } - ); + assert_eq!(fee_result, expected_fee_result); + + if apply { + let (updated_balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!( + updated_balance.expect("balance should present"), + added_balance - negative_amount + ); + + let updated_negative_balance = drive + .fetch_identity_negative_balance_operations( + identity.id().to_buffer(), + true, + None, + &mut drive_operations, + platform_version, + ) + .expect("expected to get negative balance") + .expect("negative balance should present"); + + assert_eq!(updated_negative_balance, 0); + } + } - let (updated_balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block_info, - true, - None, - platform_version, - ) - .expect("expected to get balance"); + #[test] + fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 260540, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert_eq!( - updated_balance.expect("balance should present"), - added_balance - negative_amount + do_should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower( + true, + platform_version, + expected_fee_result, ); + } - let updated_negative_balance = drive - .fetch_identity_negative_balance_operations( - identity.id().to_buffer(), - true, - None, - &mut drive_operations, - platform_version, - ) - .expect("expected to get balance") - .expect("balance should present"); + #[test] + fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower_latest_version_apply() + { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 260540, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert_eq!(updated_negative_balance, 0) + do_should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower( + true, + platform_version, + expected_fee_result, + ); } - #[test] - fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower() { + fn do_should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { let drive = setup_drive_with_initial_state_structure(None); - let platform_version = PlatformVersion::latest(); let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) .expect("expected an identity"); @@ -229,130 +346,117 @@ mod tests { identity.id().to_buffer(), added_balance, &block_info, - true, + apply, None, platform_version, ) .expect("expected to add to identity balance"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 0, - processing_fee: 260540, - removed_bytes_from_system: 0, - ..Default::default() - } - ); - - let (updated_balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block_info, - true, - None, - platform_version, - ) - .expect("expected to get balance"); + assert_eq!(fee_result, expected_fee_result); + + if apply { + let (updated_balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!(updated_balance.expect("balance should present"), 0); + + let updated_negative_balance = drive + .fetch_identity_negative_balance_operations( + identity.id().to_buffer(), + true, + None, + &mut drive_operations, + platform_version, + ) + .expect("expected to get balance") + .expect("balance should present"); + + assert_eq!(updated_negative_balance, negative_amount - added_balance); + } + } + } - assert_eq!(updated_balance.expect("balance should present"), 0); + mod remove_from_identity_balance { + use super::*; + use dpp::block::block_info::BlockInfo; + use dpp::fee::fee_result::FeeResult; + use dpp::version::PlatformVersion; - let updated_negative_balance = drive - .fetch_identity_negative_balance_operations( - identity.id().to_buffer(), - true, - None, - &mut drive_operations, - platform_version, - ) - .expect("expected to get balance") - .expect("balance should present"); + #[test] + fn should_remove_from_balance_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert_eq!(updated_negative_balance, negative_amount - added_balance) + do_should_remove_from_balance(true, platform_version, expected_fee_result); } #[test] - fn should_estimate_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(None); - - let platform_version = PlatformVersion::latest(); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); - - let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); - - let app_hash_before = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - let fee_result = drive - .add_to_identity_balance( - identity.id().to_buffer(), - 300, - &block, - false, - None, - platform_version, - ) - .expect("expected to get estimated costs to update an identity balance"); + fn should_remove_from_balance_first_version_estimated() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + processing_fee: 2476860, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert_eq!( - fee_result, - FeeResult { - processing_fee: 4278840, - ..Default::default() - } - ); + do_should_remove_from_balance(false, platform_version, expected_fee_result); + } - let app_hash_after = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); + #[test] + fn should_remove_from_balance_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert_eq!(app_hash_after, app_hash_before); + do_should_remove_from_balance(true, platform_version, expected_fee_result); + } - let (balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block, - true, - None, - platform_version, - ) - .expect("expected to get balance"); + #[test] + fn should_remove_from_balance_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + processing_fee: 2476860, + removed_bytes_from_system: 0, + ..Default::default() + }; - assert!(balance.is_none()); //shouldn't have changed + do_should_remove_from_balance(false, platform_version, expected_fee_result); } - } - mod remove_from_identity_balance { - use super::*; - use dpp::block::block_info::BlockInfo; - use dpp::fee::fee_result::FeeResult; - use dpp::version::PlatformVersion; - - #[test] - fn should_remove_from_balance() { + fn do_should_remove_from_balance( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { let drive = setup_drive_with_initial_state_structure(None); - let platform_version = PlatformVersion::latest(); - let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); let old_balance = identity.balance(); - let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + // Insert the identity with apply=true so it's actually stored drive .add_new_identity( identity.clone(), false, - &block, + &block_info, true, None, platform_version, @@ -367,100 +471,35 @@ mod tests { .remove_from_identity_balance( identity.id().to_buffer(), amount, - &block, - true, + &block_info, + apply, Some(&db_transaction), platform_version, None, ) - .expect("expected to add to identity balance"); + .expect("expected to remove from identity balance"); - assert_eq!( - fee_result, - FeeResult { - processing_fee: 174660, - removed_bytes_from_system: 0, - ..Default::default() - } - ); + assert_eq!(fee_result, expected_fee_result); - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); - - let (balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block, - true, - None, - platform_version, - ) - .expect("expected to get balance"); - - assert_eq!(balance.unwrap(), old_balance - amount); - } - - #[test] - fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(None); - - let platform_version = PlatformVersion::latest(); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); - let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); - - let app_hash_before = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - let amount = 10; - - let fee_result = drive - .remove_from_identity_balance( - identity.id().to_buffer(), - amount, - &block, - false, - None, - platform_version, - None, - ) - .expect("expected to add to identity balance"); - - let app_hash_after = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - assert_eq!(app_hash_after, app_hash_before); - - assert_eq!( - fee_result, - FeeResult { - processing_fee: 2476860, - ..Default::default() - } - ); - - let (balance, _fee_cost) = drive - .fetch_identity_balance_with_costs( - identity.id().to_buffer(), - &block, - true, - None, - platform_version, - ) - .expect("expected to get balance"); + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); - assert!(balance.is_none()); //shouldn't have changed + assert_eq!(balance.unwrap(), old_balance - amount); + } } } diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs index 14a8e3e05ee..bfbf1c2f4f9 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/fetch_identity_contract_nonce/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::prelude::IdentityNonce; use crate::drive::identity::contract_info::ContractInfoStructure::IdentityContractNonceKey; use dpp::version::PlatformVersion; use grovedb::Element::Item; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Identity's contract revision from the backing store @@ -51,7 +51,7 @@ impl Drive { DirectQueryType::StatefulDirectQuery } else { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue(1), } }; diff --git a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs index aaa805ca542..9585f029fe6 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/identity_contract_nonce/merge_identity_contract_nonce/v0/mod.rs @@ -11,7 +11,7 @@ use crate::util::object_size_info::{PathKeyElementInfo, PathKeyInfo}; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; use dpp::block::block_info::BlockInfo; use dpp::fee::fee_result::FeeResult; @@ -98,8 +98,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: 0, } }; @@ -119,7 +119,7 @@ impl Drive { // we insert the contract root tree if it doesn't exist already self.batch_insert_empty_tree_if_not_exists( PathKeyInfo::<0>::PathKey((identity_path, vec![IdentityContractInfo as u8])), - false, + TreeType::NormalTree, None, apply_type, transaction, @@ -134,7 +134,7 @@ impl Drive { identity_contract_info_root_path_vec(&identity_id), contract_id.to_vec(), )), - false, + TreeType::NormalTree, None, apply_type, transaction, @@ -302,7 +302,7 @@ mod tests { use platform_version::version::PlatformVersion; fn setup_base_test(contract_id: [u8; 32]) -> (Drive, Identity) { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs index 745bd2daffa..a2177bd0697 100644 --- a/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/contract_info/keys/add_potential_contract_info_for_contract_bounded_key/v0/mod.rs @@ -24,7 +24,7 @@ use dpp::identity::{IdentityPublicKey, Purpose}; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; use grovedb::reference_path::ReferencePathType::{SiblingReference, UpstreamRootHeightReference}; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use grovedb_costs::OperationCost; use integer_encoding::VarInt; use std::collections::HashMap; @@ -95,8 +95,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: 0, } }; @@ -233,7 +233,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, target: QueryTargetValue(reference_type_path.serialized_size() as u32), } }; @@ -419,7 +419,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, target: QueryTargetValue(reference.serialized_size() as u32), } }; diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_authentication_keys_security_level_in_key_reference_tree/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_authentication_keys_security_level_in_key_reference_tree/v0/mod.rs index 28d254ead1a..529b56477f6 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_authentication_keys_security_level_in_key_reference_tree/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_authentication_keys_security_level_in_key_reference_tree/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllItems; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_query_keys_security_level_tree_path_vec; @@ -45,7 +45,7 @@ impl Drive { )), //todo: revisit EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(4), //we can estimate that each security level will only have 4 keys //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: AllItems(1, KEY_REFERENCE_SIZE, None), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_balances/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_balances/v0/mod.rs index fd7be5dcdb2..db78d1fff31 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_balances/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_balances/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::balances::balance_path_vec; @@ -56,12 +56,15 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees( 1, SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 1, }, None, @@ -73,7 +76,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(balance_path_vec()), EstimatedLayerInformation { - is_sum_tree: true, + tree_type: TreeType::SumTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, AVERAGE_BALANCE_SIZE, None), }, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs index 79a3a2c57b6..77a184dab7d 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info/v0/mod.rs @@ -3,9 +3,9 @@ use crate::drive::{identity_tree_path, Drive}; use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -19,7 +19,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -29,7 +29,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(identity_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -46,7 +46,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(2, false), estimated_layer_sizes: Mix { subtrees_size: Some((1, NoSumTrees, None, 2)), // weight of 2 because 1 for keys and 1 for data contract info @@ -59,7 +59,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_contract_info_root_path_vec(identity_id)), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs index 9fc0347ab8a..563dedebf6a 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group/v0/mod.rs @@ -2,9 +2,9 @@ use crate::drive::identity::identity_contract_info_group_path_vec; use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::Mix; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -20,7 +20,7 @@ impl Drive { group_id, )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: Mix { subtrees_size: Some((1, NoSumTrees, None, 1)), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_key_purpose/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_key_purpose/v0/mod.rs index 2a2d2405d79..195a04d3c7c 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_key_purpose/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_key_purpose/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllReference; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::estimation_costs::KEY_REFERENCE_SIZE; use crate::drive::identity::identity_contract_info_group_path_key_purpose_vec; @@ -25,7 +25,7 @@ impl Drive { key_purpose, )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(5), estimated_layer_sizes: AllReference(1, KEY_REFERENCE_SIZE, None), }, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs index efa3892a36c..069fc57bcb8 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_identity_contract_info_group_keys/v0/mod.rs @@ -2,9 +2,9 @@ use crate::drive::identity::identity_contract_info_group_keys_path_vec; use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -20,7 +20,7 @@ impl Drive { group_id, )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_keys_for_identity_id/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_keys_for_identity_id/v0/mod.rs index 3721c5cad3b..ac776f1ab24 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_keys_for_identity_id/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_keys_for_identity_id/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::{identity_tree_path, Drive}; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::{identity_key_tree_path_vec, identity_path_vec}; @@ -58,7 +58,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -68,7 +68,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(identity_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -78,7 +78,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), @@ -89,7 +89,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_key_tree_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(50), //we can estimate that an identity will have amount 50 keys //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: AllItems(1, 42, Some(3)), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_negative_credit/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_negative_credit/v0/mod.rs index 34a7a6d214a..c4102f56b77 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_negative_credit/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_negative_credit/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::{identity_tree_path, Drive}; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_path_vec; @@ -36,7 +36,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(identity_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -53,7 +53,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(2, false), //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: Mix { diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs index 68d4852ad3e..6951d86eda7 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_purpose_in_key_reference_tree/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllReference, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_query_keys_purpose_tree_path_vec; @@ -68,7 +68,7 @@ impl Drive { purpose, )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count, // there are //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes, diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_root_key_reference_tree/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_root_key_reference_tree/v0/mod.rs index ca2672fa5a2..7d312f98fd6 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_root_key_reference_tree/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_root_key_reference_tree/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_query_keys_tree_path_vec; @@ -34,7 +34,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_query_keys_tree_path_vec(identity_id)), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(4), //we can estimate that an identity will have amount 50 keys //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs index bbd73f99edf..0f129654927 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_nonce/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::{identity_tree_path, Drive}; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_path_vec; @@ -40,7 +40,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -50,7 +50,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(identity_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -67,7 +67,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: Mix { diff --git a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs index f5fe620cc68..659ffc26169 100644 --- a/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/estimation_costs/for_update_revision/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::{identity_tree_path, Drive}; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllSubtrees, Mix}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::identity::identity_path_vec; @@ -40,7 +40,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -50,7 +50,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(identity_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -67,7 +67,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(identity_path_vec(identity_id.as_slice())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), //We can mark these as all subtrees, because the revision will be under estimated_layer_sizes: Mix { diff --git a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs index 2c5c98f7dbe..31c0eb6b9cf 100644 --- a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_balance/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::fee::Credits; use dpp::version::PlatformVersion; use grovedb::Element::SumItem; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Identity's balance from the backing store @@ -77,7 +77,7 @@ impl Drive { } else { // 8 is the size of a i64 used in sum trees DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: true, + in_tree_type: TreeType::SumTree, query_target: QueryTargetValue(8), } }; diff --git a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_negative_balance/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_negative_balance/v0/mod.rs index ba32dca8740..8bc4ccb63ba 100644 --- a/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_negative_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/balance/fetch_identity_negative_balance/v0/mod.rs @@ -9,7 +9,7 @@ use dpp::fee::Credits; use dpp::version::PlatformVersion; use grovedb::Element::Item; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Identity's negative balance operations from the backing store. @@ -26,7 +26,7 @@ impl Drive { } else { // 8 is the size of a encoded u64 DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: true, + in_tree_type: TreeType::SumTree, query_target: QueryTargetValue(8), } }; diff --git a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs index 9a928d7b272..859982396ab 100644 --- a/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/fetch_by_public_key_hashes/mod.rs @@ -21,7 +21,7 @@ mod tests { #[test] fn test_fetch_all_keys_on_identity() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let drive_version = &platform_version.drive; diff --git a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs index 14a7c3f705e..8aa7fbe80d6 100644 --- a/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/nonce/fetch_identity_nonce/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::prelude::IdentityNonce; use dpp::version::PlatformVersion; use grovedb::Element::Item; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Identity's nonce from the backing store @@ -48,7 +48,7 @@ impl Drive { DirectQueryType::StatefulDirectQuery } else { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue(1), } }; diff --git a/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs b/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs index bc58f655241..5257b2f4323 100644 --- a/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/fetch/revision/fetch_identity_revision/v0/mod.rs @@ -12,7 +12,7 @@ use dpp::prelude::Revision; use dpp::version::PlatformVersion; use grovedb::Element::Item; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Identity's revision from the backing store @@ -48,7 +48,7 @@ impl Drive { DirectQueryType::StatefulDirectQuery } else { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, query_target: QueryTargetValue(1), } }; diff --git a/packages/rs-drive/src/drive/identity/insert/add_new_identity/mod.rs b/packages/rs-drive/src/drive/identity/insert/add_new_identity/mod.rs index bd03fbe38b6..16f9767ef34 100644 --- a/packages/rs-drive/src/drive/identity/insert/add_new_identity/mod.rs +++ b/packages/rs-drive/src/drive/identity/insert/add_new_identity/mod.rs @@ -121,3 +121,106 @@ impl Drive { } } } + +#[cfg(test)] +mod tests { + use crate::util::test_helpers::setup::setup_drive; + use dpp::identity::Identity; + + use dpp::block::block_info::BlockInfo; + use dpp::fee::fee_result::FeeResult; + use dpp::identity::accessors::IdentityGettersV0; + + use dpp::version::PlatformVersion; + + #[test] + fn test_insert_and_fetch_identity_first_version() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 128871000, + processing_fee: 2330320, + ..Default::default() + }; + + test_insert_and_fetch_identity(true, platform_version, expected_fee_result); + } + + #[test] + fn test_insert_and_fetch_identity_latest_version() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 128871000, + // 2 extra loaded bytes because the token tree is no longer empty + // these 2 loaded bytes cost 20 credits each + processing_fee: 2330360, + ..Default::default() + }; + + test_insert_and_fetch_identity(true, platform_version, expected_fee_result); + } + + #[test] + fn test_insert_identity_estimated_costs_first_version() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 128871000, + processing_fee: 11764980, + ..Default::default() + }; + + test_insert_and_fetch_identity(false, platform_version, expected_fee_result); + } + + #[test] + fn test_insert_identity_estimated_costs_latest_version() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 128871000, + processing_fee: 11764980, + ..Default::default() + }; + + test_insert_and_fetch_identity(false, platform_version, expected_fee_result); + } + + fn test_insert_and_fetch_identity( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive(None, None); + + let transaction = drive.grove.start_transaction(); + + drive + .create_initial_state_structure(Some(&transaction), platform_version) + .expect("expected to create root tree successfully"); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + let fee_result = drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + apply, + Some(&transaction), + platform_version, + ) + .expect("expected to insert identity"); + + if apply { + let fetched_identity = drive + .fetch_full_identity( + identity.id().to_buffer(), + Some(&transaction), + platform_version, + ) + .expect("should fetch an identity") + .expect("should have an identity"); + assert_eq!(identity, fetched_identity); + } + assert_eq!(fee_result, expected_fee_result); + } +} diff --git a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs index f7562344318..9345a21a5b4 100644 --- a/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/insert/add_new_identity/v0/mod.rs @@ -19,7 +19,7 @@ use dpp::identity::identity_public_key::accessors::v0::{ }; use dpp::version::PlatformVersion; use grovedb::batch::KeyInfoPath; -use grovedb::{EstimatedLayerInformation, TransactionArg}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; use itertools::Itertools; use std::collections::{BTreeSet, HashMap}; @@ -122,8 +122,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags.serialized_size(), } }; @@ -131,7 +131,7 @@ impl Drive { // We insert the identity tree let inserted = self.batch_insert_empty_tree_if_not_exists( PathFixedSizeKey((identity_tree_path, id.to_vec())), - false, + TreeType::NormalTree, Some(&storage_flags), apply_type, transaction, @@ -257,7 +257,7 @@ impl Drive { let mut create_tree_keys_operations = self.create_key_tree_with_keys_operations( id.to_buffer(), public_keys.into_values().collect(), - // if we are a masternode identity, we want to register all keys as non unique + // if we are a masternode identity, we want to register all keys as non-unique is_masternode_identity, &block_info.epoch, estimated_costs_only_with_layer_info, @@ -270,80 +270,3 @@ impl Drive { Ok(batch_operations) } } - -#[cfg(test)] -mod tests { - use crate::util::test_helpers::setup::{setup_drive, setup_drive_with_initial_state_structure}; - use dpp::identity::Identity; - - use dpp::block::block_info::BlockInfo; - use dpp::identity::accessors::IdentityGettersV0; - - use dpp::version::PlatformVersion; - - #[test] - fn test_insert_and_fetch_identity_v0() { - let drive = setup_drive(None); - let platform_version = PlatformVersion::first(); - - let transaction = drive.grove.start_transaction(); - - drive - .create_initial_state_structure(Some(&transaction), platform_version) - .expect("expected to create root tree successfully"); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); - - drive - .add_new_identity_v0( - identity.clone(), - false, - &BlockInfo::default(), - true, - Some(&transaction), - platform_version, - ) - .expect("expected to insert identity"); - - let fetched_identity = drive - .fetch_full_identity( - identity.id().to_buffer(), - Some(&transaction), - platform_version, - ) - .expect("should fetch an identity") - .expect("should have an identity"); - - assert_eq!(identity, fetched_identity); - } - - #[test] - fn test_insert_identity_v0() { - let drive = setup_drive_with_initial_state_structure(None); - - let db_transaction = drive.grove.start_transaction(); - - let platform_version = PlatformVersion::latest(); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); - - drive - .add_new_identity_v0( - identity, - false, - &BlockInfo::default(), - true, - Some(&db_transaction), - platform_version, - ) - .expect("expected to insert identity"); - - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); - } -} diff --git a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs index 75466736bd2..44d104288a5 100644 --- a/packages/rs-drive/src/drive/identity/key/fetch/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/fetch/mod.rs @@ -1027,7 +1027,7 @@ mod tests { #[test] fn test_fetch_all_keys_on_identity() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -1063,7 +1063,7 @@ mod tests { #[test] fn test_fetch_single_identity_key() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); @@ -1103,7 +1103,7 @@ mod tests { #[test] fn test_fetch_multiple_identity_key() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); @@ -1143,7 +1143,7 @@ mod tests { #[test] fn test_fetch_unknown_identity_key_returns_not_found() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); diff --git a/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs index 8ae39f8b345..91fd7fbe21a 100644 --- a/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert/insert_key_searchable_references/v0/mod.rs @@ -16,7 +16,7 @@ use dpp::identity::{IdentityPublicKey, Purpose, SecurityLevel}; use dpp::version::drive_versions::DriveVersion; use grovedb::batch::KeyInfoPath; use grovedb::reference_path::ReferencePathType; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use std::collections::HashMap; impl Drive { @@ -79,8 +79,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: SINGLE_EPOCH_FLAGS_SIZE, } }; diff --git a/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_non_unique_public_key_hash_reference/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_non_unique_public_key_hash_reference/v0/mod.rs index 355d05f34ba..a24e1eea04a 100644 --- a/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_non_unique_public_key_hash_reference/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_non_unique_public_key_hash_reference/v0/mod.rs @@ -7,9 +7,9 @@ use crate::drive::{ use crate::util::type_constants::{DEFAULT_HASH_160_SIZE_U8, DEFAULT_HASH_SIZE_U8}; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -24,7 +24,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(non_unique_key_hashes_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_160_SIZE_U8, NoSumTrees, None), }, @@ -36,7 +36,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(non_unique_key_hashes_sub_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(ESTIMATED_NON_UNIQUE_KEY_DUPLICATES), estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, 0, None), }, diff --git a/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_unique_public_key_hash_reference/v0/mod.rs b/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_unique_public_key_hash_reference/v0/mod.rs index 80a35c46def..db8a337fa48 100644 --- a/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_unique_public_key_hash_reference/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/key/insert_key_hash_identity_reference/estimation_costs/add_estimation_costs_for_insert_unique_public_key_hash_reference/v0/mod.rs @@ -5,7 +5,7 @@ use grovedb::EstimatedLayerCount::PotentiallyAtMaxElements; use grovedb::EstimatedLayerSizes::AllItems; use crate::util::type_constants::{DEFAULT_HASH_160_SIZE_U8, DEFAULT_HASH_SIZE_U32}; -use grovedb::EstimatedLayerInformation; +use grovedb::{EstimatedLayerInformation, TreeType}; use std::collections::HashMap; impl Drive { @@ -18,7 +18,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(unique_key_hashes_path), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems( DEFAULT_HASH_160_SIZE_U8, diff --git a/packages/rs-drive/src/drive/identity/update/mod.rs b/packages/rs-drive/src/drive/identity/update/mod.rs index c846d8d43dd..bffc73961ee 100644 --- a/packages/rs-drive/src/drive/identity/update/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/mod.rs @@ -14,28 +14,89 @@ mod tests { mod add_new_keys_to_identity { use super::*; + use crate::drive::Drive; + use crate::fees::op::LowLevelDriveOperation; use dpp::block::block_info::BlockInfo; use dpp::block::epoch::Epoch; use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; + use rand::prelude::StdRng; + use rand::{Rng, SeedableRng}; + // ------------------------------------------------- + // should_add_one_new_key_to_identity (4 tests) + // ------------------------------------------------- #[test] - fn should_add_one_new_key_to_identity() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_add_one_new_key_to_identity_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 14202000, + processing_fee: 1098260, + ..Default::default() + }; + + do_should_add_one_new_key_to_identity(true, platform_version, expected_fee_result); + } + #[test] + fn should_add_one_new_key_to_identity_first_version_estimated() { let platform_version = PlatformVersion::first(); + // Adjust the expected processing_fee if it differs from "apply = true" + // or as needed for your scenario + let expected_fee_result = FeeResult { + storage_fee: 17145000, + processing_fee: 5483620, + ..Default::default() + }; + + do_should_add_one_new_key_to_identity(false, platform_version, expected_fee_result); + } + + #[test] + fn should_add_one_new_key_to_identity_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 14202000, + // 2 extra loaded bytes because the token tree is no longer empty + // these 2 loaded bytes cost 20 credits each + processing_fee: 1098300, + ..Default::default() + }; + + do_should_add_one_new_key_to_identity(true, platform_version, expected_fee_result); + } + + #[test] + fn should_add_one_new_key_to_identity_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 17145000, + processing_fee: 5483620, + ..Default::default() + }; + + do_should_add_one_new_key_to_identity(false, platform_version, expected_fee_result); + } + + fn do_should_add_one_new_key_to_identity( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(&platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + // We assume the user wants to apply or just estimate for adding identity drive .add_new_identity( identity.clone(), false, &block, - true, + apply, None, platform_version, ) @@ -51,39 +112,97 @@ mod tests { identity.id().to_buffer(), new_keys_to_add, &block, - true, + apply, Some(&db_transaction), platform_version, ) .expect("expected to update identity with new keys"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 14202000, - processing_fee: 1098260, - ..Default::default() - } - ); + assert_eq!(fee_result, expected_fee_result); + + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let identity_keys = drive + .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) + .expect("expected to get keys"); + assert_eq!(identity_keys.len(), 6); // we had 5 keys and we added 1 + } else { + // Not applying -> no commit. We can check root hash if we want + let app_hash_after = drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should return app hash"); + // Or any other logic to ensure no state changes actually took effect + let _ = app_hash_after; + } + } - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); + // ------------------------------------------------- + // check_reference_below_tokens_cost (4 tests) + // This test exists to make sure the update cost that goes through the tokens tree + // (as key hash references are below the token tree) + // stay the same cost. + // ------------------------------------------------- + #[test] + fn check_reference_below_tokens_cost_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 9423000, + processing_fee: 406100, + ..Default::default() + }; + do_check_reference_below_tokens_cost(true, platform_version, expected_fee_result); + } - let identity_keys = drive - .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) - .expect("expected to get balance"); + #[test] + fn check_reference_below_tokens_cost_first_version_estimated() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 9423000, + processing_fee: 314560, + ..Default::default() + }; + do_check_reference_below_tokens_cost(false, platform_version, expected_fee_result); + } - assert_eq!(identity_keys.len(), 6); // we had 5 keys and we added 1 + #[test] + fn check_reference_below_tokens_cost_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 9423000, + // 2 extra loaded bytes because the token tree is no longer empty + // these 2 loaded bytes cost 20 credits each + processing_fee: 406140, + ..Default::default() + }; + do_check_reference_below_tokens_cost(true, platform_version, expected_fee_result); } #[test] - fn should_add_two_dozen_new_keys_to_identity() { - let drive = setup_drive_with_initial_state_structure(None); + fn check_reference_below_tokens_cost_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 9423000, + // 2 extra loaded bytes because the token tree is no longer empty + // these 2 loaded bytes cost 20 credits each + processing_fee: 314600, + ..Default::default() + }; + do_check_reference_below_tokens_cost(false, platform_version, expected_fee_result); + } - let platform_version = PlatformVersion::first(); + fn do_check_reference_below_tokens_cost( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); @@ -95,97 +214,186 @@ mod tests { identity.clone(), false, &block, - true, + apply, None, platform_version, ) .expect("expected to insert identity"); - let new_keys_to_add = - IdentityPublicKey::random_authentication_keys(5, 24, Some(15), platform_version); + IdentityPublicKey::random_authentication_keys(5, 1, Some(15), platform_version); + + let mut rng = StdRng::seed_from_u64(23450); let db_transaction = drive.grove.start_transaction(); - let fee_result = drive - .add_new_unique_keys_to_identity( + let batch_operations = drive + .insert_non_unique_public_key_hash_reference_to_identity_operations( identity.id().to_buffer(), - new_keys_to_add, - &block, - true, + rng.gen(), + &mut None, Some(&db_transaction), - platform_version, + &platform_version.drive, ) .expect("expected to update identity with new keys"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 347382000, - processing_fee: 6819220, - ..Default::default() - } - ); - + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); + .apply_batch_low_level_drive_operations( + None, + Some(&db_transaction), + batch_operations, + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to apply operations"); + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &Epoch::new(0).unwrap(), + drive.config.epochs_per_era, + platform_version, + None, + ) + .expect("expected fee result"); + + assert_eq!(fee_result, expected_fee_result); + + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + } else { + // Not applying -> no commit + } + } - let identity_keys = drive - .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) - .expect("expected to get balance"); + // ------------------------------------------------- + // should_add_two_dozen_new_keys_to_identity (4 tests) + // ------------------------------------------------- + #[test] + fn should_add_two_dozen_new_keys_to_identity_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 347382000, + processing_fee: 6819220, + ..Default::default() + }; + + do_should_add_two_dozen_new_keys_to_identity( + true, + platform_version, + expected_fee_result, + ); + } + + #[test] + fn should_add_two_dozen_new_keys_to_identity_first_version_estimated() { + let platform_version = PlatformVersion::first(); + // Possibly different processing fee if "estimated" differs + let expected_fee_result = FeeResult { + storage_fee: 356211000, + processing_fee: 11699520, + ..Default::default() + }; + + do_should_add_two_dozen_new_keys_to_identity( + false, + platform_version, + expected_fee_result, + ); + } - assert_eq!(identity_keys.len(), 29); // we had 5 keys and we added 24 + #[test] + fn should_add_two_dozen_new_keys_to_identity_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 347382000, + processing_fee: 6819260, + ..Default::default() + }; + + do_should_add_two_dozen_new_keys_to_identity( + true, + platform_version, + expected_fee_result, + ); } #[test] - fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_add_two_dozen_new_keys_to_identity_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 356211000, + processing_fee: 11699520, + ..Default::default() + }; + + do_should_add_two_dozen_new_keys_to_identity( + false, + platform_version, + expected_fee_result, + ); + } - let platform_version = PlatformVersion::first(); + fn do_should_add_two_dozen_new_keys_to_identity( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(&platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + drive + .add_new_identity( + identity.clone(), + false, + &block, + apply, + None, + platform_version, + ) + .expect("expected to insert identity"); + let new_keys_to_add = - IdentityPublicKey::random_authentication_keys(5, 1, Some(15), platform_version); + IdentityPublicKey::random_authentication_keys(5, 24, Some(15), platform_version); - let app_hash_before = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); + let db_transaction = drive.grove.start_transaction(); let fee_result = drive .add_new_unique_keys_to_identity( identity.id().to_buffer(), new_keys_to_add, &block, - false, - None, + apply, + Some(&db_transaction), platform_version, ) .expect("expected to update identity with new keys"); - let app_hash_after = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); + assert_eq!(fee_result, expected_fee_result); - assert_eq!(app_hash_after, app_hash_before); + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 17145000, - processing_fee: 5483620, - ..Default::default() - } - ); + let identity_keys = drive + .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) + .expect("expected to get balance"); + + assert_eq!(identity_keys.len(), 29); // we had 5 keys, added 24 + } else { + // Not applying => no commit + } } } @@ -198,11 +406,59 @@ mod tests { use dpp::identity::identity_public_key::accessors::v0::IdentityPublicKeyGettersV0; use dpp::version::PlatformVersion; + // ------------------------------------------------- + // should_disable_a_few_keys (4 tests) + // ------------------------------------------------- #[test] - fn should_disable_a_few_keys() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_disable_a_few_keys_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 513000, + processing_fee: 869380, + ..Default::default() + }; + do_should_disable_a_few_keys(true, platform_version, expected_fee_result); + } + #[test] + fn should_disable_a_few_keys_first_version_estimated() { let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 3216860, + ..Default::default() + }; + do_should_disable_a_few_keys(false, platform_version, expected_fee_result); + } + + #[test] + fn should_disable_a_few_keys_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 513000, + processing_fee: 869380, + ..Default::default() + }; + do_should_disable_a_few_keys(true, platform_version, expected_fee_result); + } + + #[test] + fn should_disable_a_few_keys_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 3216860, + ..Default::default() + }; + do_should_disable_a_few_keys(false, platform_version, expected_fee_result); + } + + fn do_should_disable_a_few_keys( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(&platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); @@ -245,92 +501,78 @@ mod tests { key_ids, disable_at, &block_info, - true, + apply, Some(&db_transaction), platform_version, ) .expect("should disable a few keys"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 513000, - processing_fee: 869380, - ..Default::default() - } - ); + assert_eq!(fee_result, expected_fee_result); - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to commit transaction"); - let identity_keys = drive - .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) - .expect("expected to get balance"); + let identity_keys = drive + .fetch_all_identity_keys(identity.id().to_buffer(), None, platform_version) + .expect("expected to get balance"); - assert_eq!(identity_keys.len(), 7); // we had 5 keys and we added 2 - - for (_, key) in identity_keys.into_iter().skip(5) { - assert_eq!(key.disabled_at(), Some(disable_at)); + assert_eq!(identity_keys.len(), 7); // we had 5 keys and we added 2 + for (_, key) in identity_keys.into_iter().skip(5) { + assert_eq!(key.disabled_at(), Some(disable_at)); + } } } #[test] - fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(None); - + fn estimated_costs_should_have_same_storage_cost_first_version() { let platform_version = PlatformVersion::first(); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); - - let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); - - let disable_at = Utc::now().timestamp_millis() as TimestampMillis; - - let app_hash_before = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - let fee_result = drive - .disable_identity_keys( - identity.id().to_buffer(), - vec![0, 1], - disable_at, - &block_info, - false, - None, - platform_version, - ) - .expect("should estimate the disabling of a few keys"); - - let app_hash_after = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - assert_eq!(app_hash_after, app_hash_before); - - assert_eq!( - fee_result, - FeeResult { - storage_fee: 486000, - processing_fee: 3216860, - ..Default::default() - } + let expected_estimated_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 3216860, + ..Default::default() + }; + let expected_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 794720, + ..Default::default() + }; + estimated_costs_should_have_same_storage_cost( + platform_version, + expected_estimated_fee_result, + expected_fee_result, ); } #[test] - fn estimated_costs_should_have_same_storage_cost() { - let drive = setup_drive_with_initial_state_structure(None); + fn estimated_costs_should_have_same_storage_cost_latest_version() { + let platform_version = PlatformVersion::latest(); + let expected_estimated_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 3216860, + ..Default::default() + }; + let expected_fee_result = FeeResult { + storage_fee: 486000, + processing_fee: 794720, + ..Default::default() + }; + estimated_costs_should_have_same_storage_cost( + platform_version, + expected_estimated_fee_result, + expected_fee_result, + ); + } - let platform_version = PlatformVersion::first(); + fn estimated_costs_should_have_same_storage_cost( + platform_version: &PlatformVersion, + expected_estimated_fee_result: FeeResult, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(&platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); @@ -350,7 +592,7 @@ mod tests { let disable_at = Utc::now().timestamp_millis() as TimestampMillis; - let expected_fee_result = drive + let estimated_fee_result = drive .disable_identity_keys( identity.id().to_buffer(), vec![0, 1], @@ -374,7 +616,9 @@ mod tests { ) .expect("should get the cost of the disabling a few keys"); - assert_eq!(expected_fee_result.storage_fee, fee_result.storage_fee); + assert_eq!(estimated_fee_result.storage_fee, fee_result.storage_fee); + assert_eq!(estimated_fee_result, expected_estimated_fee_result); + assert_eq!(fee_result, expected_fee_result); } } @@ -385,27 +629,87 @@ mod tests { use dpp::fee::fee_result::FeeResult; use dpp::version::PlatformVersion; + // ------------------------------------------------- + // should_update_revision (4 tests) + // ------------------------------------------------- #[test] - fn should_update_revision() { - let drive = setup_drive_with_initial_state_structure(None); + fn should_update_revision_first_version_apply() { + let platform_version = PlatformVersion::first(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 238820, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_update_revision(true, platform_version, expected_fee_result); + } + #[test] + fn should_update_revision_first_version_estimated() { let platform_version = PlatformVersion::first(); + // Possibly different if your scenario's estimated cost differs + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 1813560, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_update_revision(false, platform_version, expected_fee_result); + } + + #[test] + fn should_update_revision_latest_version_apply() { + let platform_version = PlatformVersion::latest(); + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 238820, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_update_revision(true, platform_version, expected_fee_result); + } + + #[test] + fn should_update_revision_latest_version_estimated() { + let platform_version = PlatformVersion::latest(); + // Possibly different if your scenario's estimated cost differs + let expected_fee_result = FeeResult { + storage_fee: 0, + processing_fee: 1813560, + removed_bytes_from_system: 0, + ..Default::default() + }; + + do_should_update_revision(false, platform_version, expected_fee_result); + } + + fn do_should_update_revision( + apply: bool, + platform_version: &PlatformVersion, + expected_fee_result: FeeResult, + ) { + let drive = setup_drive_with_initial_state_structure(Some(&platform_version)); let identity = Identity::random_identity(5, Some(12345), platform_version) .expect("expected a random identity"); let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + // Insert identity drive .add_new_identity( identity.clone(), false, &block_info, - true, + apply, None, platform_version, ) .expect("expected to insert identity"); + // We'll update the revision from 0 -> 2 let revision = 2; let db_transaction = drive.grove.start_transaction(); @@ -415,84 +719,35 @@ mod tests { identity.id().to_buffer(), revision, &block_info, - true, + apply, Some(&db_transaction), platform_version, None, ) .expect("should update revision"); - assert_eq!( - fee_result, - FeeResult { - storage_fee: 0, - processing_fee: 238820, - removed_bytes_from_system: 0, - ..Default::default() - } - ); - - drive - .grove - .commit_transaction(db_transaction) - .unwrap() - .expect("expected to be able to commit a transaction"); - - let updated_revision = drive - .fetch_identity_revision(identity.id().to_buffer(), true, None, platform_version) - .expect("expected to get revision"); - - assert_eq!(updated_revision, Some(revision)); - } - - #[test] - fn should_estimated_costs_without_state() { - let drive = setup_drive_with_initial_state_structure(None); - - let platform_version = PlatformVersion::first(); - - let identity = Identity::random_identity(5, Some(12345), platform_version) - .expect("expected a random identity"); - - let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); - - let revision = 2; - - let app_hash_before = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - let fee_result = drive - .update_identity_revision( - identity.id().to_buffer(), - revision, - &block_info, - false, - None, - platform_version, - None, - ) - .expect("should estimate the revision update"); - - let app_hash_after = drive - .grove - .root_hash(None, &platform_version.drive.grove_version) - .unwrap() - .expect("should return app hash"); - - assert_eq!(app_hash_after, app_hash_before); - - assert_eq!( - fee_result, - FeeResult { - storage_fee: 0, - processing_fee: 1813560, - removed_bytes_from_system: 0, - ..Default::default() - } - ); + assert_eq!(fee_result, expected_fee_result); + + if apply { + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + // check new revision + let updated_revision = drive + .fetch_identity_revision( + identity.id().to_buffer(), + true, + None, + platform_version, + ) + .expect("expected to get revision"); + assert_eq!(updated_revision, Some(revision)); + } else { + // No commit => no changes + } } } } diff --git a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs index dcca501abd8..5bc218428df 100644 --- a/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/identity/update/operations/merge_identity_nonce_operations/v0/mod.rs @@ -177,7 +177,7 @@ mod tests { use platform_version::version::PlatformVersion; fn setup_base_test() -> (Drive, Identity) { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::first(); diff --git a/packages/rs-drive/src/drive/initialization/mod.rs b/packages/rs-drive/src/drive/initialization/mod.rs index 97159a53ba9..2c673b90243 100644 --- a/packages/rs-drive/src/drive/initialization/mod.rs +++ b/packages/rs-drive/src/drive/initialization/mod.rs @@ -2,6 +2,7 @@ mod genesis_core_height; mod v0; +mod v1; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -24,9 +25,10 @@ impl Drive { .create_initial_state_structure { 0 => self.create_initial_state_structure_0(transaction, platform_version), + 1 => self.create_initial_state_structure_1(transaction, platform_version), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "create_initial_state_structure".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive/src/drive/initialization/v0/mod.rs b/packages/rs-drive/src/drive/initialization/v0/mod.rs index ff30075d680..681a9f45d1c 100644 --- a/packages/rs-drive/src/drive/initialization/v0/mod.rs +++ b/packages/rs-drive/src/drive/initialization/v0/mod.rs @@ -20,6 +20,25 @@ impl Drive { &self, transaction: TransactionArg, platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let drive_version = &platform_version.drive; + self.create_initial_state_structure_top_level_0(transaction, platform_version)?; + + // On lower layers we can use batching + + let batch = + self.create_initial_state_structure_lower_layers_operations_0(platform_version)?; + + self.grove_apply_batch(batch, false, transaction, drive_version)?; + + Ok(()) + } + + /// Creates the initial state structure. + pub(in crate::drive::initialization) fn create_initial_state_structure_top_level_0( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, ) -> Result<(), Error> { let drive_version = &platform_version.drive; // We can not use batching to insert the root tree structure @@ -61,7 +80,7 @@ impl Drive { self.grove_insert_empty_tree( SubtreePath::empty(), - &[RootTree::TokenBalances as u8], + &[RootTree::Tokens as u8], transaction, None, &mut drive_operations, @@ -151,6 +170,14 @@ impl Drive { drive_version, )?; + Ok(()) + } + + /// Creates the initial state structure. + pub(in crate::drive::initialization) fn create_initial_state_structure_lower_layers_operations_0( + &self, + platform_version: &PlatformVersion, + ) -> Result<GroveDbOpBatch, Error> { // On lower layers we can use batching let mut batch = GroveDbOpBatch::new(); @@ -181,9 +208,7 @@ impl Drive { // For the votes tree structure Drive::add_initial_vote_tree_main_structure_operations(&mut batch, platform_version)?; - self.grove_apply_batch(batch, false, transaction, drive_version)?; - - Ok(()) + Ok(batch) } } @@ -198,10 +223,9 @@ mod tests { use grovedb::{PathQuery, Query, SizedQuery}; #[test] - fn test_create_initial_state_structure() { - let drive = setup_drive_with_initial_state_structure(None); - - let platform_version = PlatformVersion::latest(); + fn test_create_initial_state_structure_in_first_protocol_version() { + let platform_version = PlatformVersion::first(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); let mut query = Query::new(); query.insert_all(); @@ -227,12 +251,40 @@ mod tests { } #[test] - fn test_initial_state_structure_proper_heights() { + fn test_create_initial_state_structure_in_latest_protocol_version() { let drive = setup_drive_with_initial_state_structure(None); - let _db_transaction = drive.grove.start_transaction(); - let platform_version = PlatformVersion::latest(); + + let mut query = Query::new(); + query.insert_all(); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let (elements, _) = drive + .grove_get_raw_path_query( + &root_path_query, + None, + QueryElementResultType, + &mut drive_operations, + &platform_version.drive, + ) + .expect("expected to get root elements"); + assert_eq!(elements.len(), 14); + } + + #[test] + fn test_initial_state_structure_proper_heights_in_first_protocol_version() { + let platform_version = PlatformVersion::first(); + let drive = setup_drive_with_initial_state_structure(Some(platform_version)); + + let platform_version = PlatformVersion::first(); let drive_version = &platform_version.drive; // Merk Level 0 @@ -302,7 +354,7 @@ mod tests { // Merk Level 2 let mut query = Query::new(); - query.insert_key(vec![RootTree::TokenBalances as u8]); + query.insert_key(vec![RootTree::Tokens as u8]); let root_path_query = PathQuery::new( vec![], SizedQuery { @@ -515,4 +567,313 @@ mod tests { .expect("expected to get root elements"); assert_eq!(proof.len(), 250); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent } + + #[test] + fn test_initial_state_structure_proper_heights_in_latest_protocol_version() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + let drive_version = &platform_version.drive; + + // Merk Level 0 + let mut query = Query::new(); + query.insert_key(vec![RootTree::DataContractDocuments as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 112); //it + left + right + + // Merk Level 1 + let mut query = Query::new(); + query.insert_key(vec![RootTree::Identities as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 180); //it + left + right + parent + parent other + + let mut query = Query::new(); + query.insert_key(vec![RootTree::Balances as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 181); //it + left + right + parent + parent other + + // Merk Level 2 + let mut query = Query::new(); + query.insert_key(vec![RootTree::Tokens as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 250); //it + left + right + parent + sibling + parent sibling + grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::Pools as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 218); //it + left + parent + sibling + parent sibling + grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::WithdrawalTransactions as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 250); //it + left + right + parent + sibling + parent sibling + grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::Votes as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 250); //it + left + right + parent + sibling + parent sibling + grandparent + + // Merk Level 3 + + let mut query = Query::new(); + query.insert_key(vec![RootTree::UniquePublicKeyHashesToIdentities as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 248); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![ + RootTree::NonUniquePublicKeyKeyHashesToIdentities as u8, + ]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 248); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::PreFundedSpecializedBalances as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 217); //it + parent + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::SpentAssetLockTransactions as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 248); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::GroupActions as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 248); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::Misc as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 250); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + + let mut query = Query::new(); + query.insert_key(vec![RootTree::Versions as u8]); + let root_path_query = PathQuery::new( + vec![], + SizedQuery { + query, + limit: None, + offset: None, + }, + ); + let mut drive_operations = vec![]; + let proof = drive + .grove_get_proved_path_query( + &root_path_query, + None, + &mut drive_operations, + drive_version, + ) + .expect("expected to get root elements"); + assert_eq!(proof.len(), 250); //it + parent + sibling + parent sibling + grandparent + grandparent sibling + great-grandparent + } } diff --git a/packages/rs-drive/src/drive/initialization/v1/mod.rs b/packages/rs-drive/src/drive/initialization/v1/mod.rs new file mode 100644 index 00000000000..9b0b8fad1d8 --- /dev/null +++ b/packages/rs-drive/src/drive/initialization/v1/mod.rs @@ -0,0 +1,135 @@ +//! Drive Initialization + +use crate::drive::balances::TOTAL_TOKEN_SUPPLIES_STORAGE_KEY; +use crate::util::batch::GroveDbOpBatch; + +use crate::drive::system::misc_path_vec; +use crate::drive::tokens::paths::{ + token_distributions_root_path_vec, token_timed_distributions_path_vec, tokens_root_path_vec, + TOKEN_BALANCES_KEY, TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY, TOKEN_DISTRIBUTIONS_KEY, + TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY, TOKEN_IDENTITY_INFO_KEY, TOKEN_MS_TIMED_DISTRIBUTIONS_KEY, + TOKEN_PERPETUAL_DISTRIBUTIONS_KEY, TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY, + TOKEN_STATUS_INFO_KEY, TOKEN_TIMED_DISTRIBUTIONS_KEY, +}; +use crate::drive::{Drive, RootTree}; +use crate::error::Error; +use crate::util::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; +use dpp::version::PlatformVersion; +use grovedb::{Element, TransactionArg}; +use grovedb_path::SubtreePath; + +impl Drive { + /// Creates the initial state structure. + pub(super) fn create_initial_state_structure_1( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let drive_version = &platform_version.drive; + self.create_initial_state_structure_top_level_0(transaction, platform_version)?; + + self.grove_insert_empty_tree( + SubtreePath::empty(), + &[RootTree::GroupActions as u8], + transaction, + None, + &mut vec![], + drive_version, + )?; + + // On lower layers we can use batching + + let mut batch = + self.create_initial_state_structure_lower_layers_operations_0(platform_version)?; + + self.initial_state_structure_lower_layers_add_operations_1(&mut batch, platform_version)?; + + self.grove_apply_batch(batch, false, transaction, drive_version)?; + + Ok(()) + } + + /// Creates the initial state structure. + pub(in crate::drive::initialization) fn initial_state_structure_lower_layers_add_operations_1( + &self, + batch: &mut GroveDbOpBatch, + _platform_version: &PlatformVersion, + ) -> Result<(), Error> { + // In Misc + batch.add_insert( + misc_path_vec(), + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY.to_vec(), + Element::empty_big_sum_tree(), + ); + + let tokens_root_path = tokens_root_path_vec(); + + batch.add_insert( + tokens_root_path.clone(), + vec![TOKEN_BALANCES_KEY], + Element::empty_big_sum_tree(), + ); + + batch.add_insert( + tokens_root_path.clone(), + vec![TOKEN_IDENTITY_INFO_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + tokens_root_path.clone(), + vec![TOKEN_STATUS_INFO_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + tokens_root_path, + vec![TOKEN_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + // Token Distributions Subtree + let token_distributions_path = token_distributions_root_path_vec(); + + batch.add_insert( + token_distributions_path.clone(), + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + token_distributions_path.clone(), + vec![TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + token_distributions_path, + vec![TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + // Token Timed Distributions Subtree + let token_timed_distributions_path = token_timed_distributions_path_vec(); + + batch.add_insert( + token_timed_distributions_path.clone(), + vec![TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + token_timed_distributions_path.clone(), + vec![TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + batch.add_insert( + token_timed_distributions_path, + vec![TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + Element::empty_tree(), + ); + + Ok(()) + } +} diff --git a/packages/rs-drive/src/drive/mod.rs b/packages/rs-drive/src/drive/mod.rs index fc28c49647a..ce1fb9a74e5 100644 --- a/packages/rs-drive/src/drive/mod.rs +++ b/packages/rs-drive/src/drive/mod.rs @@ -42,15 +42,25 @@ pub mod system; mod asset_lock; #[cfg(feature = "server")] mod platform_state; -pub(crate) mod prefunded_specialized_balances; + +/// Prefunded specialized balances module +#[cfg(any(feature = "server", feature = "verify"))] +pub mod prefunded_specialized_balances; /// Vote module #[cfg(any(feature = "server", feature = "verify"))] pub mod votes; +/// Group module +#[cfg(any(feature = "server", feature = "verify"))] +pub mod group; #[cfg(feature = "server")] mod shared; +/// Token module +#[cfg(any(feature = "server", feature = "verify"))] +pub mod tokens; + #[cfg(feature = "server")] use crate::cache::DriveCache; use crate::error::drive::DriveError; @@ -78,10 +88,10 @@ pub struct Drive { // DataContract_Documents 64 // / \ // Identities 32 Balances 96 -// / \ / \ -// Token_Balances 16 Pools 48 WithdrawalTransactions 80 Votes 112 -// / \ / \ / / \ -// NUPKH->I 8 UPKH->I 24 PreFundedSpecializedBalances 40 Masternode Lists 56 (reserved) SpentAssetLockTransactions 72 Misc 104 Versions 120 +// / \ / \ +// Token_Balances 16 Pools 48 WithdrawalTransactions 80 Votes 112 +// / \ / \ / \ / \ +// NUPKH->I 8 UPKH->I 24 PreFundedSpecializedBalances 40 Masternode Lists 56 (reserved) SpentAssetLockTransactions 72 GroupActions 88 Misc 104 Versions 120 /// Keys for the root tree. #[cfg(any(feature = "server", feature = "verify"))] @@ -112,12 +122,14 @@ pub enum RootTree { WithdrawalTransactions = 80, /// Balances (For identities) Balances = 96, - /// Token Balances - TokenBalances = 16, + /// Token Balances and Info + Tokens = 16, /// Versions desired by proposers Versions = 120, /// Registered votes Votes = 112, + /// Group actions + GroupActions = 88, } #[cfg(any(feature = "server", feature = "verify"))] @@ -137,9 +149,10 @@ impl fmt::Display for RootTree { RootTree::Misc => "Misc", RootTree::WithdrawalTransactions => "WithdrawalTransactions", RootTree::Balances => "Balances", - RootTree::TokenBalances => "TokenBalances", + RootTree::Tokens => "TokenBalances", RootTree::Versions => "Versions", RootTree::Votes => "Votes", + RootTree::GroupActions => "GroupActions", }; write!(f, "{}", variant_name) } @@ -180,7 +193,7 @@ impl TryFrom<u8> for RootTree { 104 => Ok(RootTree::Misc), 80 => Ok(RootTree::WithdrawalTransactions), 96 => Ok(RootTree::Balances), - 16 => Ok(RootTree::TokenBalances), + 16 => Ok(RootTree::Tokens), 120 => Ok(RootTree::Versions), 112 => Ok(RootTree::Votes), _ => Err(Error::Drive(DriveError::NotSupported( @@ -204,10 +217,11 @@ impl From<RootTree> for &'static [u8; 1] { RootTree::Misc => &[104], RootTree::WithdrawalTransactions => &[80], RootTree::Balances => &[96], - RootTree::TokenBalances => &[16], + RootTree::Tokens => &[16], RootTree::NonUniquePublicKeyKeyHashesToIdentities => &[8], RootTree::Versions => &[120], RootTree::Votes => &[112], + RootTree::GroupActions => &[88], } } } diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/mod.rs index 18fd27d1039..4a02d9e9c67 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -50,9 +51,16 @@ impl Drive { transaction, platform_version, ), + 1 => self.add_prefunded_specialized_balance_operations_v1( + specialized_balance_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "add_prefunded_specialized_balance_operations".to_string(), - known_versions: vec![0], + known_versions: vec![0, 1], received: version, })), } diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/v1/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/v1/mod.rs new file mode 100644 index 00000000000..e691b12efe6 --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/add_prefunded_specialized_balance_operations/v1/mod.rs @@ -0,0 +1,91 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::DirectQueryType; + +use crate::drive::prefunded_specialized_balances::{ + prefunded_specialized_balances_for_voting_path, + prefunded_specialized_balances_for_voting_path_vec, +}; +use crate::error::identity::IdentityError; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::balances::credits::MAX_CREDITS; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::batch::{KeyInfoPath, QualifiedGroveDbOp}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// The operations to add to the specialized balance + #[inline(always)] + pub(super) fn add_prefunded_specialized_balance_operations_v1( + &self, + specialized_balance_id: Identifier, + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_prefunded_specialized_balance_update( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::SumTree, + query_target: QueryTargetValue(8), + } + }; + + let path_holding_specialized_balances = prefunded_specialized_balances_for_voting_path(); + let previous_credits_in_specialized_balance = self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_specialized_balances).into(), + specialized_balance_id.as_slice(), + direct_query_type, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + let had_previous_balance = previous_credits_in_specialized_balance.is_some(); + let new_total = previous_credits_in_specialized_balance + .unwrap_or_default() + .checked_add(amount) + .ok_or(Error::Drive(DriveError::CriticalCorruptedState( + "trying to add an amount that would overflow credits", + )))?; + // while i64::MAX could potentially work, best to avoid it. + if new_total >= MAX_CREDITS { + return Err(Error::Identity(IdentityError::CriticalBalanceOverflow( + "trying to set prefunded specialized balance to over max credits amount (i64::MAX)", + ))); + }; + let path_holding_total_credits_vec = prefunded_specialized_balances_for_voting_path_vec(); + let op = if had_previous_balance { + QualifiedGroveDbOp::replace_op( + path_holding_total_credits_vec, + specialized_balance_id.to_vec(), + Element::new_sum_item(new_total as i64), + ) + } else { + QualifiedGroveDbOp::insert_or_replace_op( + path_holding_total_credits_vec, + specialized_balance_id.to_vec(), + Element::new_sum_item(new_total as i64), + ) + }; + drive_operations.push(GroveOperation(op)); + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/mod.rs index d294ec90872..aef16a0cb53 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/mod.rs @@ -1,4 +1,5 @@ mod v0; +mod v1; use crate::drive::Drive; use crate::error::drive::DriveError; @@ -50,6 +51,13 @@ impl Drive { transaction, platform_version, ), + 1 => self.deduct_from_prefunded_specialized_balance_operations_v1( + specialized_balance_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), version => Err(Error::Drive(DriveError::UnknownVersionMismatch { method: "deduct_from_prefunded_specialized_balance_operations".to_string(), known_versions: vec![0], diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/v1/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/v1/mod.rs new file mode 100644 index 00000000000..e059985c0fe --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/deduct_from_prefunded_specialized_balance_operations/v1/mod.rs @@ -0,0 +1,91 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::DirectQueryType; + +use crate::drive::prefunded_specialized_balances::{ + prefunded_specialized_balances_for_voting_path, + prefunded_specialized_balances_for_voting_path_vec, +}; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::batch::{KeyInfoPath, QualifiedGroveDbOp}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// The operations to add to the specialized balance + #[inline(always)] + pub(super) fn deduct_from_prefunded_specialized_balance_operations_v1( + &self, + specialized_balance_id: Identifier, + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_prefunded_specialized_balance_update( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::SumTree, + query_target: QueryTargetValue(8), + } + }; + + let path_holding_specialized_balances = prefunded_specialized_balances_for_voting_path(); + let previous_credits_in_specialized_balance = match self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_specialized_balances).into(), + specialized_balance_id.as_slice(), + direct_query_type, + transaction, + &mut drive_operations, + &platform_version.drive, + )? { + None => { + if estimated_costs_only_with_layer_info.is_none() { + return + Err(Error::Drive( + DriveError::PrefundedSpecializedBalanceDoesNotExist(format!( + "trying to deduct from a prefunded specialized balance {} that does not exist", + specialized_balance_id + )), + )); + } else { + i64::MAX as u64 + } + } + Some(value) => value, + }; + let new_total = previous_credits_in_specialized_balance + .checked_sub(amount) + .ok_or(Error::Drive( + DriveError::PrefundedSpecializedBalanceNotEnough( + previous_credits_in_specialized_balance, + amount, + ), + ))?; + let path_holding_total_credits_vec = prefunded_specialized_balances_for_voting_path_vec(); + let replace_op = QualifiedGroveDbOp::replace_op( + path_holding_total_credits_vec, + specialized_balance_id.to_vec(), + Element::new_sum_item(new_total as i64), + ); + drive_operations.push(GroveOperation(replace_op)); + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/mod.rs new file mode 100644 index 00000000000..acf43841664 --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/mod.rs @@ -0,0 +1,53 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; + +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Empties from a prefunded specialized balance the entire left over balance + /// + /// # Arguments + /// + /// * `transaction` - A `TransactionArg` object representing the transaction to be used for adding to the system credits. + /// * `platform_version` - A `PlatformVersion` object specifying the version of Platform. + /// + /// # Returns + /// + /// * `Result<(), Error>` - If successful, returns `Ok(())`. If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of Platform is unknown. + pub fn empty_prefunded_specialized_balance( + &self, + specialized_balance_id: Identifier, + error_if_does_not_exist: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Credits, Error> { + match platform_version + .drive + .methods + .prefunded_specialized_balances + .empty_prefunded_specialized_balance + { + 0 => self.empty_prefunded_specialized_balance_v0( + specialized_balance_id, + error_if_does_not_exist, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "empty_prefunded_specialized_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/v0/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/v0/mod.rs new file mode 100644 index 00000000000..4e46151f5f3 --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance/v0/mod.rs @@ -0,0 +1,52 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; + +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Empties the prefunded specialized balance + /// + /// # Arguments + /// + /// * `transaction` - A `TransactionArg` object representing the transaction to be used for adding to the system credits. + /// * `platform_version` - A `PlatformVersion` object specifying the version of Platform. + /// + /// # Returns + /// + /// * `Result<(), Error>` - If successful, returns `Ok(())`. If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of Platform is unknown. + #[inline(always)] + pub(super) fn empty_prefunded_specialized_balance_v0( + &self, + specialized_balance_id: Identifier, + error_if_does_not_exist: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Credits, Error> { + let mut drive_operations = vec![]; + let (credits, batch_operations) = self.empty_prefunded_specialized_balance_operations( + specialized_balance_id, + error_if_does_not_exist, + &mut None, + transaction, + platform_version, + )?; + let grove_db_operations = + LowLevelDriveOperation::grovedb_operations_batch(&batch_operations); + self.grove_apply_batch_with_add_costs( + grove_db_operations, + false, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + Ok(credits) + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/mod.rs new file mode 100644 index 00000000000..d7562fac85c --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/mod.rs @@ -0,0 +1,60 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use grovedb::batch::KeyInfoPath; +use std::collections::HashMap; + +use crate::fees::op::LowLevelDriveOperation; +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::{EstimatedLayerInformation, TransactionArg}; + +impl Drive { + /// The operation Deducts from a prefunded specialized balance it's entire amount + /// + /// # Arguments + /// + /// * `transaction` - A `TransactionArg` object representing the transaction to be used for adding to the system credits. + /// * `platform_version` - A `PlatformVersion` object specifying the version of Platform. + /// + /// # Returns + /// + /// * `Result<(), Error>` - If successful, returns `Ok(())`. If an error occurs during the operation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of Platform is unknown. + pub fn empty_prefunded_specialized_balance_operations( + &self, + specialized_balance_id: Identifier, + error_if_does_not_exist: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Credits, Vec<LowLevelDriveOperation>), Error> { + match platform_version + .drive + .methods + .prefunded_specialized_balances + .empty_prefunded_specialized_balance + { + 0 => self.empty_prefunded_specialized_balance_operations_v0( + specialized_balance_id, + error_if_does_not_exist, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "empty_prefunded_specialized_balance_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/v0/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/v0/mod.rs new file mode 100644 index 00000000000..d0959b40715 --- /dev/null +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/empty_prefunded_specialized_balance_operations/v0/mod.rs @@ -0,0 +1,85 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::DirectQueryType; + +use crate::drive::prefunded_specialized_balances::{ + prefunded_specialized_balances_for_voting_path, + prefunded_specialized_balances_for_voting_path_vec, +}; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::batch::{KeyInfoPath, QualifiedGroveDbOp}; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// The operations to add to the specialized balance + #[inline(always)] + pub(super) fn empty_prefunded_specialized_balance_operations_v0( + &self, + specialized_balance_id: Identifier, + error_if_does_not_exist: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Credits, Vec<LowLevelDriveOperation>), Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_prefunded_specialized_balance_update( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::SumTree, + query_target: QueryTargetValue(8), + } + }; + + let path_holding_specialized_balances = prefunded_specialized_balances_for_voting_path(); + let previous_credits_in_specialized_balance = match self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_specialized_balances).into(), + specialized_balance_id.as_slice(), + direct_query_type, + transaction, + &mut drive_operations, + &platform_version.drive, + )? { + None => { + if estimated_costs_only_with_layer_info.is_none() { + return if error_if_does_not_exist { + Err(Error::Drive( + DriveError::PrefundedSpecializedBalanceDoesNotExist(format!( + "trying to deduct from a prefunded specialized balance {} that does not exist", + specialized_balance_id + )), + )) + } else { + Ok((0, drive_operations)) + }; + } else { + 0 + } + } + Some(value) => value, + }; + let path_holding_total_credits_vec = prefunded_specialized_balances_for_voting_path_vec(); + let delete_op = QualifiedGroveDbOp::delete_op( + path_holding_total_credits_vec, + specialized_balance_id.to_vec(), + ); + drive_operations.push(GroveOperation(delete_op)); + Ok((previous_credits_in_specialized_balance, drive_operations)) + } +} diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/estimation_costs/for_prefunded_specialized_balance_update/v0/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/estimation_costs/for_prefunded_specialized_balance_update/v0/mod.rs index 3400c9e6a43..5e7925cf1d7 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/estimation_costs/for_prefunded_specialized_balance_update/v0/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/estimation_costs/for_prefunded_specialized_balance_update/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::constants::AVERAGE_BALANCE_SIZE; use crate::drive::prefunded_specialized_balances::{ @@ -28,13 +28,16 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // We are on the 3rd level estimated_layer_count: EstimatedLevel(3, false), estimated_layer_sizes: AllSubtrees( 1, SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 1, }, None, @@ -45,7 +48,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(prefunded_specialized_balances_path()), EstimatedLayerInformation { - is_sum_tree: true, + tree_type: TreeType::SumTree, estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, AllSumTrees, None), }, @@ -54,7 +57,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(prefunded_specialized_balances_for_voting_path_vec()), EstimatedLayerInformation { - is_sum_tree: true, + tree_type: TreeType::SumTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, AVERAGE_BALANCE_SIZE, None), }, diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs index 54c2fd9690f..134a05f582f 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/fetch/single_balance/v0/mod.rs @@ -11,7 +11,7 @@ use dpp::fee::Credits; use crate::drive::prefunded_specialized_balances::prefunded_specialized_balances_for_voting_path; use dpp::version::PlatformVersion; use grovedb::Element::SumItem; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Fetches the Prefunded specialized balance from the backing store @@ -76,7 +76,7 @@ impl Drive { } else { // 8 is the size of a i64 used in sum trees DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: true, + in_tree_type: TreeType::SumTree, query_target: QueryTargetValue(8), } }; diff --git a/packages/rs-drive/src/drive/prefunded_specialized_balances/mod.rs b/packages/rs-drive/src/drive/prefunded_specialized_balances/mod.rs index 215ac249341..ea5656188c2 100644 --- a/packages/rs-drive/src/drive/prefunded_specialized_balances/mod.rs +++ b/packages/rs-drive/src/drive/prefunded_specialized_balances/mod.rs @@ -7,6 +7,10 @@ mod deduct_from_prefunded_specialized_balance; #[cfg(feature = "server")] mod deduct_from_prefunded_specialized_balance_operations; #[cfg(feature = "server")] +mod empty_prefunded_specialized_balance; +#[cfg(feature = "server")] +mod empty_prefunded_specialized_balance_operations; +#[cfg(feature = "server")] mod estimation_costs; #[cfg(feature = "server")] mod fetch; @@ -20,17 +24,18 @@ use crate::util::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; #[cfg(feature = "server")] use crate::util::batch::GroveDbOpBatch; +/// The key for prefunded balances for voting pub const PREFUNDED_BALANCES_FOR_VOTING: u8 = 128; /// prefunded specialized balances for voting -pub(crate) fn prefunded_specialized_balances_path() -> [&'static [u8]; 1] { +pub fn prefunded_specialized_balances_path() -> [&'static [u8]; 1] { [Into::<&[u8; 1]>::into( RootTree::PreFundedSpecializedBalances, )] } /// prefunded specialized balances for voting -pub(crate) fn prefunded_specialized_balances_for_voting_path() -> [&'static [u8]; 2] { +pub fn prefunded_specialized_balances_for_voting_path() -> [&'static [u8]; 2] { [ Into::<&[u8; 1]>::into(RootTree::PreFundedSpecializedBalances), &[PREFUNDED_BALANCES_FOR_VOTING], @@ -38,7 +43,7 @@ pub(crate) fn prefunded_specialized_balances_for_voting_path() -> [&'static [u8] } /// prefunded specialized balances for voting vector -pub(crate) fn prefunded_specialized_balances_for_voting_path_vec() -> Vec<Vec<u8>> { +pub fn prefunded_specialized_balances_for_voting_path_vec() -> Vec<Vec<u8>> { vec![ Into::<&[u8; 1]>::into(RootTree::PreFundedSpecializedBalances).to_vec(), vec![PREFUNDED_BALANCES_FOR_VOTING], diff --git a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs index 6db3de7a093..871e5d7bceb 100644 --- a/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs +++ b/packages/rs-drive/src/drive/protocol_upgrade/remove_validators_proposed_app_versions/v0/mod.rs @@ -14,7 +14,7 @@ use crate::util::batch::grovedb_op_batch::GroveDbOpBatchV0Methods; use dpp::util::deserializer::ProtocolVersion; use dpp::version::drive_versions::DriveVersion; -use grovedb::{Element, TransactionArg}; +use grovedb::{Element, MaybeTree, TransactionArg}; use integer_encoding::VarInt; impl Drive { @@ -121,7 +121,7 @@ impl Drive { (&path).into(), validator_pro_tx_hash.as_slice(), StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, drive_operations, diff --git a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract/v0/mod.rs b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract/v0/mod.rs index 2257bfae60b..32d25eae456 100644 --- a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract/v0/mod.rs @@ -6,8 +6,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::votes::paths::{ vote_contested_resource_active_polls_contract_document_tree_path, @@ -58,13 +58,16 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(2, false), //voting is on level 2 // We have balances in the middle which is a sum tree estimated_layer_sizes: AllSubtrees( 1, SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 2, }, None, @@ -76,7 +79,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_root_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // contested resource tree is a key of "c" so it should be on the top layer of the merk estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), @@ -87,7 +90,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_contested_resource_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // active poll "p", with "e" and "i" first so it should be on the second layer of the merk estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), @@ -98,7 +101,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_contested_resource_active_polls_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -111,7 +114,7 @@ impl Drive { contract.id_ref().as_bytes(), )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(document_type_count), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_DOCUMENT_TYPE_NAME_SIZE, @@ -130,7 +133,7 @@ impl Drive { ), ), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_INDEX_NAME_SIZE, @@ -148,7 +151,7 @@ impl Drive { ), ), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(1024), //Just a guess estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_INDEX_NAME_SIZE, diff --git a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded/v0/mod.rs b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded/v0/mod.rs index 83f8c8dbc50..7dd930ddc67 100644 --- a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded/v0/mod.rs +++ b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded/v0/mod.rs @@ -4,8 +4,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::votes::paths::{ vote_contested_resource_active_polls_contract_tree_path, @@ -49,13 +49,16 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(2, false), //voting is on level 2 // We have balances in the middle which is a sum tree estimated_layer_sizes: AllSubtrees( 1, SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 2, }, None, @@ -67,7 +70,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_root_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // contested resource tree is a key of "c" so it should be on the top layer of the merk estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), @@ -78,8 +81,8 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_contested_resource_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, - // active poll "p", with "e" and "i" first so it should be on the second layer of the merk + tree_type: TreeType::NormalTree, + // active poll "p", with "e" and "i" first, so it should be on the second layer of the merk estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -89,7 +92,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_contested_resource_active_polls_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), }, @@ -102,7 +105,7 @@ impl Drive { contract.id_ref().as_bytes(), )), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(document_type_count), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_DOCUMENT_TYPE_NAME_SIZE, diff --git a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract/v0/mod.rs b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract/v0/mod.rs index 8bae767c7b2..0e6e4630378 100644 --- a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract/v0/mod.rs +++ b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract/v0/mod.rs @@ -5,8 +5,8 @@ use crate::util::storage_flags::StorageFlags; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::contract::paths::all_contracts_global_root_path; @@ -43,7 +43,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(0, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), }, @@ -53,7 +53,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(all_contracts_global_root_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: PotentiallyAtMaxElements, estimated_layer_sizes: AllSubtrees( DEFAULT_HASH_SIZE_U8, diff --git a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract_document_type_excluded/v0/mod.rs b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract_document_type_excluded/v0/mod.rs index e9376cc3850..443349d04ad 100644 --- a/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract_document_type_excluded/v0/mod.rs +++ b/packages/rs-drive/src/drive/shared/shared_estimation_costs/add_estimation_costs_for_levels_up_to_contract_document_type_excluded/v0/mod.rs @@ -6,8 +6,8 @@ use crate::util::storage_flags::StorageFlags; use dpp::data_contract::DataContract; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::AllSubtrees; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::contract::paths::contract_root_path; use crate::error::Error; @@ -62,7 +62,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(contract_root_path(contract.id_ref().as_bytes())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(1, false), estimated_layer_sizes: AllSubtrees(1, NoSumTrees, storage_flags), }, @@ -71,7 +71,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(contract_documents_path(contract.id_ref().as_bytes())), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(document_type_count), estimated_layer_sizes: AllSubtrees( ESTIMATED_AVERAGE_DOCUMENT_TYPE_NAME_SIZE, diff --git a/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs b/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs index 2d8a9d33bcc..40f013d0104 100644 --- a/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs +++ b/packages/rs-drive/src/drive/system/estimation_costs/for_total_system_credits_update/v0/mod.rs @@ -2,8 +2,8 @@ use crate::drive::Drive; use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel}; -use grovedb::EstimatedLayerInformation; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; use crate::drive::system::misc_path_vec; @@ -33,12 +33,15 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path([]), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: EstimatedLevel(3, false), estimated_layer_sizes: AllSubtrees( 12, // about 32 + 1 + 1 / 3 SomeSumTrees { sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, non_sum_trees_weight: 2, }, None, @@ -50,7 +53,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_owned_path(misc_path_vec()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, estimated_layer_count: ApproximateElements(1), estimated_layer_sizes: AllItems(1, 8, None), }, diff --git a/packages/rs-drive/src/drive/system/genesis_time/mod.rs b/packages/rs-drive/src/drive/system/genesis_time/mod.rs index 9eee51529b7..93addd701d3 100644 --- a/packages/rs-drive/src/drive/system/genesis_time/mod.rs +++ b/packages/rs-drive/src/drive/system/genesis_time/mod.rs @@ -64,7 +64,7 @@ mod tests { #[test] fn should_return_none_if_cache_is_empty_and_start_time_is_not_persisted() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let result = drive .get_genesis_time(None) @@ -75,7 +75,7 @@ mod tests { #[test] fn should_return_some_if_cache_is_set() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let mut genesis_time_ms_cache = drive.cache.genesis_time_ms.write(); @@ -141,7 +141,7 @@ mod tests { #[test] fn should_set_genesis_time_to_cache() { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let genesis_time_ms: u64 = 100; diff --git a/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/mod.rs b/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/mod.rs new file mode 100644 index 00000000000..53acbd61852 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/mod.rs @@ -0,0 +1,55 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; +use dpp::tokens::token_event::TokenEvent; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +mod v0; + +impl Drive { + /// Adds token transaction history + pub fn add_token_transaction_history_operations( + &self, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + event: TokenEvent, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .add_transaction_history_operations + { + 0 => self.add_token_transaction_history_operations_v0( + token_id, + owner_id, + owner_nonce, + event, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_token_transaction_history_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/v0/mod.rs b/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/v0/mod.rs new file mode 100644 index 00000000000..24da7e1129f --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/add_transaction_history_operations/v0/mod.rs @@ -0,0 +1,62 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::DocumentInfo::DocumentOwnedInfo; +use crate::util::object_size_info::{DocumentAndContractInfo, OwnedDocumentInfo}; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; +use dpp::tokens::token_event::TokenEvent; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +impl Drive { + /// Adds token transaction history + pub(super) fn add_token_transaction_history_operations_v0( + &self, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + event: TokenEvent, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let contract = self.cache.system_data_contracts.load_token_history(); + + let document_type = event.associated_document_type(&contract)?; + + let document = event.build_historical_document_owned( + &contract, + token_id, + owner_id, + owner_nonce, + block_info, + platform_version, + )?; + + let operations = self.add_document_for_contract_operations( + DocumentAndContractInfo { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentOwnedInfo((document, None)), + owner_id: Some(owner_id.to_buffer()), + }, + contract: &contract, + document_type, + }, + true, + block_info, + &mut None, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + Ok(operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/apply_status/mod.rs b/packages/rs-drive/src/drive/tokens/apply_status/mod.rs new file mode 100644 index 00000000000..f6c88f0b68b --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/apply_status/mod.rs @@ -0,0 +1,93 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Sets a token status + pub fn token_apply_status( + &self, + token_id: [u8; 32], + status: TokenStatus, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.apply_status { + 0 => self.token_apply_status_v0( + token_id, + status, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_apply_status".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations to apply_status tokens without calculating fees and optionally applying. + pub fn token_apply_status_add_to_operations( + &self, + token_id: [u8; 32], + status: TokenStatus, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.apply_status { + 0 => self.token_apply_status_add_to_operations_v0( + token_id, + status, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_apply_status_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to apply_status tokens. + pub fn token_apply_status_operations( + &self, + token_id: [u8; 32], + status: TokenStatus, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.apply_status { + 0 => self.token_apply_status_operations_v0( + token_id, + status, + estimated_costs_only_with_layer_info, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_apply_status_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/apply_status/v0/mod.rs b/packages/rs-drive/src/drive/tokens/apply_status/v0/mod.rs new file mode 100644 index 00000000000..3fe3526aa8b --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/apply_status/v0/mod.rs @@ -0,0 +1,107 @@ +use crate::drive::tokens::paths::token_statuses_root_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::PathKeyElementInfo; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::serialization::PlatformSerializable; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_apply_status_v0( + &self, + token_id: [u8; 32], + status: TokenStatus, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_apply_status_add_to_operations_v0( + token_id, + status, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_apply_status_add_to_operations_v0( + &self, + token_id: [u8; 32], + status: TokenStatus, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_apply_status_operations_v0( + token_id, + status, + &mut estimated_costs_only_with_layer_info, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_apply_status_operations_v0( + &self, + token_id: [u8; 32], + status: TokenStatus, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + let token_status_bytes = status.serialize_consume_to_bytes()?; + + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_token_status_infos( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + self.batch_insert( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<2>(( + token_statuses_root_path(), + token_id.as_slice(), + Element::Item(token_status_bytes, None), + )), + &mut drive_operations, + &platform_version.drive, + )?; + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/mod.rs b/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/mod.rs new file mode 100644 index 00000000000..ba521297a22 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/mod.rs @@ -0,0 +1,119 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; + +use dpp::balances::credits::TokenAmount; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// The operations for adding a certain amount of credits to an identity's balance. This function is version controlled. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the Token. + /// * `identity_id` - The ID of the Identity to which credits are to be added. + /// * `balance_to_add` - The amount of credits to be added to the identity's balance. + /// * `block_info` - Information about the current block. + /// * `apply` - A boolean indicating whether the operation should be applied or not. + /// * `transaction` - The transaction information related to the operation. + /// * `platform_version` - The platform version. + /// * `previous_fee_versions` - Cached fee versions, if any. + /// + /// # Returns + /// + /// * `Result<FeeResult, Error>` - The resulting fee result if successful, or an error. + pub fn add_to_identity_token_balance( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_add: Credits, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, + ) -> Result<FeeResult, Error> { + match platform_version + .drive + .methods + .token + .update + .add_to_identity_token_balance + { + 0 => self.add_to_identity_token_balance_v0( + token_id, + identity_id, + balance_to_add, + block_info, + apply, + transaction, + platform_version, + previous_fee_versions, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_to_identity_token_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds a specified amount of credits to an identity balance. This function checks for overflows and ensures the balance does not exceed `MAX_CREDITS`. + /// Balances are stored under the identity's ID in the token balance tree. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the Token. + /// * `identity_id` - The ID of the Identity to which credits are to be added. + /// * `balance_to_add` - The amount of credits to be added to the identity's balance. + /// * `estimated_costs_only_with_layer_info` - Estimated costs with layer information, if any. + /// * `transaction` - The transaction information related to the operation. + /// * `platform_version` - The platform version. + /// + /// # Returns + /// + /// * `Result<Vec<LowLevelDriveOperation>, Error>` - The resulting low level drive operations if successful, or an error. + pub(crate) fn add_to_identity_token_balance_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_add: TokenAmount, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .add_to_identity_token_balance + { + 0 => self.add_to_identity_token_balance_operations_v0( + token_id, + identity_id, + balance_to_add, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_to_identity_token_balance_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/v0/mod.rs new file mode 100644 index 00000000000..87fd0c9c376 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/add_to_previous_token_balance/v0/mod.rs @@ -0,0 +1,141 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; + +use crate::drive::tokens::paths::token_balances_path_vec; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::version::PlatformVersion; +use dpp::ProtocolError; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Adds specified amount of credits to identity balance + /// This function checks for overflows and does not exceed MAX_CREDITS + /// + /// Balances are stored in the balance tree under the identity's id + pub(in crate::drive::tokens) fn add_to_identity_token_balance_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_add: Credits, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, + ) -> Result<FeeResult, Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + + let batch_operations = self.add_to_identity_token_balance_operations_v0( + token_id, + identity_id, + balance_to_add, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + &mut drive_operations, + &platform_version.drive, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + previous_fee_versions, + )?; + Ok(fees) + } + + /// Adds specified amount of credits to identity balance + /// This function checks for overflows and does not exceed MAX_CREDITS + /// + /// Balances are stored in the identity under key 0 + /// This gets operations based on apply flag (stateful vs stateless) + pub(in crate::drive::tokens) fn add_to_identity_token_balance_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_add: TokenAmount, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_token_balances( + token_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let apply = estimated_costs_only_with_layer_info.is_none(); + + let previous_balance = if apply { + self.fetch_identity_token_balance_operations( + token_id, + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )? + } else { + None // worse case is that we insert + }; + + let balance_path = token_balances_path_vec(token_id); + + if let Some(previous_balance) = previous_balance { + // Check for overflow + let new_balance = (previous_balance as i64) + .checked_add(balance_to_add as i64) + .ok_or(ProtocolError::CriticalCorruptedCreditsCodeExecution( + "Overflow of total token balance".to_string(), + ))?; + + drive_operations.push(LowLevelDriveOperation::replace_for_known_path_key_element( + balance_path, + identity_id.to_vec(), + Element::new_sum_item(new_balance), + )); + } else { + if balance_to_add > i64::MAX as u64 { + return Err( + ProtocolError::CriticalCorruptedCreditsCodeExecution(format!( + "Token balance to add over i64 max, is {}", + balance_to_add + )) + .into(), + ); + } + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + balance_path, + identity_id.to_vec(), + Element::new_sum_item(balance_to_add as i64), + )); + } + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/mod.rs new file mode 100644 index 00000000000..9e45812091c --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/mod.rs @@ -0,0 +1,152 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::Identifier; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the token balances of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose balances are to be fetched. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding balances, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_balances( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, Option<TokenAmount>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identities_token_balances + { + 0 => self.fetch_identities_token_balances_v0( + token_id, + identity_ids, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token balances with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to fetch the balances for. + /// * `identity_id` - The identity's ID whose balances are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<((BTreeMap<[u8; 32], Option<TokenAmount>>), FeeResult), Error>` - A tuple containing a map of token balances and the associated fee result. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_balances_with_costs( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(BTreeMap<Identifier, Option<TokenAmount>>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identities_token_balances_operations( + token_id, + identity_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to fetch the identity's token balances from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the balances for. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding balances, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_balances_operations( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, Option<TokenAmount>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identities_token_balances + { + 0 => self.fetch_identities_token_balances_operations_v0( + token_id, + identity_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identities_token_balances_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/v0/mod.rs new file mode 100644 index 00000000000..b9dddc6e8cf --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identities_token_balances/v0/mod.rs @@ -0,0 +1,63 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; +use dpp::version::PlatformVersion; +use grovedb::Element::SumItem; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_identities_token_balances_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, Option<TokenAmount>>, Error> { + self.fetch_identities_token_balances_operations_v0( + token_id, + identity_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identities_token_balances_operations_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<Identifier, Option<TokenAmount>>, Error> { + let path_query = Self::token_balances_for_identity_ids_query(token_id, identity_ids); + + self.grove_get_raw_path_query_with_optional( + &path_query, + false, + transaction, + drive_operations, + &platform_version.drive, + )? + .into_iter() + .map(|(_, key, element)| { + let identity_id: Identifier = key.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "identity id not 32 bytes".to_string(), + )) + })?; + match element { + Some(SumItem(value, ..)) => Ok((identity_id, Some(value as TokenAmount))), + None => Ok((identity_id, None)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for balances should contain only sum items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/mod.rs new file mode 100644 index 00000000000..8b563ae97b4 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/mod.rs @@ -0,0 +1,135 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's token balance from the backing store. + /// Passing `apply = false` will return estimated costs (0 or Some(0) in place of actual values). + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `identity_id` - The ID of the Identity whose token balance is to be fetched. + /// * `apply` - Whether to actually fetch from state (true) or estimate costs (false). + /// * `transaction` - The current transaction. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<Credits>, Error>` - The token balance of the Identity if successful, or an error. + pub fn fetch_identity_token_balance( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_balance + { + 0 => self.fetch_identity_token_balance_v0( + token_id, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the Identity's token balance with costs (if `apply = true`) and returns associated fee result. + pub fn fetch_identity_token_balance_with_costs( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option<Credits>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identity_token_balance_operations( + token_id, + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the operations to get Identity's token balance from the backing store. + /// If `apply` is false, the operations are stateless and only used for cost estimation. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `identity_id` - The ID of the Identity whose token balance is to be fetched. + /// * `apply` - Whether to fetch actual stateful data (true) or just estimate costs (false). + /// * `transaction` - The current transaction. + /// * `drive_operations` - The drive operations vector to populate. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<Credits>, Error>` - The token balance of the Identity if successful, or an error. + pub fn fetch_identity_token_balance_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_balance + { + 0 => self.fetch_identity_token_balance_operations_v0( + token_id, + identity_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_balance_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/v0/mod.rs new file mode 100644 index 00000000000..3a85fb330a8 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balance/v0/mod.rs @@ -0,0 +1,83 @@ +use crate::drive::tokens::paths::token_balances_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::balances::credits::TokenAmount; +use dpp::version::PlatformVersion; +use grovedb::Element::SumItem; +use grovedb::{TransactionArg, TreeType}; + +impl Drive { + pub(super) fn fetch_identity_token_balance_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + self.fetch_identity_token_balance_operations_v0( + token_id, + identity_id, + true, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identity_token_balance_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + let direct_query_type = if apply { + DirectQueryType::StatefulDirectQuery + } else { + // 8 is the size of an i64 used in sum trees + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::SumTree, + query_target: QueryTargetValue(8), + } + }; + + let balance_path = token_balances_path(&token_id); + + match self.grove_get_raw_optional( + (&balance_path).into(), + identity_id.as_slice(), + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + ) { + Ok(Some(SumItem(balance, _))) if balance >= 0 => Ok(Some(balance as TokenAmount)), + + Ok(None) | Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) => { + // If we are applying (stateful), no balance means None. + // If we are estimating (stateless), return Some(0) to indicate no cost or minimal cost scenario. + if apply { + Ok(None) + } else { + Ok(Some(0)) + } + } + + Ok(Some(SumItem(..))) => Err(Error::Drive(DriveError::CorruptedElementType( + "identity token balance was present but was negative", + ))), + + Ok(Some(_)) => Err(Error::Drive(DriveError::CorruptedElementType( + "identity token balance was present but was not a sum item", + ))), + + Err(e) => Err(e), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/mod.rs new file mode 100644 index 00000000000..fbe2b3aa43a --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/mod.rs @@ -0,0 +1,151 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the token balances of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose balances are to be fetched. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding balances, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_balances( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_balances + { + 0 => self.fetch_identity_token_balances_v0( + token_ids, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token balances with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to fetch the balances for. + /// * `identity_id` - The identity's ID whose balances are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<((BTreeMap<[u8; 32], Option<TokenAmount>>), FeeResult), Error>` - A tuple containing a map of token balances and the associated fee result. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_balances_with_costs( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(BTreeMap<[u8; 32], Option<TokenAmount>>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identity_token_balances_operations( + token_ids, + identity_id, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to fetch the identity's token balances from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the balances for. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding balances, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_balances_operations( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_balances + { + 0 => self.fetch_identity_token_balances_operations_v0( + token_ids, + identity_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_balances_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/v0/mod.rs new file mode 100644 index 00000000000..5d5692630b0 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/fetch_identity_token_balances/v0/mod.rs @@ -0,0 +1,69 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::version::PlatformVersion; +use grovedb::Element::SumItem; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_identity_token_balances_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error> { + self.fetch_identity_token_balances_operations_v0( + token_ids, + identity_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identity_token_balances_operations_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error> { + let path_query = Drive::token_balances_for_identity_id_query(token_ids, identity_id); + + self.grove_get_raw_path_query_with_optional( + &path_query, + false, + transaction, + drive_operations, + &platform_version.drive, + )? + .into_iter() + .map(|(path, _, element)| { + let token_id: [u8; 32] = path + .get(2) + .ok_or(Error::Drive(DriveError::CorruptedDriveState( + "returned path item should always have a third part at index 2".to_string(), + )))? + .clone() + .try_into() + .map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "token id not 32 bytes".to_string(), + )) + })?; + match element { + Some(SumItem(value, ..)) => Ok((token_id, Some(value as TokenAmount))), + None => Ok((token_id, None)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for balances should contain only sum items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/mod.rs b/packages/rs-drive/src/drive/tokens/balance/mod.rs new file mode 100644 index 00000000000..33d22088c30 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/mod.rs @@ -0,0 +1,17 @@ +#[cfg(feature = "server")] +mod add_to_previous_token_balance; +#[cfg(feature = "server")] +mod fetch_identities_token_balances; +#[cfg(feature = "server")] +mod fetch_identity_token_balance; +#[cfg(feature = "server")] +mod fetch_identity_token_balances; +#[cfg(feature = "server")] +mod prove_identities_token_balances; +#[cfg(feature = "server")] +mod prove_identity_token_balances; +mod queries; +#[cfg(feature = "server")] +mod remove_from_identity_token_balance; +#[cfg(feature = "server")] +mod update; diff --git a/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/mod.rs b/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/mod.rs new file mode 100644 index 00000000000..4549f680a08 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/mod.rs @@ -0,0 +1,149 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves the token balances of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose balances are to be proveed. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_balances( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identities_token_balances + { + 0 => self.prove_identities_token_balances_v0( + token_id, + identity_ids, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Proves the identity's token balances with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to prove the balances for. + /// * `identity_id` - The identity's ID whose balances are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_balances_with_costs( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Vec<u8>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.prove_identities_token_balances_operations( + token_id, + identity_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to prove the identity's token balances from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the balances for. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_balances_operations( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identities_token_balances + { + 0 => self.prove_identities_token_balances_operations_v0( + token_id, + identity_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identities_token_balances_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/v0/mod.rs new file mode 100644 index 00000000000..d25dc8fe165 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/prove_identities_token_balances/v0/mod.rs @@ -0,0 +1,359 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_identities_token_balances_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_identities_token_balances_operations_v0( + token_id, + identity_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_identities_token_balances_operations_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::token_balances_for_identity_ids_query(token_id, identity_ids); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::balances::credits::TokenAmount; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::identity::Identity; + use std::collections::BTreeMap; + + use dpp::identity::accessors::IdentityGettersV0; + use dpp::prelude::DataContract; + use dpp::version::PlatformVersion; + + #[test] + fn should_prove_a_single_identity_token_balance() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + drive + .token_mint( + token_id.to_buffer(), + identity.id().to_buffer(), + 10000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token"); + let proof = drive + .prove_identities_token_balances_v0( + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!( + proved_identity_balance, + BTreeMap::from([(identity_id, Some(10000))]) + ); + } + + #[test] + fn should_prove_a_single_identity_token_balance_does_not_exist() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + let proof = drive + .prove_identities_token_balances_v0( + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!( + proved_identity_balance, + BTreeMap::from([(identity_id, None)]) + ); + } + + #[test] + fn should_prove_multiple_identity_single_token_balances_after_transfer() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id().to_buffer(); + + let identity_2 = Identity::random_identity(3, Some(15), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity_1.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .add_new_identity( + identity_2.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + drive + .token_mint( + token_id.to_buffer(), + identity_1.id().to_buffer(), + 100000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token"); + + drive + .token_transfer( + token_id.to_buffer(), + identity_1.id().to_buffer(), + identity_2.id().to_buffer(), + 30000, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to transfer token"); + let proof = drive + .prove_identities_token_balances_v0( + token_id.to_buffer(), + &vec![identity_1.id().to_buffer(), identity_2.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity_1.id().to_buffer(), identity_2.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!( + proved_identity_balance, + BTreeMap::from([(identity_1_id, Some(70000)), (identity_2_id, Some(30000))]) + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/mod.rs b/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/mod.rs new file mode 100644 index 00000000000..429bb599499 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/mod.rs @@ -0,0 +1,149 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the token balances of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose balances are to be proveed. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_balances( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_balances + { + 0 => self.prove_identity_token_balances_v0( + token_ids, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token balances with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to prove the balances for. + /// * `identity_id` - The identity's ID whose balances are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_balances_with_costs( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Vec<u8>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.prove_identity_token_balances_operations( + token_ids, + identity_id, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to prove the identity's token balances from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the balances for. + /// * `identity_id` - The ID of the identity whose token balances are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_balances_operations( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_balances + { + 0 => self.prove_identity_token_balances_operations_v0( + token_ids, + identity_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_balances_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/v0/mod.rs new file mode 100644 index 00000000000..fad0b5357b0 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/prove_identity_token_balances/v0/mod.rs @@ -0,0 +1,382 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_identity_token_balances_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_identity_token_balances_operations_v0( + token_ids, + identity_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_identity_token_balances_operations_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::token_balances_for_identity_id_query(token_ids, identity_id); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::balances::credits::TokenAmount; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::DataContract; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_multiple_token_balances_for_single_identity() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + let token_id_1 = contract.token_id(0).expect("expected token at position 0"); + let token_id_2 = contract.token_id(1).expect("expected token at position 1"); + + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + drive + .token_mint( + token_id_1.to_buffer(), + identity.id().to_buffer(), + 5000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token 1"); + + let token_balance_1 = drive + .fetch_identity_token_balance( + token_id_1.to_buffer(), + identity_id, + None, + platform_version, + ) + .expect("should not error when fetching token balance"); + + assert_eq!(token_balance_1, Some(5000)); + + drive + .token_mint( + token_id_2.to_buffer(), + identity.id().to_buffer(), + 10000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token 2"); + + let token_balance_2 = drive + .fetch_identity_token_balance( + token_id_2.to_buffer(), + identity_id, + None, + platform_version, + ) + .expect("should not error when fetching token balance"); + + assert_eq!(token_balance_2, Some(10000)); + + let token_balances = drive + .fetch_identity_token_balances( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity_id, + None, + platform_version, + ) + .expect("should not error when fetching token balances"); + + assert_eq!( + token_balances, + BTreeMap::from([ + (token_id_1.to_buffer(), Some(5000)), + (token_id_2.to_buffer(), Some(10000)), + ]) + ); + + let proof = drive + .prove_identity_token_balances_v0( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity_id, + None, + platform_version, + ) + .expect("should not error when proving token balances"); + + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_id( + proof.as_slice(), + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity.id().to_buffer(), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + assert_eq!( + proved_identity_balance, + BTreeMap::from([ + (token_id_1.to_buffer(), Some(5000)), + (token_id_2.to_buffer(), Some(10000)), + ]) + ); + } + + #[test] + fn should_prove_no_token_balances_for_single_identity() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let token_id = contract.token_id(0).expect("expected token at position 0"); + + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + let proof = drive + .prove_identity_token_balances_v0( + &[token_id.to_buffer()], + identity_id, + None, + platform_version, + ) + .expect("should not error when proving token balances"); + + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_id( + proof.as_slice(), + &[token_id.to_buffer()], + identity.id().to_buffer(), + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + assert_eq!( + proved_identity_balance, + BTreeMap::from([(token_id.to_buffer(), None)]) + ); + } + + #[test] + fn should_prove_no_token_balances_for_non_existent_identity() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + // Create a random identity ID that is not added to the drive + let non_existent_identity_id = [1u8; 32]; // An example of a non-existent identity ID + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let token_id = contract.token_id(0).expect("expected token at position 0"); + + // Insert the contract but no identities + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Attempt to prove token balances for a non-existent identity + let proof_result = drive.prove_identity_token_balances_v0( + &[token_id.to_buffer()], + non_existent_identity_id, + None, + platform_version, + ); + + // Ensure proof generation succeeds even for non-existent identities + assert!(proof_result.is_ok(), "proof generation should succeed"); + + let proof = proof_result.expect("expected valid proof"); + + // Verify the proof + let proved_identity_balance: BTreeMap<[u8; 32], Option<TokenAmount>> = + Drive::verify_token_balances_for_identity_id( + proof.as_slice(), + &[token_id.to_buffer()], + non_existent_identity_id, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Verify the balance is `None` for the non-existent identity + assert_eq!( + proved_identity_balance, + BTreeMap::from([(token_id.to_buffer(), None)]), + "expected no balances for non-existent identity" + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/queries.rs b/packages/rs-drive/src/drive/tokens/balance/queries.rs new file mode 100644 index 00000000000..1804724e2ac --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/queries.rs @@ -0,0 +1,118 @@ +use crate::drive::balances::total_tokens_root_supply_path_vec; +use crate::drive::tokens::paths::{token_balances_path_vec, token_balances_root_path_vec}; +use crate::drive::Drive; +use crate::error::Error; +use crate::query::{Query, QueryItem}; +use grovedb::{PathQuery, SizedQuery}; +use platform_version::version::PlatformVersion; +use std::ops::RangeFull; + +impl Drive { + /// The query for proving the identities balance of a token from an identity id. + pub fn token_balance_for_identity_id_query( + token_id: [u8; 32], + identity_id: [u8; 32], + ) -> PathQuery { + let balance_path = token_balances_path_vec(token_id); + PathQuery::new_single_key(balance_path, identity_id.to_vec()) + } + + /// The query getting a token balance for many identities + pub fn token_balances_for_identity_ids_query( + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + ) -> PathQuery { + let balance_path = token_balances_path_vec(token_id); + let mut query = Query::new(); + query.insert_keys(identity_ids.iter().map(|key| key.to_vec()).collect()); + PathQuery { + path: balance_path, + query: SizedQuery { + query, + limit: Some(identity_ids.len() as u16), + offset: None, + }, + } + } + + /// The query getting token balances for a single identity and many tokens + pub fn token_balances_for_identity_id_query( + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + ) -> PathQuery { + let tokens_root = token_balances_root_path_vec(); + + let mut query = Query::new(); + + for token_id in token_ids { + query.insert_key(token_id.to_vec()); + } + + query.set_subquery_path(vec![identity_id.to_vec()]); + + PathQuery::new( + tokens_root, + SizedQuery::new(query, Some(token_ids.len() as u16), None), + ) + } + + /// The query getting token balances for identities in a range + pub fn token_balances_for_range_query( + token_id: [u8; 32], + start_at: Option<([u8; 32], bool)>, + ascending: bool, + limit: u16, + ) -> PathQuery { + let balance_path = token_balances_path_vec(token_id); + let mut query = Query::new_with_direction(ascending); + if ascending { + if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeFrom(start_at.to_vec()..)) + } else { + query.insert_item(QueryItem::RangeAfter(start_at.to_vec()..)) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + } else if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeToInclusive(..=start_at.to_vec())) + } else { + query.insert_item(QueryItem::RangeTo(..start_at.to_vec())) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + PathQuery { + path: balance_path, + query: SizedQuery { + query, + limit: Some(limit), + offset: None, + }, + } + } + + /// The query getting token balances for identities in a range + pub fn token_total_supply_and_aggregated_identity_balances_query( + token_id: [u8; 32], + platform_version: &PlatformVersion, + ) -> Result<PathQuery, Error> { + let path_holding_total_token_supply = total_tokens_root_supply_path_vec(); + let token_supply_query = + PathQuery::new_single_key(path_holding_total_token_supply, token_id.to_vec()); + let tokens_root_path = token_balances_root_path_vec(); + let token_aggregated_identity_balances_query = + PathQuery::new_single_key(tokens_root_path, token_id.to_vec()); + let mut path_query = PathQuery::merge( + vec![ + &token_aggregated_identity_balances_query, + &token_supply_query, + ], + &platform_version.drive.grove_version, + )?; + path_query.query.limit = Some(2); + Ok(path_query) + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/mod.rs b/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/mod.rs new file mode 100644 index 00000000000..c80eb72789c --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/mod.rs @@ -0,0 +1,117 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; + +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// The operations for removing a certain amount of credits from an identity's balance. This function is version controlled. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the Token. + /// * `identity_id` - The ID of the Identity from whose balance credits are to be removed. + /// * `balance_to_remove` - The amount of credits to be removed from the identity's balance. + /// * `block_info` - Information about the current block. + /// * `apply` - A boolean indicating whether the operation should be applied or not. + /// * `transaction` - The transaction information related to the operation. + /// * `drive_version` - The drive version. + /// + /// # Returns + /// + /// * `Result<FeeResult, Error>` - The resulting fee result if successful, or an error. + pub fn remove_from_identity_token_balance( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_remove: Credits, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, + ) -> Result<FeeResult, Error> { + match platform_version + .drive + .methods + .token + .update + .remove_from_identity_token_balance + { + 0 => self.remove_from_identity_token_balance_v0( + token_id, + identity_id, + balance_to_remove, + block_info, + apply, + transaction, + platform_version, + previous_fee_versions, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_from_identity_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Removes a specified amount of credits from an identity balance. This function doesn't allow the balance to go below zero. + /// Balances are stored under key 0 in the identity. Operations are determined based on the `apply` flag (stateful vs stateless). + /// + /// # Arguments + /// + /// * `token_id` - The ID of the Token. + /// * `identity_id` - The ID of the Identity from which credits are to be removed. + /// * `balance_to_remove` - The amount of credits to be removed from the identity's balance. + /// * `estimated_costs_only_with_layer_info` - Estimated costs with layer information, if any. + /// * `transaction` - The transaction information related to the operation. + /// * `drive_version` - The drive version. + /// + /// # Returns + /// + /// * `Result<Vec<LowLevelDriveOperation>, Error>` - The resulting low level drive operations if successful, or an error. + pub(crate) fn remove_from_identity_token_balance_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_remove: Credits, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .remove_from_identity_token_balance + { + 0 => self.remove_from_identity_token_balance_operations_v0( + token_id, + identity_id, + balance_to_remove, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_from_identity_token_balance_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/v0/mod.rs b/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/v0/mod.rs new file mode 100644 index 00000000000..6d09ae621d1 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/remove_from_identity_token_balance/v0/mod.rs @@ -0,0 +1,129 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::identity::IdentityError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::MAX_CREDITS; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::fee::Credits; + +use crate::drive::tokens::paths::token_balances_path_vec; +use dpp::fee::default_costs::CachedEpochIndexFeeVersions; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Balances are stored in the balance tree under the identity's id + pub(in crate::drive::tokens) fn remove_from_identity_token_balance_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_remove: Credits, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + previous_fee_versions: Option<&CachedEpochIndexFeeVersions>, + ) -> Result<FeeResult, Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + + let batch_operations = self.remove_from_identity_token_balance_operations_v0( + token_id, + identity_id, + balance_to_remove, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + &mut drive_operations, + &platform_version.drive, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + previous_fee_versions, + )?; + Ok(fees) + } + + /// Removes specified amount of credits from identity balance + /// This function doesn't go below nil balance (negative balance) + /// + /// Balances are stored in the identity under key 0 + /// This gets operations based on apply flag (stateful vs stateless) + pub(in crate::drive::tokens) fn remove_from_identity_token_balance_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + balance_to_remove: Credits, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_token_balances( + token_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let apply = estimated_costs_only_with_layer_info.is_none(); + + let previous_balance = if apply { + self.fetch_identity_token_balance_operations( + token_id, + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )? + .ok_or(Error::Drive(DriveError::CorruptedCodeExecution( + "there should always be a balance if apply is set to true", + )))? + } else { + MAX_CREDITS + }; + + // we do not have enough balance + // there is a part we absolutely need to pay for + if balance_to_remove > previous_balance { + return Err(Error::Identity(IdentityError::IdentityInsufficientBalance( + format!( + "identity with token balance {} does not have the required balance to remove {}", + previous_balance, balance_to_remove + ), + ))); + } + + let balance_path = token_balances_path_vec(token_id); + + drive_operations.push(LowLevelDriveOperation::replace_for_known_path_key_element( + balance_path, + identity_id.to_vec(), + Element::new_sum_item((previous_balance - balance_to_remove) as i64), + )); + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/balance/update.rs b/packages/rs-drive/src/drive/tokens/balance/update.rs new file mode 100644 index 00000000000..dc7c94e3e76 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/balance/update.rs @@ -0,0 +1,896 @@ +#[cfg(test)] +mod tests { + + use dpp::prelude::*; + + use crate::error::drive::DriveError; + use crate::error::Error; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use crate::util::test_helpers::test_utils::identities::create_test_identity; + use dpp::block::epoch::Epoch; + use dpp::identity::accessors::IdentityGettersV0; + + mod add_to_identity_balance { + use dpp::block::block_info::BlockInfo; + use dpp::fee::fee_result::FeeResult; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::version::PlatformVersion; + + use crate::fees::op::LowLevelDriveOperation; + + use super::*; + + #[test] + fn should_add_to_balance() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + let old_balance = identity.balance(); + + let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + drive + .add_new_identity( + identity.clone(), + false, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let db_transaction = drive.grove.start_transaction(); + + let amount = 300; + + let fee_result = drive + .add_to_identity_balance( + identity.id().to_buffer(), + amount, + &block_info, + true, + Some(&db_transaction), + platform_version, + ) + .expect("expected to add to identity balance"); + + assert_eq!( + fee_result, + FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + } + ); + + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!(balance.unwrap(), old_balance + amount); + } + + #[test] + fn should_fail_if_balance_is_not_persisted() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let block_info = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let result = drive.add_to_identity_balance( + [0; 32], + 300, + &block_info, + true, + None, + platform_version, + ); + + assert!( + matches!(result, Err(Error::Drive(DriveError::CorruptedCodeExecution(m))) if m == "there should always be a balance") + ); + } + + #[test] + fn should_deduct_from_debt_if_balance_is_nil() { + let drive = setup_drive_with_initial_state_structure(None); + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) + .expect("expected an identity"); + + let added_balance = 300; + let negative_amount = 100; + + // Persist negative balance + let batch = vec![drive + .update_identity_negative_credit_operation( + identity.id().to_buffer(), + negative_amount, + platform_version, + ) + .expect("expected to get an update_identity_negative_credit_operation")]; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + drive + .apply_batch_low_level_drive_operations( + None, + None, + batch, + &mut drive_operations, + &platform_version.drive, + ) + .expect("should apply batch"); + + let block_info = BlockInfo::default(); + + let fee_result = drive + .add_to_identity_balance( + identity.id().to_buffer(), + added_balance, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to add to identity balance"); + + assert_eq!( + fee_result, + FeeResult { + storage_fee: 0, + processing_fee: 385160, + removed_bytes_from_system: 0, + ..Default::default() + } + ); + + let (updated_balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!( + updated_balance.expect("balance should present"), + added_balance - negative_amount + ); + + let updated_negative_balance = drive + .fetch_identity_negative_balance_operations( + identity.id().to_buffer(), + true, + None, + &mut drive_operations, + platform_version, + ) + .expect("expected to get balance") + .expect("balance should present"); + + assert_eq!(updated_negative_balance, 0) + } + + #[test] + fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower() { + let drive = setup_drive_with_initial_state_structure(None); + let platform_version = PlatformVersion::latest(); + let identity = create_test_identity(&drive, [0; 32], Some(1), None, platform_version) + .expect("expected an identity"); + + let added_balance = 50; + let negative_amount = 100; + + // Persist negative balance + let batch = vec![drive + .update_identity_negative_credit_operation( + identity.id().to_buffer(), + negative_amount, + platform_version, + ) + .expect("expected to get an update_identity_negative_credit_operation")]; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + drive + .apply_batch_low_level_drive_operations( + None, + None, + batch, + &mut drive_operations, + &platform_version.drive, + ) + .expect("should apply batch"); + + let block_info = BlockInfo::default(); + + let fee_result = drive + .add_to_identity_balance( + identity.id().to_buffer(), + added_balance, + &block_info, + true, + None, + platform_version, + ) + .expect("expected to add to identity balance"); + + assert_eq!( + fee_result, + FeeResult { + storage_fee: 0, + processing_fee: 260540, + removed_bytes_from_system: 0, + ..Default::default() + } + ); + + let (updated_balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block_info, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!(updated_balance.expect("balance should present"), 0); + + let updated_negative_balance = drive + .fetch_identity_negative_balance_operations( + identity.id().to_buffer(), + true, + None, + &mut drive_operations, + platform_version, + ) + .expect("expected to get balance") + .expect("balance should present"); + + assert_eq!(updated_negative_balance, negative_amount - added_balance) + } + + #[test] + fn should_estimate_costs_without_state() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let app_hash_before = drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should return app hash"); + + let fee_result = drive + .add_to_identity_balance( + identity.id().to_buffer(), + 300, + &block, + false, + None, + platform_version, + ) + .expect("expected to get estimated costs to update an identity balance"); + + assert_eq!( + fee_result, + FeeResult { + processing_fee: 4278840, + ..Default::default() + } + ); + + let app_hash_after = drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should return app hash"); + + assert_eq!(app_hash_after, app_hash_before); + + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert!(balance.is_none()); //shouldn't have changed + } + } + + mod remove_from_identity_balance { + use super::*; + use dpp::block::block_info::BlockInfo; + use dpp::fee::fee_result::FeeResult; + use dpp::version::PlatformVersion; + + #[test] + fn should_remove_from_balance() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + let old_balance = identity.balance(); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + drive + .add_new_identity( + identity.clone(), + false, + &block, + true, + None, + platform_version, + ) + .expect("expected to insert identity"); + + let db_transaction = drive.grove.start_transaction(); + + let amount = 10; + + let fee_result = drive + .remove_from_identity_balance( + identity.id().to_buffer(), + amount, + &block, + true, + Some(&db_transaction), + platform_version, + None, + ) + .expect("expected to add to identity balance"); + + assert_eq!( + fee_result, + FeeResult { + processing_fee: 174660, + removed_bytes_from_system: 0, + ..Default::default() + } + ); + + drive + .grove + .commit_transaction(db_transaction) + .unwrap() + .expect("expected to be able to commit a transaction"); + + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert_eq!(balance.unwrap(), old_balance - amount); + } + + #[test] + fn should_estimated_costs_without_state() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(5, Some(12345), platform_version) + .expect("expected a random identity"); + + let block = BlockInfo::default_with_epoch(Epoch::new(0).unwrap()); + + let app_hash_before = drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should return app hash"); + + let amount = 10; + + let fee_result = drive + .remove_from_identity_balance( + identity.id().to_buffer(), + amount, + &block, + false, + None, + platform_version, + None, + ) + .expect("expected to add to identity balance"); + + let app_hash_after = drive + .grove + .root_hash(None, &platform_version.drive.grove_version) + .unwrap() + .expect("should return app hash"); + + assert_eq!(app_hash_after, app_hash_before); + + assert_eq!( + fee_result, + FeeResult { + processing_fee: 2476860, + ..Default::default() + } + ); + + let (balance, _fee_cost) = drive + .fetch_identity_balance_with_costs( + identity.id().to_buffer(), + &block, + true, + None, + platform_version, + ) + .expect("expected to get balance"); + + assert!(balance.is_none()); //shouldn't have changed + } + } + + mod apply_balance_change_from_fee_to_identity_operations { + use super::*; + use crate::error::identity::IdentityError; + use crate::fees::op::LowLevelDriveOperation; + use dpp::block::block_info::BlockInfo; + use dpp::fee::epoch::{CreditsPerEpoch, GENESIS_EPOCH_INDEX}; + use dpp::fee::fee_result::refunds::{CreditsPerEpochByIdentifier, FeeRefunds}; + use dpp::fee::fee_result::FeeResult; + use dpp::fee::{Credits, SignedCredits}; + use dpp::version::PlatformVersion; + use grovedb::batch::GroveOp; + use grovedb::Element; + use nohash_hasher::IntMap; + use std::collections::BTreeMap; + + #[test] + fn should_do_nothing_if_there_is_no_balance_change() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + let fee_result = FeeResult::default_with_fees(0, 0); + let fee_change = fee_result.clone().into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + assert_eq!(drive_operations.len(), 0); + assert_eq!(fee_result_outcome, fee_result); + } + + #[test] + fn should_add_to_balance() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + let other_identity = + create_test_identity(&drive, [1; 32], Some(16), None, platform_version) + .expect("expected to create an identity"); + + let removed_credits = 100000; + let other_removed_credits = 200000; + + let credits_per_epoch: CreditsPerEpoch = + IntMap::from_iter([(GENESIS_EPOCH_INDEX, removed_credits)]); + + let other_credits_per_epoch: CreditsPerEpoch = + IntMap::from_iter([(GENESIS_EPOCH_INDEX, other_removed_credits)]); + + let refunds_per_epoch_by_identifier: CreditsPerEpochByIdentifier = + BTreeMap::from_iter([ + (identity.id().to_buffer(), credits_per_epoch), + (other_identity.id().to_buffer(), other_credits_per_epoch), + ]); + + let fee_result = FeeResult { + fee_refunds: FeeRefunds(refunds_per_epoch_by_identifier), + ..Default::default() + }; + let fee_change = fee_result.clone().into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + assert!(matches!( + drive_operations[..], + [ + _, + _, + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::SumItem(refund_amount, None), + }, + .. + }), + .., + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::SumItem(other_refund_amount, None), + }, + .. + }) + ] if refund_amount as Credits == removed_credits && other_refund_amount as Credits == other_removed_credits + )); + + assert_eq!(fee_result_outcome, fee_result); + } + + #[test] + fn should_fail_if_balance_is_not_persisted() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let fee_result = FeeResult::default_with_fees(100000, 100); + let fee_change = fee_result.into_balance_change([0; 32].into()); + + let result = drive.apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ); + + assert!( + matches!(result, Err(Error::Drive(DriveError::CorruptedCodeExecution(m))) if m == "there should always be a balance if apply is set to true") + ); + } + + #[test] + fn should_deduct_from_debt_if_balance_is_nil() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let removed_credits = 10000; + let negative_amount = 1000; + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + // Persist negative balance + let batch = vec![drive + .update_identity_negative_credit_operation( + identity.id().to_buffer(), + negative_amount, + platform_version, + ) + .expect("expected to get an update_identity_negative_credit_operation")]; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + drive + .apply_batch_low_level_drive_operations( + None, + None, + batch, + &mut drive_operations, + &platform_version.drive, + ) + .expect("should apply batch"); + + let credits_per_epoch: CreditsPerEpoch = + IntMap::from_iter([(GENESIS_EPOCH_INDEX, removed_credits)]); + + let refunds_per_epoch_by_identifier: CreditsPerEpochByIdentifier = + BTreeMap::from_iter([(identity.id().to_buffer(), credits_per_epoch)]); + + let fee_result = FeeResult { + fee_refunds: FeeRefunds(refunds_per_epoch_by_identifier), + ..Default::default() + }; + let fee_change = fee_result.clone().into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + assert!(matches!( + &drive_operations[..], + [ + _, + _, + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::SumItem(refund_amount, None), + }, + .. + }), + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::Item(debt_bytes, None), + }, + .. + }) + ] if *refund_amount as Credits == removed_credits - negative_amount && debt_bytes == &0u64.to_be_bytes() + )); + + assert_eq!(fee_result_outcome, fee_result); + } + + #[test] + fn should_keep_nil_balance_and_reduce_debt_if_added_balance_is_lower() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let removed_credits = 1000; + let negative_amount = 3000; + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + // Persist negative balance + let batch = vec![drive + .update_identity_negative_credit_operation( + identity.id().to_buffer(), + negative_amount, + platform_version, + ) + .expect("expected to get an update_identity_negative_credit_operation")]; + + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + drive + .apply_batch_low_level_drive_operations( + None, + None, + batch, + &mut drive_operations, + &platform_version.drive, + ) + .expect("should apply batch"); + + let credits_per_epoch: CreditsPerEpoch = + IntMap::from_iter([(GENESIS_EPOCH_INDEX, removed_credits)]); + + let refunds_per_epoch_by_identifier: CreditsPerEpochByIdentifier = + BTreeMap::from_iter([(identity.id().to_buffer(), credits_per_epoch)]); + + let fee_result = FeeResult { + fee_refunds: FeeRefunds(refunds_per_epoch_by_identifier), + ..Default::default() + }; + let fee_change = fee_result.clone().into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + assert!(matches!( + &drive_operations[..], + [ + _, + _, + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::Item(debt_bytes, None), + }, + .. + }) + ] if debt_bytes == &2000u64.to_be_bytes() + )); + + assert_eq!(fee_result_outcome, fee_result); + } + + #[test] + fn should_remove_from_balance_less_amount() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + let initial_balance = 100; + + drive + .add_to_identity_balance( + identity.id().to_buffer(), + initial_balance, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("should set initial balance"); + + let processing_fee = 20; + let storage_fee = 10; + + let fee_result = FeeResult { + processing_fee, + storage_fee, + ..Default::default() + }; + + let fee_change = fee_result.clone().into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + assert!(matches!( + drive_operations[..], + [_, LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::SumItem(balance, None), + }, + .. + })] if balance == (initial_balance - storage_fee - processing_fee) as SignedCredits + )); + + assert_eq!(fee_result_outcome, fee_result); + } + + #[test] + fn should_remove_from_balance_bigger_amount_and_get_into_debt() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + let initial_balance = 100; + + drive + .add_to_identity_balance( + identity.id().to_buffer(), + initial_balance, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("should set initial balance"); + + let processing_fee = 110; + let storage_fee = 80; + + let fee_result = FeeResult { + processing_fee, + storage_fee, + ..Default::default() + }; + + let fee_change = fee_result.into_balance_change(identity.id()); + + let (drive_operations, fee_result_outcome) = drive + .apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ) + .expect("should apply fee change"); + + let expected_debt_bytes = + (storage_fee + processing_fee - initial_balance).to_be_bytes(); + + assert!(matches!( + &drive_operations[..], + [ + _, + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::SumItem(balance, None), + }, + .. + }), + LowLevelDriveOperation::GroveOperation(grovedb::batch::QualifiedGroveDbOp { + op: GroveOp::Replace { + element: Element::Item(debt_bytes, None), + }, + .. + }) + ] if balance == &(0 as SignedCredits) && debt_bytes == &expected_debt_bytes + )); + + assert_eq!( + fee_result_outcome, + FeeResult { + storage_fee, + processing_fee: initial_balance - storage_fee, + ..Default::default() + } + ); + } + + #[test] + fn should_return_error_if_required_amount_bigger_than_balance() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = create_test_identity(&drive, [0; 32], Some(15), None, platform_version) + .expect("expected to create an identity"); + + let processing_fee = 110; + let storage_fee = 80; + + let fee_result = FeeResult { + processing_fee, + storage_fee, + ..Default::default() + }; + + let fee_change = fee_result.into_balance_change(identity.id()); + + let result = drive.apply_balance_change_from_fee_to_identity_operations( + fee_change, + None, + platform_version, + ); + + assert!(matches!( + result, + Err(Error::Identity(IdentityError::IdentityInsufficientBalance( + _ + ))) + )); + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/burn/mod.rs b/packages/rs-drive/src/drive/tokens/burn/mod.rs new file mode 100644 index 00000000000..e7c733df77b --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/burn/mod.rs @@ -0,0 +1,100 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Burns tokens by reducing the total supply and removing them from an identity's balance. + pub fn token_burn( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.burn { + 0 => self.token_burn_v0( + token_id, + identity_id, + burn_amount, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_burn".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations to burn tokens without calculating fees and optionally applying. + pub fn token_burn_add_to_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.burn { + 0 => self.token_burn_add_to_operations_v0( + token_id, + identity_id, + burn_amount, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_burn_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to burn tokens. + pub fn token_burn_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.burn { + 0 => self.token_burn_operations_v0( + token_id, + identity_id, + burn_amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_burn_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/burn/v0/mod.rs b/packages/rs-drive/src/drive/tokens/burn/v0/mod.rs new file mode 100644 index 00000000000..3beb0c5e06d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/burn/v0/mod.rs @@ -0,0 +1,108 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_burn_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_burn_add_to_operations_v0( + token_id, + identity_id, + burn_amount, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_burn_add_to_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_burn_operations_v0( + token_id, + identity_id, + burn_amount, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_burn_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + burn_amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + drive_operations.extend(self.remove_from_identity_token_balance_operations( + token_id, + identity_id, + burn_amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + + drive_operations.extend(self.remove_from_token_total_supply_operations( + token_id, + burn_amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/mod.rs b/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/mod.rs new file mode 100644 index 00000000000..8472cfb8aa2 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/mod.rs @@ -0,0 +1,47 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::balances::total_tokens_balance::TotalTokensBalance; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Calculates the total credits balance. + /// + /// This function verifies that the sum tree identity credits + pool credits + refunds are equal to the total credits in the system. + /// + /// # Arguments + /// + /// * `transaction` - A `TransactionArg` object representing the transaction to be used for calculating the total credits balance. + /// * `drive_version` - A `DriveVersion` object specifying the version of the Drive. + /// + /// # Returns + /// + /// * `Result<TotalTokensBalance, Error>` - If successful, returns a `TotalTokensBalance` object representing the total tokens balance. + /// If an error occurs during the calculation, returns an `Error`. + /// + /// # Errors + /// + /// This function will return an error if the version of the Drive is unknown. + pub fn calculate_total_tokens_balance( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<TotalTokensBalance, Error> { + match platform_version + .drive + .methods + .token + .calculate_total_tokens_balance + { + 0 => self.calculate_total_tokens_balance_v0(transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "calculate_total_tokens_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/v0/mod.rs b/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/v0/mod.rs new file mode 100644 index 00000000000..6d4acc61691 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/calculate_total_tokens_balance/v0/mod.rs @@ -0,0 +1,47 @@ +use crate::drive::balances::TOTAL_TOKEN_SUPPLIES_STORAGE_KEY; +use crate::drive::system::misc_path; +use crate::drive::tokens::paths::{tokens_root_path, TOKEN_BALANCES_KEY}; +use crate::drive::Drive; +use crate::error::Error; +use crate::util::grove_operations::DirectQueryType; +use dpp::balances::total_tokens_balance::TotalTokensBalance; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Verify that the sum tree identity credits + pool credits + refunds are equal to the + /// Total credits in the system + #[inline(always)] + pub(super) fn calculate_total_tokens_balance_v0( + &self, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<TotalTokensBalance, Error> { + let mut drive_operations = vec![]; + let path_holding_total_credits = misc_path(); + let total_tokens_in_platform = self.grove_get_big_sum_tree_total_value( + (&path_holding_total_credits).into(), + TOTAL_TOKEN_SUPPLIES_STORAGE_KEY, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + let tokens_root_path = tokens_root_path(); + + let total_identity_token_balances = self.grove_get_big_sum_tree_total_value( + (&tokens_root_path).into(), + &[TOKEN_BALANCES_KEY], + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + Ok(TotalTokensBalance { + total_tokens_in_platform, + total_identity_token_balances, + }) + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/mod.rs new file mode 100644 index 00000000000..90e65e7abd7 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/mod.rs @@ -0,0 +1,53 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Adds a TokenPerpetualDistribution to the state tree. + pub fn add_perpetual_distribution( + &self, + token_id: [u8; 32], + owner_id: [u8; 32], + distribution: &TokenPerpetualDistribution, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + batch_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .token + .distribution + .add_perpetual_distribution + { + 0 => self.add_perpetual_distribution_v0( + token_id, + owner_id, + distribution, + block_info, + estimated_costs_only_with_layer_info, + batch_operations, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_perpetual_distribution".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/v0/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/v0/mod.rs new file mode 100644 index 00000000000..7cefe3e95fc --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/add_perpetual_distribution/v0/mod.rs @@ -0,0 +1,109 @@ +use crate::drive::tokens::paths::{ + token_root_perpetual_distributions_path_vec, TokenPerpetualDistributionPaths, + TOKEN_PERPETUAL_DISTRIBUTIONS_KEY, +}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::{BatchInsertApplyType, QueryTarget}; +use crate::util::object_size_info::PathKeyElementInfo; +use crate::util::storage_flags::StorageFlags; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::associated_token::token_distribution_key::{ + DistributionType, TokenDistributionKey, +}; +use dpp::data_contract::associated_token::token_perpetual_distribution::methods::v0::TokenPerpetualDistributionV0Accessors; +use dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use dpp::serialization::PlatformSerializable; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::reference_path::ReferencePathType; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// Version 0 of `add_perpetual_distribution` + pub(super) fn add_perpetual_distribution_v0( + &self, + token_id: [u8; 32], + owner_id: [u8; 32], + distribution: &TokenPerpetualDistribution, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + batch_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + if estimated_costs_only_with_layer_info.is_some() { + // Drive::add_estimation_costs_for_perpetual_distribution( + // estimated_costs_only_with_layer_info, + // &platform_version.drive, + // )?; + } + let serialized_distribution = distribution.serialize_to_bytes()?; + + // Storage flags for cleanup logic + let storage_flags = StorageFlags::new_single_epoch(block_info.epoch.index, Some(owner_id)); + + // Path for the perpetual distribution tree + let perpetual_distributions_path = token_root_perpetual_distributions_path_vec(); + + let insert_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertApplyType::StatefulBatchInsert + } else { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_type: TreeType::NormalTree, + target: QueryTarget::QueryTargetValue(serialized_distribution.len() as u32), + } + }; + + // We do a `if_not_exists` just to be extra careful + let inserted = self.batch_insert_if_not_exists( + PathKeyElementInfo::<0>::PathKeyElement(( + perpetual_distributions_path, + token_id.to_vec(), + Element::new_item(serialized_distribution), + )), + insert_type, + transaction, + batch_operations, + &platform_version.drive, + )?; + + if !inserted { + return Err(Error::Drive(DriveError::CorruptedCodeExecution("we can not insert the perpetual distribution as it already existed, this should have been validated before insertion"))); + } + + // We will distribute for the first time on the next interval + let distribution_path_for_next_interval = + distribution.distribution_path_for_next_interval(block_info); + + let distribution_key = TokenDistributionKey { + token_id: token_id.into(), + recipient: distribution.distribution_recipient(), + distribution_type: DistributionType::Perpetual, + }; + + let serialized_key = distribution_key.serialize_consume_to_bytes()?; + + let remaining_reference = vec![vec![TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], token_id.to_vec()]; + + let reference = ReferencePathType::UpstreamRootHeightReference(2, remaining_reference); + + // Now we create the reference + self.batch_insert( + PathKeyElementInfo::<0>::PathKeyElement(( + distribution_path_for_next_interval, + serialized_key, + Element::new_reference_with_flags(reference, storage_flags.to_some_element_flags()), + )), + batch_operations, + &platform_version.drive, + )?; + + Ok(()) + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/mod.rs new file mode 100644 index 00000000000..1c7413d0f5e --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/mod.rs @@ -0,0 +1,83 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Adds a list of pre-programmed distributions to the state tree. + /// + /// This function inserts pre-programmed token distributions, ensuring they are properly structured + /// within the storage tree. It creates necessary subtrees, validates input values, and associates + /// each distribution entry with the appropriate identifiers and timestamps. + /// + /// # Parameters + /// - `token_id`: The unique identifier of the token for which distributions are being added. + /// - `owner_id`: The identifier of the entity that owns the distributions. + /// - `distribution`: A `TokenPreProgrammedDistribution` containing the scheduled distributions. + /// - `block_info`: Metadata about the current block, including epoch information. + /// - `estimated_costs_only_with_layer_info`: If provided, stores estimated cost calculations + /// instead of applying the changes. + /// - `batch_operations`: The list of low-level operations to be executed as a batch. + /// - `transaction`: The transaction context for this operation. + /// - `platform_version`: The version of the platform to determine the correct function variant. + /// + /// # Behavior + /// - Ensures that the root path for pre-programmed distributions exists. + /// - Inserts a new distribution entry if one does not already exist. + /// - Stores distributions as sum trees, allowing for quick retrieval of total distributions at + /// a given time. + /// - Uses reference paths to map distributions to their corresponding execution times. + /// - Prevents overflow errors by ensuring token amounts do not exceed `i64::MAX`. + /// + /// # Returns + /// - `Ok(())` if the distributions are successfully added. + /// - `Err(Error::Drive(DriveError::UnknownVersionMismatch))` if an unsupported platform version + /// is encountered. + /// - `Err(Error::Protocol(ProtocolError::Overflow))` if a distribution amount exceeds the + /// maximum allowed value. + pub fn add_pre_programmed_distributions( + &self, + token_id: [u8; 32], + owner_id: [u8; 32], + distribution: &TokenPreProgrammedDistribution, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + batch_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .token + .distribution + .add_pre_programmed_distributions + { + 0 => self.add_pre_programmed_distributions_v0( + token_id, + owner_id, + distribution, + block_info, + estimated_costs_only_with_layer_info, + batch_operations, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_pre_programmed_distributions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/v0/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/v0/mod.rs new file mode 100644 index 00000000000..800e7385b89 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/add_pre_programmed_distribution/v0/mod.rs @@ -0,0 +1,187 @@ +use crate::drive::tokens::paths::{ + token_ms_timed_at_time_distributions_path_vec, token_ms_timed_distributions_path_vec, + token_pre_programmed_at_time_distribution_path_vec, token_pre_programmed_distributions_path, + token_root_pre_programmed_distributions_path, TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY, +}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::BatchInsertTreeApplyType; +use crate::util::object_size_info::{DriveKeyInfo, PathInfo, PathKeyElementInfo}; +use crate::util::storage_flags::StorageFlags; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::associated_token::token_distribution_key::{ + DistributionType, TokenDistributionKey, +}; +use dpp::data_contract::associated_token::token_perpetual_distribution::distribution_recipient::TokenDistributionRecipient; +use dpp::data_contract::associated_token::token_pre_programmed_distribution::methods::v0::TokenPreProgrammedDistributionV0Methods; +use dpp::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution; +use dpp::serialization::PlatformSerializable; +use dpp::version::PlatformVersion; +use dpp::ProtocolError; +use grovedb::batch::KeyInfoPath; +use grovedb::reference_path::ReferencePathType; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// Version 0 of `add_perpetual_distribution` + pub(super) fn add_pre_programmed_distributions_v0( + &self, + token_id: [u8; 32], + owner_id: [u8; 32], + distribution: &TokenPreProgrammedDistribution, + block_info: &BlockInfo, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + batch_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Drive::add_estimation_costs_for_token_pre_programmed_distribution( + token_id, + distribution.distributions().keys(), + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + + Drive::add_estimation_costs_for_root_token_ms_interval_distribution( + distribution.distributions().keys(), + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + let storage_flags = StorageFlags::new_single_epoch(block_info.epoch.index, Some(owner_id)); + + let pre_programmed_distributions_path = token_root_pre_programmed_distributions_path(); + + // Insert the tree for this token's perpetual distribution + let apply_tree_type_no_storage_flags = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, + flags_len: 0, + } + }; + + let apply_tree_type_with_storage_flags = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, + flags_len: storage_flags.serialized_size(), + } + }; + + let token_tree_key_info = DriveKeyInfo::Key(token_id.to_vec()); + let pre_programmed_distributions_path_key_info = token_tree_key_info.add_path_info::<3>( + PathInfo::PathFixedSizeArray(pre_programmed_distributions_path), + ); + + let inserted = self.batch_insert_empty_tree_if_not_exists( + pre_programmed_distributions_path_key_info, + TreeType::NormalTree, + None, // we will never clean this part up + apply_tree_type_no_storage_flags, + transaction, + &mut None, + batch_operations, + &platform_version.drive, + )?; + + if !inserted { + return Err(Error::Drive(DriveError::CorruptedCodeExecution("we can not insert the pre programmed distribution as it already existed, this should have been validated before insertion"))); + } + let pre_programmed_distributions_path = token_pre_programmed_distributions_path(&token_id); + + for (time, distribution) in distribution.distributions() { + self.batch_insert_empty_sum_tree( + pre_programmed_distributions_path, + DriveKeyInfo::Key(time.to_be_bytes().to_vec()), + None, // we will never clean this part up + batch_operations, + &platform_version.drive, + )?; + + let ms_time_distribution_path = token_ms_timed_distributions_path_vec(); + + let time_tree_key_info = DriveKeyInfo::Key(time.to_be_bytes().to_vec()); + let time_tree_reference_path_key_info = time_tree_key_info + .add_path_info::<0>(PathInfo::PathAsVec(ms_time_distribution_path)); + + self.batch_insert_empty_tree_if_not_exists( + time_tree_reference_path_key_info, + TreeType::NormalTree, + Some(&storage_flags), + apply_tree_type_with_storage_flags, + transaction, + &mut None, + batch_operations, + &platform_version.drive, + )?; + + let pre_programmed_at_time_distribution_path = + token_pre_programmed_at_time_distribution_path_vec(token_id, *time); + let ms_time_at_time_distribution_path = + token_ms_timed_at_time_distributions_path_vec(*time); + + for (recipient, amount) in distribution { + if *amount > i64::MAX as u64 { + return Err(Error::Protocol(ProtocolError::Overflow( + "distribution amount over i64::Max", + ))); + } + // We use a sum tree to be able to ask "at this time how much was distributed" + self.batch_insert( + PathKeyElementInfo::<0>::PathKeyElement(( + pre_programmed_at_time_distribution_path.clone(), + recipient.to_vec(), + Element::new_sum_item(*amount as i64), + )), + batch_operations, + &platform_version.drive, + )?; + + let distribution_key = TokenDistributionKey { + token_id: token_id.into(), + recipient: TokenDistributionRecipient::Identity(*recipient), + distribution_type: DistributionType::PreProgrammed, + }; + + let serialized_key = distribution_key.serialize_consume_to_bytes()?; + + let remaining_reference = vec![ + vec![TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + token_id.to_vec(), + time.to_be_bytes().to_vec(), + recipient.to_vec(), + ]; + + let reference = + ReferencePathType::UpstreamRootHeightReference(2, remaining_reference); + + // Now we create the reference + self.batch_insert( + PathKeyElementInfo::<0>::PathKeyElement(( + ms_time_at_time_distribution_path.clone(), + serialized_key, + Element::new_reference_with_flags( + reference, + storage_flags.to_some_element_flags(), + ), + )), + batch_operations, + &platform_version.drive, + )?; + } + } + + Ok(()) + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/fetch/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/fetch/mod.rs new file mode 100644 index 00000000000..9396b4148ce --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/fetch/mod.rs @@ -0,0 +1,104 @@ +mod pre_programmed_distributions; + +use crate::drive::tokens::distribution::queries::QueryPreProgrammedDistributionStartAt; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::prelude::{Identifier, TimestampMillis}; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the pre‑programmed distributions for a token, using the appropriate versioned method. + /// + /// This method queries the pre‑programmed distributions tree at the path + /// `token_pre_programmed_distributions_path_vec(token_id)`. It constructs a nested mapping where: + /// + /// - **Outer keys:** Timestamps (`TimestampMillis`) representing each distribution time. + /// - **Inner keys:** Recipient identifiers (`Identifier`). + /// - **Values:** Token amounts (`TokenAmount`). + /// + /// The method dispatches to the correct versioned implementation based on the `platform_version`. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to determine the method variant. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub fn fetch_token_pre_programmed_distributions( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, Error> { + self.fetch_token_pre_programmed_distributions_operations( + token_id, + start_at, + limit, + &mut vec![], + transaction, + platform_version, + ) + } + /// Fetches the pre‑programmed distributions for a token, using the appropriate versioned method. + /// + /// This method queries the pre‑programmed distributions tree at the path + /// `token_pre_programmed_distributions_path_vec(token_id)`. It constructs a nested mapping where: + /// + /// - **Outer keys:** Timestamps (`TimestampMillis`) representing each distribution time. + /// - **Inner keys:** Recipient identifiers (`Identifier`). + /// - **Values:** Token amounts (`TokenAmount`). + /// + /// The method dispatches to the correct versioned implementation based on the `platform_version`. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `drive_operations`: A mutable vector to accumulate low-level drive operations. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to determine the method variant. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub(crate) fn fetch_token_pre_programmed_distributions_operations( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .pre_programmed_distributions + { + 0 => self.fetch_token_pre_programmed_distributions_operations_v0( + token_id, + start_at, + limit, + drive_operations, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_pre_programmed_distributions_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/fetch/pre_programmed_distributions/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/fetch/pre_programmed_distributions/mod.rs new file mode 100644 index 00000000000..1b642c6eaf4 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/fetch/pre_programmed_distributions/mod.rs @@ -0,0 +1,89 @@ +use crate::drive::tokens::distribution::queries::{ + pre_programmed_distributions_query, QueryPreProgrammedDistributionStartAt, +}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; +use dpp::identity::TimestampMillis; +use grovedb::query_result_type::{QueryResultElement, QueryResultType}; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the pre‑programmed distributions for a token. + /// + /// This method queries the backing store for the pre‑programmed distributions tree at the path + /// defined by `token_pre_programmed_distributions_path_vec(token_id)`. It then extracts a nested + /// mapping where: + /// + /// - **Outer keys:** Are timestamps (`TimestampMillis`) representing each distribution time, + /// extracted from the 5th path component (index 4). The time is expected to be stored as 4 bytes in big‑endian. + /// - **Inner keys:** Are recipient identifiers (`Identifier`) derived from the query key. + /// - **Values:** Are token amounts (`TokenAmount`), extracted from elements that are sum items. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `drive_operations`: A mutable vector to accumulate low-level drive operations. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to use. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub(super) fn fetch_token_pre_programmed_distributions_operations_v0( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>>, Error> { + let path_query = pre_programmed_distributions_query(token_id, start_at, limit); + + let results = self + .grove_get_raw_path_query( + &path_query, + transaction, + QueryResultType::QueryPathKeyElementTrioResultType, + drive_operations, + &platform_version.drive, + )? + .0; + + let mut map: BTreeMap<TimestampMillis, BTreeMap<Identifier, TokenAmount>> = BTreeMap::new(); + + for result_item in results.elements.into_iter() { + if let QueryResultElement::PathKeyElementTrioResultItem((mut path, key, element)) = + result_item + { + if let Some(last) = path.pop() { + if last.len() != 8 { + return Err(Error::Drive(DriveError::CorruptedDriveState( + format!("time key in pre-programmed distributions is not 8 bytes, got {} bytes instead", last.len()), + ))); + } + let mut time_bytes = [0u8; 8]; + time_bytes.copy_from_slice(last.as_slice()); + let time = TimestampMillis::from_be_bytes(time_bytes); + let recipient = Identifier::from_bytes(key.as_slice())?; + let sum_item = element.as_sum_item_value()?; + if sum_item < 0 { + return Err(Error::Drive(DriveError::CorruptedDriveState( + "negative token amount in pre-programmed distribution".to_string(), + ))); + } + let token_amount: TokenAmount = sum_item as TokenAmount; + map.entry(time).or_default().insert(recipient, token_amount); + } + } + } + + Ok(map) + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/mod.rs new file mode 100644 index 00000000000..7fd9a456813 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/mod.rs @@ -0,0 +1,11 @@ +#[cfg(feature = "server")] +mod add_perpetual_distribution; +#[cfg(feature = "server")] +mod add_pre_programmed_distribution; +#[cfg(feature = "server")] +mod fetch; + +#[cfg(feature = "server")] +mod prove; +/// Token distribution queries +pub mod queries; diff --git a/packages/rs-drive/src/drive/tokens/distribution/prove/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/prove/mod.rs new file mode 100644 index 00000000000..a4a6bed83b4 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/prove/mod.rs @@ -0,0 +1,101 @@ +mod pre_programmed_distributions; + +use crate::drive::tokens::distribution::queries::QueryPreProgrammedDistributionStartAt; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves the pre‑programmed distributions for a token, using the appropriate versioned method. + /// + /// This method queries the pre‑programmed distributions tree at the path + /// `token_pre_programmed_distributions_path_vec(token_id)`. It constructs a nested mapping where: + /// + /// - **Outer keys:** Timestamps (`TimestampMillis`) representing each distribution time. + /// - **Inner keys:** Recipient identifiers (`Identifier`). + /// - **Values:** Token amounts (`TokenAmount`). + /// + /// The method dispatches to the correct versioned implementation based on the `platform_version`. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to determine the method variant. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub fn prove_token_pre_programmed_distributions( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_token_pre_programmed_distributions_operations( + token_id, + start_at, + limit, + &mut vec![], + transaction, + platform_version, + ) + } + /// Proves the pre‑programmed distributions for a token, using the appropriate versioned method. + /// + /// This method queries the pre‑programmed distributions tree at the path + /// `token_pre_programmed_distributions_path_vec(token_id)`. It constructs a nested mapping where: + /// + /// - **Outer keys:** Timestamps (`TimestampMillis`) representing each distribution time. + /// - **Inner keys:** Recipient identifiers (`Identifier`). + /// - **Values:** Token amounts (`TokenAmount`). + /// + /// The method dispatches to the correct versioned implementation based on the `platform_version`. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `drive_operations`: A mutable vector to accumulate low-level drive operations. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to determine the method variant. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub(crate) fn prove_token_pre_programmed_distributions_operations( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .pre_programmed_distributions + { + 0 => self.prove_token_pre_programmed_distributions_operations_v0( + token_id, + start_at, + limit, + drive_operations, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_pre_programmed_distributions_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/prove/pre_programmed_distributions/mod.rs b/packages/rs-drive/src/drive/tokens/distribution/prove/pre_programmed_distributions/mod.rs new file mode 100644 index 00000000000..546c04c7cf5 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/prove/pre_programmed_distributions/mod.rs @@ -0,0 +1,50 @@ +use crate::drive::tokens::distribution::queries::{ + pre_programmed_distributions_query, QueryPreProgrammedDistributionStartAt, +}; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + /// Fetches the pre‑programmed distributions for a token as a proof. + /// + /// This method queries the backing store for the pre‑programmed distributions tree at the path + /// defined by `token_pre_programmed_distributions_path_vec(token_id)`. It then extracts a nested + /// mapping where: + /// + /// - **Outer keys:** Are timestamps (`TimestampMillis`) representing each distribution time, + /// extracted from the 5th path component (index 4). The time is expected to be stored as 4 bytes in big‑endian. + /// - **Inner keys:** Are recipient identifiers (`Identifier`) derived from the query key. + /// - **Values:** Are token amounts (`TokenAmount`), extracted from elements that are sum items. + /// + /// # Parameters + /// + /// - `token_id`: The 32‑byte identifier for the token. + /// - `drive_operations`: A mutable vector to accumulate low-level drive operations. + /// - `transaction`: The current GroveDB transaction. + /// - `platform_version`: The platform version to use. + /// + /// # Returns + /// + /// A `Result` containing a nested `BTreeMap` on success or an `Error` on failure. + pub(super) fn prove_token_pre_programmed_distributions_operations_v0( + &self, + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = pre_programmed_distributions_query(token_id, start_at, limit); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} diff --git a/packages/rs-drive/src/drive/tokens/distribution/queries.rs b/packages/rs-drive/src/drive/tokens/distribution/queries.rs new file mode 100644 index 00000000000..b676a24db5b --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/distribution/queries.rs @@ -0,0 +1,81 @@ +use crate::drive::tokens::paths::token_pre_programmed_distributions_path_vec; +use crate::query::QueryItem; +use dpp::identifier::Identifier; +use dpp::prelude::{StartAtIncluded, TimestampMillis}; +use grovedb::{PathQuery, Query, SizedQuery}; + +/// Defines the starting point for a query on pre-programmed token distributions. +/// +/// # Usage +/// +/// This struct is used to define a query range when retrieving pre-programmed distributions. +/// It allows queries to start at a specific point instead of always fetching the full dataset. +pub struct QueryPreProgrammedDistributionStartAt { + /// The timestamp (in milliseconds) from which distributions should be queried. + /// Only distributions at or after this time will be included. + pub start_at_time: TimestampMillis, + + /// An optional recipient filter that specifies a recipient to start querying from within the given timestamp. + /// + /// - If `Some((recipient, StartAtIncluded::Yes))`, the query will start **from** this recipient. + /// - If `Some((recipient, StartAtIncluded::No))`, the query will start **after** this recipient. + /// - If `None`, the query will return all recipients from `start_at_time`. + pub start_at_recipient: Option<(Identifier, StartAtIncluded)>, +} + +/// Constructs a query that fetches the entire pre‑programmed distributions subtree for a token. +/// +/// The query uses the path returned by `token_pre_programmed_distributions_path_vec(token_id)` and +/// inserts a full‑range query (i.e. `RangeFull`) so that all time keys are returned. +/// +/// # Parameters +/// +/// - `token_id`: The 32‑byte identifier for the token. +/// - `limit`: An optional limit +/// +/// # Returns +/// +/// A `PathQuery` that, when executed, will return all entries under the token’s +/// pre‑programmed distributions tree. +pub fn pre_programmed_distributions_query( + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, +) -> PathQuery { + let path = token_pre_programmed_distributions_path_vec(token_id); + let query = match start_at { + None => { + let mut query = Query::new_range_full(); + query.set_subquery(Query::new_range_full()); + query + } + Some(QueryPreProgrammedDistributionStartAt { + start_at_time, + start_at_recipient, + }) => { + let mut query = Query::new_single_query_item(QueryItem::RangeFrom( + start_at_time.to_be_bytes().to_vec().., + )); + query.set_subquery(Query::new_range_full()); + if let Some((start_at_recipient, included)) = start_at_recipient { + let subquery = if included { + Query::new_single_query_item(QueryItem::RangeFrom( + start_at_recipient.to_vec().., + )) + } else { + Query::new_single_query_item(QueryItem::RangeAfter( + start_at_recipient.to_vec().., + )) + }; + query.add_conditional_subquery( + QueryItem::Key(start_at_time.to_be_bytes().to_vec()), + None, + Some(subquery), + ) + } + query + } + }; + + PathQuery::new(path, SizedQuery::new(query, limit, None)) +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/mod.rs new file mode 100644 index 00000000000..7ea7d03fd5a --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/mod.rs @@ -0,0 +1,40 @@ +mod v0; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::prelude::TimestampMillis; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + pub(crate) fn add_estimation_costs_for_root_token_ms_interval_distribution<'a, I>( + times: I, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> + where + I: IntoIterator<Item = &'a TimestampMillis> + ExactSizeIterator, + { + match drive_version + .methods + .identity + .cost_estimation + .for_root_token_ms_interval_distribution + { + 0 => { + Self::add_estimation_costs_for_root_token_ms_interval_distribution_v0( + times, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_root_token_ms_interval_distribution".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/v0/mod.rs new file mode 100644 index 00000000000..6efd7d1575d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_root_token_ms_interval_distribution/v0/mod.rs @@ -0,0 +1,65 @@ +use crate::drive::tokens::paths::{ + token_ms_timed_at_time_distributions_path_vec, token_ms_timed_distributions_path_vec, + token_timed_distributions_path_vec, +}; +use crate::drive::Drive; +use crate::util::type_constants::{ + DEFAULT_HASH_SIZE_U32, DEFAULT_HASH_SIZE_U8, U64_SIZE_U8, U8_SIZE_U8, +}; +use dpp::prelude::TimestampMillis; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::EstimatedLevel; +use grovedb::EstimatedLayerSizes::{AllReference, AllSubtrees}; +use grovedb::EstimatedSumTrees::NoSumTrees; +use grovedb::{EstimatedLayerInformation, TreeType}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn add_estimation_costs_for_root_token_ms_interval_distribution_v0<'a, I>( + times: I, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) where + I: IntoIterator<Item = &'a TimestampMillis> + ExactSizeIterator, + { + // 1. Insert estimation for the generic timed distributions tree. + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(token_timed_distributions_path_vec()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(0, false), // 0 because ms is on top + estimated_layer_sizes: AllSubtrees(U8_SIZE_U8, NoSumTrees, None), + }, + ); + + // 2. Insert estimation for the millisecond-timed distributions tree. + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(token_ms_timed_distributions_path_vec()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // we can have a lot of times + estimated_layer_sizes: AllSubtrees(U64_SIZE_U8, NoSumTrees, None), + }, + ); + + // 3. For each provided timestamp, add an estimation entry for the at-time ms distribution sum tree. + for time in times { + let key = KeyInfoPath::from_known_owned_path( + token_ms_timed_at_time_distributions_path_vec(*time), + ); + estimated_costs_only_with_layer_info.insert( + key, + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + // We assume a shallow sum tree for the distribution entries at a given time. + estimated_layer_count: EstimatedLevel(1, false), + // Each distribution entry is estimated with a fixed size. + estimated_layer_sizes: AllReference( + DEFAULT_HASH_SIZE_U8, + DEFAULT_HASH_SIZE_U32 * 2 + 2, + None, + ), + }, + ); + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/mod.rs new file mode 100644 index 00000000000..fcce3e3dff7 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/mod.rs @@ -0,0 +1,57 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token balance changes based on the provided drive version. + /// + /// This method updates the `estimated_costs_only_with_layer_info` HashMap with entries + /// representing the estimated costs for different layers of the balance tree. The method + /// adjusts its behavior depending on the provided `drive_version`, allowing it to support + /// different versioned implementations for cost estimation. + /// + /// # Parameters + /// - `token_id`: A 32-byte identifier for the token whose balance changes are being estimated. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap that holds + /// `KeyInfoPath` and `EstimatedLayerInformation` for each token balance layer. + /// - `drive_version`: The version of the drive to determine which estimation logic to apply. + /// + /// # Returns + /// - `Ok(())` if the operation is successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the provided `drive_version` does not match + /// any known supported versions. + /// + /// # Errors + /// This function will return an error if the provided `drive_version` does not match a known version. + pub(crate) fn add_estimation_costs_for_token_balances( + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_token_balances + { + 0 => { + Self::add_estimation_costs_for_token_balances_v0( + token_id, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_token_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/v0/mod.rs new file mode 100644 index 00000000000..821d7c74c63 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_balances/v0/mod.rs @@ -0,0 +1,100 @@ +use crate::drive::constants::AVERAGE_BALANCE_SIZE; + +use crate::drive::Drive; + +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; + +use crate::drive::tokens::paths::{ + token_balances_path, token_balances_root_path, tokens_root_path, +}; +use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; +use grovedb::EstimatedSumTrees::{AllBigSumTrees, AllSumTrees, NoSumTrees}; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token balances in Drive for version 0. + /// + /// This function provides a mechanism to estimate the costs of token balances + /// in the drive by updating the provided `HashMap` with layer information + /// relevant to balances. + /// + /// # Parameters + /// + /// * `estimated_costs_only_with_layer_info`: A mutable reference to a `HashMap` + /// that stores estimated layer information based on the key information path. + /// + /// # Notes + /// + /// The function estimates costs for three layers: + /// + /// 1. **Top Layer**: + /// - Contains general balance information and is assumed to be located on + /// layer 3 (third level in the hierarchy). The update will involve modifying: + /// - 1 normal tree for token balances. + /// - 1 normal tree for identities. + /// - 1 normal tree for contract/documents. + /// + /// 2. **Token Balances or Info Layer**: + /// - This layer contains two nodes, either for representing the token balances or info. + /// + /// 3. **All Token Balances Layer**: + /// - This layer contains the token balance root path and is considered to be + /// a normal tree that will require updates to an average of 10 nodes. + /// + /// 3. **Token Layer**: + /// - This layer contains the contract-specific token balance information, which + /// is a sum tree structure with all token amounts for all identities that have a balance. + /// ``` + pub(super) fn add_estimation_costs_for_token_balances_v0( + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 3 (level 2 on left then left) + // updating will mean we will update: + // 1 normal tree (token balances) + // 1 normal tree (identities) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(2, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // there is one tree for the root path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(tokens_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(0, false), // this should be at the top + estimated_layer_sizes: AllSubtrees(1, AllBigSumTrees, None), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(token_balances_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::BigSumTree, + estimated_layer_count: EstimatedLevel(10, false), // we can estimate 10 levels deep + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, AllSumTrees, None), + }, + ); + + // this is where the balances are + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(token_balances_path(&token_id)), + EstimatedLayerInformation { + tree_type: TreeType::SumTree, + estimated_layer_count: PotentiallyAtMaxElements, + estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, AVERAGE_BALANCE_SIZE, None), + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/mod.rs new file mode 100644 index 00000000000..a5225fa37be --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/mod.rs @@ -0,0 +1,57 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token identity infos changes based on the provided drive version. + /// + /// This method updates the `estimated_costs_only_with_layer_info` HashMap with entries + /// representing the estimated costs for different layers of the balance tree. The method + /// adjusts its behavior depending on the provided `drive_version`, allowing it to support + /// different versioned implementations for cost estimation. + /// + /// # Parameters + /// - `token_id`: A 32-byte identifier for the token whose balance changes are being estimated. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap that holds + /// `KeyInfoPath` and `EstimatedLayerInformation` for each token balance layer. + /// - `drive_version`: The version of the drive to determine which estimation logic to apply. + /// + /// # Returns + /// - `Ok(())` if the operation is successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the provided `drive_version` does not match + /// any known supported versions. + /// + /// # Errors + /// This function will return an error if the provided `drive_version` does not match a known version. + pub(crate) fn add_estimation_costs_for_token_identity_infos( + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_token_identity_infos + { + 0 => { + Self::add_estimation_costs_for_token_identity_infos_v0( + token_id, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_token_identity_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/v0/mod.rs new file mode 100644 index 00000000000..087fa60b8fc --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_identity_infos/v0/mod.rs @@ -0,0 +1,81 @@ +use crate::drive::Drive; + +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::{EstimatedLevel, PotentiallyAtMaxElements}; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; + +use crate::drive::tokens::paths::{ + token_identity_infos_path, token_identity_infos_root_path, tokens_root_path, +}; +use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; +use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use std::collections::HashMap; + +pub const ESTIMATED_TOKEN_INFO_SIZE_BYTES: u32 = 32; + +impl Drive { + pub(super) fn add_estimation_costs_for_token_identity_infos_v0( + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 3 (level 2 on left then left) + // updating will mean we will update: + // 1 normal tree (token balances) + // 1 normal tree (identities) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(2, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // there is one tree for the root path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(tokens_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), // this should be at the top + estimated_layer_sizes: AllSubtrees( + 1, + SomeSumTrees { + sum_trees_weight: 0, + big_sum_trees_weight: 1, + count_trees_weight: 0, + count_sum_trees_weight: 0, + non_sum_trees_weight: 1, + }, + None, + ), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(token_identity_infos_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // we can estimate 10 levels deep + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + // this is where the balances are + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(token_identity_infos_path(&token_id)), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: PotentiallyAtMaxElements, + estimated_layer_sizes: AllItems( + DEFAULT_HASH_SIZE_U8, + ESTIMATED_TOKEN_INFO_SIZE_BYTES, + None, + ), + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/mod.rs new file mode 100644 index 00000000000..b83b6c58961 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/mod.rs @@ -0,0 +1,72 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::prelude::TimestampMillis; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds cost estimation entries for a token's pre-programmed distribution tree. + /// + /// This function updates the provided `estimated_costs_only_with_layer_info` hashmap with estimation entries + /// for each layer in the pre-programmed distribution tree associated with a specific token. The tree structure + /// includes: + /// + /// - The root level of the pre-programmed distributions. + /// - The token-specific subtree (keyed by `token_id`). + /// - One sum tree per distribution time (each timestamp in `times`). + /// + /// The function selects the appropriate estimation logic based on the provided `drive_version`. + /// + /// # Parameters + /// + /// - `token_id`: The 32-byte identifier for the token whose pre-programmed distribution tree is being estimated. + /// - `times`: A vector of timestamps (in milliseconds) for which pre-programmed distributions exist. + /// - `estimated_costs_only_with_layer_info`: A mutable hashmap that maps `KeyInfoPath` to `EstimatedLayerInformation`. + /// This cache is used by Grovedb to track the estimated storage costs for each layer in the tree. + /// - `drive_version`: The drive version that determines which estimation logic to use. + /// + /// # Returns + /// + /// - `Ok(())` if the estimation entries were successfully added. + /// - `Err(DriveError::UnknownVersionMismatch)` if the provided `drive_version` does not match any supported version. + /// + /// # Errors + /// + /// Returns an error if the `drive_version` is not recognized, ensuring that only supported estimation + /// implementations are applied. + pub(crate) fn add_estimation_costs_for_token_pre_programmed_distribution<'a, I>( + token_id: [u8; 32], + times: I, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> + where + I: IntoIterator<Item = &'a TimestampMillis> + ExactSizeIterator, + { + match drive_version + .methods + .identity + .cost_estimation + .for_token_pre_programmed_distribution + { + 0 => { + Self::add_estimation_costs_for_token_pre_programmed_distribution_v0( + token_id, + times, + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_pre_programmed_distribution".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/v0/mod.rs new file mode 100644 index 00000000000..43590bf1d4f --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_pre_programmed_distribution/v0/mod.rs @@ -0,0 +1,81 @@ +use crate::drive::tokens::paths::{ + token_distributions_root_path_vec, token_pre_programmed_at_time_distribution_path_vec, + token_pre_programmed_distributions_path_vec, token_root_pre_programmed_distributions_path_vec, +}; +use crate::drive::Drive; +use crate::util::type_constants::{DEFAULT_HASH_SIZE_U8, U64_SIZE_U32, U64_SIZE_U8, U8_SIZE_U8}; +use dpp::prelude::TimestampMillis; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::{ApproximateElements, EstimatedLevel}; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::EstimatedSumTrees::{AllSumTrees, NoSumTrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; +use std::collections::HashMap; + +impl Drive { + /// Version 0 of the estimation function for pre-programmed distributions. + /// + /// This function adds estimation cost entries for: + /// 1. The root pre-programmed distributions tree. + /// 2. The token-specific subtree (using `token_id`). + /// 3. Each time-specific sum tree for every timestamp in `times`. + /// + /// # Parameters + /// - `token_id`: The identifier for the token. + /// - `times`: A vector of timestamps (in milliseconds) for which pre-programmed distributions exist. + /// - `estimated_costs_only_with_layer_info`: A mutable hashmap that holds estimated layer information. + pub(crate) fn add_estimation_costs_for_token_pre_programmed_distribution_v0<'a, I>( + token_id: [u8; 32], + times: I, + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) where + I: IntoIterator<Item = &'a TimestampMillis> + ExactSizeIterator, + { + // 1. Add estimation for the root distributions tree. + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(token_distributions_root_path_vec()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), // We should be on the first level + estimated_layer_sizes: AllSubtrees(U8_SIZE_U8, NoSumTrees, None), + }, + ); + + // 2. Add estimation for the root pre-programmed distributions tree. + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(token_root_pre_programmed_distributions_path_vec()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // Just an estimate + estimated_layer_sizes: AllSubtrees(DEFAULT_HASH_SIZE_U8, NoSumTrees, None), + }, + ); + + // 3. Add estimation for the token-specific pre-programmed distributions subtree. + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path(token_pre_programmed_distributions_path_vec( + token_id, + )), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + // At this level, expect as many children as there are time entries. + estimated_layer_count: ApproximateElements(times.len() as u32), + estimated_layer_sizes: AllSubtrees(U64_SIZE_U8, AllSumTrees, None), + }, + ); + + // 4. For each provided timestamp, add an estimation for the at-time sum tree. + for time in times { + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_owned_path( + token_pre_programmed_at_time_distribution_path_vec(token_id, *time), + ), + EstimatedLayerInformation { + tree_type: TreeType::SumTree, + estimated_layer_count: EstimatedLevel(3, false), // probably not that many + estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, U64_SIZE_U32, None), + }, + ); + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/mod.rs new file mode 100644 index 00000000000..59cb58e5461 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/mod.rs @@ -0,0 +1,55 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token status infos changes based on the provided drive version. + /// + /// This method updates the `estimated_costs_only_with_layer_info` HashMap with entries + /// representing the estimated costs for different layers of the balance tree. The method + /// adjusts its behavior depending on the provided `drive_version`, allowing it to support + /// different versioned implementations for cost estimation. + /// + /// # Parameters + /// - `token_id`: A 32-byte identifier for the token whose balance changes are being estimated. + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap that holds + /// `KeyInfoPath` and `EstimatedLayerInformation` for each token balance layer. + /// - `drive_version`: The version of the drive to determine which estimation logic to apply. + /// + /// # Returns + /// - `Ok(())` if the operation is successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the provided `drive_version` does not match + /// any known supported versions. + /// + /// # Errors + /// This function will return an error if the provided `drive_version` does not match a known version. + pub(crate) fn add_estimation_costs_for_token_status_infos( + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_token_identity_infos + { + 0 => { + Self::add_estimation_costs_for_token_status_infos_v0( + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_token_status_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/v0/mod.rs new file mode 100644 index 00000000000..58aa341787d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_status_infos/v0/mod.rs @@ -0,0 +1,68 @@ +use crate::drive::Drive; + +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::EstimatedLevel; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; + +use crate::drive::tokens::paths::{token_statuses_root_path, tokens_root_path}; +use crate::util::type_constants::DEFAULT_HASH_SIZE_U8; +use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use std::collections::HashMap; + +pub const ESTIMATED_TOKEN_STATUS_INFO_SIZE_BYTES: u32 = 32; + +impl Drive { + pub(super) fn add_estimation_costs_for_token_status_infos_v0( + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 3 (level 2 on left then left) + // updating will mean we will update: + // 1 normal tree (token balances) + // 1 normal tree (identities) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(2, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // there is one tree for the root path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(tokens_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(1, false), // this should be at the top + estimated_layer_sizes: AllSubtrees( + 1, + SomeSumTrees { + sum_trees_weight: 0, + big_sum_trees_weight: 1, + count_trees_weight: 0, + count_sum_trees_weight: 0, + non_sum_trees_weight: 1, + }, + None, + ), + }, + ); + + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(token_statuses_root_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), // we can estimate 10 levels deep + estimated_layer_sizes: AllItems( + DEFAULT_HASH_SIZE_U8, + ESTIMATED_TOKEN_STATUS_INFO_SIZE_BYTES, + None, + ), + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/mod.rs new file mode 100644 index 00000000000..51e3fc30f26 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/mod.rs @@ -0,0 +1,50 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::drive_versions::DriveVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerInformation; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token total supply changes. + /// + /// It operates on the provided HashMap, `estimated_costs_only_with_layer_info`, and adds + /// new entries to it, representing the estimated costs for different layers of the balance tree. + /// + /// # Parameters + /// - `estimated_costs_only_with_layer_info`: A mutable reference to a HashMap storing + /// the `KeyInfoPath` and `EstimatedLayerInformation`. + /// + /// # Returns + /// - `Ok(())` if successful. + /// - `Err(DriveError::UnknownVersionMismatch)` if the method version doesn't match any known versions. + /// + /// # Errors + /// This function will return an error if the method version doesn't match any known versions. + pub(crate) fn add_estimation_costs_for_token_total_supply( + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> { + match drive_version + .methods + .identity + .cost_estimation + .for_token_total_supply + { + 0 => { + Self::add_estimation_costs_for_token_total_supply_v0( + estimated_costs_only_with_layer_info, + ); + Ok(()) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_estimation_costs_for_token_total_supply".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/v0/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/v0/mod.rs new file mode 100644 index 00000000000..7f022ceec82 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/for_token_total_supply/v0/mod.rs @@ -0,0 +1,101 @@ +use crate::drive::Drive; + +use grovedb::batch::KeyInfoPath; +use grovedb::EstimatedLayerCount::EstimatedLevel; +use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; +use grovedb::{EstimatedLayerInformation, TreeType}; + +use crate::drive::balances::total_tokens_root_supply_path; +use crate::drive::system::misc_path; +use crate::util::type_constants::{DEFAULT_HASH_SIZE_U8, U64_SIZE_U32}; +use grovedb::EstimatedSumTrees::{NoSumTrees, SomeSumTrees}; +use std::collections::HashMap; + +impl Drive { + /// Adds estimation costs for token total supply in Drive for version 0. + /// + /// This function estimates the storage and update costs associated with token total supply + /// in Drive, providing detailed information about the layer structure and required updates + /// for each relevant path. The provided `HashMap` will be updated with the estimated costs + /// for each layer involved in the process. + /// + /// # Parameters + /// + /// * `estimated_costs_only_with_layer_info`: A mutable reference to a `HashMap` + /// that stores the estimated layer information for each key information path. + /// This map will be populated with the relevant layer information for the token supply + /// data and other associated trees. + /// + /// # Notes + /// + /// The function estimates costs for the following layers: + /// + /// 1. **Top Layer**: + /// - Contains general balance information and is assumed to be located on + /// level 3 of the hierarchy. It involves updating: + /// - 1 normal tree for contract/documents. + /// - 1 sum tree for balances. + /// - 1 normal for votes. + /// - 1 normal tree for misc. + /// - This layer has an equal weight distribution between normal and sum trees. + /// + /// 2. **Misc Layer**: + /// - A normal tree that contains miscellaneous data relevant to the total supply + /// process. + /// + /// 3. **Total Tokens Root Supply Path**: + /// - This path represents the root for the total tokens supply and is updated + /// with the corresponding token supply information. It is estimated to update + /// an average of 10 nodes in a normal tree structure. + pub(super) fn add_estimation_costs_for_token_total_supply_v0( + estimated_costs_only_with_layer_info: &mut HashMap<KeyInfoPath, EstimatedLayerInformation>, + ) { + // we have constructed the top layer so contract/documents tree are at the top + // since balance will be on layer 4 (level 3 on right, then right, then left) + // updating will mean we will update: + // 1 normal tree (misc) + // 1 normal tree (votes) + // 1 sum tree (balances) + // 1 normal tree (contract/documents) + // hence we should give an equal weight to both + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path([]), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(3, false), + // 17 because we have 2 layers at 32 and two layers at 2 + estimated_layer_sizes: AllSubtrees( + 17, + SomeSumTrees { + sum_trees_weight: 1, + big_sum_trees_weight: 0, + count_trees_weight: 0, + count_sum_trees_weight: 0, + non_sum_trees_weight: 3, + }, + None, + ), + }, + ); + + // in the misc tree + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(misc_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(2, false), + estimated_layer_sizes: AllSubtrees(1, NoSumTrees, None), + }, + ); + + // in the total tokens root supply path + estimated_costs_only_with_layer_info.insert( + KeyInfoPath::from_known_path(total_tokens_root_supply_path()), + EstimatedLayerInformation { + tree_type: TreeType::NormalTree, + estimated_layer_count: EstimatedLevel(10, false), + estimated_layer_sizes: AllItems(DEFAULT_HASH_SIZE_U8, U64_SIZE_U32, None), + }, + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/estimated_costs/mod.rs b/packages/rs-drive/src/drive/tokens/estimated_costs/mod.rs new file mode 100644 index 00000000000..b0ebc0bb9d1 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/estimated_costs/mod.rs @@ -0,0 +1,17 @@ +/// Module for handling operations related to token balances. +pub mod for_token_balances; + +/// Module for handling operations related to token total supply. +pub mod for_token_total_supply; + +/// Module for handling operations related to token identity information. +pub mod for_token_identity_infos; + +/// Module for handling operations related to token status information. +pub mod for_token_status_infos; + +/// Module for handling operations related to token pre-programmed distribution. +pub mod for_token_pre_programmed_distribution; + +/// Module for handling operations related to token interval distribution. +pub mod for_root_token_ms_interval_distribution; diff --git a/packages/rs-drive/src/drive/tokens/freeze/mod.rs b/packages/rs-drive/src/drive/tokens/freeze/mod.rs new file mode 100644 index 00000000000..d2339bd4c87 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/freeze/mod.rs @@ -0,0 +1,95 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::Identifier; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Burns tokens by reducing the total supply and removing them from an identity's balance. + pub fn token_freeze( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.freeze { + 0 => self.token_freeze_v0( + token_id, + frozen_identity_id, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_freeze".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations to freeze tokens without calculating fees and optionally applying. + pub fn token_freeze_add_to_operations( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.freeze { + 0 => self.token_freeze_add_to_operations_v0( + token_id, + frozen_identity_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_freeze_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to freeze tokens. + pub fn token_freeze_operations( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.freeze { + 0 => self.token_freeze_operations_v0( + token_id, + frozen_identity_id, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_freeze_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/freeze/v0/mod.rs b/packages/rs-drive/src/drive/tokens/freeze/v0/mod.rs new file mode 100644 index 00000000000..e36c6120776 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/freeze/v0/mod.rs @@ -0,0 +1,147 @@ +use crate::drive::tokens::paths::token_identity_infos_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use dpp::serialization::{PlatformDeserializable, PlatformSerializable}; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_freeze_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_freeze_add_to_operations_v0( + token_id, + frozen_identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_freeze_add_to_operations_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_freeze_operations_v0( + token_id, + frozen_identity_id, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_freeze_operations_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_token_identity_infos( + token_id.to_buffer(), + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let token_info_path = token_identity_infos_path(token_id.as_bytes()); + match self + .grove_get_raw_optional_item( + (&token_info_path).into(), + frozen_identity_id.as_slice(), + direct_query_type, + transaction, + &mut drive_operations, + &platform_version.drive, + )? + .map(|bytes| IdentityTokenInfo::deserialize_from_bytes(&bytes)) + .transpose()? + { + None => { + let identity_token_info_bytes = + IdentityTokenInfo::new(true, platform_version)?.serialize_consume_to_bytes()?; + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + token_info_path.iter().map(|a| a.to_vec()).collect(), + frozen_identity_id.to_vec(), + Element::new_item(identity_token_info_bytes), + )); + } + Some(mut token_info) => { + if !token_info.frozen() { + token_info.set_frozen(true); + let identity_token_info_bytes = token_info.serialize_consume_to_bytes()?; + drive_operations.push( + LowLevelDriveOperation::replace_for_known_path_key_element( + token_info_path.iter().map(|a| a.to_vec()).collect(), + frozen_identity_id.to_vec(), + Element::new_item(identity_token_info_bytes), + ), + ); + } + } + }; + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/mod.rs new file mode 100644 index 00000000000..33fac51df92 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/mod.rs @@ -0,0 +1,151 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the token infos of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose infos are to be fetched. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error>` - A map of token IDs to their corresponding infos, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_infos( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identities_token_infos + { + 0 => self.fetch_identities_token_infos_v0( + token_id, + identity_ids, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token infos with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to fetch the infos for. + /// * `identity_id` - The identity's ID whose infos are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<((BTreeMap<[u8; 32], Option<IdentityTokenInfo>>), FeeResult), Error>` - A tuple containing a map of token infos and the associated fee result. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_infos_with_costs( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identities_token_infos_operations( + token_id, + identity_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to fetch the identity's token infos from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the infos for. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding infos, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identities_token_infos_operations( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identities_token_infos + { + 0 => self.fetch_identities_token_infos_operations_v0( + token_id, + identity_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identities_token_infos_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/v0/mod.rs new file mode 100644 index 00000000000..e892dcd7aaf --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identities_token_infos/v0/mod.rs @@ -0,0 +1,66 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_identities_token_infos_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + self.fetch_identities_token_infos_operations_v0( + token_id, + identity_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identities_token_infos_operations_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + let path_query = Self::token_infos_for_identity_ids_query(token_id, identity_ids); + + self.grove_get_raw_path_query_with_optional( + &path_query, + false, + transaction, + drive_operations, + &platform_version.drive, + )? + .into_iter() + .map(|(_, key, element)| { + let identity_id: [u8; 32] = key.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "identity id not 32 bytes".to_string(), + )) + })?; + match element { + Some(Item(value, ..)) => Ok(( + identity_id, + Some(IdentityTokenInfo::deserialize_from_bytes(&value)?), + )), + None => Ok((identity_id, None)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for infos should contain only items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/mod.rs new file mode 100644 index 00000000000..3fa1a5dad03 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/mod.rs @@ -0,0 +1,134 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Identity's token info from the backing store. + /// Passing `apply = false` will return estimated costs (0 or Some(0) in place of actual values). + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `identity_id` - The ID of the Identity whose token info is to be fetched. + /// * `apply` - Whether to actually fetch from state (true) or estimate costs (false). + /// * `transaction` - The current transaction. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<Credits>, Error>` - The token info of the Identity if successful, or an error. + pub fn fetch_identity_token_info( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<IdentityTokenInfo>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_info + { + 0 => self.fetch_identity_token_info_v0( + token_id, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_info".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the Identity's token info with costs (if `apply = true`) and returns associated fee result. + pub fn fetch_identity_token_info_with_costs( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option<IdentityTokenInfo>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identity_token_info_operations( + token_id, + identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the operations to get Identity's token info from the backing store. + /// If `apply` is false, the operations are stateless and only used for cost estimation. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `identity_id` - The ID of the Identity whose token info is to be fetched. + /// * `apply` - Whether to fetch actual stateful data (true) or just estimate costs (false). + /// * `transaction` - The current transaction. + /// * `drive_operations` - The drive operations vector to populate. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<Credits>, Error>` - The token info of the Identity if successful, or an error. + pub fn fetch_identity_token_info_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<IdentityTokenInfo>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_info + { + 0 => self.fetch_identity_token_info_operations_v0( + token_id, + identity_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_info_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/v0/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/v0/mod.rs new file mode 100644 index 00000000000..e923a435d90 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_info/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::drive::tokens::paths::token_identity_infos_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::{TransactionArg, TreeType}; + +impl Drive { + pub(super) fn fetch_identity_token_info_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<IdentityTokenInfo>, Error> { + self.fetch_identity_token_info_operations_v0( + token_id, + identity_id, + true, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identity_token_info_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<IdentityTokenInfo>, Error> { + let direct_query_type = if apply { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let info_path = token_identity_infos_path(&token_id); + + match self.grove_get_raw_optional( + (&info_path).into(), + identity_id.as_slice(), + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + ) { + Ok(Some(Item(info, _))) => Ok(Some(IdentityTokenInfo::deserialize_from_bytes( + info.as_slice(), + )?)), + + Ok(None) | Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) => Ok(None), + + Ok(Some(_)) => Err(Error::Drive(DriveError::CorruptedElementType( + "identity token info was present but was not an item", + ))), + + Err(e) => Err(e), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/mod.rs new file mode 100644 index 00000000000..a8335427f8a --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/mod.rs @@ -0,0 +1,151 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches the token infos of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose infos are to be fetched. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error>` - A map of token IDs to their corresponding infos, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_infos( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_infos + { + 0 => self.fetch_identity_token_infos_v0( + token_ids, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token infos with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to fetch the infos for. + /// * `identity_id` - The identity's ID whose infos are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<((BTreeMap<[u8; 32], Option<TokenAmount>>), FeeResult), Error>` - A tuple containing a map of token infos and the associated fee result. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_infos_with_costs( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_identity_token_infos_operations( + token_ids, + identity_id, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to fetch the identity's token infos from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the infos for. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenAmount>>, Error>` - A map of token IDs to their corresponding infos, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_identity_token_infos_operations( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .identity_token_infos + { + 0 => self.fetch_identity_token_infos_operations_v0( + token_ids, + identity_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_identity_token_infos_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/v0/mod.rs new file mode 100644 index 00000000000..21ab3474ba6 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/fetch_identity_token_infos/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_identity_token_infos_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + self.fetch_identity_token_infos_operations_v0( + token_ids, + identity_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_identity_token_infos_operations_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error> { + let path_query = Drive::token_infos_for_identity_id_query(token_ids, identity_id); + + self.grove_get_raw_path_query_with_optional( + &path_query, + false, + transaction, + drive_operations, + &platform_version.drive, + )? + .into_iter() + .map(|(path, _, element)| { + let token_id: [u8; 32] = path + .get(2) + .ok_or(Error::Drive(DriveError::CorruptedDriveState( + "returned path item should always have a third part at index 2".to_string(), + )))? + .clone() + .try_into() + .map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "token id not 32 bytes".to_string(), + )) + })?; + match element { + Some(Item(value, ..)) => Ok(( + token_id, + Some(IdentityTokenInfo::deserialize_from_bytes(&value)?), + )), + None => Ok((token_id, None)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for infos should contain only items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/mod.rs b/packages/rs-drive/src/drive/tokens/info/mod.rs new file mode 100644 index 00000000000..f446d8668d7 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/mod.rs @@ -0,0 +1,12 @@ +#[cfg(feature = "server")] +mod fetch_identities_token_infos; +#[cfg(feature = "server")] +mod fetch_identity_token_infos; +#[cfg(feature = "server")] +mod prove_identities_token_infos; +#[cfg(feature = "server")] +mod prove_identity_token_infos; +mod queries; + +#[cfg(feature = "server")] +mod fetch_identity_token_info; diff --git a/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/mod.rs b/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/mod.rs new file mode 100644 index 00000000000..918eeafe949 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/mod.rs @@ -0,0 +1,149 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves the token infos of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose infos are to be proveed. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_infos( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_infos + { + 0 => self.prove_identities_token_infos_v0( + token_id, + identity_ids, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Proves the identity's token infos with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to prove the infos for. + /// * `identity_id` - The identity's ID whose infos are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_infos_with_costs( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Vec<u8>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.prove_identities_token_infos_operations( + token_id, + identity_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to prove the identity's token infos from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the infos for. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identities_token_infos_operations( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_infos + { + 0 => self.prove_identities_token_infos_operations_v0( + token_id, + identity_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identities_token_infos_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/v0/mod.rs new file mode 100644 index 00000000000..d74ae92a503 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/prove_identities_token_infos/v0/mod.rs @@ -0,0 +1,353 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_identities_token_infos_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_identities_token_infos_operations_v0( + token_id, + identity_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_identities_token_infos_operations_v0( + &self, + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::token_infos_for_identity_ids_query(token_id, identity_ids); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::identity::Identity; + use std::collections::BTreeMap; + + use dpp::identity::accessors::IdentityGettersV0; + use dpp::prelude::DataContract; + use dpp::tokens::info::IdentityTokenInfo; + use dpp::version::PlatformVersion; + + #[test] + fn should_prove_a_single_identity_token_info() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + drive + .token_freeze( + token_id, + identity.id(), + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token"); + let proof = drive + .prove_identities_token_infos_v0( + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_info: BTreeMap<[u8; 32], Option<IdentityTokenInfo>> = + Drive::verify_token_infos_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!( + proved_identity_info, + BTreeMap::from([( + identity_id, + Some(IdentityTokenInfo::new(true, platform_version).expect("expected token info")) + )]) + ); + } + + #[test] + fn should_prove_a_single_identity_token_info_does_not_exist() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + let proof = drive + .prove_identities_token_infos_v0( + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_info: BTreeMap<[u8; 32], Option<IdentityTokenInfo>> = + Drive::verify_token_infos_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!(proved_identity_info, BTreeMap::from([(identity_id, None)])); + } + + #[test] + fn should_prove_multiple_identity_single_token_infos() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let identity_1 = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_1_id = identity_1.id().to_buffer(); + + let identity_2 = Identity::random_identity(3, Some(15), platform_version) + .expect("expected a platform identity"); + + let identity_2_id = identity_2.id().to_buffer(); + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + let token_id = contract.token_id(0).expect("expected token at position 0"); + drive + .add_new_identity( + identity_1.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .add_new_identity( + identity_2.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + drive + .token_freeze( + token_id, + identity_1.id(), + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint token"); + + let proof = drive + .prove_identities_token_infos_v0( + token_id.to_buffer(), + &vec![identity_1.id().to_buffer(), identity_2.id().to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving an identity"); + + let proved_identity_info: BTreeMap<[u8; 32], Option<IdentityTokenInfo>> = + Drive::verify_token_infos_for_identity_ids( + proof.as_slice(), + token_id.to_buffer(), + &vec![identity_1.id().to_buffer(), identity_2.id().to_buffer()], + false, + platform_version, + ) + .expect("expect that this be verified") + .1; + + assert_eq!( + proved_identity_info, + BTreeMap::from([ + ( + identity_1_id, + Some( + IdentityTokenInfo::new(true, platform_version) + .expect("expected token info") + ) + ), + (identity_2_id, None) + ]) + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/mod.rs b/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/mod.rs new file mode 100644 index 00000000000..a43d6083acb --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/mod.rs @@ -0,0 +1,149 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the token infos of an identity from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose infos are to be proveed. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_infos( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_infos + { + 0 => self.prove_identity_token_infos_v0( + token_ids, + identity_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_infos".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token infos with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to prove the infos for. + /// * `identity_id` - The identity's ID whose infos are being queried. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_infos_with_costs( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Vec<u8>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.prove_identity_token_infos_operations( + token_ids, + identity_id, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to prove the identity's token infos from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the infos for. + /// * `identity_id` - The ID of the identity whose token infos are being queried. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_identity_token_infos_operations( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .identity_token_infos + { + 0 => self.prove_identity_token_infos_operations_v0( + token_ids, + identity_id, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_identity_token_infos_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/v0/mod.rs b/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/v0/mod.rs new file mode 100644 index 00000000000..e6d7247d861 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/prove_identity_token_infos/v0/mod.rs @@ -0,0 +1,285 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_identity_token_infos_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_identity_token_infos_operations_v0( + token_ids, + identity_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_identity_token_infos_operations_v0( + &self, + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::token_infos_for_identity_id_query(token_ids, identity_id); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::Identity; + use dpp::prelude::DataContract; + use dpp::tokens::info::v0::IdentityTokenInfoV0; + use dpp::tokens::info::IdentityTokenInfo; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_token_infos_with_one_token_frozen() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + // Create a random identity + let identity = Identity::random_identity(3, Some(14), platform_version) + .expect("expected a platform identity"); + + let identity_id = identity.id().to_buffer(); + + // Create a data contract with multiple tokens + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + let token_id_1 = contract.token_id(0).expect("expected token at position 0"); + let token_id_2 = contract.token_id(1).expect("expected token at position 1"); + + drive + .add_new_identity( + identity.clone(), + false, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to add an identity"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Freeze one token for the identity + drive + .token_freeze( + token_id_1, + identity.id(), + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to freeze token"); + + let fetched_token_info_1 = drive + .fetch_identity_token_info(token_id_1.to_buffer(), identity_id, None, platform_version) + .expect("expected to fetch token info"); + + assert_eq!( + fetched_token_info_1, + Some(IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: true })) + ); + + let fetched_token_info_2 = drive + .fetch_identity_token_info(token_id_2.to_buffer(), identity_id, None, platform_version) + .expect("expected to fetch token info"); + + assert_eq!(fetched_token_info_2, None); + + // Fetch identity token infos before proving + let fetched_token_infos = drive + .fetch_identity_token_infos( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity_id, + None, + platform_version, + ) + .expect("expected to fetch token infos"); + + // Verify fetched token infos + assert_eq!( + fetched_token_infos, + BTreeMap::from([ + ( + token_id_1.to_buffer(), + Some(IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: true })), + ), + (token_id_2.to_buffer(), None,), + ]), + "unexpected fetched token infos" + ); + + // Generate proof + let proof = drive + .prove_identity_token_infos_v0( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity_id, + None, + platform_version, + ) + .expect("should not error when proving token infos"); + + // Verify proof + let proved_token_infos: BTreeMap<[u8; 32], Option<IdentityTokenInfo>> = + Drive::verify_token_infos_for_identity_id( + proof.as_slice(), + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + identity_id, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert proved token infos match the fetched ones + assert_eq!( + proved_token_infos, + BTreeMap::from([ + ( + token_id_1.to_buffer(), + Some(IdentityTokenInfo::V0(IdentityTokenInfoV0 { frozen: true })), + ), + (token_id_2.to_buffer(), None,), + ]), + "unexpected fetched token infos" + ); + } + + #[test] + fn should_prove_no_token_infos_for_non_existent_identity() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let non_existent_identity_id = [0u8; 32]; // An identity that doesn't exist in the database + + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let token_id = contract.token_id(0).expect("expected token at position 0"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + let proof = drive + .prove_identity_token_infos_v0( + &[token_id.to_buffer()], + non_existent_identity_id, + None, + platform_version, + ) + .expect("should not error when proving token infos for non-existent identity"); + + let proved_token_infos: BTreeMap<[u8; 32], Option<IdentityTokenInfo>> = + Drive::verify_token_infos_for_identity_id( + proof.as_slice(), + &[token_id.to_buffer()], + non_existent_identity_id, + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert that no token infos exist for the non-existent identity + assert_eq!( + proved_token_infos, + BTreeMap::from([(token_id.to_buffer(), None)]) + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/info/queries.rs b/packages/rs-drive/src/drive/tokens/info/queries.rs new file mode 100644 index 00000000000..e4e6e5c09db --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/info/queries.rs @@ -0,0 +1,95 @@ +use crate::drive::tokens::paths::{ + token_identity_infos_path_vec, token_identity_infos_root_path_vec, +}; +use crate::drive::Drive; +use crate::query::{Query, QueryItem}; +use grovedb::{PathQuery, SizedQuery}; +use std::ops::RangeFull; + +impl Drive { + /// The query for proving the identities info of a token from an identity id. + pub fn token_info_for_identity_id_query( + token_id: [u8; 32], + identity_id: [u8; 32], + ) -> PathQuery { + let info_path = token_identity_infos_path_vec(token_id); + PathQuery::new_single_key(info_path, identity_id.to_vec()) + } + + /// The query getting a token info for many identities + pub fn token_infos_for_identity_ids_query( + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + ) -> PathQuery { + let info_path = token_identity_infos_path_vec(token_id); + let mut query = Query::new(); + query.insert_keys(identity_ids.iter().map(|key| key.to_vec()).collect()); + PathQuery { + path: info_path, + query: SizedQuery { + query, + limit: Some(identity_ids.len() as u16), + offset: None, + }, + } + } + + /// The query getting a token infos for one identity + pub fn token_infos_for_identity_id_query( + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + ) -> PathQuery { + let tokens_root = token_identity_infos_root_path_vec(); + + let mut query = Query::new(); + + for token_id in token_ids { + query.insert_key(token_id.to_vec()); + } + + query.set_subquery_path(vec![identity_id.to_vec()]); + + PathQuery::new( + tokens_root, + SizedQuery::new(query, Some(token_ids.len() as u16), None), + ) + } + + /// The query getting token infos for identities in a range + pub fn token_infos_for_range_query( + token_id: [u8; 32], + start_at: Option<([u8; 32], bool)>, + ascending: bool, + limit: u16, + ) -> PathQuery { + let info_path = token_identity_infos_path_vec(token_id); + let mut query = Query::new_with_direction(ascending); + if ascending { + if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeFrom(start_at.to_vec()..)) + } else { + query.insert_item(QueryItem::RangeAfter(start_at.to_vec()..)) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + } else if let Some((start_at, start_at_included)) = start_at { + if start_at_included { + query.insert_item(QueryItem::RangeToInclusive(..=start_at.to_vec())) + } else { + query.insert_item(QueryItem::RangeTo(..start_at.to_vec())) + } + } else { + query.insert_item(QueryItem::RangeFull(RangeFull)) + } + PathQuery { + path: info_path, + query: SizedQuery { + query, + limit: Some(limit), + offset: None, + }, + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/mint/mod.rs b/packages/rs-drive/src/drive/tokens/mint/mod.rs new file mode 100644 index 00000000000..ddcab0a8560 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/mint/mod.rs @@ -0,0 +1,106 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Mints (issues) new tokens by increasing the total supply and adding them to an identity's balance. + pub fn token_mint( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.mint { + 0 => self.token_mint_v0( + token_id, + identity_id, + issuance_amount, + allow_first_mint, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_mint".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations to mint tokens without calculating fees and optionally applying. + pub fn token_mint_add_to_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.mint { + 0 => self.token_mint_add_to_operations_v0( + token_id, + identity_id, + issuance_amount, + allow_first_mint, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_mint_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to mint tokens. + pub fn token_mint_operations( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.mint { + 0 => self.token_mint_operations_v0( + token_id, + identity_id, + issuance_amount, + allow_first_mint, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_mint_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/mint/v0/mod.rs b/packages/rs-drive/src/drive/tokens/mint/v0/mod.rs new file mode 100644 index 00000000000..f0d737455a0 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/mint/v0/mod.rs @@ -0,0 +1,115 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_mint_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_mint_add_to_operations_v0( + token_id, + identity_id, + issuance_amount, + allow_first_mint, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_mint_add_to_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_mint_operations_v0( + token_id, + identity_id, + issuance_amount, + allow_first_mint, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_mint_operations_v0( + &self, + token_id: [u8; 32], + identity_id: [u8; 32], + issuance_amount: u64, + allow_first_mint: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + // Update identity balance + drive_operations.extend(self.add_to_identity_token_balance_operations( + token_id, + identity_id, + issuance_amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + + drive_operations.extend(self.add_to_token_total_supply_operations( + token_id, + issuance_amount, + allow_first_mint, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/mod.rs b/packages/rs-drive/src/drive/tokens/mod.rs new file mode 100644 index 00000000000..c6ba59c841d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/mod.rs @@ -0,0 +1,52 @@ +/// Handles operations related to adding transaction history. +#[cfg(feature = "server")] +mod add_transaction_history_operations; + +/// Defines logic for applying status updates within the system. +#[cfg(feature = "server")] +pub mod apply_status; + +/// Manages operations related to balance handling. +pub mod balance; + +/// Implements functionality for burning tokens. +#[cfg(feature = "server")] +pub mod burn; + +/// Computes estimated costs for various operations. +#[cfg(feature = "server")] +pub mod estimated_costs; + +/// Manages freezing operations in the system. +#[cfg(feature = "server")] +pub mod freeze; + +/// Identity token info module, like if someone is frozen +pub mod info; + +/// Implements minting operations for creating new tokens. +#[cfg(feature = "server")] +pub mod mint; + +/// Manages system-level operations and utilities. +#[cfg(feature = "server")] +pub mod system; + +/// Handles transfer operations, including token movement. +#[cfg(feature = "server")] +pub mod transfer; + +/// Manages unfreezing operations within the system. +#[cfg(feature = "server")] +pub mod unfreeze; + +/// Calculates the total token balance across all accounts. +#[cfg(feature = "server")] +pub mod calculate_total_tokens_balance; + +/// Distribution module +pub mod distribution; +/// Token paths +pub mod paths; +/// Token status module, like if the token is paused +pub mod status; diff --git a/packages/rs-drive/src/drive/tokens/paths.rs b/packages/rs-drive/src/drive/tokens/paths.rs new file mode 100644 index 00000000000..8e212c58c78 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/paths.rs @@ -0,0 +1,478 @@ +use crate::drive::RootTree; +use dpp::block::block_info::BlockInfo; +use dpp::block::epoch::EpochIndex; +use dpp::data_contract::associated_token::token_perpetual_distribution::methods::v0::TokenPerpetualDistributionV0Accessors; +use dpp::data_contract::associated_token::token_perpetual_distribution::reward_distribution_type::RewardDistributionType; +use dpp::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution; +use dpp::prelude::{BlockHeight, TimestampMillis}; + +// ROOT TOKEN LEVEL + +/// Key for accessing token status information. +pub const TOKEN_STATUS_INFO_KEY: u8 = 64; +/// Key for accessing token identity information tree. +pub const TOKEN_IDENTITY_INFO_KEY: u8 = 192; +/// Key for accessing token balances tree. +pub const TOKEN_BALANCES_KEY: u8 = 128; + +/// Key for token distributions sub level +pub const TOKEN_DISTRIBUTIONS_KEY: u8 = 32; + +// The Token Merk tree looks like +// TOKEN_BALANCES_KEY +// / \ +// TOKEN_STATUS_INFO_KEY TOKEN_IDENTITY_INFO_KEY +// / +// TOKEN_DISTRIBUTIONS_KEY + +// The token distribution Tree level + +/// Key for the perpetual distributions. +pub const TOKEN_TIMED_DISTRIBUTIONS_KEY: u8 = 128; + +/// Key for the perpetual distributions. +pub const TOKEN_PERPETUAL_DISTRIBUTIONS_KEY: u8 = 64; + +/// Key for the pre-programmed distributions +pub const TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY: u8 = 192; + +// The Token Distribution Merk tree looks like +// TOKEN_TIMED_DISTRIBUTIONS_KEY +// / \ +// TOKEN_PERPETUAL_DISTRIBUTIONS_KEY TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY + +// Then inside the timed distribution Merk tree we have + +/// Key for the millisecond timed token distributions. +pub const TOKEN_MS_TIMED_DISTRIBUTIONS_KEY: u8 = 128; + +/// Key for the block timed token distributions. +pub const TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY: u8 = 64; + +/// Key for the epoch timed token distributions. +pub const TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY: u8 = 192; + +/// The path for the balances tree + +pub fn tokens_root_path() -> [&'static [u8]; 1] { + [Into::<&[u8; 1]>::into(RootTree::Tokens)] +} + +/// The path for the balances tree + +pub fn tokens_root_path_vec() -> Vec<Vec<u8>> { + vec![Into::<&[u8; 1]>::into(RootTree::Tokens).to_vec()] +} + +/// The root path of token balances tree, this refers to a big sum tree + +pub fn token_balances_root_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_BALANCES_KEY], + ] +} + +/// The root path of token balances tree, this refers to a big sum tree + +pub fn token_balances_root_path_vec() -> Vec<Vec<u8>> { + vec![vec![RootTree::Tokens as u8], vec![TOKEN_BALANCES_KEY]] +} + +/// Returns the root path for token identity information as a fixed-size array of byte slices. + +pub fn token_identity_infos_root_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_IDENTITY_INFO_KEY], + ] +} + +/// Returns the root path for token identity information as a vector of byte vectors. + +pub fn token_identity_infos_root_path_vec() -> Vec<Vec<u8>> { + vec![vec![RootTree::Tokens as u8], vec![TOKEN_IDENTITY_INFO_KEY]] +} + +/// Returns the root path for token statuses as a fixed-size array of byte slices. + +pub fn token_statuses_root_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_STATUS_INFO_KEY], + ] +} + +/// Returns the root path for token statuses as a vector of byte vectors. + +pub fn token_statuses_root_path_vec() -> Vec<Vec<u8>> { + vec![vec![RootTree::Tokens as u8], vec![TOKEN_STATUS_INFO_KEY]] +} + +/// Returns the root path for token distributions as a fixed-size array of byte slices. +pub fn token_distributions_root_path() -> [&'static [u8]; 2] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + ] +} + +/// Returns the root path for token distributions as a vector of byte vectors. +pub fn token_distributions_root_path_vec() -> Vec<Vec<u8>> { + vec![vec![RootTree::Tokens as u8], vec![TOKEN_DISTRIBUTIONS_KEY]] +} + +/// The path for the token timed distributions tree +pub fn token_timed_distributions_path() -> [&'static [u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token timed distributions tree as a vector +pub fn token_timed_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token perpetual distributions tree +pub fn token_root_perpetual_distributions_path() -> [&'static [u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token perpetual distributions tree as a vector +pub fn token_root_perpetual_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token perpetual distributions tree for a token +pub fn token_perpetual_distributions_path(token_id: &[u8; 32]) -> [&[u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + token_id, + ] +} + +/// The path for the token perpetual distributions tree for a token as a vector +pub fn token_perpetual_distributions_path_vec(token_id: [u8; 32]) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_PERPETUAL_DISTRIBUTIONS_KEY], + token_id.to_vec(), + ] +} + +/// The path for the token pre-programmed distributions tree +pub fn token_root_pre_programmed_distributions_path() -> [&'static [u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token pre-programmed distributions tree as a vector +pub fn token_root_pre_programmed_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the token pre-programmed distributions tree +pub fn token_pre_programmed_distributions_path(token_id: &[u8; 32]) -> [&[u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + token_id, + ] +} + +/// The path for the token pre-programmed distributions tree as a vector +pub fn token_pre_programmed_distributions_path_vec(token_id: [u8; 32]) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + token_id.to_vec(), + ] +} + +/// The path for the token pre-programmed distribution tree at a given time +/// These refer to sum trees +pub fn token_pre_programmed_at_time_distribution_path<'a>( + token_id: &'a [u8; 32], + time_bytes: &'a [u8; 4], +) -> [&'a [u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + token_id, + time_bytes, + ] +} + +/// The path for the token pre-programmed distribution tree at a given time as a vector +/// These refer to sum trees +pub fn token_pre_programmed_at_time_distribution_path_vec( + token_id: [u8; 32], + timestamp: TimestampMillis, +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_PRE_PROGRAMMED_DISTRIBUTIONS_KEY], + token_id.to_vec(), + timestamp.to_be_bytes().to_vec(), + ] +} + +/// The path for the millisecond timed token distributions tree +pub fn token_ms_timed_distributions_path() -> [&'static [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the millisecond timed token distributions tree as a vector +pub fn token_ms_timed_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the millisecond timed token distributions tree +pub fn token_ms_timed_at_time_distributions_path(timestamp_bytes: &[u8; 4]) -> [&[u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + timestamp_bytes, + ] +} + +/// The path for the millisecond timed token distributions tree as a vector +pub fn token_ms_timed_at_time_distributions_path_vec(time: TimestampMillis) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_MS_TIMED_DISTRIBUTIONS_KEY], + time.to_be_bytes().to_vec(), + ] +} + +/// The path for the block timed token distributions tree +pub fn token_block_timed_distributions_path() -> [&'static [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the block timed token distributions tree as a vector +pub fn token_block_timed_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the block timed at a specific block height token distributions tree +pub fn token_block_timed_at_block_distributions_path(block_height_bytes: &[u8; 4]) -> [&[u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + block_height_bytes, + ] +} + +/// The path for the block timed at a specific block height token distributions tree as a vector +pub fn token_block_timed_at_block_distributions_path_vec( + block_height: BlockHeight, +) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_BLOCK_TIMED_DISTRIBUTIONS_KEY], + block_height.to_be_bytes().to_vec(), + ] +} + +/// The path for the epoch timed token distributions tree +pub fn token_epoch_timed_distributions_path() -> [&'static [u8]; 4] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the epoch timed token distributions tree as a vector +pub fn token_epoch_timed_distributions_path_vec() -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + ] +} + +/// The path for the epoch timed at a specific epoch token distributions tree +pub fn token_epoch_timed_at_epoch_distributions_path(epoch_index_bytes: &[u8; 2]) -> [&[u8]; 5] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_DISTRIBUTIONS_KEY], + &[TOKEN_TIMED_DISTRIBUTIONS_KEY], + &[TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + epoch_index_bytes, + ] +} + +/// The path for the epoch timed at a specific epoch token distributions tree as a vector +pub fn token_epoch_timed_at_epoch_distributions_path_vec(epoch_index: EpochIndex) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_DISTRIBUTIONS_KEY], + vec![TOKEN_TIMED_DISTRIBUTIONS_KEY], + vec![TOKEN_EPOCH_TIMED_DISTRIBUTIONS_KEY], + epoch_index.to_be_bytes().to_vec(), + ] +} + +/// The path for the token balances tree + +pub fn token_balances_path(token_id: &[u8; 32]) -> [&[u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_BALANCES_KEY], + token_id, + ] +} + +/// The path for the token balances tree + +pub fn token_balances_path_vec(token_id: [u8; 32]) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_BALANCES_KEY], + token_id.to_vec(), + ] +} + +/// The path for the token info tree + +pub fn token_identity_infos_path(token_id: &[u8; 32]) -> [&[u8]; 3] { + [ + Into::<&[u8; 1]>::into(RootTree::Tokens), + &[TOKEN_IDENTITY_INFO_KEY], + token_id, + ] +} + +/// The path for the token info tree + +pub fn token_identity_infos_path_vec(token_id: [u8; 32]) -> Vec<Vec<u8>> { + vec![ + vec![RootTree::Tokens as u8], + vec![TOKEN_IDENTITY_INFO_KEY], + token_id.to_vec(), + ] +} + +/// Paths for the token perpetual distribution +pub trait TokenPerpetualDistributionPaths { + /// Returns the path where the perpetual distribution times should be stored. + fn root_distribution_path(&self) -> Vec<Vec<u8>>; + + /// Returns the path where the perpetual distribution should be stored. + fn distribution_path(&self, unit: u64) -> Vec<Vec<u8>>; + /// Returns the path where the perpetual distribution should be stored. + fn distribution_path_for_next_interval(&self, block_info: &BlockInfo) -> Vec<Vec<u8>>; +} + +impl TokenPerpetualDistributionPaths for TokenPerpetualDistribution { + fn root_distribution_path(&self) -> Vec<Vec<u8>> { + match self.distribution_type() { + RewardDistributionType::BlockBasedDistribution(_, _, _) => { + token_block_timed_distributions_path_vec() + } + RewardDistributionType::TimeBasedDistribution(_, _, _) => { + token_ms_timed_distributions_path_vec() + } + RewardDistributionType::EpochBasedDistribution(_, _, _) => { + token_epoch_timed_distributions_path_vec() + } + } + } + + fn distribution_path(&self, unit: u64) -> Vec<Vec<u8>> { + match self.distribution_type() { + RewardDistributionType::BlockBasedDistribution(_, _, _) => { + token_block_timed_at_block_distributions_path_vec(unit) + } + RewardDistributionType::TimeBasedDistribution(_, _, _) => { + token_ms_timed_at_time_distributions_path_vec(unit) + } + RewardDistributionType::EpochBasedDistribution(_, _, _) => { + token_epoch_timed_at_epoch_distributions_path_vec(unit as EpochIndex) + } + } + } + + fn distribution_path_for_next_interval(&self, block_info: &BlockInfo) -> Vec<Vec<u8>> { + match self.distribution_type() { + // If the distribution is based on block height, return the next height where emissions occur. + RewardDistributionType::BlockBasedDistribution(interval, _, _) => { + let height = block_info.height - block_info.height % interval + interval; + token_block_timed_at_block_distributions_path_vec(height) + } + + // If the distribution is based on time, return the next timestamp in milliseconds. + RewardDistributionType::TimeBasedDistribution(interval, _, _) => { + let time = block_info.time_ms - block_info.time_ms % interval + interval; + token_ms_timed_at_time_distributions_path_vec(time) + } + + // If the distribution is based on epochs, return the next epoch index. + RewardDistributionType::EpochBasedDistribution(interval, _, _) => { + let index = block_info.epoch.index - block_info.epoch.index % interval + interval; + token_epoch_timed_at_epoch_distributions_path_vec(index) + } + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/fetch_token_status/mod.rs b/packages/rs-drive/src/drive/tokens/status/fetch_token_status/mod.rs new file mode 100644 index 00000000000..6d9803dd81f --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/fetch_token_status/mod.rs @@ -0,0 +1,108 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Fetches the Token status from the backing store. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `transaction` - The current transaction. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<TokenStatus>, Error>` - The token status if successful, or an error. + pub fn fetch_token_status( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenStatus>, Error> { + match platform_version.drive.methods.token.fetch.token_status { + 0 => self.fetch_token_status_v0(token_id, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_status".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the Token status with costs (if `apply = true`) and returns associated fee result. + pub fn fetch_token_status_with_costs( + &self, + token_id: [u8; 32], + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option<TokenStatus>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_token_status_operations( + token_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the operations to get Token's status from the backing store. + /// If `apply` is false, the operations are stateless and only used for cost estimation. + /// + /// # Arguments + /// + /// * `token_id` - The ID of the token. + /// * `apply` - Whether to fetch actual stateful data (true) or just estimate costs (false). + /// * `transaction` - The current transaction. + /// * `drive_operations` - The drive operations vector to populate. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Option<TokenStatus>, Error>` - The token info of the Identity if successful, or an error. + pub fn fetch_token_status_operations( + &self, + token_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenStatus>, Error> { + match platform_version.drive.methods.token.fetch.token_status { + 0 => self.fetch_token_status_operations_v0( + token_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_status_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/fetch_token_status/v0/mod.rs b/packages/rs-drive/src/drive/tokens/status/fetch_token_status/v0/mod.rs new file mode 100644 index 00000000000..db71c1cd7e1 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/fetch_token_status/v0/mod.rs @@ -0,0 +1,70 @@ +use crate::drive::tokens::paths::token_statuses_root_path; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::{TransactionArg, TreeType}; + +impl Drive { + pub(super) fn fetch_token_status_v0( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenStatus>, Error> { + self.fetch_token_status_operations_v0( + token_id, + true, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_token_status_operations_v0( + &self, + token_id: [u8; 32], + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenStatus>, Error> { + let direct_query_type = if apply { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let token_statuses_root_path = token_statuses_root_path(); + + match self.grove_get_raw_optional( + (&token_statuses_root_path).into(), + &token_id, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + ) { + Ok(Some(Item(info, _))) => { + Ok(Some(TokenStatus::deserialize_from_bytes(info.as_slice())?)) + } + + Ok(None) | Err(Error::GroveDB(grovedb::Error::PathKeyNotFound(_))) => Ok(None), + + Ok(Some(_)) => Err(Error::Drive(DriveError::CorruptedElementType( + "token status was present but was not an item", + ))), + + Err(e) => Err(e), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/mod.rs b/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/mod.rs new file mode 100644 index 00000000000..9f81e5ab2ed --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/mod.rs @@ -0,0 +1,126 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + /// Fetches token statuses from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose infos are to be fetched. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<IdentityTokenInfo>>, Error>` - A map of token IDs to their corresponding infos, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_token_statuses( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenStatus>>, Error> { + match platform_version.drive.methods.token.fetch.token_statuses { + 0 => self.fetch_token_statuses_v0(token_ids, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_statuses".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Fetches the identity's token infos with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to fetch the infos for. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<((BTreeMap<[u8; 32], Option<TokenAmount>>), FeeResult), Error>` - A tuple containing a map of token infos and the associated fee result. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_token_statuses_with_costs( + &self, + token_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(BTreeMap<[u8; 32], Option<TokenStatus>>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.fetch_token_statuses_operations( + token_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to fetch the identity's token infos from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the infos for. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<BTreeMap<[u8; 32], Option<TokenStatus>>, Error>` - A map of token IDs to their corresponding statuses. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn fetch_token_statuses_operations( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenStatus>>, Error> { + match platform_version.drive.methods.token.fetch.token_statuses { + 0 => self.fetch_token_statuses_operations_v0( + token_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_statuses_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/v0/mod.rs b/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/v0/mod.rs new file mode 100644 index 00000000000..8a9e1f23c3b --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/fetch_token_statuses/v0/mod.rs @@ -0,0 +1,62 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::status::TokenStatus; +use dpp::version::PlatformVersion; +use grovedb::Element::Item; +use grovedb::TransactionArg; +use std::collections::BTreeMap; + +impl Drive { + pub(super) fn fetch_token_statuses_v0( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenStatus>>, Error> { + self.fetch_token_statuses_operations_v0( + token_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn fetch_token_statuses_operations_v0( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<BTreeMap<[u8; 32], Option<TokenStatus>>, Error> { + let path_query = Drive::token_statuses_query(token_ids); + + self.grove_get_raw_path_query_with_optional( + &path_query, + false, + transaction, + drive_operations, + &platform_version.drive, + )? + .into_iter() + .map(|(_, key, element)| { + let token_id: [u8; 32] = key.try_into().map_err(|_| { + Error::Drive(DriveError::CorruptedDriveState( + "token id not 32 bytes".to_string(), + )) + })?; + match element { + Some(Item(value, ..)) => { + Ok((token_id, Some(TokenStatus::deserialize_from_bytes(&value)?))) + } + None => Ok((token_id, None)), + _ => Err(Error::Drive(DriveError::CorruptedDriveState( + "token tree for statuses should contain only items".to_string(), + ))), + } + }) + .collect() + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/mod.rs b/packages/rs-drive/src/drive/tokens/status/mod.rs new file mode 100644 index 00000000000..4824bb8f87e --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/mod.rs @@ -0,0 +1,8 @@ +#[cfg(feature = "server")] +mod fetch_token_statuses; + +#[cfg(feature = "server")] +mod fetch_token_status; +#[cfg(feature = "server")] +mod prove_token_statuses; +mod queries; diff --git a/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/mod.rs b/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/mod.rs new file mode 100644 index 00000000000..29e31ef5940 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/mod.rs @@ -0,0 +1,124 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves the token statuses from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs whose statuses are to be proved. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The version of the platform to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_token_statuses( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.token.prove.token_statuses { + 0 => self.prove_token_statuses_v0(token_ids, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_token_statuses".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Proves the token statuses with associated costs. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to prove the infos for. + /// * `block_info` - Information about the current block for fee calculation. + /// * `transaction` - The current transaction context. + /// * `platform_version` - The platform version to use. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_token_statuses_with_costs( + &self, + token_ids: &[[u8; 32]], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Vec<u8>, FeeResult), Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + let value = self.prove_token_statuses_operations( + token_ids, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok((value, fees)) + } + + /// Creates the low-level operations needed to prove the Token statuses from the backing store. + /// + /// # Arguments + /// + /// * `token_ids` - A list of token IDs to query the statuses for. + /// * `transaction` - The current transaction context. + /// * `drive_operations` - A vector to store the created low-level drive operations. + /// * `platform_version` - The platform version to use for compatibility checks. + /// + /// # Returns + /// + /// * `Result<Vec<u8>, Error>` - A grovedb proof, or an error. + /// + /// # Errors + /// + /// * `DriveError::UnknownVersionMismatch` - If the platform version does not support the requested operation. + pub fn prove_token_statuses_operations( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version.drive.methods.token.prove.token_statuses { + 0 => self.prove_token_statuses_operations_v0( + token_ids, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_token_statuses_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/v0/mod.rs b/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/v0/mod.rs new file mode 100644 index 00000000000..07b6fef19c7 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/prove_token_statuses/v0/mod.rs @@ -0,0 +1,221 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + pub(super) fn prove_token_statuses_v0( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_token_statuses_operations_v0( + token_ids, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_token_statuses_operations_v0( + &self, + token_ids: &[[u8; 32]], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let path_query = Self::token_statuses_query(token_ids); + + self.grove_get_proved_path_query( + &path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::prelude::DataContract; + use dpp::tokens::status::v0::TokenStatusV0; + use dpp::tokens::status::TokenStatus; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_token_statuses_for_multiple_tokens() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + // Create a data contract with multiple tokens + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([ + ( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ( + 1, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + ), + ]), + }); + + let token_id_1 = contract.token_id(0).expect("expected token at position 0"); + let token_id_2 = contract.token_id(1).expect("expected token at position 1"); + + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Freeze the first token + drive + .token_apply_status( + token_id_1.to_buffer(), + TokenStatus::new(true, platform_version).expect("expected token status"), + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to freeze token"); + + let fetched_token_info_1 = drive + .fetch_token_status(token_id_1.to_buffer(), None, platform_version) + .expect("expected to fetch token status"); + + assert_eq!( + fetched_token_info_1, + Some(TokenStatus::V0(TokenStatusV0 { paused: true })) + ); + + let fetched_token_info_2 = drive + .fetch_token_status(token_id_2.to_buffer(), None, platform_version) + .expect("expected to fetch token status"); + + assert_eq!(fetched_token_info_2, None); + + // Fetch token statuses before proving + let fetched_token_statuses = drive + .fetch_token_statuses( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + None, + platform_version, + ) + .expect("expected to fetch token statuses"); + + // Verify fetched token statuses + assert_eq!( + fetched_token_statuses, + BTreeMap::from([ + ( + token_id_1.to_buffer(), + Some(TokenStatus::V0(TokenStatusV0 { paused: true })), + ), + (token_id_2.to_buffer(), None,), + ]), + "unexpected fetched token infos" + ); + + // Generate proof + let proof = drive + .prove_token_statuses( + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + None, + platform_version, + ) + .expect("should not error when proving token statuses"); + + // Verify proof + let proved_token_statuses: BTreeMap<[u8; 32], Option<TokenStatus>> = + Drive::verify_token_statuses( + proof.as_slice(), + &[token_id_1.to_buffer(), token_id_2.to_buffer()], + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert the token statuses match expected values + assert_eq!( + proved_token_statuses, + BTreeMap::from([ + ( + token_id_1.to_buffer(), + Some(TokenStatus::V0(TokenStatusV0 { paused: true })) + ), + (token_id_2.to_buffer(), None), + ]), + "unexpected token statuses" + ); + } + + #[test] + fn should_prove_no_token_statuses_for_non_existent_tokens() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let non_existent_token_id = [0u8; 32]; // A token ID that doesn't exist in the database + + // Generate proof + let proof = drive + .prove_token_statuses_v0(&[non_existent_token_id], None, platform_version) + .expect("should not error when proving token statuses for non-existent tokens"); + + // Verify proof + let proved_token_statuses: BTreeMap<[u8; 32], Option<TokenStatus>> = + Drive::verify_token_statuses( + proof.as_slice(), + &[non_existent_token_id], + false, + platform_version, + ) + .expect("expected proof verification to succeed") + .1; + + // Assert that the token status is `None` for the non-existent token + assert_eq!( + proved_token_statuses, + BTreeMap::from([(non_existent_token_id, None)]), + "unexpected token statuses for non-existent tokens" + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/status/queries.rs b/packages/rs-drive/src/drive/tokens/status/queries.rs new file mode 100644 index 00000000000..f15f67db307 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/status/queries.rs @@ -0,0 +1,33 @@ +use crate::drive::tokens::paths::token_statuses_root_path_vec; +use crate::drive::Drive; +use crate::query::Query; +use grovedb::{PathQuery, SizedQuery}; + +impl Drive { + /// The query getting a token statuses + pub fn token_statuses_query(token_ids: &[[u8; 32]]) -> PathQuery { + let tokens_root = token_statuses_root_path_vec(); + + let mut query = Query::new(); + + for token_id in token_ids { + query.insert_key(token_id.to_vec()); + } + + PathQuery::new( + tokens_root, + SizedQuery::new(query, Some(token_ids.len() as u16), None), + ) + } + + /// The query getting a token statuses + pub fn token_status_query(token_id: [u8; 32]) -> PathQuery { + let tokens_root = token_statuses_root_path_vec(); + + let mut query = Query::new(); + + query.insert_key(token_id.to_vec()); + + PathQuery::new(tokens_root, SizedQuery::new(query, Some(1), None)) + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/mod.rs b/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/mod.rs new file mode 100644 index 00000000000..4daa069ec8d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/mod.rs @@ -0,0 +1,119 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Adds to the token's total supply + pub fn add_to_token_total_supply( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version + .drive + .methods + .token + .update + .add_to_token_total_supply + { + 0 => self.add_to_token_total_supply_v0( + token_id, + amount, + allow_first_mint, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_to_token_total_supply".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations of adding to the token total supply + pub fn add_to_token_total_supply_add_to_operations( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .token + .update + .add_to_token_total_supply + { + 0 => self.add_to_token_total_supply_add_to_operations_v0( + token_id, + amount, + allow_first_mint, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_to_token_total_supply_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// The operations needed to add to the token total supply + pub fn add_to_token_total_supply_operations( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .add_to_token_total_supply + { + 0 => self.add_to_token_total_supply_operations_v0( + token_id, + amount, + allow_first_mint, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "add_to_token_total_supply_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/v0/mod.rs new file mode 100644 index 00000000000..686591211a8 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/add_to_token_total_supply/v0/mod.rs @@ -0,0 +1,148 @@ +use crate::drive::balances::{total_tokens_root_supply_path, total_tokens_root_supply_path_vec}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::DirectQueryType; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::batch::{KeyInfoPath, QualifiedGroveDbOp}; +use grovedb::Element::SumItem; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn add_to_token_total_supply_v0( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.add_to_token_total_supply_add_to_operations_v0( + token_id, + amount, + apply, + allow_first_mint, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn add_to_token_total_supply_add_to_operations_v0( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.add_to_token_total_supply_operations_v0( + token_id, + amount, + allow_first_mint, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn add_to_token_total_supply_operations_v0( + &self, + token_id: [u8; 32], + amount: u64, + allow_first_mint: bool, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + // If we only estimate, add estimation costs + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + // Add your estimation logic similar to add_to_system_credits_operations_v0 + // For example: + Self::add_estimation_costs_for_token_total_supply( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let path_holding_total_token_supply = total_tokens_root_supply_path(); + let path_holding_total_token_supply_vec = total_tokens_root_supply_path_vec(); + let total_token_supply_in_platform = self.grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_total_token_supply).into(), + &token_id, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )?; + + if let Some(total_token_supply_in_platform) = total_token_supply_in_platform { + let new_total = (total_token_supply_in_platform as i64) + .checked_add(amount as i64) + .ok_or(Error::Drive(DriveError::CriticalCorruptedState( + "trying to add an amount that would underflow total supply", + )))?; + let replace_op = QualifiedGroveDbOp::replace_op( + path_holding_total_token_supply_vec, + token_id.to_vec(), + SumItem(new_total, None), + ); + drive_operations.push(GroveOperation(replace_op)); + } else if allow_first_mint { + if amount > i64::MAX as u64 { + return Err(Error::Drive(DriveError::CriticalCorruptedState( + "amount is over max allowed in Sum Item (i64::Max)", + ))); + } + let insert_op = QualifiedGroveDbOp::insert_only_op( + path_holding_total_token_supply_vec, + token_id.to_vec(), + SumItem(amount as i64, None), + ); + drive_operations.push(GroveOperation(insert_op)); + } else { + return Err(Error::Drive(DriveError::CriticalCorruptedState( + "Total supply for token not found in Platform", + ))); + } + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/create_token_trees/mod.rs b/packages/rs-drive/src/drive/tokens/system/create_token_trees/mod.rs new file mode 100644 index 00000000000..49656bb930c --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/create_token_trees/mod.rs @@ -0,0 +1,124 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; + +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Adds an identity by inserting a new identity subtree structure to the `Identities` subtree. + pub fn create_token_trees( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version + .drive + .methods + .token + .update + .create_token_trees + { + 0 => self.create_token_trees_v0( + token_id, + start_as_paused, + allow_already_exists, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "create_token_trees".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds identity creation operations to drive operations + pub fn create_token_trees_add_to_operations( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + apply: bool, + previous_batch_operations: &mut Option<&mut Vec<LowLevelDriveOperation>>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .token + .update + .create_token_trees + { + 0 => self.create_token_trees_add_to_operations_v0( + token_id, + start_as_paused, + allow_already_exists, + apply, + previous_batch_operations, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "create_token_trees_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// The operations needed to create an identity + pub fn create_token_trees_operations( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + previous_batch_operations: &mut Option<&mut Vec<LowLevelDriveOperation>>, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .create_token_trees + { + 0 => self.create_token_trees_operations_v0( + token_id, + start_as_paused, + allow_already_exists, + previous_batch_operations, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "create_token_trees_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/create_token_trees/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/create_token_trees/v0/mod.rs new file mode 100644 index 00000000000..71224f1328d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/create_token_trees/v0/mod.rs @@ -0,0 +1,220 @@ +use crate::drive::balances::total_tokens_root_supply_path; +use crate::drive::tokens::paths::{ + token_balances_root_path, token_identity_infos_root_path, token_statuses_root_path, +}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::{BatchInsertApplyType, BatchInsertTreeApplyType, QueryTarget}; +use crate::util::object_size_info::PathKeyElementInfo; +use crate::util::object_size_info::PathKeyInfo::PathFixedSizeKeyRef; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::serialization::PlatformSerializable; +use dpp::tokens::status::TokenStatus; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +impl Drive { + /// Creates a new token root subtree at `TokenBalances` keyed by `token_id`. + /// This function applies the operations directly, calculates fees, and returns the fee result. + pub(super) fn create_token_trees_v0( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations: Vec<LowLevelDriveOperation> = vec![]; + + // Add operations to create the token root tree + self.create_token_trees_add_to_operations_v0( + token_id, + start_as_paused, + allow_already_exists, + apply, + &mut None, + transaction, + &mut drive_operations, + platform_version, + )?; + + // If applying, calculate fees + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + /// Adds the token root creation operations to the provided `drive_operations` vector without + /// calculating or returning fees. If `apply` is false, it will only estimate costs. + pub(super) fn create_token_trees_add_to_operations_v0( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + apply: bool, + previous_batch_operations: &mut Option<&mut Vec<LowLevelDriveOperation>>, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = if apply { + None::<HashMap<KeyInfoPath, EstimatedLayerInformation>> + } else { + Some(HashMap::new()) + }; + + // Get the operations required to create the token tree + let batch_operations = self.create_token_trees_operations_v0( + token_id, + start_as_paused, + allow_already_exists, + previous_batch_operations, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + // Apply or estimate the operations + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + /// Gathers the operations needed to create the token root subtree. If `apply` is false, it + /// populates `estimated_costs_only_with_layer_info` instead of applying. + pub(super) fn create_token_trees_operations_v0( + &self, + token_id: [u8; 32], + start_as_paused: bool, + allow_already_exists: bool, + previous_batch_operations: &mut Option<&mut Vec<LowLevelDriveOperation>>, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut batch_operations: Vec<LowLevelDriveOperation> = vec![]; + + let non_sum_tree_apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, + flags_len: 0, + } + }; + + let item_apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertApplyType::StatefulBatchInsert + } else { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_type: TreeType::NormalTree, + target: QueryTarget::QueryTargetValue(8), + } + }; + + let token_balance_tree_apply_type = if estimated_costs_only_with_layer_info.is_none() { + BatchInsertTreeApplyType::StatefulBatchInsertTree + } else { + BatchInsertTreeApplyType::StatelessBatchInsertTree { + in_tree_type: TreeType::BigSumTree, + tree_type: TreeType::SumTree, + flags_len: 0, + } + }; + + // Insert an empty tree for this token if it doesn't exist + let inserted = self.batch_insert_empty_tree_if_not_exists( + PathFixedSizeKeyRef::<2>((token_balances_root_path(), token_id.as_slice())), + TreeType::SumTree, + None, + token_balance_tree_apply_type, + transaction, + previous_batch_operations, + &mut batch_operations, + &platform_version.drive, + )?; + + if !inserted && !allow_already_exists { + // The token root already exists. Depending on your logic, this might be allowed or should be treated as an error. + return Err(Error::Drive(DriveError::CorruptedDriveState( + "token balance root tree already exists".to_string(), + ))); + } + + let inserted = self.batch_insert_empty_tree_if_not_exists( + PathFixedSizeKeyRef::<2>((token_identity_infos_root_path(), token_id.as_slice())), + TreeType::NormalTree, + None, + non_sum_tree_apply_type, + transaction, + &mut None, + &mut batch_operations, + &platform_version.drive, + )?; + + if !inserted && !allow_already_exists { + // The token root already exists. Depending on your logic, this might be allowed or should be treated as an error. + return Err(Error::Drive(DriveError::CorruptedDriveState( + "token balance tree already exists".to_string(), + ))); + } + + let starting_status = TokenStatus::new(start_as_paused, platform_version)?; + let token_status_bytes = starting_status.serialize_consume_to_bytes()?; + + let inserted = self.batch_insert_if_not_exists( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<2>(( + token_statuses_root_path(), + token_id.as_slice(), + Element::Item(token_status_bytes, None), + )), + item_apply_type, + transaction, + &mut batch_operations, + &platform_version.drive, + )?; + + if !inserted && !allow_already_exists { + // The token root already exists. Depending on your logic, this might be allowed or should be treated as an error. + return Err(Error::Drive(DriveError::CorruptedDriveState( + "token info tree already exists".to_string(), + ))); + } + + self.batch_insert_sum_item_if_not_exists( + PathKeyElementInfo::PathFixedSizeKeyRefElement::<2>(( + total_tokens_root_supply_path(), + token_id.as_slice(), + Element::SumItem(0, None), + )), + !allow_already_exists, + item_apply_type, + transaction, + &mut batch_operations, + &platform_version.drive, + )?; + + Ok(batch_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/mod.rs b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/mod.rs new file mode 100644 index 00000000000..aac5a63ff62 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/mod.rs @@ -0,0 +1,74 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Fetches token's total aggregated_identity_balances + pub fn fetch_token_total_aggregated_identity_balances( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .token_total_aggregated_identity_balances + { + 0 => self.fetch_token_total_aggregated_identity_balances_v0( + token_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_total_aggregated_identity_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations of fetching the token total aggregated_identity_balances + pub fn fetch_token_total_aggregated_identity_balances_add_to_operations( + &self, + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .token_total_aggregated_identity_balances + { + 0 => self.fetch_token_total_aggregated_identity_balances_add_to_operations_v0( + token_id, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_total_aggregated_identity_balances_add_to_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/v0/mod.rs new file mode 100644 index 00000000000..035091d0527 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_aggregated_identity_balances/v0/mod.rs @@ -0,0 +1,75 @@ +use crate::drive::tokens::paths::token_balances_root_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::balances::credits::TokenAmount; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn fetch_token_total_aggregated_identity_balances_v0( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + let mut drive_operations = vec![]; + + self.fetch_token_total_aggregated_identity_balances_add_to_operations_v0( + token_id, + &mut None, + transaction, + &mut drive_operations, + platform_version, + ) + } + + pub(super) fn fetch_token_total_aggregated_identity_balances_add_to_operations_v0( + &self, + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + // If we only estimate, add estimation costs + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + // Add your estimation logic similar to add_to_system_credits_operations_v0 + // For example: + Self::add_estimation_costs_for_token_balances( + token_id, + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::BigSumTree, + query_target: QueryTargetValue(8), + } + }; + + let tokens_root_path = token_balances_root_path(); + + let total_token_aggregated_identity_balances_in_platform = self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&tokens_root_path).into(), + &token_id, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + + Ok(total_token_aggregated_identity_balances_in_platform) + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/mod.rs b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/mod.rs new file mode 100644 index 00000000000..ca6a6f44acd --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/mod.rs @@ -0,0 +1,99 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Fetches token's total supply + pub fn fetch_token_total_supply( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .token_total_supply + { + 0 => self.fetch_token_total_supply_v0(token_id, transaction, platform_version), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_total_supply".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + /// Fetches token's total supply and returns cost of doing so + pub fn fetch_token_total_supply_with_cost( + &self, + token_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option<TokenAmount>, FeeResult), Error> { + match platform_version + .drive + .methods + .token + .fetch + .token_total_supply + { + 0 => self.fetch_token_total_supply_with_cost_v0( + token_id, + block_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_total_supply".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations of fetching the token total supply + pub fn fetch_token_total_supply_add_to_operations( + &self, + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + match platform_version + .drive + .methods + .token + .fetch + .token_total_supply + { + 0 => self.fetch_token_total_supply_add_to_operations_v0( + token_id, + estimated_costs_only_with_layer_info, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "fetch_token_total_supply_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/v0/mod.rs new file mode 100644 index 00000000000..abd233e22b8 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/fetch_token_total_supply/v0/mod.rs @@ -0,0 +1,101 @@ +use crate::drive::balances::total_tokens_root_supply_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn fetch_token_total_supply_v0( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + let mut drive_operations = vec![]; + + self.fetch_token_total_supply_add_to_operations_v0( + token_id, + &mut None, + transaction, + &mut drive_operations, + platform_version, + ) + } + + pub(super) fn fetch_token_total_supply_with_cost_v0( + &self, + token_id: [u8; 32], + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<(Option<TokenAmount>, FeeResult), Error> { + let mut drive_operations = vec![]; + + let token_amount = self.fetch_token_total_supply_add_to_operations_v0( + token_id, + &mut None, + transaction, + &mut drive_operations, + platform_version, + )?; + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + Ok((token_amount, fees)) + } + + pub(super) fn fetch_token_total_supply_add_to_operations_v0( + &self, + token_id: [u8; 32], + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Option<TokenAmount>, Error> { + // If we only estimate, add estimation costs + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + // Add your estimation logic similar to add_to_system_credits_operations_v0 + // For example: + Self::add_estimation_costs_for_token_total_supply( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::BigSumTree, + query_target: QueryTargetValue(8), + } + }; + + let path_holding_total_token_supply = total_tokens_root_supply_path(); + let total_token_supply_in_platform = self.grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_total_token_supply).into(), + &token_id, + direct_query_type, + transaction, + drive_operations, + &platform_version.drive, + )?; + + Ok(total_token_supply_in_platform) + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/mod.rs b/packages/rs-drive/src/drive/tokens/system/mod.rs new file mode 100644 index 00000000000..e9fcbd0c304 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/mod.rs @@ -0,0 +1,6 @@ +mod add_to_token_total_supply; +mod create_token_trees; +mod fetch_token_total_aggregated_identity_balances; +mod fetch_token_total_supply; +mod prove_token_total_supply_and_aggregated_identity_balances; +mod remove_from_token_total_supply; diff --git a/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/mod.rs b/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/mod.rs new file mode 100644 index 00000000000..bf442bd2a80 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/mod.rs @@ -0,0 +1,36 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use dpp::version::PlatformVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Proves token's total supply and aggregated identity balances + pub fn prove_token_total_supply_and_aggregated_identity_balances( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + match platform_version + .drive + .methods + .token + .prove + .total_supply_and_aggregated_identity_balances + { + 0 => self.prove_token_total_supply_and_aggregated_identity_balances_v0( + token_id, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "prove_token_total_supply_and_aggregated_identity_balances".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/v0/mod.rs new file mode 100644 index 00000000000..64ee4a9dd36 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/prove_token_total_supply_and_aggregated_identity_balances/v0/mod.rs @@ -0,0 +1,259 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use grovedb::TransactionArg; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn prove_token_total_supply_and_aggregated_identity_balances_v0( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + self.prove_token_total_supply_and_aggregated_identity_balances_add_operations_v0( + token_id, + transaction, + &mut vec![], + platform_version, + ) + } + + pub(super) fn prove_token_total_supply_and_aggregated_identity_balances_add_operations_v0( + &self, + token_id: [u8; 32], + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, Error> { + let combined_path_query = Drive::token_total_supply_and_aggregated_identity_balances_query( + token_id, + platform_version, + )?; + self.grove_get_proved_path_query( + &combined_path_query, + transaction, + drive_operations, + &platform_version.drive, + ) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::block::block_info::BlockInfo; + use dpp::data_contract::accessors::v1::DataContractV1Getters; + use dpp::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0; + use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; + use dpp::data_contract::config::v0::DataContractConfigV0; + use dpp::data_contract::config::DataContractConfig; + use dpp::data_contract::v1::DataContractV1; + use dpp::prelude::DataContract; + use dpp::version::PlatformVersion; + use std::collections::BTreeMap; + + #[test] + fn should_prove_token_total_supply_and_aggregated_identity_balances() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + // Create a data contract with a token + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0(TokenConfigurationV0::default_most_restrictive()), + )]), + }); + + let token_id = contract.token_id(0).expect("expected token at position 0"); + + // Insert contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Mint tokens for identity accounts + let identity_1 = [1u8; 32]; + let identity_2 = [2u8; 32]; + + drive + .token_mint( + token_id.to_buffer(), + identity_1, + 50_000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint tokens for identity 1"); + + drive + .token_mint( + token_id.to_buffer(), + identity_2, + 50_000, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to mint tokens for identity 2"); + + // Prove token total supply and aggregated identity balances + let proof = drive + .prove_token_total_supply_and_aggregated_identity_balances( + token_id.to_buffer(), + None, + platform_version, + ) + .expect("should not error when proving total supply and balances"); + + // Verify proof + let (root_hash, total_single_token_balance) = + Drive::verify_token_total_supply_and_aggregated_identity_balance( + proof.as_slice(), + token_id.to_buffer(), + false, + platform_version, + ) + .expect("expected proof verification to succeed"); + + // Assert root hash is not empty + assert!(!root_hash.is_empty(), "expected a valid root hash"); + + // Assert total supply matches aggregated identity balances + // The contract was created with 100k, then 50k to each identity + assert_eq!( + total_single_token_balance.token_supply, 200_000, + "unexpected token supply" + ); + assert_eq!( + total_single_token_balance.aggregated_token_account_balances, 200_000, + "unexpected aggregated token account balances" + ); + + // Assert that the total balance is valid + assert!( + total_single_token_balance + .ok() + .expect("expected total balance to be valid"), + "unexpected total balance validation failure" + ); + } + + #[test] + fn should_prove_token_total_supply_and_aggregated_identity_balances_for_empty_token() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + // Create a data contract with a token + let contract = DataContract::V1(DataContractV1 { + id: Default::default(), + version: 0, + owner_id: Default::default(), + document_types: Default::default(), + metadata: None, + config: DataContractConfig::V0(DataContractConfigV0 { + can_be_deleted: false, + readonly: false, + keeps_history: false, + documents_keep_history_contract_default: false, + documents_mutable_contract_default: false, + documents_can_be_deleted_contract_default: false, + requires_identity_encryption_bounded_key: None, + requires_identity_decryption_bounded_key: None, + }), + schema_defs: None, + groups: Default::default(), + tokens: BTreeMap::from([( + 0, + TokenConfiguration::V0( + TokenConfigurationV0::default_most_restrictive().with_base_supply(0), + ), + )]), + }); + + let token_id = contract.token_id(0).expect("expected token at position 0"); + + // Insert contract into Drive + drive + .insert_contract( + &contract, + BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("expected to insert contract"); + + // Prove token total supply and aggregated identity balances for a token with no supply + let proof = drive + .prove_token_total_supply_and_aggregated_identity_balances_v0( + token_id.to_buffer(), + None, + platform_version, + ) + .expect("should not error when proving total supply and balances"); + + // Verify proof + let (root_hash, total_single_token_balance) = + Drive::verify_token_total_supply_and_aggregated_identity_balance( + proof.as_slice(), + token_id.to_buffer(), + false, + platform_version, + ) + .expect("expected proof verification to succeed"); + + // Assert root hash is not empty + assert!(!root_hash.is_empty(), "expected a valid root hash"); + + // Assert total supply matches aggregated identity balances + assert_eq!( + total_single_token_balance.token_supply, 0, + "unexpected token supply" + ); + assert_eq!( + total_single_token_balance.aggregated_token_account_balances, 0, + "unexpected aggregated token account balances" + ); + + // Assert that the total balance is valid + assert!( + total_single_token_balance + .ok() + .expect("expected total balance to be valid"), + "unexpected total balance validation failure" + ); + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/mod.rs b/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/mod.rs new file mode 100644 index 00000000000..4ede94b6322 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/mod.rs @@ -0,0 +1,112 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Removes from the token's total supply + pub fn remove_from_token_total_supply( + &self, + token_id: [u8; 32], + amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version + .drive + .methods + .token + .update + .remove_from_token_total_supply + { + 0 => self.remove_from_token_total_supply_v0( + token_id, + amount, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_from_token_total_supply".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations of removing from the token total supply + pub fn remove_from_token_total_supply_add_to_operations( + &self, + token_id: [u8; 32], + amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version + .drive + .methods + .token + .update + .remove_from_token_total_supply + { + 0 => self.remove_from_token_total_supply_add_to_operations_v0( + token_id, + amount, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_from_token_total_supply_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// The operations needed to remove from the token total supply + pub fn remove_from_token_total_supply_operations( + &self, + token_id: [u8; 32], + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version + .drive + .methods + .token + .update + .remove_from_token_total_supply + { + 0 => self.remove_from_token_total_supply_operations_v0( + token_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "remove_from_token_total_supply_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/v0/mod.rs b/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/v0/mod.rs new file mode 100644 index 00000000000..1bdbe38ebb5 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/system/remove_from_token_total_supply/v0/mod.rs @@ -0,0 +1,128 @@ +use crate::drive::balances::{total_tokens_root_supply_path, total_tokens_root_supply_path_vec}; +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::util::grove_operations::DirectQueryType; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::batch::QualifiedGroveDbOp; +use grovedb::Element::SumItem; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn remove_from_token_total_supply_v0( + &self, + token_id: [u8; 32], + amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.remove_from_token_total_supply_add_to_operations_v0( + token_id, + amount, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn remove_from_token_total_supply_add_to_operations_v0( + &self, + token_id: [u8; 32], + amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.remove_from_token_total_supply_operations_v0( + token_id, + amount, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn remove_from_token_total_supply_operations_v0( + &self, + token_id: [u8; 32], + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + // If we only estimate, add estimation costs + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + // Add your estimation logic similar to add_to_token_total_supply if needed + // For example (this is a placeholder method, you must implement similarly as others): + Self::add_estimation_costs_for_token_total_supply( + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + let path_holding_total_token_supply = total_tokens_root_supply_path(); + let total_token_supply_in_platform = self + .grove_get_raw_value_u64_from_encoded_var_vec( + (&path_holding_total_token_supply).into(), + &token_id, + DirectQueryType::StatefulDirectQuery, + transaction, + &mut drive_operations, + &platform_version.drive, + )? + .ok_or(Error::Drive(DriveError::CriticalCorruptedState( + "Total supply for Token not found in Platform", + )))?; + let new_total = total_token_supply_in_platform + .checked_sub(amount) + .ok_or(Error::Drive(DriveError::CriticalCorruptedState( + "trying to subtract an amount that would underflow total supply", + )))?; + let path_holding_total_token_supply_vec = total_tokens_root_supply_path_vec(); + let replace_op = QualifiedGroveDbOp::replace_op( + path_holding_total_token_supply_vec, + token_id.to_vec(), + SumItem(new_total as i64, None), + ); + drive_operations.push(GroveOperation(replace_op)); + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/transfer/mod.rs b/packages/rs-drive/src/drive/tokens/transfer/mod.rs new file mode 100644 index 00000000000..bb18a9220be --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/transfer/mod.rs @@ -0,0 +1,106 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Transfers tokens from one identity to another without changing total supply. + pub fn token_transfer( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.transfer { + 0 => self.token_transfer_v0( + token_id, + from_identity_id, + to_identity_id, + amount, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_transfer".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds operations to transfer tokens without calculating fees. + pub fn token_transfer_add_to_operations( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.transfer { + 0 => self.token_transfer_add_to_operations_v0( + token_id, + from_identity_id, + to_identity_id, + amount, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_transfer_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to transfer tokens. + pub fn token_transfer_operations( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.transfer { + 0 => self.token_transfer_operations_v0( + token_id, + from_identity_id, + to_identity_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_transfer_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/transfer/v0/mod.rs b/packages/rs-drive/src/drive/tokens/transfer/v0/mod.rs new file mode 100644 index 00000000000..6e1f95689bc --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/transfer/v0/mod.rs @@ -0,0 +1,114 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_transfer_v0( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_transfer_add_to_operations_v0( + token_id, + from_identity_id, + to_identity_id, + amount, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_transfer_add_to_operations_v0( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_transfer_operations_v0( + token_id, + from_identity_id, + to_identity_id, + amount, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_transfer_operations_v0( + &self, + token_id: [u8; 32], + from_identity_id: [u8; 32], + to_identity_id: [u8; 32], + amount: u64, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + + drive_operations.extend(self.remove_from_identity_token_balance_operations( + token_id, + from_identity_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + drive_operations.extend(self.add_to_identity_token_balance_operations( + token_id, + to_identity_id, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?); + + // Total supply remains the same. + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/tokens/unfreeze/mod.rs b/packages/rs-drive/src/drive/tokens/unfreeze/mod.rs new file mode 100644 index 00000000000..0e483c0c244 --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/unfreeze/mod.rs @@ -0,0 +1,95 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::Identifier; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use std::collections::HashMap; + +impl Drive { + /// Burns tokens by reducing the total supply and removing them from an identity's balance. + pub fn token_unfreeze( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + match platform_version.drive.methods.token.update.unfreeze { + 0 => self.token_unfreeze_v0( + token_id, + frozen_identity_id, + block_info, + apply, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_unfreeze".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Adds the operations to unfreeze tokens without calculating fees and optionally applying. + pub fn token_unfreeze_add_to_operations( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + match platform_version.drive.methods.token.update.unfreeze { + 0 => self.token_unfreeze_add_to_operations_v0( + token_id, + frozen_identity_id, + apply, + transaction, + drive_operations, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_unfreeze_add_to_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } + + /// Gathers the operations needed to unfreeze tokens. + pub fn token_unfreeze_operations( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match platform_version.drive.methods.token.update.unfreeze { + 0 => self.token_unfreeze_operations_v0( + token_id, + frozen_identity_id, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "token_unfreeze_operations".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/drive/tokens/unfreeze/v0/mod.rs b/packages/rs-drive/src/drive/tokens/unfreeze/v0/mod.rs new file mode 100644 index 00000000000..f9f0339a82d --- /dev/null +++ b/packages/rs-drive/src/drive/tokens/unfreeze/v0/mod.rs @@ -0,0 +1,147 @@ +use crate::drive::tokens::paths::token_identity_infos_path; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use crate::util::grove_operations::QueryTarget::QueryTargetValue; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::identifier::Identifier; +use dpp::serialization::{PlatformDeserializable, PlatformSerializable}; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::tokens::info::IdentityTokenInfo; +use dpp::version::PlatformVersion; +use grovedb::{batch::KeyInfoPath, Element, EstimatedLayerInformation, TransactionArg, TreeType}; +use std::collections::HashMap; + +impl Drive { + pub(super) fn token_unfreeze_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + block_info: &BlockInfo, + apply: bool, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<FeeResult, Error> { + let mut drive_operations = vec![]; + + self.token_unfreeze_add_to_operations_v0( + token_id, + frozen_identity_id, + apply, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fees = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + self.config.epochs_per_era, + platform_version, + None, + )?; + + Ok(fees) + } + + pub(super) fn token_unfreeze_add_to_operations_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + apply: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + platform_version: &PlatformVersion, + ) -> Result<(), Error> { + let mut estimated_costs_only_with_layer_info = + if apply { None } else { Some(HashMap::new()) }; + + let batch_operations = self.token_unfreeze_operations_v0( + token_id, + frozen_identity_id, + &mut estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + + self.apply_batch_low_level_drive_operations( + estimated_costs_only_with_layer_info, + transaction, + batch_operations, + drive_operations, + &platform_version.drive, + ) + } + + pub(super) fn token_unfreeze_operations_v0( + &self, + token_id: Identifier, + frozen_identity_id: Identifier, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + let mut drive_operations = vec![]; + if let Some(estimated_costs_only_with_layer_info) = estimated_costs_only_with_layer_info { + Self::add_estimation_costs_for_token_identity_infos( + token_id.to_buffer(), + estimated_costs_only_with_layer_info, + &platform_version.drive, + )?; + } + + // no estimated_costs_only_with_layer_info, means we want to apply to state + let direct_query_type = if estimated_costs_only_with_layer_info.is_none() { + DirectQueryType::StatefulDirectQuery + } else { + DirectQueryType::StatelessDirectQuery { + in_tree_type: TreeType::NormalTree, + query_target: QueryTargetValue(8), + } + }; + + let token_info_path = token_identity_infos_path(token_id.as_bytes()); + match self + .grove_get_raw_optional_item( + (&token_info_path).into(), + frozen_identity_id.as_slice(), + direct_query_type, + transaction, + &mut drive_operations, + &platform_version.drive, + )? + .map(|bytes| IdentityTokenInfo::deserialize_from_bytes(&bytes)) + .transpose()? + { + None => { + let identity_token_info_bytes = IdentityTokenInfo::new(false, platform_version)? + .serialize_consume_to_bytes()?; + drive_operations.push(LowLevelDriveOperation::insert_for_known_path_key_element( + token_info_path.iter().map(|a| a.to_vec()).collect(), + frozen_identity_id.to_vec(), + Element::new_item(identity_token_info_bytes), + )); + } + Some(mut token_info) => { + if token_info.frozen() { + token_info.set_frozen(false); + let identity_token_info_bytes = token_info.serialize_consume_to_bytes()?; + drive_operations.push( + LowLevelDriveOperation::replace_for_known_path_key_element( + token_info_path.iter().map(|a| a.to_vec()).collect(), + frozen_identity_id.to_vec(), + Element::new_item(identity_token_info_bytes), + ), + ); + } + } + }; + + Ok(drive_operations) + } +} diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_all_votes_given_by_identities/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_all_votes_given_by_identities/v0/mod.rs index 81b3d0fab7b..2f2346d88b6 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_all_votes_given_by_identities/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_all_votes_given_by_identities/v0/mod.rs @@ -15,7 +15,7 @@ use dpp::dashcore::Network; use dpp::prelude::{BlockHeight, Identifier}; use dpp::version::PlatformVersion; use grovedb::query_result_type::QueryResultType::QueryPathKeyElementTrioResultType; -use grovedb::{PathQuery, Query, SizedQuery, TransactionArg}; +use grovedb::{MaybeTree, PathQuery, Query, SizedQuery, TransactionArg}; impl Drive { /// We remove votes for an identity when that identity is somehow disabled. Currently there is @@ -70,7 +70,7 @@ impl Drive { vote_path_ref.as_slice().into(), vote_id.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut deletion_batch, @@ -106,7 +106,7 @@ impl Drive { absolute_path_ref.as_slice().into(), identifier_bytes.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut deletion_batch, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v0/mod.rs index 5e9127abf65..3598e7b0617 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v0/mod.rs @@ -8,7 +8,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -33,7 +33,7 @@ impl Drive { path.as_slice().into(), resource_vote_choice.to_key().as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v1/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v1/mod.rs index 7440aaadce6..4a2542b3906 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v1/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_contenders_operations/v1/mod.rs @@ -10,7 +10,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -35,7 +35,7 @@ impl Drive { path.as_slice().into(), resource_vote_choice.to_key().as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, @@ -47,7 +47,7 @@ impl Drive { path.as_slice().into(), &RESOURCE_ABSTAIN_VOTE_TREE_KEY_U8_32, BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, @@ -58,7 +58,7 @@ impl Drive { path.as_slice().into(), &RESOURCE_LOCK_VOTE_TREE_KEY_U8_32, BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v0/mod.rs index cb25558a382..c417c36cfb4 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v0/mod.rs @@ -9,7 +9,7 @@ use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use grovedb::query_result_type::QueryResultType; -use grovedb::{PathQuery, TransactionArg}; +use grovedb::{MaybeTree, PathQuery, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; use std::ops::RangeFull; @@ -54,7 +54,7 @@ impl Drive { documents_storage_path.as_slice().into(), document_key.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, @@ -72,7 +72,7 @@ impl Drive { contender_path.as_slice().into(), vec![0].as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v1/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v1/mod.rs index f6722670348..b21d9584fab 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v1/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_documents_operations/v1/mod.rs @@ -11,7 +11,7 @@ use dpp::document::DocumentV0Getters; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -70,7 +70,7 @@ impl Drive { documents_storage_path.as_slice().into(), document_key.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, @@ -89,7 +89,7 @@ impl Drive { contender_path.as_slice().into(), vec![0].as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v0/mod.rs index 1f2a36d353f..4a0e7c0a4be 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v0/mod.rs @@ -8,7 +8,7 @@ use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use grovedb::batch::KeyInfoPath; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -34,7 +34,7 @@ impl Drive { // VotePoll Info 1 VotePoll Info 2 VotePoll Info 3 let delete_apply_type = BatchDeleteUpTreeApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }; for (vote_poll, end_date, _) in vote_polls { diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v1/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v1/mod.rs index b47e5feb605..ef35e8a2db9 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v1/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_end_date_query_operations/v1/mod.rs @@ -12,7 +12,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -38,7 +38,7 @@ impl Drive { // VotePoll Info 1 VotePoll Info 2 VotePoll Info 3 let delete_apply_type = BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }; let mut by_end_date: BTreeMap<TimestampMillis, Vec<Identifier>> = BTreeMap::new(); diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_info_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_info_operations/v0/mod.rs index 141fd3c766e..0f30733b0a9 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_info_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_info_operations/v0/mod.rs @@ -7,7 +7,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -29,7 +29,7 @@ impl Drive { path.as_slice().into(), &RESOURCE_STORED_INFO_KEY_U8_32, BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_top_level_index_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_top_level_index_operations/v0/mod.rs index 13d3832592c..d1a3583bf08 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_top_level_index_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_top_level_index_operations/v0/mod.rs @@ -7,7 +7,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -30,7 +30,7 @@ impl Drive { path.as_slice().into(), last_index_path.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_votes_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_votes_operations/v0/mod.rs index 4bd8edcff97..44ee761e560 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_votes_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_contested_resource_vote_poll_votes_operations/v0/mod.rs @@ -7,7 +7,7 @@ use crate::util::grove_operations::BatchDeleteApplyType; use dpp::identifier::Identifier; use dpp::identity::TimestampMillis; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; use platform_version::version::PlatformVersion; use std::collections::BTreeMap; @@ -36,7 +36,7 @@ impl Drive { path.as_slice().into(), vote.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, @@ -51,7 +51,7 @@ impl Drive { path.as_slice().into(), vec![VOTING_STORAGE_TREE_KEY].as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/cleanup/remove_specific_votes_given_by_identity/v0/mod.rs b/packages/rs-drive/src/drive/votes/cleanup/remove_specific_votes_given_by_identity/v0/mod.rs index bc8b4679853..1802e9ab242 100644 --- a/packages/rs-drive/src/drive/votes/cleanup/remove_specific_votes_given_by_identity/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/cleanup/remove_specific_votes_given_by_identity/v0/mod.rs @@ -6,7 +6,7 @@ use crate::fees::op::LowLevelDriveOperation; use crate::util::grove_operations::BatchDeleteApplyType; use dpp::prelude::Identifier; use dpp::version::PlatformVersion; -use grovedb::TransactionArg; +use grovedb::{MaybeTree, TransactionArg}; impl Drive { /// We remove votes for an identity when that identity is somehow disabled. Currently there is @@ -29,7 +29,7 @@ impl Drive { vote_path_ref.as_slice().into(), vote_identifier_to_remove.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, batch_operations, diff --git a/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs b/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs index c7b284b845c..2a1ddacfddf 100644 --- a/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/insert/contested_resource/individual_vote/register_contested_resource_identity_vote/v0/mod.rs @@ -16,7 +16,7 @@ use dpp::fee::fee_result::FeeResult; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use dpp::{bincode, ProtocolError}; use grovedb::reference_path::ReferencePathType; -use grovedb::{Element, TransactionArg}; +use grovedb::{Element, MaybeTree, TransactionArg, TreeType}; use platform_version::version::PlatformVersion; impl Drive { @@ -104,7 +104,7 @@ impl Drive { previous_voting_path.as_slice().into(), voter_pro_tx_hash.as_slice(), BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, true)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut drive_operations, @@ -118,7 +118,7 @@ impl Drive { self.batch_insert_empty_tree_if_not_exists( PathKeyInfo::PathKey::<0>((votes_identities_path, voter_pro_tx_hash.to_vec())), - false, + TreeType::NormalTree, None, BatchInsertTreeApplyType::StatefulBatchInsertTree, //todo this shouldn't always be stateful transaction, diff --git a/packages/rs-drive/src/drive/votes/insert/vote_poll/add_vote_poll_end_date_query_operations/v0/mod.rs b/packages/rs-drive/src/drive/votes/insert/vote_poll/add_vote_poll_end_date_query_operations/v0/mod.rs index 1c5fb593e9c..e3ac582a483 100644 --- a/packages/rs-drive/src/drive/votes/insert/vote_poll/add_vote_poll_end_date_query_operations/v0/mod.rs +++ b/packages/rs-drive/src/drive/votes/insert/vote_poll/add_vote_poll_end_date_query_operations/v0/mod.rs @@ -22,7 +22,7 @@ use grovedb::batch::KeyInfoPath; use grovedb::EstimatedLayerCount::ApproximateElements; use grovedb::EstimatedLayerSizes::{AllItems, AllSubtrees}; use grovedb::EstimatedSumTrees::NoSumTrees; -use grovedb::{Element, EstimatedLayerInformation, TransactionArg}; +use grovedb::{Element, EstimatedLayerInformation, TransactionArg, TreeType}; use platform_version::version::PlatformVersion; use std::collections::HashMap; @@ -51,7 +51,7 @@ impl Drive { estimated_costs_only_with_layer_info.insert( KeyInfoPath::from_known_path(vote_end_date_queries_tree_path()), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // We can estimate that there is at least a vote concluding every block, and we put blocks at 6 seconds. estimated_layer_count: ApproximateElements(201_600), estimated_layer_sizes: AllSubtrees( @@ -67,7 +67,7 @@ impl Drive { vote_contested_resource_end_date_queries_at_time_tree_path_vec(end_date), ), EstimatedLayerInformation { - is_sum_tree: false, + tree_type: TreeType::NormalTree, // We can estimate that there is 2 votes ending per block. estimated_layer_count: ApproximateElements(2), estimated_layer_sizes: AllItems( @@ -100,8 +100,8 @@ impl Drive { BatchInsertTreeApplyType::StatefulBatchInsertTree } else { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums: false, - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, + tree_type: TreeType::NormalTree, flags_len: storage_flags .as_ref() .map(|s| s.serialized_size()) @@ -113,7 +113,7 @@ impl Drive { // end data in the documents batch transition self.batch_insert_empty_tree_if_not_exists( path_key_info.clone(), - false, + TreeType::NormalTree, storage_flags.as_ref(), apply_type, transaction, @@ -133,7 +133,7 @@ impl Drive { BatchInsertApplyType::StatefulBatchInsert } else { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums: false, + in_tree_type: TreeType::NormalTree, // todo: figure out a default serialized size to make this faster target: QueryTargetValue( item.serialized_size(&platform_version.drive.grove_version)? as u32, diff --git a/packages/rs-drive/src/drive/votes/resolved/vote_polls/contested_document_resource_vote_poll/resolve.rs b/packages/rs-drive/src/drive/votes/resolved/vote_polls/contested_document_resource_vote_poll/resolve.rs index 2ca742ff8f9..07006e2c190 100644 --- a/packages/rs-drive/src/drive/votes/resolved/vote_polls/contested_document_resource_vote_poll/resolve.rs +++ b/packages/rs-drive/src/drive/votes/resolved/vote_polls/contested_document_resource_vote_poll/resolve.rs @@ -1,8 +1,10 @@ #[cfg(feature = "server")] use crate::drive::contract::DataContractFetchInfo; +#[cfg(feature = "server")] use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfo; #[cfg(any(feature = "server", feature = "verify"))] use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfoAllowBorrowed; +#[cfg(feature = "server")] use crate::drive::Drive; use crate::error::contract::DataContractError; use crate::error::Error; diff --git a/packages/rs-drive/src/error/proof.rs b/packages/rs-drive/src/error/proof.rs index 504aa11f559..b2c14a57ed7 100644 --- a/packages/rs-drive/src/error/proof.rs +++ b/packages/rs-drive/src/error/proof.rs @@ -30,6 +30,13 @@ pub enum ProofError { #[error("incorrect proof error: {0}")] IncorrectProof(String), + /// The proof returned is said to be valid, data is what we asked for, but is not what was + /// expected, for example we ask for token balance, and we get that the token does not exist. + /// UnexpectedResultProof is most likely is a User error. + /// IncorrectProof is most likely a system error. + #[error("unexpected result in proof error: {0}")] + UnexpectedResultProof(String), + /// The transition we are trying to prove was executed is invalid #[error("invalid transition error: {0}")] InvalidTransition(String), @@ -85,5 +92,6 @@ fn get_error_code(error: &ProofError) -> u32 { ProofError::ErrorRetrievingContract(_) => 6010, ProofError::InvalidMetadata(_) => 6011, ProofError::MissingContextRequirement(_) => 6012, + ProofError::UnexpectedResultProof(_) => 6013, } } diff --git a/packages/rs-drive/src/fees/mod.rs b/packages/rs-drive/src/fees/mod.rs index 96e7c996aca..c240c54f0c9 100644 --- a/packages/rs-drive/src/fees/mod.rs +++ b/packages/rs-drive/src/fees/mod.rs @@ -2,6 +2,7 @@ use crate::error::fee::FeeError; use crate::error::Error; mod calculate_fee; +/// Operations pub mod op; /// Get overflow error diff --git a/packages/rs-drive/src/fees/op.rs b/packages/rs-drive/src/fees/op.rs index c28ea60caa2..f98c05096d5 100644 --- a/packages/rs-drive/src/fees/op.rs +++ b/packages/rs-drive/src/fees/op.rs @@ -9,7 +9,7 @@ use grovedb::batch::key_info::KeyInfo; use grovedb::batch::KeyInfoPath; use grovedb::element::MaxReferenceHop; use grovedb::reference_path::ReferencePathType; -use grovedb::{batch::QualifiedGroveDbOp, Element, ElementFlags}; +use grovedb::{batch::QualifiedGroveDbOp, Element, ElementFlags, TreeType}; use grovedb_costs::OperationCost; use itertools::Itertools; @@ -382,6 +382,54 @@ impl LowLevelDriveOperation { LowLevelDriveOperation::insert_for_known_path_key_element(path, key, tree) } + /// Sets `GroveOperation` for inserting an empty sum tree at the given path and key + pub fn for_known_path_key_empty_big_sum_tree( + path: Vec<Vec<u8>>, + key: Vec<u8>, + storage_flags: Option<&StorageFlags>, + ) -> Self { + let tree = match storage_flags { + Some(storage_flags) => { + Element::new_big_sum_tree_with_flags(None, storage_flags.to_some_element_flags()) + } + None => Element::empty_big_sum_tree(), + }; + + LowLevelDriveOperation::insert_for_known_path_key_element(path, key, tree) + } + + /// Sets `GroveOperation` for inserting an empty count tree at the given path and key + pub fn for_known_path_key_empty_count_tree( + path: Vec<Vec<u8>>, + key: Vec<u8>, + storage_flags: Option<&StorageFlags>, + ) -> Self { + let tree = match storage_flags { + Some(storage_flags) => { + Element::new_count_tree_with_flags(None, storage_flags.to_some_element_flags()) + } + None => Element::empty_count_tree(), + }; + + LowLevelDriveOperation::insert_for_known_path_key_element(path, key, tree) + } + + /// Sets `GroveOperation` for inserting an empty count tree at the given path and key + pub fn for_known_path_key_empty_count_sum_tree( + path: Vec<Vec<u8>>, + key: Vec<u8>, + storage_flags: Option<&StorageFlags>, + ) -> Self { + let tree = match storage_flags { + Some(storage_flags) => { + Element::new_count_sum_tree_with_flags(None, storage_flags.to_some_element_flags()) + } + None => Element::new_count_sum_tree(None), + }; + + LowLevelDriveOperation::insert_for_known_path_key_element(path, key, tree) + } + /// Sets `GroveOperation` for inserting an empty tree at the given path and key pub fn for_estimated_path_key_empty_tree( path: KeyInfoPath, @@ -398,6 +446,22 @@ impl LowLevelDriveOperation { LowLevelDriveOperation::insert_for_estimated_path_key_element(path, key, tree) } + /// Sets `GroveOperation` for inserting an empty sum tree at the given path and key + pub fn for_estimated_path_key_empty_sum_tree( + path: KeyInfoPath, + key: KeyInfo, + storage_flags: Option<&StorageFlags>, + ) -> Self { + let tree = match storage_flags { + Some(storage_flags) => { + Element::empty_sum_tree_with_flags(storage_flags.to_some_element_flags()) + } + None => Element::empty_sum_tree(), + }; + + LowLevelDriveOperation::insert_for_estimated_path_key_element(path, key, tree) + } + /// Sets `GroveOperation` for inserting an element at the given path and key pub fn insert_for_known_path_key_element( path: Vec<Vec<u8>>, @@ -470,6 +534,38 @@ impl LowLevelDriveOperation { } } +/// A trait for getting an empty tree operation based on the tree type +pub trait LowLevelDriveOperationTreeTypeConverter { + /// Sets `GroveOperation` for inserting an empty tree at the given path and key + fn empty_tree_operation_for_known_path_key( + &self, + path: Vec<Vec<u8>>, + key: Vec<u8>, + storage_flags: Option<&StorageFlags>, + ) -> LowLevelDriveOperation; +} + +impl LowLevelDriveOperationTreeTypeConverter for TreeType { + /// Sets `GroveOperation` for inserting an empty tree at the given path and key + fn empty_tree_operation_for_known_path_key( + &self, + path: Vec<Vec<u8>>, + key: Vec<u8>, + storage_flags: Option<&StorageFlags>, + ) -> LowLevelDriveOperation { + let element_flags = storage_flags.map(|storage_flags| storage_flags.to_element_flags()); + let element = match self { + TreeType::NormalTree => Element::empty_tree_with_flags(element_flags), + TreeType::SumTree => Element::empty_sum_tree_with_flags(element_flags), + TreeType::BigSumTree => Element::empty_big_sum_tree_with_flags(element_flags), + TreeType::CountTree => Element::empty_count_tree_with_flags(element_flags), + TreeType::CountSumTree => Element::empty_count_sum_tree_with_flags(element_flags), + }; + + LowLevelDriveOperation::insert_for_known_path_key_element(path, key, element) + } +} + /// Drive cost trait pub trait DriveCost { /// Ephemeral cost diff --git a/packages/rs-drive/src/lib.rs b/packages/rs-drive/src/lib.rs index a11e8e74bd3..a13845e0fcd 100644 --- a/packages/rs-drive/src/lib.rs +++ b/packages/rs-drive/src/lib.rs @@ -41,8 +41,9 @@ pub use grovedb_storage; pub mod cache; #[cfg(any(feature = "server", feature = "verify"))] pub mod config; +/// Fees module #[cfg(feature = "server")] -mod fees; +pub mod fees; #[cfg(feature = "server")] mod open; #[cfg(feature = "server")] diff --git a/packages/rs-drive/src/open/mod.rs b/packages/rs-drive/src/open/mod.rs index 8e2c599264c..82e9a6c65c7 100644 --- a/packages/rs-drive/src/open/mod.rs +++ b/packages/rs-drive/src/open/mod.rs @@ -4,9 +4,8 @@ use crate::config::DriveConfig; use crate::drive::Drive; use crate::error::Error; use dpp::errors::ProtocolError; -use dpp::util::deserializer::ProtocolVersion; use grovedb::GroveDb; -use platform_version::version::{PlatformVersion, INITIAL_PROTOCOL_VERSION}; +use platform_version::version::PlatformVersion; use std::path::Path; use std::sync::Arc; @@ -29,7 +28,8 @@ impl Drive { pub fn open<P: AsRef<Path>>( path: P, config: Option<DriveConfig>, - ) -> Result<(Self, Option<ProtocolVersion>), Error> { + default_platform_version: Option<&PlatformVersion>, + ) -> Result<(Self, Option<&'static PlatformVersion>), Error> { let config = config.unwrap_or_default(); let grove = Arc::new(GroveDb::open(path)?); @@ -42,13 +42,18 @@ impl Drive { let data_contracts_global_cache_size = config.data_contracts_global_cache_size; let data_contracts_block_cache_size = config.data_contracts_block_cache_size; - let protocol_version = Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + let maybe_protocol_version = + Drive::fetch_current_protocol_version_with_grovedb(&grove, None)?; + let maybe_platform_version = maybe_protocol_version + .map(|protocol_version| { + PlatformVersion::get(protocol_version).map_err(ProtocolError::PlatformVersionError) + }) + .transpose()?; // At this point we don't know the version what we need to process next block or initialize the chain // so version related data should be updated on init chain or on block execution - let platform_version = - PlatformVersion::get(protocol_version.unwrap_or(INITIAL_PROTOCOL_VERSION)) - .map_err(ProtocolError::PlatformVersionError)?; + let platform_version = maybe_platform_version + .unwrap_or_else(|| default_platform_version.unwrap_or(PlatformVersion::latest())); let drive = Drive { grove, @@ -66,6 +71,6 @@ impl Drive { }, }; - Ok((drive, protocol_version)) + Ok((drive, maybe_platform_version)) } } diff --git a/packages/rs-drive/src/prove/prove_multiple_state_transition_results/mod.rs b/packages/rs-drive/src/prove/prove_multiple_state_transition_results/mod.rs index 309cecc47ea..646894b25cd 100644 --- a/packages/rs-drive/src/prove/prove_multiple_state_transition_results/mod.rs +++ b/packages/rs-drive/src/prove/prove_multiple_state_transition_results/mod.rs @@ -4,6 +4,9 @@ use crate::error::drive::DriveError; use crate::error::Error; use crate::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery}; +use crate::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery; +use crate::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery; +use crate::query::token_status_drive_query::TokenStatusDriveQuery; use dpp::version::PlatformVersion; use grovedb::TransactionArg; @@ -21,6 +24,14 @@ impl Drive { /// if the contract is historical. /// - `document_queries`: A list of [SingleDocumentDriveQuery]. These specify the documents /// to be proven. + /// - `vote_queries`: A list of [IdentityBasedVoteDriveQuery]. These would be to figure out the + /// result of votes based on identities making them. + /// - `token_balance_queries`: A slice of [IdentityTokenBalanceDriveQuery] objects specifying + /// token balance queries for identities. + /// - `token_info_queries`: A slice of [IdentityTokenInfoDriveQuery] objects specifying + /// token information queries for identities. + /// - `token_status_queries`: A slice of [TokenStatusDriveQuery] objects specifying token + /// status queries. /// - `transaction`: An optional grovedb transaction /// - `drive_version`: A reference to the [DriveVersion] object that specifies the version of /// the function to call. @@ -34,6 +45,9 @@ impl Drive { contract_ids: &[([u8; 32], Option<bool>)], //bool represents if it is historical document_queries: &[SingleDocumentDriveQuery], vote_queries: &[IdentityBasedVoteDriveQuery], + token_balance_queries: &[IdentityTokenBalanceDriveQuery], + token_info_queries: &[IdentityTokenInfoDriveQuery], + token_status_queries: &[TokenStatusDriveQuery], transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<Vec<u8>, Error> { @@ -48,6 +62,9 @@ impl Drive { contract_ids, document_queries, vote_queries, + token_balance_queries, + token_info_queries, + token_status_queries, transaction, platform_version, ), diff --git a/packages/rs-drive/src/prove/prove_multiple_state_transition_results/v0/mod.rs b/packages/rs-drive/src/prove/prove_multiple_state_transition_results/v0/mod.rs index a348c2d1400..4c0c8058b1c 100644 --- a/packages/rs-drive/src/prove/prove_multiple_state_transition_results/v0/mod.rs +++ b/packages/rs-drive/src/prove/prove_multiple_state_transition_results/v0/mod.rs @@ -3,6 +3,9 @@ use crate::drive::Drive; use crate::error::Error; use crate::query::{IdentityBasedVoteDriveQuery, SingleDocumentDriveQuery}; +use crate::query::identity_token_balance_drive_query::IdentityTokenBalanceDriveQuery; +use crate::query::identity_token_info_drive_query::IdentityTokenInfoDriveQuery; +use crate::query::token_status_drive_query::TokenStatusDriveQuery; use dpp::version::PlatformVersion; use grovedb::{PathQuery, TransactionArg}; use itertools::{Either, Itertools}; @@ -18,6 +21,12 @@ impl Drive { /// to be proven. /// - `vote_queries`: A list of [IdentityBasedVoteDriveQuery]. These would be to figure out the /// result of votes based on identities making them. + /// - `token_balance_queries`: A slice of [IdentityTokenBalanceDriveQuery] objects specifying + /// token balance queries for identities. + /// - `token_info_queries`: A slice of [IdentityTokenInfoDriveQuery] objects specifying + /// token information queries for identities. + /// - `token_status_queries`: A slice of [TokenStatusDriveQuery] objects specifying token + /// status queries. /// - `transaction`: An optional grovedb transaction /// - `platform_version`: A reference to the [PlatformVersion] object that specifies the version of /// the function to call. @@ -32,6 +41,9 @@ impl Drive { contract_ids: &[([u8; 32], Option<bool>)], //bool is history document_queries: &[SingleDocumentDriveQuery], vote_queries: &[IdentityBasedVoteDriveQuery], + token_balance_queries: &[IdentityTokenBalanceDriveQuery], + token_info_queries: &[IdentityTokenInfoDriveQuery], + token_status_queries: &[TokenStatusDriveQuery], transaction: TransactionArg, platform_version: &PlatformVersion, ) -> Result<Vec<u8>, Error> { @@ -108,6 +120,44 @@ impl Drive { })); } + if !token_balance_queries.is_empty() { + path_queries.extend( + token_balance_queries + .iter() + .filter_map(|token_balance_query| { + // The path query construction can only fail if the serialization fails. + // Because the serialization will pretty much never fail, we can do this. + let mut path_query = token_balance_query.construct_path_query(); + path_query.query.limit = None; + Some(path_query) + }), + ); + } + + if !token_info_queries.is_empty() { + path_queries.extend(token_info_queries.iter().filter_map(|token_info_query| { + // The path query construction can only fail if the serialization fails. + // Because the serialization will pretty much never fail, we can do this. + let mut path_query = token_info_query.construct_path_query(); + path_query.query.limit = None; + Some(path_query) + })); + } + + if !token_status_queries.is_empty() { + path_queries.extend( + token_status_queries + .iter() + .filter_map(|token_status_query| { + // The path query construction can only fail if the serialization fails. + // Because the serialization will pretty much never fail, we can do this. + let mut path_query = token_status_query.construct_path_query(); + path_query.query.limit = None; + Some(path_query) + }), + ); + } + let path_query = PathQuery::merge( path_queries.iter().collect(), &platform_version.drive.grove_version, diff --git a/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs b/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs index b5b6938358d..05c5ad8cfe1 100644 --- a/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs +++ b/packages/rs-drive/src/query/contested_resource_votes_given_by_identity_query.rs @@ -1,9 +1,13 @@ use crate::drive::votes::paths::vote_contested_resource_identity_votes_tree_path_for_identity_vec; +#[cfg(feature = "server")] use crate::drive::votes::storage_form::contested_document_resource_reference_storage_form::ContestedDocumentResourceVoteReferenceStorageForm; +#[cfg(feature = "server")] use crate::drive::votes::storage_form::contested_document_resource_storage_form::ContestedDocumentResourceVoteStorageForm; +#[cfg(feature = "server")] use crate::drive::votes::tree_path_storage_form::TreePathStorageForm; #[cfg(feature = "server")] use crate::drive::Drive; +#[cfg(feature = "server")] use crate::error::drive::DriveError; use crate::error::Error; #[cfg(feature = "server")] @@ -11,6 +15,7 @@ use crate::fees::op::LowLevelDriveOperation; #[cfg(feature = "server")] use crate::query::GroveError; use crate::query::Query; +#[cfg(feature = "server")] use dpp::bincode; #[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; @@ -20,6 +25,7 @@ use grovedb::query_result_type::{QueryResultElements, QueryResultType}; #[cfg(feature = "server")] use grovedb::TransactionArg; use grovedb::{PathQuery, SizedQuery}; +#[cfg(feature = "server")] use platform_version::version::PlatformVersion; #[cfg(feature = "server")] use std::collections::BTreeMap; diff --git a/packages/rs-drive/src/query/drive_contested_document_query.rs b/packages/rs-drive/src/query/drive_contested_document_query.rs index e83950d6e0d..375429edbc5 100644 --- a/packages/rs-drive/src/query/drive_contested_document_query.rs +++ b/packages/rs-drive/src/query/drive_contested_document_query.rs @@ -1,4 +1,5 @@ use crate::drive::contract::paths::DataContractPaths; +#[cfg(feature = "server")] use crate::drive::Drive; use crate::error::Error; #[cfg(feature = "server")] @@ -6,6 +7,7 @@ use crate::fees::op::LowLevelDriveOperation; #[cfg(feature = "server")] use crate::query::GroveError; use crate::query::Query; +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::document_type::DocumentTypeRef; diff --git a/packages/rs-drive/src/query/identity_token_balance_drive_query.rs b/packages/rs-drive/src/query/identity_token_balance_drive_query.rs new file mode 100644 index 00000000000..568fb176cf7 --- /dev/null +++ b/packages/rs-drive/src/query/identity_token_balance_drive_query.rs @@ -0,0 +1,23 @@ +use crate::drive::Drive; +use bincode::{Decode, Encode}; +use dpp::identifier::Identifier; +use grovedb::PathQuery; + +/// Identity token balance drive query struct +#[derive(Debug, PartialEq, Clone, Encode, Decode)] +pub struct IdentityTokenBalanceDriveQuery { + /// The identity who we are querying for + pub identity_id: Identifier, + /// the token id + pub token_id: Identifier, +} + +impl IdentityTokenBalanceDriveQuery { + /// Operations to construct a path query. + pub fn construct_path_query(&self) -> PathQuery { + Drive::token_balance_for_identity_id_query( + self.token_id.to_buffer(), + self.identity_id.to_buffer(), + ) + } +} diff --git a/packages/rs-drive/src/query/identity_token_info_drive_query.rs b/packages/rs-drive/src/query/identity_token_info_drive_query.rs new file mode 100644 index 00000000000..1cb78c7731f --- /dev/null +++ b/packages/rs-drive/src/query/identity_token_info_drive_query.rs @@ -0,0 +1,23 @@ +use crate::drive::Drive; +use bincode::{Decode, Encode}; +use dpp::identifier::Identifier; +use grovedb::PathQuery; + +/// Identity token info drive query struct +#[derive(Debug, PartialEq, Clone, Encode, Decode)] +pub struct IdentityTokenInfoDriveQuery { + /// The identity who we are querying for + pub identity_id: Identifier, + /// The token id + pub token_id: Identifier, +} + +impl IdentityTokenInfoDriveQuery { + /// Operations to construct a path query. + pub fn construct_path_query(&self) -> PathQuery { + Drive::token_info_for_identity_id_query( + self.token_id.to_buffer(), + self.identity_id.to_buffer(), + ) + } +} diff --git a/packages/rs-drive/src/query/mod.rs b/packages/rs-drive/src/query/mod.rs index d8f7181cc2e..8b183bea9ad 100644 --- a/packages/rs-drive/src/query/mod.rs +++ b/packages/rs-drive/src/query/mod.rs @@ -130,17 +130,28 @@ pub fn contract_lookup_fn_for_contract<'a>( Box::new(func) } -#[cfg(any(feature = "server", feature = "verify"))] /// A query to get the votes given out by an identity -pub mod contested_resource_votes_given_by_identity_query; #[cfg(any(feature = "server", feature = "verify"))] +pub mod contested_resource_votes_given_by_identity_query; /// A query to get contested documents before they have been awarded +#[cfg(any(feature = "server", feature = "verify"))] pub mod drive_contested_document_query; -#[cfg(any(feature = "server", feature = "verify"))] /// A query to get the block counts of proposers in an epoch +#[cfg(any(feature = "server", feature = "verify"))] pub mod proposer_block_count_query; +/// A query to get the identity's token balance +#[cfg(any(feature = "server", feature = "verify"))] +pub mod identity_token_balance_drive_query; +/// A query to get the identity's token info +#[cfg(any(feature = "server", feature = "verify"))] +pub mod identity_token_info_drive_query; + +/// A query to get the token's status +#[cfg(any(feature = "server", feature = "verify"))] +pub mod token_status_drive_query; + #[cfg(any(feature = "server", feature = "verify"))] /// Represents a starting point for a query based on a specific document. /// @@ -2291,9 +2302,7 @@ mod tests { use serde_json::Value::Null; use crate::config::DriveConfig; - use crate::util::test_helpers::setup::{ - setup_drive_with_initial_state_structure, setup_system_data_contract, - }; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contracts::SystemDataContract; @@ -2309,10 +2318,11 @@ mod tests { fn setup_family_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); - let platform_version = PlatformVersion::latest(); + let (drive, _) = Drive::open(tmp_dir, None, Some(platform_version)) + .expect("expected to open Drive successfully"); + drive .create_initial_state_structure(None, platform_version) .expect("expected to create root tree successfully"); @@ -2341,10 +2351,11 @@ mod tests { fn setup_withdrawal_contract() -> (Drive, DataContract) { let tmp_dir = TempDir::new().unwrap(); - let (drive, _) = Drive::open(tmp_dir, None).expect("expected to open Drive successfully"); - let platform_version = PlatformVersion::latest(); + let (drive, _) = Drive::open(tmp_dir, None, Some(platform_version)) + .expect("expected to open Drive successfully"); + drive .create_initial_state_structure(None, platform_version) .expect("expected to create root tree successfully"); diff --git a/packages/rs-drive/src/query/token_status_drive_query.rs b/packages/rs-drive/src/query/token_status_drive_query.rs new file mode 100644 index 00000000000..d4712b3545c --- /dev/null +++ b/packages/rs-drive/src/query/token_status_drive_query.rs @@ -0,0 +1,18 @@ +use crate::drive::Drive; +use bincode::{Decode, Encode}; +use dpp::identifier::Identifier; +use grovedb::PathQuery; + +/// Token status drive query struct +#[derive(Debug, PartialEq, Clone, Encode, Decode)] +pub struct TokenStatusDriveQuery { + /// the token id + pub token_id: Identifier, +} + +impl TokenStatusDriveQuery { + /// Operations to construct a path query. + pub fn construct_path_query(&self) -> PathQuery { + Drive::token_status_query(self.token_id.to_buffer()) + } +} diff --git a/packages/rs-drive/src/query/vote_poll_vote_state_query.rs b/packages/rs-drive/src/query/vote_poll_vote_state_query.rs index 1d2398918d6..cf1f7ce4e9c 100644 --- a/packages/rs-drive/src/query/vote_poll_vote_state_query.rs +++ b/packages/rs-drive/src/query/vote_poll_vote_state_query.rs @@ -4,6 +4,7 @@ use crate::drive::votes::paths::{ }; use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::resolve::ContestedDocumentResourceVotePollResolver; use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfoAllowBorrowed; +#[cfg(feature = "server")] use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::query::QuerySyntaxError; @@ -16,6 +17,7 @@ use bincode::{Decode, Encode}; use dpp::block::block_info::BlockInfo; use dpp::data_contract::DataContract; use dpp::identifier::Identifier; +#[cfg(feature = "server")] use dpp::serialization::PlatformDeserializable; use dpp::voting::contender_structs::{ ContenderWithSerializedDocument, ContenderWithSerializedDocumentV0, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/batch_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/batch_transition.rs new file mode 100644 index 00000000000..31a92022373 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/batch_transition.rs @@ -0,0 +1,28 @@ +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::action_convert_to_operations::DriveHighLevelOperationConverter; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::util::batch::DriveOperation; +use dpp::block::epoch::Epoch; +use dpp::prelude::Identifier; +use dpp::version::PlatformVersion; + +impl DriveHighLevelBatchOperationConverter for BatchedTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match self { + BatchedTransitionAction::DocumentAction(document_action) => document_action + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + BatchedTransitionAction::TokenAction(token_action) => token_action + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + BatchedTransitionAction::BumpIdentityDataContractNonce( + bump_identity_contract_nonce_action, + ) => bump_identity_contract_nonce_action + .into_high_level_drive_operations(epoch, platform_version), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_create_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_create_transition.rs similarity index 95% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_create_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_create_transition.rs index 96c16ed9e36..7a40ab8b473 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_create_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_create_transition.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{ DocumentOperation, IdentityOperation, PrefundedSpecializedBalanceOperation, }; @@ -12,15 +12,15 @@ use dpp::block::epoch::Epoch; use dpp::document::Document; use dpp::prelude::Identifier; use std::borrow::Cow; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0, DocumentFromCreateTransitionAction}; use dpp::version::PlatformVersion; use crate::util::batch::drive_op_batch::PrefundedSpecializedBalanceOperationType; use crate::util::object_size_info::DataContractInfo::DataContractFetchInfo; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentCreateTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentCreateTransitionAction { + fn into_high_level_batch_drive_operations<'b>( mut self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_delete_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_delete_transition.rs similarity index 86% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_delete_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_delete_transition.rs index 799f5857784..b1622ca4d2d 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_delete_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_delete_transition.rs @@ -1,4 +1,4 @@ -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::util::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; @@ -7,15 +7,15 @@ use crate::error::Error; use dpp::block::epoch::Epoch; use dpp::identifier::Identifier; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; use dpp::version::PlatformVersion; use crate::util::object_size_info::{DataContractInfo, DocumentTypeInfo}; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentDeleteTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentDeleteTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, _epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_purchase_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_purchase_transition.rs similarity index 92% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_purchase_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_purchase_transition.rs index 3634442c282..63e6f118aac 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_purchase_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_purchase_transition.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::util::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::util::object_size_info::DocumentInfo::DocumentOwnedInfo; @@ -9,13 +9,13 @@ use dpp::block::epoch::Epoch; use dpp::prelude::Identifier; use std::borrow::Cow; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentPurchaseTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentPurchaseTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_replace_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_replace_transition.rs similarity index 91% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_replace_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_replace_transition.rs index 19fb9febacf..8cfaafa60ef 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_replace_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_replace_transition.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::util::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::util::object_size_info::DocumentInfo::DocumentOwnedInfo; @@ -10,13 +10,13 @@ use dpp::block::epoch::Epoch; use dpp::document::Document; use dpp::prelude::Identifier; use std::borrow::Cow; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentFromReplaceTransitionAction, DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentFromReplaceTransitionAction, DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentReplaceTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentReplaceTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transfer_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transfer_transition.rs similarity index 91% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transfer_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transfer_transition.rs index 67ea0f3bd1d..65521399f83 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transfer_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transfer_transition.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::util::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::util::object_size_info::DocumentInfo::DocumentOwnedInfo; @@ -10,13 +10,13 @@ use dpp::block::epoch::Epoch; use dpp::document::DocumentV0Getters; use dpp::prelude::Identifier; use std::borrow::Cow; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentTransferTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentTransferTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transition.rs similarity index 63% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transition.rs index 38d4baf3ca2..15e0a62f2e6 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_transition.rs @@ -1,14 +1,13 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; -use crate::state_transition_action::action_convert_to_operations::DriveHighLevelOperationConverter; -use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use crate::util::batch::DriveOperation; use dpp::block::epoch::Epoch; use dpp::prelude::Identifier; use dpp::version::PlatformVersion; -impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, epoch: &Epoch, owner_id: Identifier, @@ -16,51 +15,47 @@ impl DriveHighLevelDocumentOperationConverter for DocumentTransitionAction { ) -> Result<Vec<DriveOperation<'b>>, Error> { match self { DocumentTransitionAction::CreateAction(document_create_transition) => { - document_create_transition.into_high_level_document_drive_operations( + document_create_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } DocumentTransitionAction::ReplaceAction(document_replace_transition) => { - document_replace_transition.into_high_level_document_drive_operations( + document_replace_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } DocumentTransitionAction::DeleteAction(document_delete_transition) => { - document_delete_transition.into_high_level_document_drive_operations( + document_delete_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } DocumentTransitionAction::TransferAction(document_transfer_transition) => { - document_transfer_transition.into_high_level_document_drive_operations( + document_transfer_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } DocumentTransitionAction::PurchaseAction(document_purchase_transition) => { - document_purchase_transition.into_high_level_document_drive_operations( + document_purchase_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } DocumentTransitionAction::UpdatePriceAction(document_update_price_transition) => { - document_update_price_transition.into_high_level_document_drive_operations( + document_update_price_transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, ) } - DocumentTransitionAction::BumpIdentityDataContractNonce( - bump_identity_contract_nonce_action, - ) => bump_identity_contract_nonce_action - .into_high_level_drive_operations(epoch, platform_version), } } } diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_update_price_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_update_price_transition.rs similarity index 90% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_update_price_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_update_price_transition.rs index abea0ffa630..f01e313a8a3 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/document_update_price_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/document_update_price_transition.rs @@ -1,5 +1,5 @@ use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::util::batch::DriveOperation::{DocumentOperation, IdentityOperation}; use crate::util::batch::{DocumentOperationType, DriveOperation, IdentityOperationType}; use crate::util::object_size_info::DocumentInfo::DocumentOwnedInfo; @@ -9,13 +9,13 @@ use dpp::block::epoch::Epoch; use dpp::prelude::Identifier; use std::borrow::Cow; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; use crate::error::drive::DriveError; -impl DriveHighLevelDocumentOperationConverter for DocumentUpdatePriceTransitionAction { - fn into_high_level_document_drive_operations<'b>( +impl DriveHighLevelBatchOperationConverter for DocumentUpdatePriceTransitionAction { + fn into_high_level_batch_drive_operations<'b>( self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/documents_batch_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/documents_batch_transition.rs similarity index 84% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/documents_batch_transition.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/documents_batch_transition.rs index eb1371efc27..652b3a33764 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/documents_batch_transition.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/documents_batch_transition.rs @@ -1,13 +1,13 @@ use crate::error::drive::DriveError; use crate::error::Error; -use crate::state_transition_action::action_convert_to_operations::document::DriveHighLevelDocumentOperationConverter; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; use crate::state_transition_action::action_convert_to_operations::DriveHighLevelOperationConverter; -use crate::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; +use crate::state_transition_action::batch::BatchTransitionAction; use crate::util::batch::DriveOperation; use dpp::block::epoch::Epoch; use dpp::version::PlatformVersion; -impl DriveHighLevelOperationConverter for DocumentsBatchTransitionAction { +impl DriveHighLevelOperationConverter for BatchTransitionAction { fn into_high_level_drive_operations<'b>( self, epoch: &Epoch, @@ -26,7 +26,7 @@ impl DriveHighLevelOperationConverter for DocumentsBatchTransitionAction { Ok(transitions .into_iter() .map(|transition| { - transition.into_high_level_document_drive_operations( + transition.into_high_level_batch_drive_operations( epoch, owner_id, platform_version, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/mod.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/mod.rs new file mode 100644 index 00000000000..a6831026e37 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/document/mod.rs @@ -0,0 +1,8 @@ +mod document_create_transition; +mod document_delete_transition; +mod document_purchase_transition; +mod document_replace_transition; +mod document_transfer_transition; +mod document_transition; +mod document_update_price_transition; +mod documents_batch_transition; diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/mod.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/mod.rs similarity index 57% rename from packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/mod.rs rename to packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/mod.rs index d473c995af1..99c1c40408a 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/document/mod.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/mod.rs @@ -4,19 +4,14 @@ use dpp::block::epoch::Epoch; use dpp::platform_value::Identifier; use dpp::version::PlatformVersion; -mod document_create_transition; -mod document_delete_transition; -mod document_purchase_transition; -mod document_replace_transition; -mod document_transfer_transition; -mod document_transition; -mod document_update_price_transition; -mod documents_batch_transition; +mod batch_transition; +mod document; +mod token; /// A converter that will get High Level Drive Operations from State transitions -pub trait DriveHighLevelDocumentOperationConverter { +pub trait DriveHighLevelBatchOperationConverter { /// This will get a list of atomic drive operations from a high level operations - fn into_high_level_document_drive_operations<'a>( + fn into_high_level_batch_drive_operations<'a>( self, epoch: &Epoch, owner_id: Identifier, diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/mod.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/mod.rs new file mode 100644 index 00000000000..ac5990efb1b --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/mod.rs @@ -0,0 +1,9 @@ +mod token_burn_transition; +mod token_config_update_transition; +mod token_destroy_frozen_funds_transition; +mod token_emergency_action_transition; +mod token_freeze_transition; +mod token_mint_transition; +mod token_transfer_transition; +mod token_transition; +mod token_unfreeze_transition; diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_burn_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_burn_transition.rs new file mode 100644 index 00000000000..b4d62088fc7 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_burn_transition.rs @@ -0,0 +1,102 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::{TokenBurnTransitionAction, TokenBurnTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenBurnTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_burn_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = TokenEvent::Burn(self.burn_amount(), self.public_note().cloned()); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenBurn { + token_id: self.token_id(), + identity_balance_holder_id: owner_id, + burn_amount: self.burn_amount(), + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::Burn(self.burn_amount(), self.public_note_owned()), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenBurnTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_config_update_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_config_update_transition.rs new file mode 100644 index 00000000000..ff0060b0f1f --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_config_update_transition.rs @@ -0,0 +1,120 @@ +use std::borrow::Cow; +use dpp::block::epoch::Epoch; +use dpp::data_contract::accessors::v0::DataContractV0Setters; +use dpp::data_contract::accessors::v1::DataContractV1Setters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::{TokenConfigUpdateTransitionAction, TokenConfigUpdateTransitionActionAccessorsV0}; +use crate::util::batch::{DataContractOperationType, DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{DataContractOperation, GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenConfigUpdateTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_config_update_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = TokenEvent::ConfigUpdate( + self.update_token_configuration_item().clone(), + self.public_note().cloned(), + ); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + let mut contract = self.data_contract_fetch_info().contract.clone(); + contract.increment_version(); + let mut token_configuration = self.base().token_configuration()?.clone(); + token_configuration.apply_token_configuration_item( + self.update_token_configuration_item().clone(), + ); + contract.add_token(self.token_position(), token_configuration); + ops.push(DataContractOperation( + DataContractOperationType::ApplyContract { + contract: Cow::Owned(contract), + storage_flags: None, + }, + )); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::ConfigUpdate( + self.update_token_configuration_item().clone(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: + "TokenConfigUpdateTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_destroy_frozen_funds_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_destroy_frozen_funds_transition.rs new file mode 100644 index 00000000000..52b46800f9c --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_destroy_frozen_funds_transition.rs @@ -0,0 +1,107 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::{TokenDestroyFrozenFundsTransitionAction, TokenDestroyFrozenFundsTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenDestroyFrozenFundsTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_destroy_frozen_funds_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = + TokenEvent::DestroyFrozenFunds(self.frozen_identity_id(), self.amount(), self.public_note().cloned()); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenBurn { + token_id: self.token_id(), + identity_balance_holder_id: self.frozen_identity_id(), + burn_amount: self.amount(), + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::DestroyFrozenFunds( + self.frozen_identity_id(), + self.amount(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenDestroyFrozenFundsTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_emergency_action_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_emergency_action_transition.rs new file mode 100644 index 00000000000..93a0899818e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_emergency_action_transition.rs @@ -0,0 +1,105 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::{TokenEmergencyActionTransitionAction, TokenEmergencyActionTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenEmergencyActionTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_emergency_action_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = + TokenEvent::EmergencyAction(self.emergency_action(), self.public_note().cloned()); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenSetStatus { + token_id: self.token_id(), + status: self.emergency_action().resulting_status(platform_version)?, + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::EmergencyAction( + self.emergency_action(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenEmergencyActionTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_freeze_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_freeze_transition.rs new file mode 100644 index 00000000000..507db5e3dd1 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_freeze_transition.rs @@ -0,0 +1,107 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::{TokenFreezeTransitionAction, TokenFreezeTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenFreezeTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_freeze_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = TokenEvent::Freeze( + self.identity_to_freeze_id(), + self.public_note().cloned(), + ); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenFreeze { + token_id: self.token_id(), + frozen_identity_id: self.identity_to_freeze_id(), + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::Freeze( + self.identity_to_freeze_id(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenFreezeTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_mint_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_mint_transition.rs new file mode 100644 index 00000000000..81cb0b2e1c0 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_mint_transition.rs @@ -0,0 +1,111 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::{TokenMintTransitionAction, TokenMintTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenMintTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_mint_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = TokenEvent::Mint( + self.mint_amount(), + self.identity_balance_holder_id(), + self.public_note().cloned(), + ); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenMint { + token_id: self.token_id(), + identity_balance_holder_id: self.identity_balance_holder_id(), + mint_amount: self.mint_amount(), + allow_first_mint: false, + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::Mint( + self.mint_amount(), + self.identity_balance_holder_id(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenMintTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transfer_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transfer_transition.rs new file mode 100644 index 00000000000..cb9db8c9b8d --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transfer_transition.rs @@ -0,0 +1,84 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::v0::TokenTransferTransitionActionAccessorsV0; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::TokenOperationType; +use crate::util::batch::DriveOperation::{IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenTransferTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_transfer_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let token_id = self.token_id(); + + let recipient_id = self.recipient_id(); + + let amount = self.amount(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + ops.push(TokenOperation(TokenOperationType::TokenTransfer { + token_id, + sender_id: owner_id, + recipient_id, + amount, + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + let (public_note, shared_encrypted_note, private_encrypted_note) = + self.notes_owned(); + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id, + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::Transfer( + recipient_id, + public_note, + shared_encrypted_note, + private_encrypted_note, + amount, + ), + })); + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenTransferTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transition.rs new file mode 100644 index 00000000000..91237b7f8b7 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_transition.rs @@ -0,0 +1,112 @@ +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::util::batch::DriveOperation; +use dpp::block::epoch::Epoch; +use dpp::prelude::Identifier; +use dpp::tokens::token_event::TokenEvent; +use dpp::version::PlatformVersion; +use crate::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::TokenBurnTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::TokenConfigUpdateTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::TokenFreezeTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::TokenMintTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::TokenUnfreezeTransitionActionAccessorsV0; + +impl DriveHighLevelBatchOperationConverter for TokenTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match self { + TokenTransitionAction::BurnAction(token_burn_transition) => token_burn_transition + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + TokenTransitionAction::MintAction(token_mint_transition) => token_mint_transition + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + TokenTransitionAction::TransferAction(token_transfer_transition) => { + token_transfer_transition.into_high_level_batch_drive_operations( + epoch, + owner_id, + platform_version, + ) + } + TokenTransitionAction::FreezeAction(token_freeze_action) => token_freeze_action + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + TokenTransitionAction::UnfreezeAction(token_unfreeze_action) => token_unfreeze_action + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + TokenTransitionAction::EmergencyActionAction(token_emergency_action) => { + token_emergency_action.into_high_level_batch_drive_operations( + epoch, + owner_id, + platform_version, + ) + } + TokenTransitionAction::DestroyFrozenFundsAction(token_destroy_frozen_funds) => { + token_destroy_frozen_funds.into_high_level_batch_drive_operations( + epoch, + owner_id, + platform_version, + ) + } + TokenTransitionAction::ConfigUpdateAction(token_config_update) => token_config_update + .into_high_level_batch_drive_operations(epoch, owner_id, platform_version), + } + } +} + +impl TokenTransitionAction { + /// Gets the associated token event for the transition action + pub fn associated_token_event(&self) -> TokenEvent { + match self { + TokenTransitionAction::BurnAction(burn_action) => TokenEvent::Burn( + burn_action.burn_amount(), + burn_action.public_note().cloned(), + ), + TokenTransitionAction::MintAction(mint_action) => TokenEvent::Mint( + mint_action.mint_amount(), + mint_action.identity_balance_holder_id(), + mint_action.public_note().cloned(), + ), + TokenTransitionAction::TransferAction(transfer_action) => { + let (public_note, shared_encrypted_note, private_encrypted_note) = + transfer_action.notes(); + TokenEvent::Transfer( + transfer_action.recipient_id(), + public_note, + shared_encrypted_note, + private_encrypted_note, + transfer_action.amount(), + ) + } + TokenTransitionAction::FreezeAction(freeze_action) => TokenEvent::Freeze( + freeze_action.identity_to_freeze_id(), + freeze_action.public_note().cloned(), + ), + TokenTransitionAction::UnfreezeAction(unfreeze_action) => TokenEvent::Unfreeze( + unfreeze_action.frozen_identity_id(), + unfreeze_action.public_note().cloned(), + ), + TokenTransitionAction::EmergencyActionAction(emergency_action) => { + TokenEvent::EmergencyAction( + emergency_action.emergency_action(), + emergency_action.public_note().cloned(), + ) + } + TokenTransitionAction::DestroyFrozenFundsAction(destroy_action) => { + TokenEvent::DestroyFrozenFunds( + destroy_action.frozen_identity_id(), + destroy_action.amount(), + destroy_action.public_note().cloned(), + ) + } + TokenTransitionAction::ConfigUpdateAction(config_update) => TokenEvent::ConfigUpdate( + config_update.update_token_configuration_item().clone(), + config_update.public_note().cloned(), + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_unfreeze_transition.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_unfreeze_transition.rs new file mode 100644 index 00000000000..d297c2cae19 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/batch/token/token_unfreeze_transition.rs @@ -0,0 +1,107 @@ +use dpp::block::epoch::Epoch; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::group::action_event::GroupActionEvent; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action::v0::GroupActionV0; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::tokens::token_event::TokenEvent; +use platform_version::version::PlatformVersion; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::state_transition_action::action_convert_to_operations::batch::DriveHighLevelBatchOperationConverter; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::{TokenUnfreezeTransitionAction, TokenUnfreezeTransitionActionAccessorsV0}; +use crate::util::batch::{DriveOperation, IdentityOperationType}; +use crate::util::batch::drive_op_batch::{GroupOperationType, TokenOperationType}; +use crate::util::batch::DriveOperation::{GroupOperation, IdentityOperation, TokenOperation}; + +impl DriveHighLevelBatchOperationConverter for TokenUnfreezeTransitionAction { + fn into_high_level_batch_drive_operations<'b>( + self, + _epoch: &Epoch, + owner_id: Identifier, + platform_version: &PlatformVersion, + ) -> Result<Vec<DriveOperation<'b>>, Error> { + match platform_version + .drive + .methods + .state_transitions + .convert_to_high_level_operations + .token_unfreeze_transition + { + 0 => { + let data_contract_id = self.base().data_contract_id(); + + let identity_contract_nonce = self.base().identity_contract_nonce(); + + let mut ops = vec![IdentityOperation( + IdentityOperationType::UpdateIdentityContractNonce { + identity_id: owner_id.into_buffer(), + contract_id: data_contract_id.into_buffer(), + nonce: identity_contract_nonce, + }, + )]; + + if let Some(GroupStateTransitionResolvedInfo { + group_contract_position, + action_id, + action_is_proposer, + signer_power, + .. + }) = self.base().store_in_group() + { + let event = TokenEvent::Unfreeze( + self.frozen_identity_id(), + self.public_note().cloned(), + ); + + let initialize_with_insert_action_info = if *action_is_proposer { + Some(GroupAction::V0(GroupActionV0 { + event: GroupActionEvent::TokenEvent(event), + })) + } else { + None + }; + + ops.push(GroupOperation(GroupOperationType::AddGroupAction { + contract_id: data_contract_id, + group_contract_position: *group_contract_position, + initialize_with_insert_action_info, + action_id: *action_id, + signer_identity_id: owner_id, + signer_power: *signer_power, + })); + } + + if self.base().perform_action() { + ops.push(TokenOperation(TokenOperationType::TokenUnfreeze { + token_id: self.token_id(), + frozen_identity_id: self.frozen_identity_id(), + })); + + let token_configuration = self.base().token_configuration()?; + if token_configuration.keeps_history() { + ops.push(TokenOperation(TokenOperationType::TokenHistory { + token_id: self.token_id(), + owner_id, + nonce: identity_contract_nonce, + event: TokenEvent::Unfreeze( + self.frozen_identity_id(), + self.public_note_owned(), + ), + })); + } + } + + Ok(ops) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "TokenUnfreezeTransitionAction::into_high_level_document_drive_operations" + .to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/mod.rs b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/mod.rs index bfc5b55e272..28c69e3f883 100644 --- a/packages/rs-drive/src/state_transition_action/action_convert_to_operations/mod.rs +++ b/packages/rs-drive/src/state_transition_action/action_convert_to_operations/mod.rs @@ -3,8 +3,8 @@ //! This module defines general, commonly used functions in Drive. //! +mod batch; mod contract; -mod document; mod identity; mod system; @@ -39,7 +39,7 @@ impl DriveHighLevelOperationConverter for StateTransitionAction { data_contract_update_transition .into_high_level_drive_operations(epoch, platform_version) } - StateTransitionAction::DocumentsBatchAction(documents_batch_transition) => { + StateTransitionAction::BatchAction(documents_batch_transition) => { documents_batch_transition.into_high_level_drive_operations(epoch, platform_version) } StateTransitionAction::IdentityCreateAction(identity_create_transition) => { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/mod.rs similarity index 100% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/mod.rs diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/transformer.rs similarity index 81% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/transformer.rs index 35a79fc023f..a9bc78577fc 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/transformer.rs @@ -2,13 +2,13 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use dpp::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; impl DocumentBaseTransitionAction { /// from base transition with contract lookup - pub fn from_base_transition_with_contract_lookup( + pub fn try_from_base_transition_with_contract_lookup( value: DocumentBaseTransition, get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, ) -> Result<Self, ProtocolError> { @@ -24,7 +24,7 @@ impl DocumentBaseTransitionAction { } /// from borrowed base transition with contract lookup - pub fn from_borrowed_base_transition_with_contract_lookup( + pub fn try_from_borrowed_base_transition_with_contract_lookup( value: &DocumentBaseTransition, get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, ) -> Result<Self, ProtocolError> { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/v0/mod.rs similarity index 100% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/v0/mod.rs diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/v0/transformer.rs similarity index 90% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/v0/transformer.rs index b639eb421e8..d64553ca355 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_base_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_base_transition_action/v0/transformer.rs @@ -3,9 +3,9 @@ use std::sync::Arc; use dpp::platform_value::Identifier; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dpp::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionV0; impl DocumentBaseTransitionActionV0 { /// try from base transition with contract lookup diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/mod.rs similarity index 98% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/mod.rs index 352444f8301..e529985db76 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/mod.rs @@ -14,7 +14,7 @@ use dpp::fee::Credits; use dpp::ProtocolError; pub use v0::*; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction}; use dpp::version::PlatformVersion; use dpp::voting::vote_info_storage::contested_document_vote_poll_stored_info::ContestedDocumentVotePollStoredInfo; use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfo; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/transformer.rs similarity index 86% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/transformer.rs index 50d8b830afa..dab39d6d725 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/transformer.rs @@ -5,16 +5,16 @@ use grovedb::TransactionArg; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +use dpp::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; use platform_version::version::PlatformVersion; use crate::drive::contract::DataContractFetchInfo; use crate::drive::Drive; use crate::error::Error; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionV0}; impl DocumentCreateTransitionAction { /// from_document_create_transition_with_contract_lookup - pub fn from_document_create_transition_with_contract_lookup( + pub fn try_from_document_create_transition_with_contract_lookup( drive: &Drive, transaction: TransactionArg, value: DocumentCreateTransition, @@ -31,7 +31,7 @@ impl DocumentCreateTransitionAction { } /// from_document_borrowed_create_transition_with_contract_lookup - pub fn from_document_borrowed_create_transition_with_contract_lookup( + pub fn try_from_document_borrowed_create_transition_with_contract_lookup( drive: &Drive, transaction: TransactionArg, value: &DocumentCreateTransition, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs similarity index 99% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs index e61fbb73c9f..e30b3948a70 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/mod.rs @@ -18,7 +18,7 @@ use dpp::document::property_names::{ }; use dpp::fee::Credits; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionV0}; use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePollWithContractInfo; use dpp::version::PlatformVersion; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/transformer.rs similarity index 95% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/transformer.rs index 2c2aea87bec..5c7540f8692 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_create_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_create_transition_action/v0/transformer.rs @@ -6,7 +6,7 @@ use grovedb::TransactionArg; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::DocumentCreateTransitionV0; +use dpp::state_transition::batch_transition::document_create_transition::v0::DocumentCreateTransitionV0; use dpp::voting::vote_info_storage::contested_document_vote_poll_stored_info::ContestedDocumentVotePollStoredInfo; use dpp::voting::vote_polls::contested_document_resource_vote_poll::ContestedDocumentResourceVotePoll; use platform_version::version::PlatformVersion; @@ -15,8 +15,8 @@ use crate::drive::Drive; use crate::drive::votes::resolved::vote_polls::contested_document_resource_vote_poll::resolve::ContestedDocumentResourceVotePollResolver; use crate::error::drive::DriveError; use crate::error::Error; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionActionV0; impl DocumentCreateTransitionActionV0 { /// try from document create transition with contract lookup @@ -34,7 +34,7 @@ impl DocumentCreateTransitionActionV0 { prefunded_voting_balance, .. } = value; - let base = DocumentBaseTransitionAction::from_base_transition_with_contract_lookup( + let base = DocumentBaseTransitionAction::try_from_base_transition_with_contract_lookup( base, get_data_contract, )?; @@ -130,7 +130,7 @@ impl DocumentCreateTransitionActionV0 { .. } = value; let base = - DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/mod.rs similarity index 87% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/mod.rs index 6ab5b5d730d..bb6a09b3817 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/mod.rs @@ -1,13 +1,13 @@ use derive_more::From; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::{DocumentDeleteTransitionActionAccessorsV0, DocumentDeleteTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::{DocumentDeleteTransitionActionAccessorsV0, DocumentDeleteTransitionActionV0}; /// transformer pub mod transformer; /// v0 pub mod v0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; /// document delete transition action #[derive(Debug, Clone, From)] diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/transformer.rs similarity index 78% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/transformer.rs index da6cd644cc4..ede80bd6f0b 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/transformer.rs @@ -2,13 +2,13 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentDeleteTransition; +use dpp::state_transition::batch_transition::batched_transition::DocumentDeleteTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::{DocumentDeleteTransitionAction, DocumentDeleteTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::{DocumentDeleteTransitionAction, DocumentDeleteTransitionActionV0}; impl DocumentDeleteTransitionAction { /// from - pub fn from_document_create_transition_with_contract_lookup( + pub fn try_from_document_create_transition_with_contract_lookup( value: DocumentDeleteTransition, get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, ) -> Result<Self, ProtocolError> { @@ -18,7 +18,7 @@ impl DocumentDeleteTransitionAction { } /// from borrowed - pub fn from_document_borrowed_create_transition_with_contract_lookup( + pub fn try_from_document_borrowed_create_transition_with_contract_lookup( value: &DocumentDeleteTransition, get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, ) -> Result<Self, ProtocolError> { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/mod.rs similarity index 89% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/mod.rs index 7df7f037443..c4e179c9623 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/mod.rs @@ -1,7 +1,7 @@ /// transformer pub mod transformer; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; #[derive(Debug, Clone)] /// document delete transition action v0 diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/transformer.rs similarity index 74% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/transformer.rs index ff183289440..e3bbfeb2893 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_delete_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_delete_transition_action/v0/transformer.rs @@ -2,10 +2,10 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionV0; impl DocumentDeleteTransitionActionV0 { /// try from @@ -15,7 +15,7 @@ impl DocumentDeleteTransitionActionV0 { ) -> Result<Self, ProtocolError> { let DocumentDeleteTransitionV0 { base, .. } = value; Ok(DocumentDeleteTransitionActionV0 { - base: DocumentBaseTransitionAction::from_base_transition_with_contract_lookup( + base: DocumentBaseTransitionAction::try_from_base_transition_with_contract_lookup( base, get_data_contract, )?, @@ -29,7 +29,7 @@ impl DocumentDeleteTransitionActionV0 { ) -> Result<Self, ProtocolError> { let DocumentDeleteTransitionV0 { base, .. } = value; Ok(DocumentDeleteTransitionActionV0 { - base: DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + base: DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?, diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/mod.rs similarity index 97% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/mod.rs index 53a84fe1a5d..e91b681f104 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/mod.rs @@ -8,7 +8,7 @@ use dpp::platform_value::Identifier; use dpp::ProtocolError; pub use v0::*; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; /// transformer diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/transformer.rs similarity index 87% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/transformer.rs index 894e13b5bdc..7f591c601f6 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/transformer.rs @@ -4,9 +4,9 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentPurchaseTransition; +use dpp::state_transition::batch_transition::batched_transition::DocumentPurchaseTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionV0}; impl DocumentPurchaseTransitionAction { /// try from borrowed diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/mod.rs similarity index 94% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/mod.rs index 785ccb32b60..dd0fe6acb8d 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/mod.rs @@ -4,7 +4,7 @@ use dpp::document::Document; use dpp::fee::Credits; use dpp::identifier::Identifier; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; /// document purchase transition action v0 #[derive(Debug, Clone)] diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/transformer.rs similarity index 86% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/transformer.rs index e888f20d33e..f6131860b2d 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_purchase_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_purchase_transition_action/v0/transformer.rs @@ -5,10 +5,10 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::DocumentPurchaseTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_purchase_transition::DocumentPurchaseTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::v0::DocumentPurchaseTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::v0::DocumentPurchaseTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; impl DocumentPurchaseTransitionActionV0 { /// try from borrowed @@ -21,7 +21,7 @@ impl DocumentPurchaseTransitionActionV0 { ) -> Result<Self, ProtocolError> { let DocumentPurchaseTransitionV0 { base, price, .. } = document_purchase_transition; let base = - DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs similarity index 98% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs index f2dfc222e36..01d8400b382 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/mod.rs @@ -11,7 +11,7 @@ use dpp::prelude::{BlockHeight, CoreBlockHeight, Revision}; use dpp::ProtocolError; pub use v0::*; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; /// transformer diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs similarity index 91% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs index 4c5cfa6316f..51f52bd4e6e 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/transformer.rs @@ -5,9 +5,9 @@ use std::sync::Arc; use dpp::identity::TimestampMillis; use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentReplaceTransition; +use dpp::state_transition::batch_transition::batched_transition::DocumentReplaceTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionV0}; impl DocumentReplaceTransitionAction { /// try from borrowed diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs similarity index 99% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs index 299d71136f5..f8b4daa0fd6 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/mod.rs @@ -8,7 +8,7 @@ use dpp::ProtocolError; use std::collections::BTreeMap; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; use dpp::version::PlatformVersion; /// document replace transition action v0 diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs similarity index 88% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs index 8127c39532a..b7d9ce25ed7 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_replace_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_replace_transition_action/v0/transformer.rs @@ -6,10 +6,10 @@ use std::sync::Arc; use dpp::identity::TimestampMillis; use dpp::prelude::{BlockHeight, CoreBlockHeight}; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::v0::DocumentReplaceTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::v0::DocumentReplaceTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; impl DocumentReplaceTransitionActionV0 { /// try from borrowed @@ -31,7 +31,7 @@ impl DocumentReplaceTransitionActionV0 { .. } = document_replace_transition; let base = - DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/mod.rs similarity index 97% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/mod.rs index d9a38534ca9..6dde44bf561 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/mod.rs @@ -7,7 +7,7 @@ use dpp::platform_value::Identifier; use dpp::ProtocolError; pub use v0::*; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; /// transformer diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/transformer.rs similarity index 87% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/transformer.rs index 16bbaa4822a..736d414f17c 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/transformer.rs @@ -4,9 +4,9 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransferTransition; +use dpp::state_transition::batch_transition::batched_transition::DocumentTransferTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionV0}; impl DocumentTransferTransitionAction { /// try from borrowed diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/mod.rs similarity index 92% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/mod.rs index d23667dd298..f87c75b6226 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::document::Document; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; /// document transfer transition action v0 #[derive(Debug, Clone)] diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/transformer.rs similarity index 85% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/transformer.rs index 88f6d0776ab..1bf629c41db 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_transfer_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transfer_transition_action/v0/transformer.rs @@ -5,10 +5,10 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::DocumentTransferTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::v0::DocumentTransferTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::v0::DocumentTransferTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; impl DocumentTransferTransitionActionV0 { /// try from borrowed @@ -24,7 +24,7 @@ impl DocumentTransferTransitionActionV0 { .. } = document_transfer_transition; let base = - DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transition_action_type.rs similarity index 63% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transition_action_type.rs index de03698b223..83d41158eaf 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/action_type.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_transition_action_type.rs @@ -1,9 +1,9 @@ -use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::{ - DocumentTransitionActionType, TransitionActionTypeGetter, +use crate::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::{ + DocumentTransitionActionType, DocumentTransitionActionTypeGetter, }; -impl TransitionActionTypeGetter for DocumentTransitionAction { +impl DocumentTransitionActionTypeGetter for DocumentTransitionAction { fn action_type(&self) -> DocumentTransitionActionType { match self { DocumentTransitionAction::CreateAction(_) => DocumentTransitionActionType::Create, @@ -14,9 +14,6 @@ impl TransitionActionTypeGetter for DocumentTransitionAction { DocumentTransitionAction::UpdatePriceAction(_) => { DocumentTransitionActionType::UpdatePrice } - DocumentTransitionAction::BumpIdentityDataContractNonce(_) => { - DocumentTransitionActionType::IgnoreWhileBumpingRevision - } } } } diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/mod.rs similarity index 97% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/mod.rs index c206f21da92..254e3f803bf 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/mod.rs @@ -7,7 +7,7 @@ use dpp::platform_value::Identifier; use dpp::ProtocolError; pub use v0::*; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; use dpp::version::PlatformVersion; /// transformer diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/transformer.rs similarity index 87% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/transformer.rs index f52e99d0d61..524ff7e6c1a 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/transformer.rs @@ -4,9 +4,9 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentUpdatePriceTransition; +use dpp::state_transition::batch_transition::batched_transition::DocumentUpdatePriceTransition; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionV0}; impl DocumentUpdatePriceTransitionAction { /// try from borrowed diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/mod.rs similarity index 93% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/mod.rs index 37f3f8100c4..493af12a6d2 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/mod.rs @@ -2,7 +2,7 @@ pub mod transformer; use dpp::document::Document; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; /// document transfer transition action v0 #[derive(Debug, Clone)] diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/transformer.rs similarity index 84% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/transformer.rs index 6054d09f9b8..c34bba6cb60 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/document_update_price_transition_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/document_update_price_transition_action/v0/transformer.rs @@ -5,10 +5,10 @@ use dpp::platform_value::Identifier; use std::sync::Arc; use dpp::ProtocolError; -use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_update_price_transition::DocumentUpdatePriceTransitionV0; use crate::drive::contract::DataContractFetchInfo; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::v0::DocumentUpdatePriceTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::v0::DocumentUpdatePriceTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::{DocumentBaseTransitionAction, DocumentBaseTransitionActionAccessorsV0}; impl DocumentUpdatePriceTransitionActionV0 { /// try from borrowed @@ -20,7 +20,7 @@ impl DocumentUpdatePriceTransitionActionV0 { ) -> Result<Self, ProtocolError> { let DocumentUpdatePriceTransitionV0 { base, price, .. } = document_update_price_transition; let base = - DocumentBaseTransitionAction::from_borrowed_base_transition_with_contract_lookup( + DocumentBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( base, get_data_contract, )?; diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/mod.rs similarity index 51% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/mod.rs index 51c7f19d2d0..7c40b645318 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/document_transition/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/document_transition/mod.rs @@ -1,4 +1,3 @@ -mod action_type; /// document_base_transition_action pub mod document_base_transition_action; /// document_create_transition_action @@ -11,22 +10,21 @@ pub mod document_purchase_transition_action; pub mod document_replace_transition_action; /// document_transfer_transition_action pub mod document_transfer_transition_action; +mod document_transition_action_type; /// document_update_price_transition_action pub mod document_update_price_transition_action; -pub use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; +pub use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionType; use derive_more::From; - -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; -use crate::state_transition_action::document::documents_batch::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; -use crate::state_transition_action::document::documents_batch::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; -use crate::state_transition_action::document::documents_batch::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; -use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::{DocumentCreateTransitionAction, DocumentCreateTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::DocumentDeleteTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_replace_transition_action::{DocumentReplaceTransitionAction, DocumentReplaceTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_delete_transition_action::v0::DocumentDeleteTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::{DocumentPurchaseTransitionAction, DocumentPurchaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_transfer_transition_action::{DocumentTransferTransitionAction, DocumentTransferTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::document_transition::document_update_price_transition_action::{DocumentUpdatePriceTransitionAction, DocumentUpdatePriceTransitionActionAccessorsV0}; /// version pub const DOCUMENT_TRANSITION_ACTION_VERSION: u32 = 0; @@ -46,34 +44,30 @@ pub enum DocumentTransitionAction { PurchaseAction(DocumentPurchaseTransitionAction), /// update price UpdatePriceAction(DocumentUpdatePriceTransitionAction), - /// bump identity data contract nonce - BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), } impl DocumentTransitionAction { /// base - pub fn base(&self) -> Option<&DocumentBaseTransitionAction> { + pub fn base(&self) -> &DocumentBaseTransitionAction { match self { - DocumentTransitionAction::CreateAction(d) => Some(d.base()), - DocumentTransitionAction::DeleteAction(d) => Some(d.base()), - DocumentTransitionAction::ReplaceAction(d) => Some(d.base()), - DocumentTransitionAction::TransferAction(d) => Some(d.base()), - DocumentTransitionAction::PurchaseAction(d) => Some(d.base()), - DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base()), - DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, + DocumentTransitionAction::CreateAction(d) => d.base(), + DocumentTransitionAction::DeleteAction(d) => d.base(), + DocumentTransitionAction::ReplaceAction(d) => d.base(), + DocumentTransitionAction::TransferAction(d) => d.base(), + DocumentTransitionAction::PurchaseAction(d) => d.base(), + DocumentTransitionAction::UpdatePriceAction(d) => d.base(), } } /// base owned - pub fn base_owned(self) -> Option<DocumentBaseTransitionAction> { + pub fn base_owned(self) -> DocumentBaseTransitionAction { match self { - DocumentTransitionAction::CreateAction(d) => Some(d.base_owned()), - DocumentTransitionAction::DeleteAction(d) => Some(d.base_owned()), - DocumentTransitionAction::ReplaceAction(d) => Some(d.base_owned()), - DocumentTransitionAction::TransferAction(d) => Some(d.base_owned()), - DocumentTransitionAction::PurchaseAction(d) => Some(d.base_owned()), - DocumentTransitionAction::UpdatePriceAction(d) => Some(d.base_owned()), - DocumentTransitionAction::BumpIdentityDataContractNonce(_) => None, + DocumentTransitionAction::CreateAction(d) => d.base_owned(), + DocumentTransitionAction::DeleteAction(d) => d.base_owned(), + DocumentTransitionAction::ReplaceAction(d) => d.base_owned(), + DocumentTransitionAction::TransferAction(d) => d.base_owned(), + DocumentTransitionAction::PurchaseAction(d) => d.base_owned(), + DocumentTransitionAction::UpdatePriceAction(d) => d.base_owned(), } } } diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/mod.rs new file mode 100644 index 00000000000..4ba839bd84f --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/mod.rs @@ -0,0 +1,40 @@ +use derive_more::From; +use dpp::identifier::Identifier; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionAccessorsV0}; + +/// document transition +pub mod document_transition; +/// token transition +pub mod token_transition; + +/// token action +#[derive(Debug, Clone, From)] +pub enum BatchedTransitionAction { + /// document + DocumentAction(DocumentTransitionAction), + /// token + TokenAction(TokenTransitionAction), + /// bump identity data contract nonce + BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction), +} + +impl BatchedTransitionAction { + /// Helper method to get the data contract id + pub fn data_contract_id(&self) -> Identifier { + match self { + BatchedTransitionAction::DocumentAction(document_action) => { + document_action.base().data_contract_id() + } + BatchedTransitionAction::TokenAction(token_action) => { + token_action.base().data_contract_id() + } + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action) => { + bump_action.data_contract_id() + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/mod.rs new file mode 100644 index 00000000000..df9f43a1991 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/mod.rs @@ -0,0 +1,155 @@ +mod token_transition_action_type; + +/// token_base_transition_action +pub mod token_base_transition_action; +/// token_burn_transition_action +pub mod token_burn_transition_action; +/// token_freeze_transition_action +pub mod token_freeze_transition_action; +/// token_issuance_transition_action +pub mod token_mint_transition_action; +/// token_transfer_transition_action +pub mod token_transfer_transition_action; +/// token_unfreeze_transition_action +pub mod token_unfreeze_transition_action; + +/// token_config_update_transition_action +pub mod token_config_update_transition_action; +/// token_destroy_frozen_funds_transition_action +pub mod token_destroy_frozen_funds_transition_action; +/// token_emergency_action_transition_action +pub mod token_emergency_action_transition_action; + +use derive_more::From; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::DocumentTypeRef; +use dpp::data_contracts::SystemDataContract; +use dpp::document::Document; +use dpp::identifier::Identifier; +use dpp::prelude::{DataContract, IdentityNonce}; +use dpp::ProtocolError; +use platform_version::version::PlatformVersion; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::{TokenBurnTransitionAction, TokenBurnTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::{TokenConfigUpdateTransitionAction, TokenConfigUpdateTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::{TokenFreezeTransitionAction, TokenFreezeTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::{TokenUnfreezeTransitionAction, TokenUnfreezeTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::{TokenMintTransitionAction, TokenMintTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::TokenEmergencyActionTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::TokenDestroyFrozenFundsTransitionActionAccessorsV0; + +/// token action +#[derive(Debug, Clone, From)] +pub enum TokenTransitionAction { + /// burn + BurnAction(TokenBurnTransitionAction), + /// issuance + MintAction(TokenMintTransitionAction), + /// transfer + TransferAction(TokenTransferTransitionAction), + /// freeze + FreezeAction(TokenFreezeTransitionAction), + /// unfreeze + UnfreezeAction(TokenUnfreezeTransitionAction), + /// emergency action + EmergencyActionAction(TokenEmergencyActionTransitionAction), + /// destroy frozen funds action + DestroyFrozenFundsAction(TokenDestroyFrozenFundsTransitionAction), + /// update the token configuration + ConfigUpdateAction(TokenConfigUpdateTransitionAction), +} + +impl TokenTransitionAction { + /// Returns a reference to the base token transition action if available + pub fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenTransitionAction::BurnAction(action) => action.base(), + TokenTransitionAction::MintAction(action) => action.base(), + TokenTransitionAction::TransferAction(action) => action.base(), + TokenTransitionAction::FreezeAction(action) => action.base(), + TokenTransitionAction::UnfreezeAction(action) => action.base(), + TokenTransitionAction::EmergencyActionAction(action) => action.base(), + TokenTransitionAction::DestroyFrozenFundsAction(action) => action.base(), + TokenTransitionAction::ConfigUpdateAction(action) => action.base(), + } + } + + /// Consumes self and returns the base token transition action if available + pub fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenTransitionAction::BurnAction(action) => action.base_owned(), + TokenTransitionAction::MintAction(action) => action.base_owned(), + TokenTransitionAction::TransferAction(action) => action.base_owned(), + TokenTransitionAction::FreezeAction(action) => action.base_owned(), + TokenTransitionAction::UnfreezeAction(action) => action.base_owned(), + TokenTransitionAction::EmergencyActionAction(action) => action.base_owned(), + TokenTransitionAction::DestroyFrozenFundsAction(action) => action.base_owned(), + TokenTransitionAction::ConfigUpdateAction(action) => action.base_owned(), + } + } + + /// Historical document type name for the token history contract + pub fn historical_document_type_name(&self) -> &str { + match self { + TokenTransitionAction::BurnAction(_) => "burn", + TokenTransitionAction::MintAction(_) => "mint", + TokenTransitionAction::TransferAction(_) => "transfer", + TokenTransitionAction::FreezeAction(_) => "freeze", + TokenTransitionAction::UnfreezeAction(_) => "unfreeze", + TokenTransitionAction::EmergencyActionAction(_) => "emergencyAction", + TokenTransitionAction::DestroyFrozenFundsAction(_) => "destroyFrozenFunds", + TokenTransitionAction::ConfigUpdateAction(_) => "configUpdate", + } + } + + /// Historical document type for the token history contract + pub fn historical_document_type<'a>( + &self, + token_history_contract: &'a DataContract, + ) -> Result<DocumentTypeRef<'a>, ProtocolError> { + Ok(token_history_contract.document_type_for_name(self.historical_document_type_name())?) + } + + /// Historical document id + pub fn historical_document_id( + &self, + owner_id: Identifier, + owner_nonce: IdentityNonce, + ) -> Identifier { + let name = self.historical_document_type_name(); + Document::generate_document_id_v0( + &SystemDataContract::TokenHistory.id(), + &owner_id, + name, + owner_nonce.to_be_bytes().as_slice(), + ) + } + + /// Historical document id + pub fn build_historical_document( + &self, + token_historical_contract: &DataContract, + token_id: Identifier, + owner_id: Identifier, + owner_nonce: IdentityNonce, + block_info: &BlockInfo, + platform_version: &PlatformVersion, + ) -> Result<Document, Error> { + self.associated_token_event() + .build_historical_document_owned( + token_historical_contract, + token_id, + owner_id, + owner_nonce, + block_info, + platform_version, + ) + .map_err(Error::Protocol) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/mod.rs new file mode 100644 index 00000000000..49b42cf17c0 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/mod.rs @@ -0,0 +1,79 @@ +use derive_more::From; +use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; +use dpp::data_contract::TokenContractPosition; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::platform_value::Identifier; +use dpp::prelude::IdentityNonce; +use std::sync::Arc; + +/// transformer module +pub mod transformer; +mod v0; + +use crate::drive::contract::DataContractFetchInfo; + +use crate::error::Error; +pub use v0::*; + +/// document base transition action +#[derive(Debug, Clone, From)] +pub enum TokenBaseTransitionAction { + /// v0 + V0(TokenBaseTransitionActionV0), +} + +impl TokenBaseTransitionActionAccessorsV0 for TokenBaseTransitionAction { + fn token_position(&self) -> TokenContractPosition { + match self { + TokenBaseTransitionAction::V0(v0) => v0.token_contract_position, + } + } + + fn token_id(&self) -> Identifier { + match self { + TokenBaseTransitionAction::V0(v0) => v0.token_id, + } + } + + fn data_contract_id(&self) -> Identifier { + match self { + TokenBaseTransitionAction::V0(v0) => v0.data_contract_id(), + } + } + + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + match self { + TokenBaseTransitionAction::V0(v0) => v0.data_contract_fetch_info_ref(), + } + } + + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + match self { + TokenBaseTransitionAction::V0(v0) => v0.data_contract_fetch_info(), + } + } + + fn token_configuration(&self) -> Result<&TokenConfiguration, Error> { + match self { + TokenBaseTransitionAction::V0(v0) => v0.token_configuration(), + } + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + match self { + TokenBaseTransitionAction::V0(v0) => v0.identity_contract_nonce(), + } + } + + fn store_in_group(&self) -> Option<&GroupStateTransitionResolvedInfo> { + match self { + TokenBaseTransitionAction::V0(v0) => v0.store_in_group(), + } + } + + fn perform_action(&self) -> bool { + match self { + TokenBaseTransitionAction::V0(v0) => v0.perform_action(), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/transformer.rs new file mode 100644 index 00000000000..ab33951ffcc --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/transformer.rs @@ -0,0 +1,69 @@ +use dpp::platform_value::Identifier; +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::prelude::ConsensusValidationResult; +use dpp::ProtocolError; +use dpp::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use platform_version::version::PlatformVersion; +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionV0}; + +impl TokenBaseTransitionAction { + /// from base transition with contract lookup + pub fn try_from_base_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenBaseTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Self>, Error> { + match value { + TokenBaseTransition::V0(v0) => Ok( + TokenBaseTransitionActionV0::try_from_base_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + drive_operations, + get_data_contract, + platform_version, + )? + .map(|v0| v0.into()), + ), + } + } + + /// from borrowed base transition with contract lookup + pub fn try_from_borrowed_base_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenBaseTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Self>, Error> { + match value { + TokenBaseTransition::V0(v0) => Ok( + TokenBaseTransitionActionV0::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + drive_operations, + get_data_contract, + platform_version, + )?.map(|v0| v0.into()) + ), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/mod.rs new file mode 100644 index 00000000000..9995478c57d --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/mod.rs @@ -0,0 +1,112 @@ +use crate::drive::contract::DataContractFetchInfo; +use crate::error::Error; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::TokenConfiguration; +use dpp::data_contract::TokenContractPosition; +use dpp::group::GroupStateTransitionResolvedInfo; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; +use dpp::ProtocolError; +use std::sync::Arc; + +/// transformer +pub mod transformer; + +/// Token base transition action v0 +#[derive(Debug, Clone)] +pub struct TokenBaseTransitionActionV0 { + /// Token Id + pub token_id: Identifier, + /// The identity contract nonce, used to prevent replay attacks + pub identity_contract_nonce: IdentityNonce, + /// The token position within the data contract + pub token_contract_position: u16, + /// A potential data contract + pub data_contract: Arc<DataContractFetchInfo>, + /// Using group multi party rules for authentication + /// If this is set we should store in group + pub store_in_group: Option<GroupStateTransitionResolvedInfo>, + /// Should the action be performed. + /// This is true if we don't store in group. + /// And also true if we store in group and with this have enough signatures to perform the action + pub perform_action: bool, +} + +/// Token base transition action accessors v0 +pub trait TokenBaseTransitionActionAccessorsV0 { + /// The token position within the data contract + fn token_position(&self) -> TokenContractPosition; + + /// The token id + fn token_id(&self) -> Identifier; + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier; + + /// Returns a reference to the data contract fetch info, without cloning + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo>; + + /// Returns the data contract fetch info (cloned Arc) + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo>; + + /// Returns the identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce; + + /// Gets the token configuration associated to the action + fn token_configuration(&self) -> Result<&TokenConfiguration, Error>; + + /// Gets the store_in_group field (optional) + fn store_in_group(&self) -> Option<&GroupStateTransitionResolvedInfo>; + + /// Gets the perform_action field + fn perform_action(&self) -> bool; +} + +impl TokenBaseTransitionActionAccessorsV0 for TokenBaseTransitionActionV0 { + fn token_position(&self) -> u16 { + self.token_contract_position + } + + fn token_id(&self) -> Identifier { + self.token_id + } + + fn data_contract_id(&self) -> Identifier { + self.data_contract.contract.id() + } + + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + &self.data_contract + } + + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.data_contract.clone() + } + + fn identity_contract_nonce(&self) -> IdentityNonce { + self.identity_contract_nonce + } + + fn token_configuration(&self) -> Result<&TokenConfiguration, Error> { + self.data_contract + .as_ref() + .contract + .tokens() + .get(&self.token_contract_position) + .ok_or(Error::Protocol(ProtocolError::CorruptedCodeExecution( + format!( + "data contract does not have a token at position {}", + self.token_contract_position + ), + ))) + } + + fn store_in_group(&self) -> Option<&GroupStateTransitionResolvedInfo> { + self.store_in_group.as_ref() + } + + fn perform_action(&self) -> bool { + self.perform_action + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..64532238e7c --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_base_transition_action/v0/transformer.rs @@ -0,0 +1,242 @@ +use dpp::group::{GroupStateTransitionInfo, GroupStateTransitionResolvedInfo}; +use dpp::platform_value::Identifier; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::consensus::ConsensusError; +use dpp::consensus::state::group::{GroupActionAlreadyCompletedError, GroupActionDoesNotExistError, IdentityNotMemberOfGroupError}; +use dpp::consensus::state::state_error::StateError; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::group::accessors::v0::GroupV0Getters; +use dpp::prelude::ConsensusValidationResult; +use dpp::ProtocolError; +use dpp::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; +use platform_version::version::PlatformVersion; +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionV0; + +impl TokenBaseTransitionActionV0 { + /// try from base transition with contract lookup + pub fn try_from_base_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenBaseTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Self>, Error> { + let TokenBaseTransitionV0 { + token_contract_position, + data_contract_id, + identity_contract_nonce, + token_id, + using_group_info, + } = value; + + let data_contract = get_data_contract(data_contract_id)?; + + let (perform_action, store_in_group) = match using_group_info { + None => (true, None), + Some(GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer, + }) => { + let group = data_contract.contract.group(group_contract_position)?; + let signer_power = match group.member_power(owner_id) { + Ok(signer_power) => signer_power, + Err(ProtocolError::GroupMemberNotFound(_)) => { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityNotMemberOfGroupError( + IdentityNotMemberOfGroupError::new( + owner_id, + data_contract_id, + group_contract_position, + ), + )), + )); + } + Err(e) => return Err(e.into()), + }; + let required_power = group.required_power(); + let current_power = if action_is_proposer { + 0 + } else { + match drive.fetch_action_id_signers_power_and_add_operations( + data_contract_id, + group_contract_position, + action_id, + approximate_without_state_for_costs, + transaction, + drive_operations, + platform_version, + )? { + None => { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::GroupActionDoesNotExistError( + GroupActionDoesNotExistError::new( + data_contract_id, + group_contract_position, + action_id, + ), + ), + ), + )); + } + Some(power) => power, + } + }; + if current_power >= required_power { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::GroupActionAlreadyCompletedError( + GroupActionAlreadyCompletedError::new( + data_contract_id, + group_contract_position, + action_id, + ), + )), + )); + } + let perform_action = if approximate_without_state_for_costs { + // most expensive case is that we perform action + true + } else { + current_power + signer_power >= required_power + }; + let store_in_group = GroupStateTransitionResolvedInfo { + group_contract_position, + group: group.clone(), + action_id, + action_is_proposer, + signer_power, + }; + (perform_action, Some(store_in_group)) + } + }; + Ok(TokenBaseTransitionActionV0 { + token_id, + identity_contract_nonce, + token_contract_position, + data_contract, + store_in_group, + perform_action, + } + .into()) + } + + /// try from borrowed base transition with contract lookup + pub fn try_from_borrowed_base_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenBaseTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<ConsensusValidationResult<Self>, Error> { + let TokenBaseTransitionV0 { + token_contract_position, + data_contract_id, + identity_contract_nonce, + token_id, + using_group_info, + } = value; + + let data_contract = get_data_contract(*data_contract_id)?; + + let (perform_action, store_in_group) = match using_group_info { + None => (true, None), + Some(GroupStateTransitionInfo { + group_contract_position, + action_id, + action_is_proposer, + }) => { + let group = data_contract.contract.group(*group_contract_position)?; + let signer_power = match group.member_power(owner_id) { + Ok(signer_power) => signer_power, + Err(ProtocolError::GroupMemberNotFound(_)) => { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::IdentityNotMemberOfGroupError( + IdentityNotMemberOfGroupError::new( + owner_id, + *data_contract_id, + *group_contract_position, + ), + )), + )); + } + Err(e) => return Err(e.into()), + }; + let required_power = group.required_power(); + let current_power = if *action_is_proposer { + 0 + } else { + match drive.fetch_action_id_signers_power_and_add_operations( + *data_contract_id, + *group_contract_position, + *action_id, + approximate_without_state_for_costs, + transaction, + drive_operations, + platform_version, + )? { + None => { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError( + StateError::GroupActionDoesNotExistError( + GroupActionDoesNotExistError::new( + *data_contract_id, + *group_contract_position, + *action_id, + ), + ), + ), + )); + } + Some(power) => power, + } + }; + if current_power >= required_power { + return Ok(ConsensusValidationResult::new_with_error( + ConsensusError::StateError(StateError::GroupActionAlreadyCompletedError( + GroupActionAlreadyCompletedError::new( + *data_contract_id, + *group_contract_position, + *action_id, + ), + )), + )); + } + let perform_action = if approximate_without_state_for_costs { + // most expensive case is that we perform action + true + } else { + current_power + signer_power >= required_power + }; + let store_in_group = GroupStateTransitionResolvedInfo { + group_contract_position: *group_contract_position, + group: group.clone(), + action_id: *action_id, + action_is_proposer: *action_is_proposer, + signer_power, + }; + (perform_action, Some(store_in_group)) + } + }; + Ok(TokenBaseTransitionActionV0 { + token_id: *token_id, + identity_contract_nonce: *identity_contract_nonce, + token_contract_position: *token_contract_position, + data_contract, + store_in_group, + perform_action, + } + .into()) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/mod.rs new file mode 100644 index 00000000000..0e24f14920b --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/mod.rs @@ -0,0 +1,60 @@ +use derive_more::From; + +/// transformer module for token burn transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenBurnTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token burn transition action +#[derive(Debug, Clone, From)] +pub enum TokenBurnTransitionAction { + /// v0 + V0(TokenBurnTransitionActionV0), +} + +impl TokenBurnTransitionActionAccessorsV0 for TokenBurnTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenBurnTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenBurnTransitionAction::V0(v0) => v0.base, + } + } + + fn burn_amount(&self) -> u64 { + match self { + TokenBurnTransitionAction::V0(v0) => v0.burn_amount, + } + } + + fn set_burn_amount(&mut self, amount: u64) { + match self { + TokenBurnTransitionAction::V0(v0) => v0.burn_amount = amount, + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenBurnTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenBurnTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenBurnTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/transformer.rs new file mode 100644 index 00000000000..92383d278b8 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/transformer.rs @@ -0,0 +1,125 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::{ + TokenBurnTransitionAction, TokenBurnTransitionActionV0, +}; +use dpp::state_transition::batch_transition::token_burn_transition::TokenBurnTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenBurnTransition` into a `TokenBurnTransitionAction`. +impl TokenBurnTransitionAction { + /// Transform a `TokenBurnTransition` into a `TokenBurnTransitionAction` using the provided data contract lookup. + /// + /// This method processes a `TokenBurnTransition` and converts it into a `TokenBurnTransitionAction` while + /// looking up necessary data contracts and calculating transaction fees. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the burn transition. + /// * `value` - The `TokenBurnTransition` instance to be converted into a `TokenBurnTransitionAction`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state information. + /// * `transaction` - The transaction argument used for state changes. + /// * `block_info` - Block information needed to process the transition. + /// * `get_data_contract` - A closure that retrieves the `DataContractFetchInfo` for a given contract ID. + /// * `platform_version` - The platform version in use for the context of the transition. + /// + /// # Returns + /// + /// * `Result<(TokenBurnTransitionAction, FeeResult), Error>` - A result containing the `TokenBurnTransitionAction` and associated fees if successful, otherwise an error. + pub fn try_from_token_burn_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenBurnTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenBurnTransition::V0(v0) => { + TokenBurnTransitionActionV0::try_from_token_burn_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenBurnTransition` into a `TokenBurnTransitionAction` using the provided data contract lookup. + /// + /// This method processes a borrowed reference to a `TokenBurnTransition` and converts it into a `TokenBurnTransitionAction` + /// while looking up necessary data contracts and calculating transaction fees. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the burn transition. + /// * `value` - A reference to the `TokenBurnTransition` to be converted into a `TokenBurnTransitionAction`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state information. + /// * `transaction` - The transaction argument used for state changes. + /// * `block_info` - Block information needed to process the transition. + /// * `get_data_contract` - A closure that retrieves the `DataContractFetchInfo` for a given contract ID. + /// * `platform_version` - The platform version in use for the context of the transition. + /// + /// # Returns + /// + /// * `Result<(TokenBurnTransitionAction, FeeResult), Error>` - A result containing the `TokenBurnTransitionAction` and associated fees if successful, otherwise an error. + pub fn try_from_borrowed_token_burn_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenBurnTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenBurnTransition::V0(v0) => { + TokenBurnTransitionActionV0::try_from_borrowed_token_burn_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/mod.rs new file mode 100644 index 00000000000..7a6c9a51845 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/mod.rs @@ -0,0 +1,102 @@ +mod transformer; + +use std::sync::Arc; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token burn transition action v0 +#[derive(Debug, Clone)] +pub struct TokenBurnTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The amount of tokens to burn + pub burn_amount: u64, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenBurnTransitionActionV0` +pub trait TokenBurnTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Returns the amount of tokens to burn + fn burn_amount(&self) -> u64; + + /// Sets the amount of tokens to burn + fn set_burn_amount(&mut self, amount: u64); + + /// Returns a reference to the `public_note` field of the `TokenBurnTransitionActionV0` + fn public_note(&self) -> Option<&String>; + + /// Returns the owned `public_note` field of the `TokenBurnTransitionActionV0` + fn public_note_owned(self) -> Option<String>; + + /// Sets the value of the `public_note` field in the `TokenBurnTransitionActionV0` + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the identity contract nonce + fn identity_contract_nonce(&self) -> IdentityNonce { + self.base().identity_contract_nonce() + } +} + +impl TokenBurnTransitionActionAccessorsV0 for TokenBurnTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn burn_amount(&self) -> u64 { + self.burn_amount + } + + fn set_burn_amount(&mut self, amount: u64) { + self.burn_amount = amount; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..1542acc0b2a --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_burn_transition_action/v0/transformer.rs @@ -0,0 +1,229 @@ +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_burn_transition::v0::TokenBurnTransitionV0; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::UserFeeIncrease; +use dpp::validation::ConsensusValidationResult; +use platform_version::version::PlatformVersion; +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_burn_transition_action::v0::TokenBurnTransitionActionV0; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenBurnTransitionActionV0 { + /// Attempts to create a `TokenBurnTransitionActionV0` from the given `TokenBurnTransitionV0` value. + /// + /// This function extracts the necessary data from the provided `TokenBurnTransitionV0` and + /// delegates to the `try_from_base_transition_with_contract_lookup` function to construct the + /// base action. It then constructs the `TokenBurnTransitionActionV0` struct by including the + /// `burn_amount` and `public_note` values, along with the base action. + /// + /// # Parameters + /// - `drive`: A reference to the `Drive` struct which provides access to the system. + /// - `owner_id`: The identifier of the owner initiating the burn transition. + /// - `value`: The `TokenBurnTransitionV0` containing the details for the token burn. + /// - `approximate_without_state_for_costs`: A flag indicating whether to approximate state costs. + /// - `transaction`: The transaction argument used for state changes. + /// - `block_info`: Information about the current block to calculate fees. + /// - `get_data_contract`: A closure function that looks up the data contract for a given identifier. + /// - `platform_version`: The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// A `Result` containing the constructed `TokenBurnTransitionActionV0` on success, or an error + /// if any issues occur during the process. + /// + /// # Errors + /// - Returns an `Error` if any error occurs while trying to create the base action or process the burn. + pub fn try_from_token_burn_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenBurnTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenBurnTransitionV0 { + base, + burn_amount, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::BurnAction( + TokenBurnTransitionActionV0 { + base: base_action, + burn_amount, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Attempts to create a `TokenBurnTransitionActionV0` from the borrowed `TokenBurnTransitionV0` value. + /// + /// This function is similar to `try_from_token_burn_transition_with_contract_lookup`, but it + /// operates on a borrowed `TokenBurnTransitionV0` to avoid ownership transfer. It delegates + /// to `try_from_borrowed_base_transition_with_contract_lookup` for constructing the base action, + /// then combines it with the `burn_amount` and `public_note` to form a `TokenBurnTransitionActionV0`. + /// + /// # Parameters + /// - `drive`: A reference to the `Drive` struct which provides access to the system. + /// - `owner_id`: The identifier of the owner initiating the burn transition. + /// - `value`: A borrowed reference to the `TokenBurnTransitionV0` containing the details for the token burn. + /// - `approximate_without_state_for_costs`: A flag indicating whether to approximate state costs. + /// - `transaction`: The transaction argument used for state changes. + /// - `block_info`: Information about the current block to calculate fees. + /// - `get_data_contract`: A closure function that looks up the data contract for a given identifier. + /// - `platform_version`: The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// A `Result` containing the constructed `TokenBurnTransitionActionV0` on success, or an error + /// if any issues occur during the process. + /// + /// # Errors + /// - Returns an `Error` if any error occurs while trying to create the base action or process the burn. + pub fn try_from_borrowed_token_burn_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenBurnTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenBurnTransitionV0 { + base, + burn_amount, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::BurnAction( + TokenBurnTransitionActionV0 { + base: base_action, + burn_amount: *burn_amount, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/mod.rs new file mode 100644 index 00000000000..b40ecc23105 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/mod.rs @@ -0,0 +1,66 @@ +use derive_more::From; +use dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; + +/// transformer module for token freeze transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token config update transition action +#[derive(Debug, Clone, From)] +pub enum TokenConfigUpdateTransitionAction { + /// v0 + V0(TokenConfigUpdateTransitionActionV0), +} + +impl TokenConfigUpdateTransitionActionAccessorsV0 for TokenConfigUpdateTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => v0.base, + } + } + + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => &v0.update_token_configuration_item, + } + } + + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ) { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => { + v0.update_token_configuration_item = update_token_configuration_item + } + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenConfigUpdateTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/transformer.rs new file mode 100644 index 00000000000..04ee9d1c1f3 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::{TokenConfigUpdateTransitionActionV0, TokenConfigUpdateTransitionAction}; +use dpp::state_transition::batch_transition::token_config_update_transition::TokenConfigUpdateTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenConfigUpdateTransition` into a `TokenConfigUpdateTransitionAction`. +impl TokenConfigUpdateTransitionAction { + /// Transform a `TokenConfigUpdateTransition` into a `TokenConfigUpdateTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenConfigUpdateTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenConfigUpdateTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_config_update_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenConfigUpdateTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenConfigUpdateTransition::V0(v0) => { + TokenConfigUpdateTransitionActionV0::try_from_token_config_update_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenConfigUpdateTransition` into a `TokenConfigUpdateTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenConfigUpdateTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenConfigUpdateTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_config_update_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenConfigUpdateTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenConfigUpdateTransition::V0(v0) => { + TokenConfigUpdateTransitionActionV0::try_from_borrowed_token_config_update_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/mod.rs new file mode 100644 index 00000000000..9dcdcd4003a --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/mod.rs @@ -0,0 +1,104 @@ +mod transformer; + +use std::sync::Arc; +use dpp::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem; +use dpp::data_contract::TokenContractPosition; +use dpp::identifier::Identifier; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token config update transition action v0 +#[derive(Debug, Clone)] +pub struct TokenConfigUpdateTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// Updated token configuration item + pub update_token_configuration_item: TokenConfigurationChangeItem, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenConfigUpdateTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Returns the `update_token_configuration_item` + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem; + + /// Sets the `update_token_configuration_item` + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ); + + /// Returns the token position in the contract + fn token_position(&self) -> TokenContractPosition { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenConfigUpdateTransitionActionAccessorsV0 for TokenConfigUpdateTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn update_token_configuration_item(&self) -> &TokenConfigurationChangeItem { + &self.update_token_configuration_item + } + + fn set_update_token_configuration_item( + &mut self, + update_token_configuration_item: TokenConfigurationChangeItem, + ) { + self.update_token_configuration_item = update_token_configuration_item; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..b23f3d2ff74 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_config_update_transition_action/v0/transformer.rs @@ -0,0 +1,233 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_config_update_transition::v0::TokenConfigUpdateTransitionV0; +use dpp::ProtocolError; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_config_update_transition_action::v0::TokenConfigUpdateTransitionActionV0; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenConfigUpdateTransitionActionV0 { + /// Converts a `TokenConfigUpdateTransitionV0` into a `TokenConfigUpdateTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token config update transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for config update. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the config update transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenConfigUpdateTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenConfigUpdateTransitionActionV0>, Error>` - Returns the constructed `TokenConfigUpdateTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_config_update_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenConfigUpdateTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenConfigUpdateTransitionV0 { + base, + + update_token_configuration_item, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::ConfigUpdateAction( + TokenConfigUpdateTransitionActionV0 { + base: base_action, + update_token_configuration_item, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenConfigUpdateTransitionV0` into a `TokenConfigUpdateTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token config update transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant config update logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the config update transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenConfigUpdateTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenConfigUpdateTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenConfigUpdateTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_config_update_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenConfigUpdateTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenConfigUpdateTransitionV0 { + base, + update_token_configuration_item, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::ConfigUpdateAction( + TokenConfigUpdateTransitionActionV0 { + base: base_action, + update_token_configuration_item: update_token_configuration_item.clone(), + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/mod.rs new file mode 100644 index 00000000000..b3074af9481 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/mod.rs @@ -0,0 +1,76 @@ +use derive_more::From; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; + +/// transformer module for token destroy_frozen_funds transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token destroy_frozen_funds transition action +#[derive(Debug, Clone, From)] +pub enum TokenDestroyFrozenFundsTransitionAction { + /// v0 + V0(TokenDestroyFrozenFundsTransitionActionV0), +} + +impl TokenDestroyFrozenFundsTransitionActionAccessorsV0 + for TokenDestroyFrozenFundsTransitionAction +{ + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.base, + } + } + + fn frozen_identity_id(&self) -> Identifier { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.frozen_identity_id, + } + } + + fn set_frozen_identity_id(&mut self, id: Identifier) { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.frozen_identity_id = id, + } + } + + fn amount(&self) -> TokenAmount { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.amount, + } + } + + fn set_amount(&mut self, amount: TokenAmount) { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.amount = amount, + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenDestroyFrozenFundsTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/transformer.rs new file mode 100644 index 00000000000..6b83b6e6a34 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::{TokenDestroyFrozenFundsTransitionActionV0, TokenDestroyFrozenFundsTransitionAction}; +use dpp::state_transition::batch_transition::token_destroy_frozen_funds_transition::TokenDestroyFrozenFundsTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenDestroyFrozenFundsTransition` into a `TokenDestroyFrozenFundsTransitionAction`. +impl TokenDestroyFrozenFundsTransitionAction { + /// Transform a `TokenDestroyFrozenFundsTransition` into a `TokenDestroyFrozenFundsTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the destroy_frozen_funds transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenDestroyFrozenFundsTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenDestroyFrozenFundsTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_destroy_frozen_funds_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenDestroyFrozenFundsTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenDestroyFrozenFundsTransition::V0(v0) => { + TokenDestroyFrozenFundsTransitionActionV0::try_from_token_destroy_frozen_funds_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenDestroyFrozenFundsTransition` into a `TokenDestroyFrozenFundsTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the destroy_frozen_funds transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenDestroyFrozenFundsTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenDestroyFrozenFundsTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_destroy_frozen_funds_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenDestroyFrozenFundsTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenDestroyFrozenFundsTransition::V0(v0) => { + TokenDestroyFrozenFundsTransitionActionV0::try_from_borrowed_token_destroy_frozen_funds_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/mod.rs new file mode 100644 index 00000000000..9cbe01544e9 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/mod.rs @@ -0,0 +1,115 @@ +mod transformer; + +use std::sync::Arc; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token issuance transition action v0 +#[derive(Debug, Clone)] +pub struct TokenDestroyFrozenFundsTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The identity to credit the token to + pub frozen_identity_id: Identifier, + /// The amount that will be burned + pub amount: TokenAmount, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenDestroyFrozenFundsTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Consumes self and returns the identity balance holder ID + fn frozen_identity_id(&self) -> Identifier; + + /// Sets the identity balance holder ID + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier); + + /// Returns the amount of tokens that the identity had and will be burned + fn amount(&self) -> TokenAmount; + + /// Sets the amount of tokens that the identity had and will be burned + fn set_amount(&mut self, amount: TokenAmount); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenDestroyFrozenFundsTransitionActionAccessorsV0 + for TokenDestroyFrozenFundsTransitionActionV0 +{ + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn frozen_identity_id(&self) -> Identifier { + self.frozen_identity_id + } + + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + self.frozen_identity_id = frozen_identity_id; + } + + fn amount(&self) -> TokenAmount { + self.amount + } + + fn set_amount(&mut self, amount: TokenAmount) { + self.amount = amount; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..07ad9e32ecf --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_destroy_frozen_funds_transition_action/v0/transformer.rs @@ -0,0 +1,311 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::state::state_error::StateError; +use dpp::consensus::state::token::IdentityDoesNotHaveEnoughTokenBalanceError; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_destroy_frozen_funds_transition::v0::TokenDestroyFrozenFundsTransitionV0; +use dpp::ProtocolError; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_destroy_frozen_funds_transition_action::v0::TokenDestroyFrozenFundsTransitionActionV0; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenDestroyFrozenFundsTransitionActionV0 { + /// Converts a `TokenDestroyFrozenFundsTransitionV0` into a `TokenDestroyFrozenFundsTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token destroy_frozen_fundsing transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for destroy_frozen_fundsing. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the destroy_frozen_fundsing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenDestroyFrozenFundsTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenDestroyFrozenFundsTransitionActionV0>, Error>` - Returns the constructed `TokenDestroyFrozenFundsTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_destroy_frozen_funds_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenDestroyFrozenFundsTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenDestroyFrozenFundsTransitionV0 { + base, + frozen_identity_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let maybe_token_amount = drive.fetch_identity_token_balance_operations( + base.token_id().to_buffer(), + frozen_identity_id.to_buffer(), + !approximate_without_state_for_costs, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let Some(token_amount) = maybe_token_amount else { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + &base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![StateError::IdentityDoesNotHaveEnoughTokenBalanceError( + IdentityDoesNotHaveEnoughTokenBalanceError::new( + base.token_id(), + frozen_identity_id, + 1, + 0, + "destroy_frozen_funds".to_string(), + ), + ) + .into()], + ), + fee_result, + )); + }; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::DestroyFrozenFundsAction( + TokenDestroyFrozenFundsTransitionActionV0 { + base: base_action, + frozen_identity_id, + amount: token_amount, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenDestroyFrozenFundsTransitionV0` into a `TokenDestroyFrozenFundsTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token destroy_frozen_fundsing transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant destroy_frozen_fundsing logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the destroy_frozen_fundsing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenDestroyFrozenFundsTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenDestroyFrozenFundsTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenDestroyFrozenFundsTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_destroy_frozen_funds_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenDestroyFrozenFundsTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenDestroyFrozenFundsTransitionV0 { + base, + frozen_identity_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let maybe_token_amount = drive.fetch_identity_token_balance_operations( + base.token_id().to_buffer(), + frozen_identity_id.to_buffer(), + !approximate_without_state_for_costs, + transaction, + &mut drive_operations, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let Some(token_amount) = maybe_token_amount else { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + &base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![StateError::IdentityDoesNotHaveEnoughTokenBalanceError( + IdentityDoesNotHaveEnoughTokenBalanceError::new( + base.token_id(), + *frozen_identity_id, + 1, + 0, + "destroy_frozen_funds".to_string(), + ), + ) + .into()], + ), + fee_result, + )); + }; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::DestroyFrozenFundsAction( + TokenDestroyFrozenFundsTransitionActionV0 { + base: base_action, + frozen_identity_id: *frozen_identity_id, + amount: token_amount, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/mod.rs new file mode 100644 index 00000000000..4cd3b96c261 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/mod.rs @@ -0,0 +1,63 @@ +use derive_more::From; +use dpp::tokens::emergency_action::TokenEmergencyAction; + +/// transformer module for token emergency_action transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token emergency_action transition action +#[derive(Debug, Clone, From)] +pub enum TokenEmergencyActionTransitionAction { + /// v0 + V0(TokenEmergencyActionTransitionActionV0), +} + +impl TokenEmergencyActionTransitionActionAccessorsV0 for TokenEmergencyActionTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => v0.base, + } + } + + fn emergency_action(&self) -> TokenEmergencyAction { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => v0.emergency_action(), + } + } + + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction) { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => { + v0.set_emergency_action(emergency_action) + } + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenEmergencyActionTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/transformer.rs new file mode 100644 index 00000000000..0e2670ed951 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::{TokenEmergencyActionTransitionActionV0, TokenEmergencyActionTransitionAction}; +use dpp::state_transition::batch_transition::token_emergency_action_transition::TokenEmergencyActionTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenEmergencyActionTransition` into a `TokenEmergencyActionTransitionAction`. +impl TokenEmergencyActionTransitionAction { + /// Transform a `TokenEmergencyActionTransition` into a `TokenEmergencyActionTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the emergency_action transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenEmergencyActionTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenEmergencyActionTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_emergency_action_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenEmergencyActionTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenEmergencyActionTransition::V0(v0) => { + TokenEmergencyActionTransitionActionV0::try_from_token_emergency_action_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenEmergencyActionTransition` into a `TokenEmergencyActionTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the emergency_action transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenEmergencyActionTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenEmergencyActionTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_emergency_action_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenEmergencyActionTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenEmergencyActionTransition::V0(v0) => { + TokenEmergencyActionTransitionActionV0::try_from_borrowed_token_emergency_action_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/mod.rs new file mode 100644 index 00000000000..12dd5babe37 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/mod.rs @@ -0,0 +1,97 @@ +mod transformer; + +use std::sync::Arc; +use dpp::identifier::Identifier; +use dpp::tokens::emergency_action::TokenEmergencyAction; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token issuance transition action v0 +#[derive(Debug, Clone)] +pub struct TokenEmergencyActionTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The emergency action + pub emergency_action: TokenEmergencyAction, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenEmergencyActionTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Returns the `emergency_action` field. + fn emergency_action(&self) -> TokenEmergencyAction; + + /// Sets the value of the `emergency_action` field. + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenEmergencyActionTransitionActionAccessorsV0 for TokenEmergencyActionTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn emergency_action(&self) -> TokenEmergencyAction { + self.emergency_action + } + + fn set_emergency_action(&mut self, emergency_action: TokenEmergencyAction) { + self.emergency_action = emergency_action; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..b1d3b29459f --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_emergency_action_transition_action/v0/transformer.rs @@ -0,0 +1,232 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_emergency_action_transition::v0::TokenEmergencyActionTransitionV0; +use dpp::ProtocolError; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_emergency_action_transition_action::v0::TokenEmergencyActionTransitionActionV0; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenEmergencyActionTransitionActionV0 { + /// Converts a `TokenEmergencyActionTransitionV0` into a `TokenEmergencyActionTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token emergency_actioning transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for emergency_actioning. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the emergency_actioning transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenEmergencyActionTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenEmergencyActionTransitionActionV0>, Error>` - Returns the constructed `TokenEmergencyActionTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_emergency_action_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenEmergencyActionTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenEmergencyActionTransitionV0 { + base, + emergency_action, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::EmergencyActionAction( + TokenEmergencyActionTransitionActionV0 { + base: base_action, + emergency_action, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenEmergencyActionTransitionV0` into a `TokenEmergencyActionTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token emergency_actioning transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant emergency_actioning logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the emergency_actioning transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenEmergencyActionTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenEmergencyActionTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenEmergencyActionTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_emergency_action_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenEmergencyActionTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenEmergencyActionTransitionV0 { + base, + emergency_action, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::EmergencyActionAction( + TokenEmergencyActionTransitionActionV0 { + base: base_action, + emergency_action: *emergency_action, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/mod.rs new file mode 100644 index 00000000000..5f0e9bcd353 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/mod.rs @@ -0,0 +1,61 @@ +use derive_more::From; +use dpp::identifier::Identifier; + +/// transformer module for token freeze transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token freeze transition action +#[derive(Debug, Clone, From)] +pub enum TokenFreezeTransitionAction { + /// v0 + V0(TokenFreezeTransitionActionV0), +} + +impl TokenFreezeTransitionActionAccessorsV0 for TokenFreezeTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenFreezeTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.base, + } + } + + fn identity_to_freeze_id(&self) -> Identifier { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.identity_to_freeze_id, + } + } + + fn set_identity_to_freeze_id(&mut self, id: Identifier) { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.identity_to_freeze_id = id, + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenFreezeTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/transformer.rs new file mode 100644 index 00000000000..3347e72524b --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::{TokenFreezeTransitionActionV0, TokenFreezeTransitionAction}; +use dpp::state_transition::batch_transition::token_freeze_transition::TokenFreezeTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenFreezeTransition` into a `TokenFreezeTransitionAction`. +impl TokenFreezeTransitionAction { + /// Transform a `TokenFreezeTransition` into a `TokenFreezeTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenFreezeTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenFreezeTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_freeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenFreezeTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenFreezeTransition::V0(v0) => { + TokenFreezeTransitionActionV0::try_from_token_freeze_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenFreezeTransition` into a `TokenFreezeTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenFreezeTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenFreezeTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_freeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenFreezeTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenFreezeTransition::V0(v0) => { + TokenFreezeTransitionActionV0::try_from_borrowed_token_freeze_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/mod.rs new file mode 100644 index 00000000000..3216d0b2052 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/mod.rs @@ -0,0 +1,96 @@ +mod transformer; + +use std::sync::Arc; +use dpp::identifier::Identifier; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token issuance transition action v0 +#[derive(Debug, Clone)] +pub struct TokenFreezeTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The identity to freeze + pub identity_to_freeze_id: Identifier, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenFreezeTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Consumes self and returns the identity balance holder ID + fn identity_to_freeze_id(&self) -> Identifier; + + /// Sets the identity balance holder ID + fn set_identity_to_freeze_id(&mut self, frozen_identity_id: Identifier); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenFreezeTransitionActionAccessorsV0 for TokenFreezeTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn identity_to_freeze_id(&self) -> Identifier { + self.identity_to_freeze_id + } + + fn set_identity_to_freeze_id(&mut self, frozen_identity_id: Identifier) { + self.identity_to_freeze_id = frozen_identity_id; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..3047903c7df --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_freeze_transition_action/v0/transformer.rs @@ -0,0 +1,232 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_freeze_transition::v0::TokenFreezeTransitionV0; +use dpp::ProtocolError; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_freeze_transition_action::v0::TokenFreezeTransitionActionV0; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenFreezeTransitionActionV0 { + /// Converts a `TokenFreezeTransitionV0` into a `TokenFreezeTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token freezeing transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for freezeing. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the freezeing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenFreezeTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenFreezeTransitionActionV0>, Error>` - Returns the constructed `TokenFreezeTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_freeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenFreezeTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenFreezeTransitionV0 { + base, + identity_to_freeze_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::FreezeAction( + TokenFreezeTransitionActionV0 { + base: base_action, + identity_to_freeze_id, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenFreezeTransitionV0` into a `TokenFreezeTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token freezeing transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant freezeing logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the freezeing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenFreezeTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenFreezeTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenFreezeTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_freeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenFreezeTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenFreezeTransitionV0 { + base, + identity_to_freeze_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::FreezeAction( + TokenFreezeTransitionActionV0 { + base: base_action, + identity_to_freeze_id: *identity_to_freeze_id, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/mod.rs new file mode 100644 index 00000000000..2c4b75de5e7 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/mod.rs @@ -0,0 +1,73 @@ +use derive_more::From; +use dpp::identifier::Identifier; + +/// transformer module for token issuance transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token issuance transition action +#[derive(Debug, Clone, From)] +pub enum TokenMintTransitionAction { + /// v0 + V0(TokenMintTransitionActionV0), +} + +impl TokenMintTransitionActionAccessorsV0 for TokenMintTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenMintTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenMintTransitionAction::V0(v0) => v0.base, + } + } + + fn mint_amount(&self) -> u64 { + match self { + TokenMintTransitionAction::V0(v0) => v0.mint_amount, + } + } + + fn set_mint_amount(&mut self, amount: u64) { + match self { + TokenMintTransitionAction::V0(v0) => v0.mint_amount = amount, + } + } + + fn identity_balance_holder_id(&self) -> Identifier { + match self { + TokenMintTransitionAction::V0(v0) => v0.identity_balance_holder_id, + } + } + + fn set_identity_balance_holder_id(&mut self, id: Identifier) { + match self { + TokenMintTransitionAction::V0(v0) => v0.identity_balance_holder_id = id, + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenMintTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenMintTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenMintTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/transformer.rs new file mode 100644 index 00000000000..0183d1a7fdd --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::{TokenMintTransitionActionV0, TokenMintTransitionAction}; +use dpp::state_transition::batch_transition::token_mint_transition::TokenMintTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenMintTransition` into a `TokenMintTransitionAction`. +impl TokenMintTransitionAction { + /// Transform a `TokenMintTransition` into a `TokenMintTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the mint transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenMintTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenMintTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_mint_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenMintTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenMintTransition::V0(v0) => { + TokenMintTransitionActionV0::try_from_token_mint_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenMintTransition` into a `TokenMintTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the mint transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenMintTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenMintTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_mint_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenMintTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenMintTransition::V0(v0) => { + TokenMintTransitionActionV0::try_from_borrowed_token_mint_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/mod.rs new file mode 100644 index 00000000000..812949c03ca --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/mod.rs @@ -0,0 +1,112 @@ +mod transformer; + +use std::sync::Arc; +use dpp::identifier::Identifier; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token issuance transition action v0 +#[derive(Debug, Clone)] +pub struct TokenMintTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The amount of tokens to create + pub mint_amount: u64, + /// The identity to credit the token to + pub identity_balance_holder_id: Identifier, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenMintTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Returns the amount of tokens to issuance + fn mint_amount(&self) -> u64; + + /// Sets the amount of tokens to issuance + fn set_mint_amount(&mut self, amount: u64); + + /// Consumes self and returns the identity balance holder ID + fn identity_balance_holder_id(&self) -> Identifier; + + /// Sets the identity balance holder ID + fn set_identity_balance_holder_id(&mut self, id: Identifier); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenMintTransitionActionAccessorsV0 for TokenMintTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn mint_amount(&self) -> u64 { + self.mint_amount + } + + fn set_mint_amount(&mut self, amount: u64) { + self.mint_amount = amount; + } + + fn identity_balance_holder_id(&self) -> Identifier { + self.identity_balance_holder_id + } + + fn set_identity_balance_holder_id(&mut self, id: Identifier) { + self.identity_balance_holder_id = id; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..ee34e6dd99e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_mint_transition_action/v0/transformer.rs @@ -0,0 +1,376 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::consensus::basic::BasicError; +use dpp::consensus::basic::token::{ChoosingTokenMintRecipientNotAllowedError, DestinationIdentityForTokenMintingNotSetError}; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_mint_transition::v0::TokenMintTransitionV0; +use dpp::ProtocolError; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; +use crate::state_transition_action::batch::batched_transition::token_transition::token_mint_transition_action::v0::TokenMintTransitionActionV0; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::batch::BatchedTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenMintTransitionActionV0 { + /// Converts a `TokenMintTransitionV0` into a `TokenMintTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token minting transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for minting. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the minting transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenMintTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenMintTransitionActionV0>, Error>` - Returns the constructed `TokenMintTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_mint_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenMintTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenMintTransitionV0 { + base, + issued_to_identity_id, + amount, + public_note, + } = value; + + let position = base.token_contract_position(); + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + if !base_action + .token_configuration()? + .distribution_rules() + .minting_allow_choosing_destination() + && issued_to_identity_id.is_some() + { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action( + &base_action, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![BasicError::ChoosingTokenMintRecipientNotAllowedError( + ChoosingTokenMintRecipientNotAllowedError::new(base_action.token_id()), + ) + .into()], + ), + fee_result, + )); + } + + let identity_balance_holder_id = match issued_to_identity_id.or_else(|| { + base_action + .data_contract_fetch_info_ref() + .contract + .tokens() + .get(&position) + .and_then(|token_configuration| { + token_configuration + .distribution_rules() + .new_tokens_destination_identity() + .copied() + }) + }) { + Some(identity_balance_holder_id) => identity_balance_holder_id, + None => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action( + &base_action, + owner_id, + 0, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![BasicError::DestinationIdentityForTokenMintingNotSetError( + DestinationIdentityForTokenMintingNotSetError::new( + base_action.token_id(), + ), + ) + .into()], + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::MintAction( + TokenMintTransitionActionV0 { + base: base_action, + mint_amount: amount, + identity_balance_holder_id, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenMintTransitionV0` into a `TokenMintTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token minting transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant minting logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the minting transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenMintTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenMintTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenMintTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_mint_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenMintTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenMintTransitionV0 { + base, + issued_to_identity_id, + amount, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + if !base_action + .token_configuration()? + .distribution_rules() + .minting_allow_choosing_destination() + && issued_to_identity_id.is_some() + { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action( + &base_action, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![BasicError::ChoosingTokenMintRecipientNotAllowedError( + ChoosingTokenMintRecipientNotAllowedError::new(base_action.token_id()), + ) + .into()], + ), + fee_result, + )); + } + + let identity_balance_holder_id = match issued_to_identity_id.or_else(|| { + base_action + .data_contract_fetch_info_ref() + .contract + .tokens() + .get(&base.token_contract_position()) + .and_then(|token_configuration| { + token_configuration + .distribution_rules() + .new_tokens_destination_identity() + .copied() + }) + }) { + Some(identity_balance_holder_id) => identity_balance_holder_id, + None => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition_action( + &base_action, + owner_id, + 0, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + vec![BasicError::DestinationIdentityForTokenMintingNotSetError( + DestinationIdentityForTokenMintingNotSetError::new( + base_action.token_id(), + ), + ) + .into()], + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::MintAction( + TokenMintTransitionActionV0 { + base: base_action, + mint_amount: *amount, + identity_balance_holder_id, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs new file mode 100644 index 00000000000..eb9fc965198 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/mod.rs @@ -0,0 +1,140 @@ +use derive_more::From; + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use dpp::identifier::Identifier; +use dpp::prelude::{DerivationEncryptionKeyIndex, RootEncryptionKeyIndex}; +use dpp::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; + +/// transformer module +pub mod transformer; +/// v0 +pub mod v0; + +pub use v0::*; + +/// TokenTransferTransitionAction +#[derive(Debug, Clone, From)] +pub enum TokenTransferTransitionAction { + /// v0 + V0(TokenTransferTransitionActionV0), +} + +impl TokenTransferTransitionActionAccessorsV0 for TokenTransferTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenTransferTransitionAction::V0(v0) => v0.base(), + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenTransferTransitionAction::V0(v0) => v0.base_owned(), + } + } + + fn amount(&self) -> u64 { + match self { + TokenTransferTransitionAction::V0(v0) => v0.amount(), + } + } + + fn recipient_id(&self) -> Identifier { + match self { + TokenTransferTransitionAction::V0(v0) => v0.recipient_id(), + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.public_note(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.public_note_owned(), + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenTransferTransitionAction::V0(v0) => v0.set_public_note(public_note), + } + } + + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.shared_encrypted_note(), + } + } + + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.shared_encrypted_note_owned(), + } + } + + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>) { + match self { + TokenTransferTransitionAction::V0(v0) => { + v0.set_shared_encrypted_note(shared_encrypted_note) + } + } + } + + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.private_encrypted_note(), + } + } + + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + match self { + TokenTransferTransitionAction::V0(v0) => v0.private_encrypted_note_owned(), + } + } + + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>) { + match self { + TokenTransferTransitionAction::V0(v0) => { + v0.set_private_encrypted_note(private_encrypted_note) + } + } + } + + fn notes( + &self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + match self { + TokenTransferTransitionAction::V0(v0) => v0.notes(), + } + } + + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + match self { + TokenTransferTransitionAction::V0(v0) => v0.notes_owned(), + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/transformer.rs new file mode 100644 index 00000000000..3cf42ca9107 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/transformer.rs @@ -0,0 +1,112 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use dpp::state_transition::batch_transition::TokenTransferTransition; +use platform_version::version::PlatformVersion; +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::v0::TokenTransferTransitionActionV0; + +/// Implement methods to transform a `TokenTransferTransition` into a `TokenTransferTransitionAction`. +impl TokenTransferTransitionAction { + /// Converts a `TokenTransferTransition` into a `TokenTransferTransitionAction` using the provided contract lookup. + /// + /// This function processes a `TokenTransferTransition` (which may contain multiple versions), looks up the necessary data + /// contracts, and calculates the associated fees for the transaction. Currently, only the `V0` variant of the transition is + /// supported. The result is a `TokenTransferTransitionAction` along with the fee result. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance for handling data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the token transfer. + /// * `value` - The `TokenTransferTransition` containing the transition data (currently only the `V0` variant is supported). + /// * `approximate_without_state_for_costs` - A flag to approximate transaction costs without full state consideration. + /// * `transaction` - The transaction context, which provides the necessary state for processing the transition. + /// * `block_info` - Information about the current block used to calculate fees for the transition. + /// * `get_data_contract` - A closure that takes an identifier and returns the associated `DataContractFetchInfo`. + /// * `platform_version` - The platform version to ensure the transition is compatible with the current version logic. + /// + /// # Returns + /// + /// * `Result<(TokenTransferTransitionAction, FeeResult), Error>` - A result containing the constructed `TokenTransferTransitionAction` + /// and the calculated `FeeResult`, or an error if the transition cannot be processed. + pub fn from_token_transfer_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenTransferTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<(Self, FeeResult), Error> { + match value { + TokenTransferTransition::V0(v0) => { + let (v0, fee) = TokenTransferTransitionActionV0::try_from_token_transfer_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + get_data_contract, + platform_version, + )?; + Ok((v0.into(), fee)) + } + } + } + + /// Converts a borrowed reference of a `TokenTransferTransition` into a `TokenTransferTransitionAction` using the provided contract lookup. + /// + /// This function is similar to `from_token_transfer_transition_with_contract_lookup` but operates on a borrowed reference of the + /// `TokenTransferTransition`, which avoids copying the data. It processes the `TokenTransferTransition`, looks up the necessary + /// data contracts, and calculates the associated fees for the transaction. Only the `V0` variant of the transition is supported. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance for handling data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the token transfer. + /// * `value` - A borrowed reference to the `TokenTransferTransition` containing the transition data (currently only the `V0` variant is supported). + /// * `approximate_without_state_for_costs` - A flag to approximate transaction costs without full state consideration. + /// * `transaction` - The transaction context, which provides the necessary state for processing the transition. + /// * `block_info` - Information about the current block used to calculate fees for the transition. + /// * `get_data_contract` - A closure that takes an identifier and returns the associated `DataContractFetchInfo`. + /// * `platform_version` - The platform version to ensure the transition is compatible with the current version logic. + /// + /// # Returns + /// + /// * `Result<(TokenTransferTransitionAction, FeeResult), Error>` - A result containing the constructed `TokenTransferTransitionAction` + /// and the calculated `FeeResult`, or an error if the transition cannot be processed. + pub fn try_from_borrowed_token_transfer_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenTransferTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<(Self, FeeResult), Error> { + match value { + TokenTransferTransition::V0(v0) => { + let (v0, fee) = TokenTransferTransitionActionV0::try_from_borrowed_token_transfer_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + get_data_contract, + platform_version, + )?; + Ok((v0.into(), fee)) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs new file mode 100644 index 00000000000..4df8b2e93ad --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/mod.rs @@ -0,0 +1,229 @@ +mod transformer; + +use std::sync::Arc; + +use dpp::identifier::Identifier; +use dpp::prelude::{ + DerivationEncryptionKeyIndex, IdentityNonce, RootEncryptionKeyIndex, +}; +use dpp::tokens::{PrivateEncryptedNote, SharedEncryptedNote}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{ + TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0, +}; + +/// Token transfer transition action v0 +#[derive(Debug, Clone)] +pub struct TokenTransferTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The amount to transfer + pub amount: u64, + /// The recipient owner ID + pub recipient_id: Identifier, + /// The public note + pub public_note: Option<String>, + /// An optional shared encrypted note + pub shared_encrypted_note: Option<SharedEncryptedNote>, + /// An optional private encrypted note + pub private_encrypted_note: Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>, +} + +/// Accessors for `TokenTransferTransitionActionV0` +pub trait TokenTransferTransitionActionAccessorsV0 { + /// Returns the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Returns the base owned token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Returns the amount of tokens to transfer + fn amount(&self) -> u64; + + /// Returns the recipient owner ID + fn recipient_id(&self) -> Identifier; + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID from the base action + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info from the base action + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the identity contract nonce from the base action + fn identity_contract_nonce(&self) -> IdentityNonce { + self.base().identity_contract_nonce() + } + + /// Returns the public note, if present + fn public_note(&self) -> Option<&String>; + + /// Consumes the `TokenTransferTransitionActionV0` and returns the public note, if present + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); + + /// Returns the shared encrypted note, if present + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote>; + + /// Consumes the `TokenTransferTransitionActionV0` and returns the shared encrypted note, if present + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote>; + + /// Sets the shared encrypted note + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>); + + /// Returns the private encrypted note, if present + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>; + + /// Consumes the `TokenTransferTransitionActionV0` and returns the private encrypted note, if present + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )>; + + /// Sets the private encrypted note + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>); + + /// All notes + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ); + /// All notes + fn notes( + &self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ); +} + +impl TokenTransferTransitionActionAccessorsV0 for TokenTransferTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn amount(&self) -> u64 { + self.amount + } + + fn recipient_id(&self) -> Identifier { + self.recipient_id + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } + + fn shared_encrypted_note(&self) -> Option<&SharedEncryptedNote> { + self.shared_encrypted_note.as_ref() + } + + fn shared_encrypted_note_owned(self) -> Option<SharedEncryptedNote> { + self.shared_encrypted_note + } + + fn set_shared_encrypted_note(&mut self, shared_encrypted_note: Option<SharedEncryptedNote>) { + self.shared_encrypted_note = shared_encrypted_note; + } + + fn private_encrypted_note( + &self, + ) -> Option<&( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + self.private_encrypted_note.as_ref() + } + + fn private_encrypted_note_owned( + self, + ) -> Option<( + RootEncryptionKeyIndex, + DerivationEncryptionKeyIndex, + Vec<u8>, + )> { + self.private_encrypted_note + } + + fn set_private_encrypted_note(&mut self, private_encrypted_note: Option<PrivateEncryptedNote>) { + self.private_encrypted_note = private_encrypted_note; + } + + fn notes( + &self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + ( + self.public_note.clone(), + self.shared_encrypted_note.clone(), + self.private_encrypted_note.clone(), + ) + } + + fn notes_owned( + self, + ) -> ( + Option<String>, + Option<SharedEncryptedNote>, + Option<PrivateEncryptedNote>, + ) { + ( + self.public_note, + self.shared_encrypted_note, + self.private_encrypted_note, + ) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..8f652ae7d10 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transfer_transition_action/v0/transformer.rs @@ -0,0 +1,177 @@ +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_transfer_transition::v0::TokenTransferTransitionV0; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use platform_version::version::PlatformVersion; +use crate::drive::contract::DataContractFetchInfo; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_transfer_transition_action::TokenTransferTransitionActionV0; + +impl TokenTransferTransitionActionV0 { + /// Converts a `TokenTransferTransitionV0` into a `TokenTransferTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token transfer transition, looks up the necessary data contracts, performs required + /// checks, and applies the relevant logic for token transfer. It also calculates the fees associated with the transaction. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the transfer. + /// * `value` - The `TokenTransferTransitionV0` struct containing the transition data, including token amount, + /// recipient details, and encrypted notes. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing transaction cost calculations when full state is not needed. + /// * `transaction` - The transaction context, which includes state details and necessary operations for the transition. + /// * `block_info` - Information about the current block to calculate the fees for the transition. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns the associated `DataContractFetchInfo`. + /// * `platform_version` - A reference to the platform version, ensuring that the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<(TokenTransferTransitionActionV0, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenTransferTransitionActionV0` and the calculated `FeeResult` if successful, or an error if the transition cannot + /// be created or an issue arises with the provided state or data. + pub fn try_from_token_transfer_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenTransferTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<(Self, FeeResult), Error> { + let TokenTransferTransitionV0 { + base, + amount, + recipient_id, + public_note, + shared_encrypted_note, + private_encrypted_note, + } = value; + + let mut drive_operations = vec![]; + + // Lookup the base action using the base transition data and contract information + let base_action = TokenBaseTransitionAction::try_from_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )? + .into_data()?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + // Return the TokenTransferTransitionActionV0 with the relevant data + Ok(( + TokenTransferTransitionActionV0 { + base: base_action, + amount, + recipient_id, + public_note, + shared_encrypted_note, + private_encrypted_note, + }, + fee_result, + )) + } + + /// Converts a borrowed `TokenTransferTransitionV0` into a `TokenTransferTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token transfer transition similarly to the `try_from_token_transfer_transition_with_contract_lookup` + /// method but operates on a borrowed reference of the `TokenTransferTransitionV0`. It performs the same checks and applies + /// the token transfer logic, while avoiding copying the `TokenTransferTransitionV0` struct. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the transfer. + /// * `value` - A reference to the `TokenTransferTransitionV0` struct containing the transition data, including token amount, + /// recipient details, and encrypted notes. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing transaction cost calculations when full state is not needed. + /// * `transaction` - The transaction context, which includes state details and necessary operations for the transition. + /// * `block_info` - Information about the current block to calculate the fees for the transition. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns the associated `DataContractFetchInfo`. + /// * `platform_version` - A reference to the platform version, ensuring that the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<(TokenTransferTransitionActionV0, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenTransferTransitionActionV0` and the calculated `FeeResult` if successful, or an error if the transition cannot + /// be created or an issue arises with the provided state or data. + pub fn try_from_borrowed_token_transfer_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenTransferTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result<(Self, FeeResult), Error> { + let TokenTransferTransitionV0 { + base, + amount, + recipient_id, + public_note, + shared_encrypted_note, + private_encrypted_note, + } = value; + + let mut drive_operations = vec![]; + + // Lookup the base action using the borrowed base transition data and contract information + let base_action = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )? + .into_data()?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + // Return the TokenTransferTransitionActionV0 with the relevant data + Ok(( + TokenTransferTransitionActionV0 { + base: base_action.into(), + amount: *amount, + recipient_id: *recipient_id, + public_note: public_note.clone(), + shared_encrypted_note: shared_encrypted_note.clone(), + private_encrypted_note: private_encrypted_note.clone(), + }, + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transition_action_type.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transition_action_type.rs new file mode 100644 index 00000000000..1d4e07a908e --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_transition_action_type.rs @@ -0,0 +1,23 @@ +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use dpp::state_transition::batch_transition::batched_transition::token_transition_action_type::{ + TokenTransitionActionType, TokenTransitionActionTypeGetter, +}; + +impl TokenTransitionActionTypeGetter for TokenTransitionAction { + fn action_type(&self) -> TokenTransitionActionType { + match self { + TokenTransitionAction::BurnAction(_) => TokenTransitionActionType::Burn, + TokenTransitionAction::MintAction(_) => TokenTransitionActionType::Mint, + TokenTransitionAction::TransferAction(_) => TokenTransitionActionType::Transfer, + TokenTransitionAction::FreezeAction(_) => TokenTransitionActionType::Freeze, + TokenTransitionAction::UnfreezeAction(_) => TokenTransitionActionType::Unfreeze, + TokenTransitionAction::EmergencyActionAction(_) => { + TokenTransitionActionType::EmergencyAction + } + TokenTransitionAction::DestroyFrozenFundsAction(_) => { + TokenTransitionActionType::DestroyFrozenFunds + } + TokenTransitionAction::ConfigUpdateAction(_) => TokenTransitionActionType::ConfigUpdate, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/mod.rs new file mode 100644 index 00000000000..ec55cb2835b --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/mod.rs @@ -0,0 +1,61 @@ +use derive_more::From; +use dpp::identifier::Identifier; + +/// transformer module for token freeze transition action +pub mod transformer; +mod v0; + +pub use v0::*; // re-export the v0 module items (including TokenIssuanceTransitionActionV0) + +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; + +/// Token freeze transition action +#[derive(Debug, Clone, From)] +pub enum TokenUnfreezeTransitionAction { + /// v0 + V0(TokenUnfreezeTransitionActionV0), +} + +impl TokenUnfreezeTransitionActionAccessorsV0 for TokenUnfreezeTransitionAction { + fn base(&self) -> &TokenBaseTransitionAction { + match self { + TokenUnfreezeTransitionAction::V0(v0) => &v0.base, + } + } + + fn base_owned(self) -> TokenBaseTransitionAction { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.base, + } + } + + fn frozen_identity_id(&self) -> Identifier { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.frozen_identity_id, + } + } + + fn set_frozen_identity_id(&mut self, id: Identifier) { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.frozen_identity_id = id, + } + } + + fn public_note(&self) -> Option<&String> { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.public_note.as_ref(), + } + } + + fn public_note_owned(self) -> Option<String> { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.public_note, + } + } + + fn set_public_note(&mut self, public_note: Option<String>) { + match self { + TokenUnfreezeTransitionAction::V0(v0) => v0.public_note = public_note, + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/transformer.rs new file mode 100644 index 00000000000..14df0f2fdf4 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/transformer.rs @@ -0,0 +1,117 @@ +use dpp::platform_value::Identifier; +use dpp::ProtocolError; +use grovedb::TransactionArg; +use std::sync::Arc; +use dpp::block::block_info::BlockInfo; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::{TokenUnfreezeTransitionActionV0, TokenUnfreezeTransitionAction}; +use dpp::state_transition::batch_transition::token_unfreeze_transition::TokenUnfreezeTransition; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::BatchedTransitionAction; + +/// Implement methods to transform a `TokenUnfreezeTransition` into a `TokenUnfreezeTransitionAction`. +impl TokenUnfreezeTransitionAction { + /// Transform a `TokenUnfreezeTransition` into a `TokenUnfreezeTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A `TokenUnfreezeTransition` instance. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenUnfreezeTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_token_unfreeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenUnfreezeTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenUnfreezeTransition::V0(v0) => { + TokenUnfreezeTransitionActionV0::try_from_token_unfreeze_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } + + /// Transform a borrowed `TokenUnfreezeTransition` into a `TokenUnfreezeTransitionAction` using the provided data contract lookup. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance used for accessing the system. + /// * `owner_id` - The identifier of the owner initiating the freeze transition. + /// * `transaction` - The transaction argument used for state changes. + /// * `value` - A reference to a `TokenUnfreezeTransition`. + /// * `approximate_without_state_for_costs` - A flag indicating whether to approximate state costs without full state. + /// * `drive_operations` - A mutable reference to the vector of low-level operations that need to be performed. + /// * `get_data_contract` - A closure that fetches the `DataContractFetchInfo` given a contract ID. + /// * `platform_version` - The platform version for the context in which the transition is being executed. + /// + /// # Returns + /// + /// * `Result<(ConsensusValidationResult<BatchedTransitionAction>, FeeResult), Error>` - A `TokenUnfreezeTransitionAction` if successful, otherwise `ProtocolError`. + pub fn try_from_borrowed_token_unfreeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenUnfreezeTransition, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + match value { + TokenUnfreezeTransition::V0(v0) => { + TokenUnfreezeTransitionActionV0::try_from_borrowed_token_unfreeze_transition_with_contract_lookup( + drive, + owner_id, + v0, + approximate_without_state_for_costs, + transaction, + block_info, + user_fee_increase, + get_data_contract, + platform_version, + ) + } + } + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/mod.rs new file mode 100644 index 00000000000..9dab3dfe50c --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/mod.rs @@ -0,0 +1,96 @@ +mod transformer; + +use std::sync::Arc; +use dpp::identifier::Identifier; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::{TokenBaseTransitionAction, TokenBaseTransitionActionAccessorsV0}; + +/// Token issuance transition action v0 +#[derive(Debug, Clone)] +pub struct TokenUnfreezeTransitionActionV0 { + /// Base token transition action + pub base: TokenBaseTransitionAction, + /// The identity to credit the token to + pub frozen_identity_id: Identifier, + /// A public note + pub public_note: Option<String>, +} + +/// Accessors for `TokenIssuanceTransitionActionV0` +pub trait TokenUnfreezeTransitionActionAccessorsV0 { + /// Returns a reference to the base token transition action + fn base(&self) -> &TokenBaseTransitionAction; + + /// Consumes self and returns the base token transition action + fn base_owned(self) -> TokenBaseTransitionAction; + + /// Consumes self and returns the identity balance holder ID + fn frozen_identity_id(&self) -> Identifier; + + /// Sets the identity balance holder ID + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier); + + /// Returns the token position in the contract + fn token_position(&self) -> u16 { + self.base().token_position() + } + + /// Returns the token ID + fn token_id(&self) -> Identifier { + self.base().token_id() + } + + /// Returns the data contract ID + fn data_contract_id(&self) -> Identifier { + self.base().data_contract_id() + } + + /// Returns a reference to the data contract fetch info + fn data_contract_fetch_info_ref(&self) -> &Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info_ref() + } + + /// Returns the data contract fetch info + fn data_contract_fetch_info(&self) -> Arc<DataContractFetchInfo> { + self.base().data_contract_fetch_info() + } + + /// Returns the public note (optional) + fn public_note(&self) -> Option<&String>; + + /// Returns the public note (owned) + fn public_note_owned(self) -> Option<String>; + + /// Sets the public note + fn set_public_note(&mut self, public_note: Option<String>); +} + +impl TokenUnfreezeTransitionActionAccessorsV0 for TokenUnfreezeTransitionActionV0 { + fn base(&self) -> &TokenBaseTransitionAction { + &self.base + } + + fn base_owned(self) -> TokenBaseTransitionAction { + self.base + } + + fn frozen_identity_id(&self) -> Identifier { + self.frozen_identity_id + } + + fn set_frozen_identity_id(&mut self, frozen_identity_id: Identifier) { + self.frozen_identity_id = frozen_identity_id; + } + + fn public_note(&self) -> Option<&String> { + self.public_note.as_ref() + } + + fn public_note_owned(self) -> Option<String> { + self.public_note + } + + fn set_public_note(&mut self, public_note: Option<String>) { + self.public_note = public_note; + } +} diff --git a/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/transformer.rs new file mode 100644 index 00000000000..b9c2dd5ca82 --- /dev/null +++ b/packages/rs-drive/src/state_transition_action/batch/batched_transition/token_transition/token_unfreeze_transition_action/v0/transformer.rs @@ -0,0 +1,232 @@ +use std::sync::Arc; +use grovedb::TransactionArg; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::token_unfreeze_transition::v0::TokenUnfreezeTransitionV0; +use dpp::ProtocolError; +use crate::drive::contract::DataContractFetchInfo; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_unfreeze_transition_action::v0::TokenUnfreezeTransitionActionV0; +use dpp::fee::fee_result::FeeResult; +use dpp::prelude::{ConsensusValidationResult, UserFeeIncrease}; +use platform_version::version::PlatformVersion; +use crate::drive::Drive; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction; +use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceAction; + +impl TokenUnfreezeTransitionActionV0 { + /// Converts a `TokenUnfreezeTransitionV0` into a `TokenUnfreezeTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token freezeing transition and returns the corresponding transition action + /// while looking up necessary data contracts and applying the relevant logic for freezeing. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance which handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the freezeing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `transaction` - A transaction context that includes the necessary state and other details for the transition. + /// * `value` - The `TokenUnfreezeTransitionV0` struct containing the transition data, including token amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to determine if costs should be approximated without considering + /// the full state for the operation. Useful for optimizing the transaction cost calculations. + /// * `block_info` - Information about the current block to calculate fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version, ensuring the transition respects version-specific logic. + /// + /// # Returns + /// + /// * `Result<ConsensusValidationResult<TokenUnfreezeTransitionActionV0>, Error>` - Returns the constructed `TokenUnfreezeTransitionActionV0` if successful, + /// or an error if any issue arises, such as missing data or an invalid state transition. + pub fn try_from_token_unfreeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: TokenUnfreezeTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenUnfreezeTransitionV0 { + base, + frozen_identity_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + &base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = BumpIdentityDataContractNonceAction::from_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::UnfreezeAction( + TokenUnfreezeTransitionActionV0 { + base: base_action, + frozen_identity_id, + public_note, + } + .into(), + )) + .into(), + fee_result, + )) + } + + /// Converts a borrowed `TokenUnfreezeTransitionV0` into a `TokenUnfreezeTransitionActionV0` using the provided contract lookup. + /// + /// This method processes the token freezeing transition and constructs the corresponding transition action while + /// looking up necessary data contracts and applying the relevant freezeing logic. It does not require `drive_operations` + /// to be passed as a parameter, but it manages them internally. + /// + /// # Arguments + /// + /// * `drive` - A reference to the `Drive` instance that handles data storage and retrieval. + /// * `owner_id` - The identifier of the owner initiating the freezeing transition. This is typically the identity + /// performing the transaction, such as the user's ID. + /// * `value` - A reference to the `TokenUnfreezeTransitionV0` struct containing the transition data, including token + /// amount and recipient. + /// * `approximate_without_state_for_costs` - A flag to indicate whether costs should be approximated without full + /// state consideration. Useful for optimizing transaction cost calculations in scenarios where full state is not needed. + /// * `transaction` - The transaction context, which includes the necessary state and other details for the transition. + /// * `block_info` - Information about the current block (e.g., epoch) to help calculate transaction fees. + /// * `get_data_contract` - A closure function that takes a contract identifier and returns a `DataContractFetchInfo` + /// containing the data contract details, including token configurations. + /// * `platform_version` - A reference to the platform version to ensure the transition respects version-specific logic. + /// + //// # Returns + /// + /// * `Result<(ConsensusValidationResult<TokenUnfreezeTransitionActionV0>, FeeResult), Error>` - Returns a tuple containing the constructed + /// `TokenUnfreezeTransitionActionV0` and a `FeeResult` if successful. If an error occurs (e.g., missing data or + /// invalid state transition), it returns an `Error`. + /// + pub fn try_from_borrowed_token_unfreeze_transition_with_contract_lookup( + drive: &Drive, + owner_id: Identifier, + value: &TokenUnfreezeTransitionV0, + approximate_without_state_for_costs: bool, + transaction: TransactionArg, + block_info: &BlockInfo, + user_fee_increase: UserFeeIncrease, + get_data_contract: impl Fn(Identifier) -> Result<Arc<DataContractFetchInfo>, ProtocolError>, + platform_version: &PlatformVersion, + ) -> Result< + ( + ConsensusValidationResult<BatchedTransitionAction>, + FeeResult, + ), + Error, + > { + let TokenUnfreezeTransitionV0 { + base, + frozen_identity_id, + public_note, + } = value; + + let mut drive_operations = vec![]; + + let base_action_validation_result = + TokenBaseTransitionAction::try_from_borrowed_base_transition_with_contract_lookup( + drive, + owner_id, + base, + approximate_without_state_for_costs, + transaction, + &mut drive_operations, + get_data_contract, + platform_version, + )?; + + let fee_result = Drive::calculate_fee( + None, + Some(drive_operations), + &block_info.epoch, + drive.config.epochs_per_era, + platform_version, + None, + )?; + + let base_action = match base_action_validation_result.is_valid() { + true => base_action_validation_result.into_data()?, + false => { + let bump_action = + BumpIdentityDataContractNonceAction::from_borrowed_token_base_transition( + base, + owner_id, + user_fee_increase, + ); + let batched_action = + BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action); + + return Ok(( + ConsensusValidationResult::new_with_data_and_errors( + batched_action.into(), + base_action_validation_result.errors, + ), + fee_result, + )); + } + }; + + Ok(( + BatchedTransitionAction::TokenAction(TokenTransitionAction::UnfreezeAction( + TokenUnfreezeTransitionActionV0 { + base: base_action, + frozen_identity_id: *frozen_identity_id, + public_note: public_note.clone(), + } + .into(), + )) + .into(), + fee_result, + )) + } +} diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs b/packages/rs-drive/src/state_transition_action/batch/mod.rs similarity index 60% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/mod.rs index 9d5891f0d1f..5aad18441e0 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/mod.rs @@ -1,5 +1,5 @@ -use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; -use crate::state_transition_action::document::documents_batch::v0::DocumentsBatchTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::v0::BatchTransitionActionV0; use derive_more::From; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; @@ -8,83 +8,83 @@ use dpp::identity::SecurityLevel; use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0; -/// document transition -pub mod document_transition; +/// batched transition +pub mod batched_transition; /// v0 pub mod v0; /// documents batch transition action #[derive(Debug, Clone, From)] -pub enum DocumentsBatchTransitionAction { +pub enum BatchTransitionAction { /// v0 - V0(DocumentsBatchTransitionActionV0), + V0(BatchTransitionActionV0), } -impl DocumentsBatchTransitionAction { +impl BatchTransitionAction { /// owner id pub fn owner_id(&self) -> Identifier { match self { - DocumentsBatchTransitionAction::V0(v0) => v0.owner_id, + BatchTransitionAction::V0(v0) => v0.owner_id, } } /// transitions - pub fn transitions(&self) -> &Vec<DocumentTransitionAction> { + pub fn transitions(&self) -> &Vec<BatchedTransitionAction> { match self { - DocumentsBatchTransitionAction::V0(v0) => &v0.transitions, + BatchTransitionAction::V0(v0) => &v0.transitions, } } /// transitions - pub fn transitions_mut(&mut self) -> &mut Vec<DocumentTransitionAction> { + pub fn transitions_mut(&mut self) -> &mut Vec<BatchedTransitionAction> { match self { - DocumentsBatchTransitionAction::V0(v0) => &mut v0.transitions, + BatchTransitionAction::V0(v0) => &mut v0.transitions, } } /// transitions - pub fn transitions_take(&mut self) -> Vec<DocumentTransitionAction> { + pub fn transitions_take(&mut self) -> Vec<BatchedTransitionAction> { match self { - DocumentsBatchTransitionAction::V0(v0) => std::mem::take(&mut v0.transitions), + BatchTransitionAction::V0(v0) => std::mem::take(&mut v0.transitions), } } /// transitions owned - pub fn transitions_owned(self) -> Vec<DocumentTransitionAction> { + pub fn transitions_owned(self) -> Vec<BatchedTransitionAction> { match self { - DocumentsBatchTransitionAction::V0(v0) => v0.transitions, + BatchTransitionAction::V0(v0) => v0.transitions, } } /// set transitions - pub fn set_transitions(&mut self, transitions: Vec<DocumentTransitionAction>) { + pub fn set_transitions(&mut self, transitions: Vec<BatchedTransitionAction>) { match self { - DocumentsBatchTransitionAction::V0(v0) => v0.transitions = transitions, + BatchTransitionAction::V0(v0) => v0.transitions = transitions, } } /// fee multiplier pub fn user_fee_increase(&self) -> UserFeeIncrease { match self { - DocumentsBatchTransitionAction::V0(transition) => transition.user_fee_increase, + BatchTransitionAction::V0(transition) => transition.user_fee_increase, } } } -impl DocumentsBatchTransitionAction { +impl BatchTransitionAction { /// The sum of all purchases amount and all conflicting index collateral voting funds pub fn all_used_balances(&self) -> Result<Option<Credits>, ProtocolError> { match self { - DocumentsBatchTransitionAction::V0(v0) => v0.all_used_balances(), + BatchTransitionAction::V0(v0) => v0.all_used_balances(), } } /// The sum of all purchases amounts for all purchase transitions in the batch pub fn all_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { match self { - DocumentsBatchTransitionAction::V0(v0) => v0.all_purchases_amount(), + BatchTransitionAction::V0(v0) => v0.all_purchases_amount(), } } @@ -93,9 +93,7 @@ impl DocumentsBatchTransitionAction { &self, ) -> Result<Option<Credits>, ProtocolError> { match self { - DocumentsBatchTransitionAction::V0(v0) => { - v0.all_conflicting_index_collateral_voting_funds() - } + BatchTransitionAction::V0(v0) => v0.all_conflicting_index_collateral_voting_funds(), } } @@ -136,28 +134,20 @@ impl DocumentsBatchTransitionAction { let mut highest_security_level = SecurityLevel::lowest_level(); for transition in self.transitions().iter() { - let document_type_name = transition - .base() - .ok_or(ProtocolError::CorruptedCodeExecution( - "expecting action to have a base".to_string(), - ))? - .document_type_name(); - let data_contract_info = transition - .base() - .ok_or(ProtocolError::CorruptedCodeExecution( - "expecting action to have a base".to_string(), - ))? - .data_contract_fetch_info(); - - let document_type = data_contract_info - .contract - .document_type_for_name(document_type_name)?; - - let document_security_level = document_type.security_level_requirement(); - - // lower enum enum representation means higher in security - if document_security_level < highest_security_level { - highest_security_level = document_security_level + if let BatchedTransitionAction::DocumentAction(document_transition) = transition { + let document_type_name = document_transition.base().document_type_name(); + let data_contract_info = document_transition.base().data_contract_fetch_info(); + + let document_type = data_contract_info + .contract + .document_type_for_name(document_type_name)?; + + let document_security_level = document_type.security_level_requirement(); + + // lower enum enum representation means higher in security + if document_security_level < highest_security_level { + highest_security_level = document_security_level + } } } Ok(if highest_security_level == SecurityLevel::MASTER { diff --git a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs b/packages/rs-drive/src/state_transition_action/batch/v0/mod.rs similarity index 68% rename from packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs rename to packages/rs-drive/src/state_transition_action/batch/v0/mod.rs index 295f0c45b4a..380fba6af73 100644 --- a/packages/rs-drive/src/state_transition_action/document/documents_batch/v0/mod.rs +++ b/packages/rs-drive/src/state_transition_action/batch/v0/mod.rs @@ -1,24 +1,27 @@ use dpp::fee::Credits; -use crate::state_transition_action::document::documents_batch::document_transition::DocumentTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction; use dpp::identifier::Identifier; use dpp::prelude::UserFeeIncrease; use dpp::ProtocolError; -use crate::state_transition_action::document::documents_batch::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_create_transition_action::DocumentCreateTransitionActionAccessorsV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_purchase_transition_action::DocumentPurchaseTransitionActionAccessorsV0; /// action v0 #[derive(Default, Debug, Clone)] -pub struct DocumentsBatchTransitionActionV0 { +pub struct BatchTransitionActionV0 { /// The owner making the transitions pub owner_id: Identifier, /// The inner transitions - pub transitions: Vec<DocumentTransitionAction>, + pub transitions: Vec<BatchedTransitionAction>, /// fee multiplier pub user_fee_increase: UserFeeIncrease, } -impl DocumentsBatchTransitionActionV0 { - pub(super) fn all_used_balances(&self) -> Result<Option<Credits>, ProtocolError> { +impl BatchTransitionActionV0 { + pub(in crate::state_transition_action) fn all_used_balances( + &self, + ) -> Result<Option<Credits>, ProtocolError> { Ok(match (self.all_purchases_amount()?, self.all_conflicting_index_collateral_voting_funds()?) { (Some(all_purchases_amount), Some(all_conflicting_index_collateral_voting_funds)) => Some(all_purchases_amount.checked_add(all_conflicting_index_collateral_voting_funds).ok_or(ProtocolError::Overflow("overflow between all_purchases_amount and all_conflicting_index_collateral_voting_funds"))?), (Some(all_purchases_amount), None) => Some(all_purchases_amount), @@ -26,12 +29,16 @@ impl DocumentsBatchTransitionActionV0 { (None, None) => None, }) } - pub(super) fn all_purchases_amount(&self) -> Result<Option<Credits>, ProtocolError> { + pub(in crate::state_transition_action) fn all_purchases_amount( + &self, + ) -> Result<Option<Credits>, ProtocolError> { let (total, any_purchases): (Option<Credits>, bool) = self .transitions .iter() .filter_map(|transition| match transition { - DocumentTransitionAction::PurchaseAction(purchase) => Some(purchase.price()), + BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::PurchaseAction(purchase), + ) => Some(purchase.price()), _ => None, }) .fold((None, false), |(acc, _), price| match acc { @@ -48,19 +55,19 @@ impl DocumentsBatchTransitionActionV0 { } } - pub(super) fn all_conflicting_index_collateral_voting_funds( + pub(in crate::state_transition_action) fn all_conflicting_index_collateral_voting_funds( &self, ) -> Result<Option<Credits>, ProtocolError> { let (total, any_voting_funds): (Option<Credits>, bool) = self .transitions .iter() .filter_map(|transition| match transition { - DocumentTransitionAction::CreateAction(document_create_transition_action) => { - document_create_transition_action - .prefunded_voting_balance() - .iter() - .try_fold(0u64, |acc, &(_, val)| acc.checked_add(val)) - } + BatchedTransitionAction::DocumentAction( + DocumentTransitionAction::CreateAction(document_create_transition_action), + ) => document_create_transition_action + .prefunded_voting_balance() + .iter() + .try_fold(0u64, |acc, &(_, val)| acc.checked_add(val)), _ => None, }) .fold((None, false), |(acc, _), price| match acc { diff --git a/packages/rs-drive/src/state_transition_action/document/mod.rs b/packages/rs-drive/src/state_transition_action/document/mod.rs deleted file mode 100644 index 1af2727c648..00000000000 --- a/packages/rs-drive/src/state_transition_action/document/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -/// documents_batch -pub mod documents_batch; diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs index 5f619841bb8..ac46cd5fda7 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/transformer.rs @@ -42,3 +42,66 @@ impl IdentityCreditWithdrawalTransitionAction { } } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::util::test_helpers::setup::setup_drive_with_initial_state_structure; + use dpp::identity::accessors::IdentityGettersV0; + use dpp::identity::{Identity, IdentityPublicKey}; + use dpp::state_transition::identity_credit_withdrawal_transition::v1::IdentityCreditWithdrawalTransitionV1; + + #[test] + fn test_try_from_identity_credit_withdrawal_without_address_and_multiple_transfer_keys() { + let drive = setup_drive_with_initial_state_structure(None); + + let platform_version = PlatformVersion::latest(); + + let mut identity = Identity::random_identity(1, Some(64), &platform_version) + .expect("create random identity"); + + let (transfer_key1, _) = + IdentityPublicKey::random_masternode_transfer_key(2, Some(64), &platform_version) + .expect("create random masternode transfer key"); + let (transfer_key2, _) = + IdentityPublicKey::random_masternode_transfer_key(3, Some(64), &platform_version) + .expect("create random masternode transfer key"); + + identity.add_public_keys([transfer_key1, transfer_key2]); + + let identity_id = identity.id(); + + drive + .add_new_identity( + identity, + true, + &BlockInfo::default(), + true, + None, + platform_version, + ) + .expect("create new identity"); + + let transition = + IdentityCreditWithdrawalTransition::V1(IdentityCreditWithdrawalTransitionV1 { + identity_id, + nonce: 0, + amount: 0, + core_fee_per_byte: 0, + pooling: Default::default(), + output_script: None, + user_fee_increase: 0, + signature_public_key_id: 0, + signature: Default::default(), + }); + + IdentityCreditWithdrawalTransitionAction::try_from_identity_credit_withdrawal( + &drive, + None, + &transition, + &BlockInfo::default(), + platform_version, + ) + .expect("create action"); + } +} diff --git a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs index e2c443d9ab7..bf4f38b651a 100644 --- a/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/identity/identity_credit_withdrawal/v0/transformer.rs @@ -93,7 +93,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { let key_request = IdentityKeysRequest { identity_id: identity_credit_withdrawal.identity_id.to_buffer(), request_type: KeyRequestType::RecentWithdrawalKeys, - limit: None, + limit: Some(1), offset: None, }; let key: Option<IdentityPublicKey> = @@ -177,7 +177,7 @@ impl IdentityCreditWithdrawalTransitionActionV0 { let withdrawal_document = DocumentV0 { id: document_id, owner_id: identity_credit_withdrawal.identity_id, - properties: document_data.into_btree_string_map().unwrap(), + properties: document_data.into_btree_string_map()?, revision: Some(1), created_at: Some(block_info.time_ms), updated_at: Some(block_info.time_ms), diff --git a/packages/rs-drive/src/state_transition_action/mod.rs b/packages/rs-drive/src/state_transition_action/mod.rs index c4e9d8477cf..13600ca2cc0 100644 --- a/packages/rs-drive/src/state_transition_action/mod.rs +++ b/packages/rs-drive/src/state_transition_action/mod.rs @@ -1,7 +1,5 @@ /// contract pub mod contract; -/// documents -pub mod document; /// identity pub mod identity; @@ -9,10 +7,12 @@ pub mod identity; pub mod system; // TODO: Must crate only but we need to remove of use it first pub mod action_convert_to_operations; +/// documents_batch +pub mod batch; +use crate::state_transition_action::batch::BatchTransitionAction; use crate::state_transition_action::contract::data_contract_create::DataContractCreateTransitionAction; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; -use crate::state_transition_action::document::documents_batch::DocumentsBatchTransitionAction; use crate::state_transition_action::identity::identity_create::IdentityCreateTransitionAction; use crate::state_transition_action::identity::identity_credit_transfer::IdentityCreditTransferTransitionAction; use crate::state_transition_action::identity::identity_credit_withdrawal::IdentityCreditWithdrawalTransitionAction; @@ -38,8 +38,8 @@ pub enum StateTransitionAction { DataContractCreateAction(DataContractCreateTransitionAction), /// data contract update DataContractUpdateAction(DataContractUpdateTransitionAction), - /// documents batch - DocumentsBatchAction(DocumentsBatchTransitionAction), + /// batch + BatchAction(BatchTransitionAction), /// identity create IdentityCreateAction(IdentityCreateTransitionAction), /// identity topup @@ -71,7 +71,7 @@ impl StateTransitionAction { match self { StateTransitionAction::DataContractCreateAction(action) => action.user_fee_increase(), StateTransitionAction::DataContractUpdateAction(action) => action.user_fee_increase(), - StateTransitionAction::DocumentsBatchAction(action) => action.user_fee_increase(), + StateTransitionAction::BatchAction(action) => action.user_fee_increase(), StateTransitionAction::IdentityCreateAction(action) => action.user_fee_increase(), StateTransitionAction::IdentityTopUpAction(action) => action.user_fee_increase(), StateTransitionAction::IdentityCreditWithdrawalAction(action) => { diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs index e5c8c190740..e0691b16e68 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/transformer.rs @@ -1,13 +1,100 @@ use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; - +use dpp::ProtocolError; +use dpp::state_transition::batch_transition::batched_transition::BatchedTransitionRef; +use dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::token_transition::TokenTransitionV0Methods; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransition; -use dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use dpp::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use dpp::state_transition::batch_transition::token_base_transition::TokenBaseTransition; +use crate::error::Error; +use crate::state_transition_action::batch::batched_transition::BatchedTransitionAction; use crate::state_transition_action::contract::data_contract_update::DataContractUpdateTransitionAction; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionAction; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionAction; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionV0}; impl BumpIdentityDataContractNonceAction { + /// from borrowed base transition + pub fn from_batched_transition_ref( + value: BatchedTransitionRef, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + match value { + BatchedTransitionRef::Document(document) => { + Self::from_borrowed_document_base_transition( + document.base(), + identity_id, + user_fee_increase, + ) + } + BatchedTransitionRef::Token(token) => Self::from_borrowed_token_base_transition( + token.base(), + identity_id, + user_fee_increase, + ), + } + } + + /// helper method + pub fn try_from_batched_transition_action( + value: BatchedTransitionAction, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Result<Self, Error> { + match value { + BatchedTransitionAction::DocumentAction(document) => { + Ok(Self::from_document_base_transition_action( + document.base_owned(), + identity_id, + user_fee_increase, + )) + } + BatchedTransitionAction::TokenAction(token) => Ok(Self::from_token_base_transition_action( + token.base_owned(), + identity_id, + user_fee_increase, + )), + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => { + Err(Error::Protocol( + ProtocolError::CorruptedCodeExecution( + "we should never be trying to convert from a BumpIdentityDataContractNonce to a BumpIdentityDataContractNonceAction".to_string(), + ), + )) + } + } + } + + /// helper method + pub fn try_from_borrowed_batched_transition_action( + value: &BatchedTransitionAction, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Result<Self, Error> { + match value { + BatchedTransitionAction::DocumentAction(document) => { + Ok(Self::from_borrowed_document_base_transition_action( + document.base(), + identity_id, + user_fee_increase, + )) + } + BatchedTransitionAction::TokenAction(token) => Ok(Self::from_borrowed_token_base_transition_action( + token.base(), + identity_id, + user_fee_increase, + )), + BatchedTransitionAction::BumpIdentityDataContractNonce(_) => { + Err(Error::Protocol( + ProtocolError::CorruptedCodeExecution( + "we should never be trying to convert from a BumpIdentityDataContractNonce to a BumpIdentityDataContractNonceAction".to_string(), + ), + )) + } + } + } + /// from base transition pub fn from_document_base_transition( value: DocumentBaseTransition, @@ -16,7 +103,7 @@ impl BumpIdentityDataContractNonceAction { ) -> Self { match value { DocumentBaseTransition::V0(v0) => { - BumpIdentityDataContractNonceActionV0::from_base_transition( + BumpIdentityDataContractNonceActionV0::from_document_base_transition( v0, identity_id, user_fee_increase, @@ -34,7 +121,7 @@ impl BumpIdentityDataContractNonceAction { ) -> Self { match value { DocumentBaseTransition::V0(v0) => { - BumpIdentityDataContractNonceActionV0::from_borrowed_base_transition( + BumpIdentityDataContractNonceActionV0::from_borrowed_document_base_transition( v0, identity_id, user_fee_increase, @@ -52,7 +139,7 @@ impl BumpIdentityDataContractNonceAction { ) -> Self { match value { DocumentBaseTransitionAction::V0(v0) => { - BumpIdentityDataContractNonceActionV0::from_base_transition_action( + BumpIdentityDataContractNonceActionV0::from_document_base_transition_action( v0, identity_id, user_fee_increase, @@ -70,7 +157,79 @@ impl BumpIdentityDataContractNonceAction { ) -> Self { match value { DocumentBaseTransitionAction::V0(v0) => { - BumpIdentityDataContractNonceActionV0::from_borrowed_base_transition_action( + BumpIdentityDataContractNonceActionV0::from_borrowed_document_base_transition_action( + v0, + identity_id, + user_fee_increase, + ) + .into() + } + } + } + + /// from base transition + pub fn from_token_base_transition( + value: TokenBaseTransition, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + match value { + TokenBaseTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_token_base_transition( + v0, + identity_id, + user_fee_increase, + ) + .into() + } + } + } + + /// from borrowed base transition + pub fn from_borrowed_token_base_transition( + value: &TokenBaseTransition, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + match value { + TokenBaseTransition::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_token_base_transition( + v0, + identity_id, + user_fee_increase, + ) + .into() + } + } + } + + /// from base transition + pub fn from_token_base_transition_action( + value: TokenBaseTransitionAction, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + match value { + TokenBaseTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_token_base_transition_action( + v0, + identity_id, + user_fee_increase, + ) + .into() + } + } + } + + /// from borrowed base transition + pub fn from_borrowed_token_base_transition_action( + value: &TokenBaseTransitionAction, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + match value { + TokenBaseTransitionAction::V0(v0) => { + BumpIdentityDataContractNonceActionV0::from_borrowed_token_base_transition_action( v0, identity_id, user_fee_increase, diff --git a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs index 42a99127900..c87a865a70c 100644 --- a/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs +++ b/packages/rs-drive/src/state_transition_action/system/bump_identity_data_contract_nonce_action/v0/transformer.rs @@ -3,14 +3,16 @@ use dpp::platform_value::Identifier; use dpp::prelude::UserFeeIncrease; use dpp::state_transition::data_contract_update_transition::DataContractUpdateTransitionV0; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dpp::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dpp::state_transition::batch_transition::token_base_transition::v0::TokenBaseTransitionV0; use crate::state_transition_action::contract::data_contract_update::v0::DataContractUpdateTransitionActionV0; -use crate::state_transition_action::document::documents_batch::document_transition::document_base_transition_action::DocumentBaseTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionV0; +use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionV0; use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::BumpIdentityDataContractNonceActionV0; impl BumpIdentityDataContractNonceActionV0 { /// from base transition - pub fn from_base_transition( + pub fn from_document_base_transition( value: DocumentBaseTransitionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, @@ -29,7 +31,7 @@ impl BumpIdentityDataContractNonceActionV0 { } /// from borrowed base transition - pub fn from_borrowed_base_transition( + pub fn from_borrowed_document_base_transition( value: &DocumentBaseTransitionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, @@ -48,7 +50,7 @@ impl BumpIdentityDataContractNonceActionV0 { } /// from base transition - pub fn from_base_transition_action( + pub fn from_document_base_transition_action( value: DocumentBaseTransitionActionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, @@ -67,7 +69,7 @@ impl BumpIdentityDataContractNonceActionV0 { } /// from borrowed base transition - pub fn from_borrowed_base_transition_action( + pub fn from_borrowed_document_base_transition_action( value: &DocumentBaseTransitionActionV0, identity_id: Identifier, user_fee_increase: UserFeeIncrease, @@ -85,6 +87,82 @@ impl BumpIdentityDataContractNonceActionV0 { } } + /// from base transition + pub fn from_token_base_transition( + value: TokenBaseTransitionV0, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + let TokenBaseTransitionV0 { + data_contract_id, + identity_contract_nonce, + .. + } = value; + BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id, + identity_contract_nonce, + user_fee_increase, + } + } + + /// from borrowed base transition + pub fn from_borrowed_token_base_transition( + value: &TokenBaseTransitionV0, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + let TokenBaseTransitionV0 { + data_contract_id, + identity_contract_nonce, + .. + } = value; + BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: *data_contract_id, + identity_contract_nonce: *identity_contract_nonce, + user_fee_increase, + } + } + + /// from base transition + pub fn from_token_base_transition_action( + value: TokenBaseTransitionActionV0, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + let TokenBaseTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: data_contract.contract.id(), + identity_contract_nonce, + user_fee_increase, + } + } + + /// from borrowed base transition + pub fn from_borrowed_token_base_transition_action( + value: &TokenBaseTransitionActionV0, + identity_id: Identifier, + user_fee_increase: UserFeeIncrease, + ) -> Self { + let TokenBaseTransitionActionV0 { + data_contract, + identity_contract_nonce, + .. + } = value; + BumpIdentityDataContractNonceActionV0 { + identity_id, + data_contract_id: data_contract.contract.id(), + identity_contract_nonce: *identity_contract_nonce, + user_fee_increase, + } + } + /// from data contract update pub fn from_data_contract_update(value: DataContractUpdateTransitionV0) -> Self { let DataContractUpdateTransitionV0 { diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs b/packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs index de4fecc4c41..0b719f85d48 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/drive_methods/convert_drive_operations_to_grove_operations/v0/mod.rs @@ -30,7 +30,7 @@ impl Drive { /// Returns a `Result` containing a `GroveDbOpBatch` with transformed grove database operations, /// or an error if any step in the conversion process fails. #[inline(always)] - pub(crate) fn convert_drive_operations_to_grove_operations_v0( + pub(super) fn convert_drive_operations_to_grove_operations_v0( &self, drive_batch_operations: Vec<DriveOperation>, block_info: &BlockInfo, diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/group.rs b/packages/rs-drive/src/util/batch/drive_op_batch/group.rs new file mode 100644 index 00000000000..ce1a193c451 --- /dev/null +++ b/packages/rs-drive/src/util/batch/drive_op_batch/group.rs @@ -0,0 +1,68 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::batch::drive_op_batch::DriveLowLevelOperationConverter; +use dpp::block::block_info::BlockInfo; +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::identifier::Identifier; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +/// Group operations requiring many people to agree to something for the action to occur. +#[derive(Clone, Debug)] +pub enum GroupOperationType { + /// Adds a group action + AddGroupAction { + /// The contract id + contract_id: Identifier, + /// The group contract position + group_contract_position: GroupContractPosition, + /// Initialize with the action info + initialize_with_insert_action_info: Option<GroupAction>, + /// The action id + action_id: Identifier, + /// The identity that is signing + signer_identity_id: Identifier, + /// The signer's power in the group + signer_power: GroupMemberPower, + }, +} + +impl DriveLowLevelOperationConverter for GroupOperationType { + fn into_low_level_drive_operations( + self, + drive: &Drive, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match self { + GroupOperationType::AddGroupAction { + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + } => drive.add_group_action_operations( + contract_id, + group_contract_position, + initialize_with_insert_action_info, + action_id, + signer_identity_id, + signer_power, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + ), + } + } +} diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs b/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs index abdd9f4cc6d..8ccfc485785 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/mod.rs @@ -2,9 +2,11 @@ mod contract; mod document; mod drive_methods; mod finalize_task; +mod group; mod identity; mod prefunded_specialized_balance; mod system; +mod token; mod withdrawals; use crate::util::batch::GroveDbOpBatch; @@ -19,9 +21,11 @@ pub use document::DocumentOperation; pub use document::DocumentOperationType; pub use document::DocumentOperationsForContractDocumentType; pub use document::UpdateOperationInfo; +pub use group::GroupOperationType; pub use identity::IdentityOperationType; pub use prefunded_specialized_balance::PrefundedSpecializedBalanceOperationType; pub use system::SystemOperationType; +pub use token::TokenOperationType; pub use withdrawals::WithdrawalOperationType; use grovedb::{EstimatedLayerInformation, TransactionArg}; @@ -69,6 +73,8 @@ pub enum DriveOperation<'a> { DataContractOperation(DataContractOperationType<'a>), /// A document operation DocumentOperation(DocumentOperationType<'a>), + /// A token operation + TokenOperation(TokenOperationType), /// Withdrawal operation WithdrawalOperation(WithdrawalOperationType), /// An identity operation @@ -77,6 +83,8 @@ pub enum DriveOperation<'a> { PrefundedSpecializedBalanceOperation(PrefundedSpecializedBalanceOperationType), /// A system operation SystemOperation(SystemOperationType), + /// A group operation + GroupOperation(GroupOperationType), /// A single low level groveDB operation GroveDBOperation(QualifiedGroveDbOp), /// Multiple low level groveDB operations @@ -152,6 +160,22 @@ impl DriveLowLevelOperationConverter for DriveOperation<'_> { .into_iter() .map(GroveOperation) .collect()), + DriveOperation::TokenOperation(token_operation_type) => token_operation_type + .into_low_level_drive_operations( + drive, + estimated_costs_only_with_layer_info, + block_info, + transaction, + platform_version, + ), + DriveOperation::GroupOperation(group_operation_type) => group_operation_type + .into_low_level_drive_operations( + drive, + estimated_costs_only_with_layer_info, + block_info, + transaction, + platform_version, + ), } } } @@ -199,16 +223,16 @@ mod tests { use super::*; + use crate::util::test_helpers::setup_contract; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; + use dpp::data_contract::DataContract; use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::tests::json_document::{json_document_to_contract, json_document_to_document}; use dpp::util::cbor_serializer; use rand::Rng; use serde_json::json; - use crate::util::test_helpers::setup_contract; - use crate::util::batch::drive_op_batch::document::DocumentOperation::{ AddOperation, UpdateOperation, }; @@ -579,7 +603,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -690,7 +717,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract-only-age-index.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract @@ -907,7 +937,10 @@ mod tests { &drive, "tests/supporting_files/contract/family/family-contract-only-age-index.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let document_type = contract diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/token.rs b/packages/rs-drive/src/util/batch/drive_op_batch/token.rs new file mode 100644 index 00000000000..ad08114540e --- /dev/null +++ b/packages/rs-drive/src/util/batch/drive_op_batch/token.rs @@ -0,0 +1,208 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::batch::drive_op_batch::DriveLowLevelOperationConverter; +use dpp::balances::credits::TokenAmount; +use dpp::block::block_info::BlockInfo; +use dpp::identifier::Identifier; +use dpp::prelude::IdentityNonce; +use dpp::tokens::status::TokenStatus; +use dpp::tokens::token_event::TokenEvent; +use grovedb::batch::KeyInfoPath; +use grovedb::{EstimatedLayerInformation, TransactionArg}; +use platform_version::version::PlatformVersion; +use std::collections::HashMap; + +/// Operations on Tokens +#[derive(Clone, Debug)] +pub enum TokenOperationType { + /// Burns token from the account issuing the action. + TokenBurn { + /// The token id + token_id: Identifier, + /// The identity to burn from + identity_balance_holder_id: Identifier, + /// The amount to burn + burn_amount: TokenAmount, + }, + /// Mints tokens + TokenMint { + /// The token id + token_id: Identifier, + /// The identity to burn from + identity_balance_holder_id: Identifier, + /// The amount to issue + mint_amount: TokenAmount, + /// Should we allow this to be the first ever mint + allow_first_mint: bool, + }, + /// Performs a token transfer + TokenTransfer { + /// The token id + token_id: Identifier, + /// The token id + sender_id: Identifier, + /// The recipient of the transfer + recipient_id: Identifier, + /// The amount to transfer + amount: TokenAmount, + }, + /// Freezes an identity's token balance so money can no longer be sent out. + TokenFreeze { + /// The token id + token_id: Identifier, + /// The frozen identity id + frozen_identity_id: Identifier, + }, + /// Unfreezes an identity's token balance so money can be sent out again. + TokenUnfreeze { + /// The token id + token_id: Identifier, + /// The frozen identity id + frozen_identity_id: Identifier, + }, + /// Sets the status of the token. + TokenSetStatus { + /// The token id + token_id: Identifier, + /// The status + status: TokenStatus, + }, + /// Adds a historical document explaining a token action. + TokenHistory { + /// The token id + token_id: Identifier, + /// The identity making the event + owner_id: Identifier, + /// The nonce + nonce: IdentityNonce, + /// The token event + event: TokenEvent, + }, +} + +impl DriveLowLevelOperationConverter for TokenOperationType { + fn into_low_level_drive_operations( + self, + drive: &Drive, + estimated_costs_only_with_layer_info: &mut Option< + HashMap<KeyInfoPath, EstimatedLayerInformation>, + >, + block_info: &BlockInfo, + transaction: TransactionArg, + platform_version: &PlatformVersion, + ) -> Result<Vec<LowLevelDriveOperation>, Error> { + match self { + TokenOperationType::TokenBurn { + token_id, + identity_balance_holder_id, + burn_amount, + } => { + let token_id_bytes: [u8; 32] = token_id.to_buffer(); + let identity_id_bytes: [u8; 32] = identity_balance_holder_id.to_buffer(); + let batch_operations = drive.token_burn_operations( + token_id_bytes, + identity_id_bytes, + burn_amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenMint { + token_id, + identity_balance_holder_id, + mint_amount, + allow_first_mint, + } => { + let token_id_bytes: [u8; 32] = token_id.to_buffer(); + let identity_id_bytes: [u8; 32] = identity_balance_holder_id.to_buffer(); + let batch_operations = drive.token_mint_operations( + token_id_bytes, + identity_id_bytes, + mint_amount, + allow_first_mint, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenTransfer { + token_id, + sender_id, + recipient_id, + amount, + } => { + let token_id_bytes: [u8; 32] = token_id.to_buffer(); + let sender_id_bytes: [u8; 32] = sender_id.to_buffer(); + let recipient_id_bytes: [u8; 32] = recipient_id.to_buffer(); + + let batch_operations = drive.token_transfer_operations( + token_id_bytes, + sender_id_bytes, + recipient_id_bytes, + amount, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenHistory { + token_id, + owner_id, + nonce, + event, + } => { + let batch_operations = drive.add_token_transaction_history_operations( + token_id, + owner_id, + nonce, + event, + block_info, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenFreeze { + token_id, + frozen_identity_id, + } => { + let batch_operations = drive.token_freeze_operations( + token_id, + frozen_identity_id, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenUnfreeze { + token_id, + frozen_identity_id, + } => { + let batch_operations = drive.token_unfreeze_operations( + token_id, + frozen_identity_id, + estimated_costs_only_with_layer_info, + transaction, + platform_version, + )?; + Ok(batch_operations) + } + TokenOperationType::TokenSetStatus { token_id, status } => { + let batch_operations = drive.token_apply_status_operations( + token_id.to_buffer(), + status, + estimated_costs_only_with_layer_info, + platform_version, + )?; + Ok(batch_operations) + } + } + } +} diff --git a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs index 26bf6617a78..8146f534d71 100644 --- a/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs +++ b/packages/rs-drive/src/util/batch/drive_op_batch/withdrawals.rs @@ -18,7 +18,7 @@ use dpp::fee::{Credits, SignedCredits}; use dpp::prelude::TimestampMillis; use dpp::version::PlatformVersion; use dpp::withdrawal::{WithdrawalTransactionIndex, WithdrawalTransactionIndexAndBytes}; -use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, TransactionArg}; +use grovedb::{batch::KeyInfoPath, EstimatedLayerInformation, MaybeTree, TransactionArg}; use grovedb::{Element, PathQuery, SizedQuery}; /// Operations for Withdrawals @@ -164,7 +164,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { true, // we know that we are not deleting a subtree BatchMoveApplyType::StatefulBatchMove { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut drive_operations, @@ -205,7 +205,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { true, // we know that we are not deleting a subtree BatchMoveApplyType::StatefulBatchMove { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut drive_operations, @@ -244,7 +244,7 @@ impl DriveLowLevelOperationConverter for WithdrawalOperationType { true, // we know that we are not deleting a subtree BatchDeleteApplyType::StatefulBatchDelete { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }, transaction, &mut drive_operations, diff --git a/packages/rs-drive/src/util/batch/grovedb_op_batch/mod.rs b/packages/rs-drive/src/util/batch/grovedb_op_batch/mod.rs index 67d5f8908ea..ecf25027e2f 100644 --- a/packages/rs-drive/src/util/batch/grovedb_op_batch/mod.rs +++ b/packages/rs-drive/src/util/batch/grovedb_op_batch/mod.rs @@ -13,7 +13,7 @@ use dpp::prelude::Identifier; use grovedb::batch::key_info::KeyInfo; use grovedb::batch::{GroveDbOpConsistencyResults, GroveOp, KeyInfoPath, QualifiedGroveDbOp}; use grovedb::operations::proof::util::hex_to_ascii; -use grovedb::Element; +use grovedb::{Element, TreeType}; use std::borrow::Cow; use std::fmt; @@ -52,6 +52,7 @@ enum KnownPath { TokenBalancesRoot, //Level 1 VersionsRoot, //Level 1 VotesRoot, //Level 1 + GroupActionsRoot, //Level 1 } impl From<RootTree> for KnownPath { @@ -71,9 +72,10 @@ impl From<RootTree> for KnownPath { RootTree::Misc => KnownPath::MiscRoot, RootTree::WithdrawalTransactions => KnownPath::WithdrawalTransactionsRoot, RootTree::Balances => KnownPath::BalancesRoot, - RootTree::TokenBalances => KnownPath::TokenBalancesRoot, + RootTree::Tokens => KnownPath::TokenBalancesRoot, RootTree::Versions => KnownPath::VersionsRoot, RootTree::Votes => KnownPath::VotesRoot, + RootTree::GroupActions => KnownPath::GroupActionsRoot, } } } @@ -358,7 +360,7 @@ pub trait GroveDbOpBatchV0Methods { fn add_delete(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>); /// Adds a `Delete` tree operation to a list of GroveDB ops. - fn add_delete_tree(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>, is_sum_tree: bool); + fn add_delete_tree(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>, tree_type: TreeType); /// Adds an `Insert` operation with an element to a list of GroveDB ops. fn add_insert(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>, element: Element); @@ -510,9 +512,9 @@ impl GroveDbOpBatchV0Methods for GroveDbOpBatch { } /// Adds a `Delete` tree operation to a list of GroveDB ops. - fn add_delete_tree(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>, is_sum_tree: bool) { + fn add_delete_tree(&mut self, path: Vec<Vec<u8>>, key: Vec<u8>, tree_type: TreeType) { self.operations - .push(QualifiedGroveDbOp::delete_tree_op(path, key, is_sum_tree)) + .push(QualifiedGroveDbOp::delete_tree_op(path, key, tree_type)) } /// Adds an `Insert` operation with an element to a list of GroveDB ops. diff --git a/packages/rs-drive/src/util/grove_operations/batch_delete/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_delete/v0/mod.rs index 25a083ced3c..bc774456306 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_delete/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_delete/v0/mod.rs @@ -32,7 +32,7 @@ impl Drive { }; let delete_operation = match apply_type { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_key_size, estimated_value_size, } => GroveDb::average_case_delete_operation_for_delete::<RocksDbStorage>( diff --git a/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs index a530776986d..3ae43af7c82 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_delete_items_in_path_query/v0/mod.rs @@ -87,7 +87,7 @@ impl Drive { }; let delete_operation = match apply_type { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_key_size, estimated_value_size, } => GroveDb::average_case_delete_operation_for_delete::<RocksDbStorage>( @@ -136,14 +136,14 @@ mod tests { util::grove_operations::BatchDeleteApplyType, }; use assert_matches::assert_matches; - use grovedb::SizedQuery; + use grovedb::{SizedQuery, TreeType}; use grovedb_path::SubtreePath; use platform_version::version::PlatformVersion; #[test] fn test_batch_delete_items_in_path_query_success() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -234,7 +234,7 @@ mod tests { #[test] fn test_batch_delete_items_in_path_query_range_query() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -379,7 +379,7 @@ mod tests { #[test] fn test_batch_delete_items_in_path_query_no_elements() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -455,7 +455,7 @@ mod tests { #[test] fn test_batch_delete_items_in_path_query_intermediate_path_missing() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -491,7 +491,7 @@ mod tests { #[test] fn test_batch_delete_items_in_path_query_stateless_delete() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -533,7 +533,7 @@ mod tests { // Set up the stateless apply type with estimated sizes let apply_type = BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree: false, + in_tree_type: TreeType::NormalTree, estimated_key_size: key.len() as u32, estimated_value_size: element .serialized_size(&platform_version.drive.grove_version) diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/mod.rs new file mode 100644 index 00000000000..2a2a033ff46 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/mod.rs @@ -0,0 +1,52 @@ +mod v0; + +use crate::util::object_size_info::DriveKeyInfo; +use crate::util::storage_flags::StorageFlags; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use dpp::version::drive_versions::DriveVersion; + +impl Drive { + /// Pushes an "insert empty tree" operation to `drive_operations`. + /// + /// # Parameters + /// * `path`: The path to insert an empty tree. + /// * `key_info`: The key information of the document. + /// * `storage_flags`: Storage options for the operation. + /// * `drive_operations`: The vector containing low-level drive operations. + /// * `drive_version`: The drive version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(())` if the operation was successful. + /// * `Err(DriveError::UnknownVersionMismatch)` if the drive version does not match known versions. + pub fn batch_insert_empty_sum_tree<'a, 'c, P>( + &'a self, + path: P, + key_info: DriveKeyInfo<'c>, + storage_flags: Option<&StorageFlags>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<(), Error> + where + P: IntoIterator<Item = &'c [u8]>, + <P as IntoIterator>::IntoIter: ExactSizeIterator + DoubleEndedIterator + Clone, + { + match drive_version + .grove_methods + .batch + .batch_insert_empty_sum_tree + { + 0 => { + self.batch_insert_empty_sum_tree_v0(path, key_info, storage_flags, drive_operations) + } + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_insert_empty_sum_tree".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/v0/mod.rs new file mode 100644 index 00000000000..ce546e65907 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_sum_tree/v0/mod.rs @@ -0,0 +1,53 @@ +use crate::drive::Drive; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::DriveKeyInfo; +use crate::util::object_size_info::DriveKeyInfo::{Key, KeyRef, KeySize}; +use crate::util::storage_flags::StorageFlags; +use grovedb::batch::KeyInfoPath; + +impl Drive { + /// Pushes an "insert empty tree" operation to `drive_operations`. + pub(super) fn batch_insert_empty_sum_tree_v0<'a, 'c, P>( + &'a self, + path: P, + key_info: DriveKeyInfo<'c>, + storage_flags: Option<&StorageFlags>, + drive_operations: &mut Vec<LowLevelDriveOperation>, + ) -> Result<(), Error> + where + P: IntoIterator<Item = &'c [u8]>, + <P as IntoIterator>::IntoIter: ExactSizeIterator + DoubleEndedIterator + Clone, + { + match key_info { + KeyRef(key) => { + let path_items: Vec<Vec<u8>> = path.into_iter().map(Vec::from).collect(); + drive_operations.push(LowLevelDriveOperation::for_known_path_key_empty_sum_tree( + path_items, + key.to_vec(), + storage_flags, + )); + Ok(()) + } + KeySize(key) => { + drive_operations.push( + LowLevelDriveOperation::for_estimated_path_key_empty_sum_tree( + KeyInfoPath::from_known_path(path), + key, + storage_flags, + ), + ); + Ok(()) + } + Key(key) => { + let path_items: Vec<Vec<u8>> = path.into_iter().map(Vec::from).collect(); + drive_operations.push(LowLevelDriveOperation::for_known_path_key_empty_sum_tree( + path_items, + key, + storage_flags, + )); + Ok(()) + } + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/mod.rs index a4f630e691e..5425de9741b 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/mod.rs @@ -10,7 +10,7 @@ use crate::error::Error; use crate::fees::op::LowLevelDriveOperation; use dpp::version::drive_versions::DriveVersion; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Pushes an "insert empty tree where path key does not yet exist" operation to `drive_operations`. @@ -19,7 +19,7 @@ impl Drive { pub fn batch_insert_empty_tree_if_not_exists<const N: usize>( &self, path_key_info: PathKeyInfo<N>, - use_sum_tree: bool, + tree_type: TreeType, storage_flags: Option<&StorageFlags>, apply_type: BatchInsertTreeApplyType, transaction: TransactionArg, @@ -34,7 +34,7 @@ impl Drive { { 0 => self.batch_insert_empty_tree_if_not_exists_v0( path_key_info, - use_sum_tree, + tree_type, storage_flags, apply_type, transaction, diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/v0/mod.rs index 4f2c30664c7..48b6760cf5d 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_empty_tree_if_not_exists/v0/mod.rs @@ -1,8 +1,8 @@ use crate::drive::Drive; use crate::error::drive::DriveError; use crate::error::Error; -use crate::fees::op::LowLevelDriveOperation; use crate::fees::op::LowLevelDriveOperation::GroveOperation; +use crate::fees::op::{LowLevelDriveOperation, LowLevelDriveOperationTreeTypeConverter}; use crate::util::grove_operations::BatchInsertTreeApplyType; use crate::util::object_size_info::PathKeyInfo; use crate::util::object_size_info::PathKeyInfo::{ @@ -11,15 +11,15 @@ use crate::util::object_size_info::PathKeyInfo::{ use crate::util::storage_flags::StorageFlags; use dpp::version::drive_versions::DriveVersion; use grovedb::batch::GroveOp; -use grovedb::TransactionArg; +use grovedb::{TransactionArg, TreeType}; impl Drive { /// Pushes an "insert empty tree where path key does not yet exist" operation to `drive_operations`. /// Will also check the current drive operations - pub(crate) fn batch_insert_empty_tree_if_not_exists_v0<const N: usize>( + pub(super) fn batch_insert_empty_tree_if_not_exists_v0<const N: usize>( &self, path_key_info: PathKeyInfo<N>, - use_sum_tree: bool, + tree_type: TreeType, storage_flags: Option<&StorageFlags>, apply_type: BatchInsertTreeApplyType, transaction: TransactionArg, @@ -30,19 +30,11 @@ impl Drive { //todo: clean up the duplication match path_key_info { PathKeyRef((path, key)) => { - let drive_operation = if use_sum_tree { - LowLevelDriveOperation::for_known_path_key_empty_sum_tree( - path.clone(), - key.to_vec(), - storage_flags, - ) - } else { - LowLevelDriveOperation::for_known_path_key_empty_tree( - path.clone(), - key.to_vec(), - storage_flags, - ) - }; + let drive_operation = tree_type.empty_tree_operation_for_known_path_key( + path.clone(), + key.to_vec(), + storage_flags, + ); // we only add the operation if it doesn't already exist in the current batch if let Some(existing_operations) = check_existing_operations { let mut i = 0; @@ -58,7 +50,7 @@ impl Drive { } else if let GroveOperation(grove_op) = previous_drive_operation { if grove_op.key == key && grove_op.path == path - && matches!(grove_op.op, GroveOp::DeleteTree) + && matches!(grove_op.op, GroveOp::DeleteTree(_)) { found = true; existing_operations.remove(i); @@ -105,19 +97,11 @@ impl Drive { DriveError::NotSupportedPrivate("document sizes in batch operations not supported"), )), PathKey((path, key)) => { - let drive_operation = if use_sum_tree { - LowLevelDriveOperation::for_known_path_key_empty_sum_tree( - path.clone(), - key.to_vec(), - storage_flags, - ) - } else { - LowLevelDriveOperation::for_known_path_key_empty_tree( - path.clone(), - key.to_vec(), - storage_flags, - ) - }; + let drive_operation = tree_type.empty_tree_operation_for_known_path_key( + path.clone(), + key.to_vec(), + storage_flags, + ); // we only add the operation if it doesn't already exist in the current batch if let Some(existing_operations) = check_existing_operations { let mut i = 0; @@ -133,7 +117,7 @@ impl Drive { } else if let GroveOperation(grove_op) = previous_drive_operation { if grove_op.key == key && grove_op.path == path - && matches!(grove_op.op, GroveOp::DeleteTree) + && matches!(grove_op.op, GroveOp::DeleteTree(_)) { found = true; existing_operations.remove(i); @@ -178,19 +162,11 @@ impl Drive { } PathFixedSizeKey((path, key)) => { let path_items: Vec<Vec<u8>> = path.into_iter().map(Vec::from).collect(); - let drive_operation = if use_sum_tree { - LowLevelDriveOperation::for_known_path_key_empty_sum_tree( - path_items, - key.to_vec(), - storage_flags, - ) - } else { - LowLevelDriveOperation::for_known_path_key_empty_tree( - path_items, - key.to_vec(), - storage_flags, - ) - }; + let drive_operation = tree_type.empty_tree_operation_for_known_path_key( + path_items, + key.to_vec(), + storage_flags, + ); // we only add the operation if it doesn't already exist in the current batch if let Some(existing_operations) = check_existing_operations { let mut i = 0; @@ -206,7 +182,7 @@ impl Drive { } else if let GroveOperation(grove_op) = previous_drive_operation { if grove_op.key == key && grove_op.path == path - && matches!(grove_op.op, GroveOp::DeleteTree) + && matches!(grove_op.op, GroveOp::DeleteTree(_)) { found = true; existing_operations.remove(i); @@ -251,19 +227,11 @@ impl Drive { } PathFixedSizeKeyRef((path, key)) => { let path_items: Vec<Vec<u8>> = path.into_iter().map(Vec::from).collect(); - let drive_operation = if use_sum_tree { - LowLevelDriveOperation::for_known_path_key_empty_sum_tree( - path_items, - key.to_vec(), - storage_flags, - ) - } else { - LowLevelDriveOperation::for_known_path_key_empty_tree( - path_items, - key.to_vec(), - storage_flags, - ) - }; + let drive_operation = tree_type.empty_tree_operation_for_known_path_key( + path_items, + key.to_vec(), + storage_flags, + ); // we only add the operation if it doesn't already exist in the current batch if let Some(existing_operations) = check_existing_operations { let mut i = 0; @@ -279,7 +247,7 @@ impl Drive { } else if let GroveOperation(grove_op) = previous_drive_operation { if grove_op.key == key && grove_op.path == path - && matches!(grove_op.op, GroveOp::DeleteTree) + && matches!(grove_op.op, GroveOp::DeleteTree(_)) { found = true; existing_operations.remove(i); diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_changed_value/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_changed_value/v0/mod.rs index de5431d8f1f..f464fc3c18d 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_if_changed_value/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_changed_value/v0/mod.rs @@ -99,7 +99,8 @@ impl Drive { PathKeyElementSize((key_info_path, key_info, element)) => { match apply_type { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums, .. + in_tree_type: in_tree_using_sums, + .. } => { // we can estimate that the element was the same size drive_operations.push(CalculatedCostOperation( diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs index 8fc5c16c5b4..cdf15dc489f 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists/v0/mod.rs @@ -87,7 +87,8 @@ impl Drive { PathKeyElementSize((key_info_path, key_info, element)) => { match apply_type { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums, .. + in_tree_type: in_tree_using_sums, + .. } => { // we can estimate that the element was the same size drive_operations.push(CalculatedCostOperation( diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs index 55f411caebc..ed3e3568800 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_if_not_exists_return_existing_element/v0/mod.rs @@ -129,7 +129,8 @@ impl Drive { PathKeyElementSize((key_info_path, key_info, element)) => { match apply_type { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums, .. + in_tree_type: in_tree_using_sums, + .. } => { // Estimate if the element with the given size already exists drive_operations.push(CalculatedCostOperation( diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/mod.rs new file mode 100644 index 00000000000..9200949046b --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/mod.rs @@ -0,0 +1,71 @@ +mod v0; + +use crate::util::grove_operations::BatchInsertApplyType; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::object_size_info::PathKeyElementInfo; + +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; + +impl Drive { + /// Attempts to batch insert a sum item at the specified path and key if it doesn't already exist. + /// This method dispatches to the appropriate version of the `batch_insert_sum_item_if_not_exists` function + /// based on the version of the drive. Currently, version `0` is supported. + /// + /// # Parameters + /// * `path_key_element_info`: Contains the path, key, and element information to be inserted. + /// * `error_if_exists`: A flag that determines whether an error is returned if a sum item already exists at the given path and key. + /// * `apply_type`: Defines the batch insert type, such as stateless or stateful insertion. + /// * `transaction`: The transaction argument used for the operation. + /// * `drive_operations`: A mutable reference to a vector that collects low-level drive operations to be executed. + /// * `drive_version`: The version of the drive that influences the behavior of the batch insert operation. + /// + /// # Returns + /// * `Ok(())` if the batch insert is successful. + /// * `Err(Error)` if the operation fails, including an error for unknown version mismatches. + /// + /// # Description + /// This function checks the version of the drive's batch methods and dispatches the operation to the appropriate version of + /// `batch_insert_sum_item_if_not_exists`. Currently, only version `0` is supported, which delegates to the function + /// `batch_insert_sum_item_if_not_exists_v0`. If the drive version is not supported, an error is returned. + /// + /// In version `0`, the function performs the following: + /// - Checks if a sum item exists at the specified path and key. + /// - If the sum item exists and `error_if_exists` is true, an error is returned. + /// - If no sum item exists, a new sum item is inserted at the path and key. + /// + /// This method allows flexibility for future versions of the drive to implement different behaviors for batch insertion. + pub fn batch_insert_sum_item_if_not_exists<const N: usize>( + &self, + path_key_element_info: PathKeyElementInfo<N>, + error_if_exists: bool, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<bool, Error> { + match drive_version + .grove_methods + .batch + .batch_insert_sum_item_if_not_exists + { + 0 => self.batch_insert_sum_item_if_not_exists_v0( + path_key_element_info, + error_if_exists, + apply_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "batch_insert_sum_item_if_not_exists".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/v0/mod.rs new file mode 100644 index 00000000000..902f806e797 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_if_not_exists/v0/mod.rs @@ -0,0 +1,230 @@ +use crate::util::grove_operations::BatchInsertApplyType; +use crate::util::object_size_info::PathKeyElementInfo::{ + PathFixedSizeKeyRefElement, PathKeyElement, PathKeyElementSize, PathKeyRefElement, + PathKeyUnknownElementSize, +}; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::object_size_info::PathKeyElementInfo; +use dpp::version::drive_versions::DriveVersion; +use grovedb::{Element, GroveDb, TransactionArg}; + +impl Drive { + /// Inserts a sum item at the specified path and key if it doesn't already exist. + /// If a sum item exists at the specified location and `error_if_exists` is true, an error is returned. + /// If a sum item exists and `error_if_exists` is false, no changes are made. + /// If no sum item exists, a new sum item is inserted at the specified path and key. + /// + /// # Parameters + /// * `path_key_element_info`: Contains information about the path, key, and element to be processed. + /// * `error_if_exists`: A flag that determines whether to return an error if the sum item already exists. + /// * `apply_type`: Defines the type of batch insert to be performed (stateful or stateless). + /// * `transaction`: The transaction argument for the operation. + /// * `drive_operations`: A mutable reference to a vector of low-level drive operations to which new operations will be appended. + /// * `drive_version`: The version of the drive to ensure compatibility with the operation. + /// + /// # Returns + /// * `Ok(())` if the operation is successful. + /// * `Err(Error)` if the operation fails for any reason, such as corrupted state or unsupported operation. + /// + /// # Description + /// This function checks whether an existing sum item exists at the given path and key: + /// - If a sum item is found and `error_if_exists` is true, an error is returned. + /// - If a sum item is found and `error_if_exists` is false, no changes are made. + /// - If no sum item exists, a new sum item is inserted at the specified path and key. + /// + /// This function supports several types of paths and keys, including: + /// - `PathKeyRefElement`: A path with a reference to a key and element. + /// - `PathKeyElement`: A path with a direct key and element. + /// - `PathFixedSizeKeyRefElement`: A fixed-size key reference. + /// - `PathKeyElementSize`: An element with an associated size. + /// - `PathKeyUnknownElementSize`: An unknown element size type. + /// + /// Depending on the element type (`SumItem` in this case), the appropriate operations will be applied. + /// + /// **Note**: Stateful batch insertions of document sizes are not supported. + pub(super) fn batch_insert_sum_item_if_not_exists_v0<const N: usize>( + &self, + path_key_element_info: PathKeyElementInfo<N>, + error_if_exists: bool, + apply_type: BatchInsertApplyType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<bool, Error> { + match path_key_element_info { + PathKeyRefElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(..)) = existing_element { + return if error_if_exists { + Err(Error::Drive(DriveError::CorruptedDriveState( + "expected no sum item".to_string(), + ))) + } else { + Ok(false) + }; + // Else do nothing + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key.to_vec(), + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(true) + } + PathKeyElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key.as_slice(), + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(..)) = existing_element { + return if error_if_exists { + Err(Error::Drive(DriveError::CorruptedDriveState( + "expected no sum item".to_string(), + ))) + } else { + Ok(false) + }; + // Else do nothing + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path, + key, + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(true) + } + PathFixedSizeKeyRefElement((path, key, element)) => { + if let Element::SumItem(new_value, _) = element { + // Check if the sum item already exists + let existing_element = self.grove_get_raw_optional( + path.as_slice().into(), + key, + apply_type.to_direct_query_type(), + transaction, + drive_operations, + drive_version, + )?; + + if let Some(Element::SumItem(..)) = existing_element { + return if error_if_exists { + Err(Error::Drive(DriveError::CorruptedDriveState( + "expected no sum item".to_string(), + ))) + } else { + Ok(false) + }; + // Else do nothing + } else if existing_element.is_some() { + return Err(Error::Drive(DriveError::CorruptedElementType( + "expected sum item element type", + ))); + } else { + // Insert as a new sum item + let path_items: Vec<Vec<u8>> = path.into_iter().map(Vec::from).collect(); + drive_operations.push( + LowLevelDriveOperation::insert_for_known_path_key_element( + path_items, + key.to_vec(), + Element::new_sum_item(new_value), + ), + ); + } + } else { + return Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))); + } + Ok(true) + } + PathKeyElementSize((key_info_path, key_info, element)) => { + if let Element::SumItem(new_value, _) = element { + match apply_type { + BatchInsertApplyType::StatelessBatchInsert { + in_tree_type, .. + } => { + // Estimate if the sum item with the given size already exists + drive_operations.push(CalculatedCostOperation( + GroveDb::average_case_for_has_raw( + &key_info_path, + &key_info, + element.serialized_size(&drive_version.grove_version)? as u32, + in_tree_type, + &drive_version.grove_version, + )?, + )); + + drive_operations.push( + LowLevelDriveOperation::insert_for_estimated_path_key_element( + key_info_path, + key_info, + Element::new_sum_item(new_value), + ), + ); + Ok(true) + } + BatchInsertApplyType::StatefulBatchInsert => { + Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes for stateful insert in batch operations not supported", + ))) + } + } + } else { + Err(Error::Drive(DriveError::CorruptedCodeExecution( + "expected sum item element type", + ))) + } + } + PathKeyUnknownElementSize(_) => Err(Error::Drive(DriveError::NotSupportedPrivate( + "document sizes in batch operations not supported", + ))), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs index 8294a6786b5..c9abd72a501 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_insert_sum_item_or_add_to_if_already_exists/v0/mod.rs @@ -178,7 +178,7 @@ impl Drive { if let Element::SumItem(new_value, _) = element { match apply_type { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums, .. + in_tree_type, .. } => { // Estimate if the sum item with the given size already exists drive_operations.push(CalculatedCostOperation( @@ -186,7 +186,7 @@ impl Drive { &key_info_path, &key_info, element.serialized_size(&drive_version.grove_version)? as u32, - in_tree_using_sums, + in_tree_type, &drive_version.grove_version, )?, )); diff --git a/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs index f8b2b904cc5..15ee4c5bda6 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_move_items_in_path_query/v0/mod.rs @@ -89,14 +89,14 @@ impl Drive { }; let delete_operation = match apply_type { BatchMoveApplyType::StatelessBatchMove { - is_sum_tree, + in_tree_type, estimated_key_size, estimated_value_size, .. } => GroveDb::average_case_delete_operation_for_delete::<RocksDbStorage>( &KeyInfoPath::from_known_owned_path(path.to_vec()), &KeyInfo::KnownKey(key.to_vec()), - is_sum_tree, + in_tree_type, false, true, 0, @@ -142,14 +142,14 @@ mod tests { util::test_helpers::setup::setup_drive, }; use assert_matches::assert_matches; - use grovedb::{Element, PathQuery, Query, SizedQuery}; + use grovedb::{Element, MaybeTree, PathQuery, Query, SizedQuery}; use grovedb_path::SubtreePath; use platform_version::version::PlatformVersion; #[test] fn test_batch_move_items_in_path_query_success() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -218,7 +218,7 @@ mod tests { // Set up the apply type and drive operations vector let apply_type = BatchMoveApplyType::StatefulBatchMove { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }; let mut drive_operations = Vec::new(); @@ -305,7 +305,7 @@ mod tests { #[test] fn test_batch_move_items_in_path_query_no_elements() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -330,7 +330,7 @@ mod tests { // Set up the apply type and drive operations vector let apply_type = BatchMoveApplyType::StatefulBatchMove { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }; let mut drive_operations = Vec::new(); @@ -351,7 +351,7 @@ mod tests { #[test] fn test_batch_move_items_in_path_query_range_query() { // Set up a test drive instance and transaction - let drive = setup_drive(None); + let drive = setup_drive(None, None); let platform_version = PlatformVersion::latest(); let transaction = drive.grove.start_transaction(); @@ -433,7 +433,7 @@ mod tests { // Set up the apply type and drive operations vector let apply_type = BatchMoveApplyType::StatefulBatchMove { - is_known_to_be_subtree_with_sum: Some((false, false)), + is_known_to_be_subtree_with_sum: Some(MaybeTree::NotTree), }; let mut drive_operations = Vec::new(); diff --git a/packages/rs-drive/src/util/grove_operations/batch_remove_raw/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/batch_remove_raw/v0/mod.rs index d6ef95dad2c..89902830ef6 100644 --- a/packages/rs-drive/src/util/grove_operations/batch_remove_raw/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/batch_remove_raw/v0/mod.rs @@ -45,9 +45,7 @@ impl Drive { "we should not be seeing internal grovedb operations", ))); } - Some(GroveOp::Delete { .. }) - | Some(GroveOp::DeleteTree { .. }) - | Some(GroveOp::DeleteSumTree { .. }) => false, + Some(GroveOp::Delete { .. }) | Some(GroveOp::DeleteTree { .. }) => false, _ => true, }; @@ -70,7 +68,7 @@ impl Drive { if needs_removal_from_state { let delete_operation = match apply_type { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_key_size, estimated_value_size, } => GroveDb::average_case_delete_operation_for_delete::<RocksDbStorage>( diff --git a/packages/rs-drive/src/util/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs index c0afbdaa794..3c212ba5440 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_apply_batch_with_add_costs/v0/mod.rs @@ -13,7 +13,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Applies the given groveDB operations batch and gets and passes the costs to `push_drive_operation_result`. - pub(crate) fn grove_apply_batch_with_add_costs_v0( + pub(super) fn grove_apply_batch_with_add_costs_v0( &self, ops: GroveDbOpBatch, validate: bool, diff --git a/packages/rs-drive/src/util/grove_operations/grove_apply_operation/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_apply_operation/v0/mod.rs index dbbb7613493..9bb4ab95c48 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_apply_operation/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_apply_operation/v0/mod.rs @@ -7,7 +7,7 @@ use grovedb::TransactionArg; impl Drive { /// Applies the given groveDB operation - pub(crate) fn grove_apply_operation_v0( + pub(super) fn grove_apply_operation_v0( &self, operation: QualifiedGroveDbOp, validate: bool, diff --git a/packages/rs-drive/src/util/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs index a734e406dba..9d7a6bc8eba 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_apply_partial_batch_with_add_costs/v0/mod.rs @@ -16,7 +16,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Applies the given groveDB operations batch and gets and passes the costs to `push_drive_operation_result`. - pub(crate) fn grove_apply_partial_batch_with_add_costs_v0( + pub(super) fn grove_apply_partial_batch_with_add_costs_v0( &self, ops: GroveDbOpBatch, validate: bool, diff --git a/packages/rs-drive/src/util/grove_operations/grove_batch_operations_costs/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_batch_operations_costs/v0/mod.rs index 146db3487e4..fb1f867e8d0 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_batch_operations_costs/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_batch_operations_costs/v0/mod.rs @@ -12,7 +12,7 @@ use std::collections::HashMap; impl Drive { /// Gets the costs for the given groveDB op batch and passes them to `push_drive_operation_result`. - pub(crate) fn grove_batch_operations_costs_v0( + pub(super) fn grove_batch_operations_costs_v0( &self, ops: GroveDbOpBatch, estimated_layer_info: HashMap<KeyInfoPath, EstimatedLayerInformation>, diff --git a/packages/rs-drive/src/util/grove_operations/grove_clear/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_clear/v0/mod.rs index ad3152f8957..e1de93ec3a9 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_clear/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_clear/v0/mod.rs @@ -7,7 +7,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of deleting an element in groveDB to `drive_operations`. - pub(crate) fn grove_clear_v0<B: AsRef<[u8]>>( + pub(super) fn grove_clear_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_delete/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_delete/v0/mod.rs index 13c8a0776eb..d5e0c2ab1e2 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_delete/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_delete/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of deleting an element in groveDB to `drive_operations`. - pub(crate) fn grove_delete_v0<B: AsRef<[u8]>>( + pub(super) fn grove_delete_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_get/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get/v0/mod.rs index c5d473ea6d2..3baac60f013 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get/v0/mod.rs @@ -13,7 +13,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the element at the given path from groveDB. /// Pushes the `OperationCost` of getting the element to `drive_operations`. - pub(crate) fn grove_get_v0<B: AsRef<[u8]>>( + pub(super) fn grove_get_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], @@ -24,19 +24,19 @@ impl Drive { ) -> Result<Option<Element>, Error> { match query_type { QueryType::StatelessQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, estimated_reference_sizes, } => { let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); let key_info = KeyInfo::KnownKey(key.to_vec()); let cost = match query_target { - QueryTarget::QueryTargetTree(flags_size, is_sum_tree) => { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { GroveDb::average_case_for_get_tree( &key_info_path, &key_info, flags_size, - is_sum_tree, + tree_type, in_tree_using_sums, &drive_version.grove_version, ) diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/mod.rs new file mode 100644 index 00000000000..571cd7461b5 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; +use grovedb_path::SubtreePath; + +impl Drive { + /// Retrieves the total value from a sum tree within groveDB at the specified path and key. + /// The cost of the operation is then appended to `drive_operations` for later processing. + /// + /// # Parameters + /// * `path`: The groveDB hierarchical authenticated structure path where the sum tree is located. + /// * `key`: The key where the sum tree resides within the subtree. + /// * `query_type`: The type of query to perform, either `StatelessDirectQuery` or `StatefulDirectQuery`. + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(i64)` if the operation was successful, returning the total value of the sum tree. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + /// * `Err(DriveError::CorruptedBalancePath)` if the balance path does not refer to a sum tree. + /// * `Err(DriveError::CorruptedCodeExecution)` if trying to query a non-tree element. + pub fn grove_get_big_sum_tree_total_value<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<i128, Error> { + match drive_version + .grove_methods + .basic + .grove_get_big_sum_tree_total_value + { + 0 => self.grove_get_big_sum_tree_total_value_v0( + path, + key, + query_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_get_big_sum_tree_total_value".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/v0/mod.rs new file mode 100644 index 00000000000..71ab45ea201 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_big_sum_tree_total_value/v0/mod.rs @@ -0,0 +1,67 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::grove_operations::{DirectQueryType, QueryTarget}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, GroveDb, TransactionArg}; +use grovedb_costs::CostContext; +use grovedb_path::SubtreePath; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Gets the element at the given path from groveDB. + /// Pushes the `OperationCost` of getting the element to `drive_operations`. + pub(super) fn grove_get_big_sum_tree_total_value_v0<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<i128, Error> { + match query_type { + DirectQueryType::StatelessDirectQuery { + in_tree_type, + query_target, + } => { + let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); + let key_info = KeyInfo::KnownKey(key.to_vec()); + let cost = match query_target { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { + Ok(GroveDb::average_case_for_get_tree( + &key_info_path, + &key_info, + flags_size, + tree_type, + in_tree_type, + &drive_version.grove_version, + )?) + } + _ => Err(Error::Drive(DriveError::CorruptedCodeExecution( + "can not query a non tree", + ))), + }?; + + drive_operations.push(CalculatedCostOperation(cost)); + Ok(0) + } + DirectQueryType::StatefulDirectQuery => { + let CostContext { value, cost } = + self.grove + .get_raw(path, key, transaction, &drive_version.grove_version); + drive_operations.push(CalculatedCostOperation(cost)); + let element = value.map_err(Error::GroveDB)?; + match element { + Element::BigSumTree(_, value, _) => Ok(value), + _ => Err(Error::Drive(DriveError::CorruptedBalancePath( + "balance path does not refer to a big sum tree", + ))), + } + } + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/mod.rs new file mode 100644 index 00000000000..2be6d7a68e9 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/mod.rs @@ -0,0 +1,58 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; +use dpp::version::drive_versions::DriveVersion; +use grovedb::TransactionArg; +use grovedb_path::SubtreePath; + +impl Drive { + /// Retrieves the total value from a sum tree within groveDB at the specified path and key. + /// The cost of the operation is then appended to `drive_operations` for later processing. + /// + /// # Parameters + /// * `path`: The groveDB hierarchical authenticated structure path where the sum tree is located. + /// * `key`: The key where the sum tree resides within the subtree. + /// * `query_type`: The type of query to perform, either `StatelessDirectQuery` or `StatefulDirectQuery`. + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(Option<i64>)` if the operation was successful, returning the total value of the sum tree if it exists. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + /// * `Err(DriveError::CorruptedBalancePath)` if the balance path does not refer to a sum tree. + /// * `Err(DriveError::CorruptedCodeExecution)` if trying to query a non-tree element. + pub fn grove_get_optional_sum_tree_total_value<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Option<i64>, Error> { + match drive_version + .grove_methods + .basic + .grove_get_optional_sum_tree_total_value + { + 0 => self.grove_get_optional_sum_tree_total_value_v0( + path, + key, + query_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_get_optional_sum_tree_total_value".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/v0/mod.rs new file mode 100644 index 00000000000..59fb0563445 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_optional_sum_tree_total_value/v0/mod.rs @@ -0,0 +1,72 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::grove_operations::{DirectQueryType, QueryTarget}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, GroveDb, TransactionArg}; +use grovedb_costs::CostContext; +use grovedb_path::SubtreePath; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// Gets the element at the given path from groveDB. + /// Pushes the `OperationCost` of getting the element to `drive_operations`. + pub(super) fn grove_get_optional_sum_tree_total_value_v0<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Option<i64>, Error> { + match query_type { + DirectQueryType::StatelessDirectQuery { + in_tree_type: in_tree_using_sums, + query_target, + } => { + let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); + let key_info = KeyInfo::KnownKey(key.to_vec()); + let cost = match query_target { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { + Ok(GroveDb::average_case_for_get_tree( + &key_info_path, + &key_info, + flags_size, + tree_type, + in_tree_using_sums, + &drive_version.grove_version, + )?) + } + _ => Err(Error::Drive(DriveError::CorruptedCodeExecution( + "can not query a non tree", + ))), + }?; + + drive_operations.push(CalculatedCostOperation(cost)); + Ok(Some(0)) + } + DirectQueryType::StatefulDirectQuery => { + let CostContext { value, cost } = self.grove.get_raw_optional( + path, + key, + transaction, + &drive_version.grove_version, + ); + drive_operations.push(CalculatedCostOperation(cost)); + let Some(element) = value.map_err(Error::GroveDB)? else { + return Ok(None); + }; + match element { + Element::SumTree(_, value, _) => Ok(Some(value)), + _ => Err(Error::Drive(DriveError::CorruptedBalancePath( + "balance path does not refer to a sum tree", + ))), + } + } + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_path_query/v0/mod.rs index 9997184f5fa..80a48f05095 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_path_query/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_path_query/v0/mod.rs @@ -10,7 +10,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_path_query_v0( + pub(super) fn grove_get_path_query_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_or_sum_results/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_or_sum_results/v0/mod.rs index 18753f813b3..56625e4b2fb 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_or_sum_results/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_or_sum_results/v0/mod.rs @@ -10,7 +10,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_path_query_serialized_or_sum_results_v0( + pub(super) fn grove_get_path_query_serialized_or_sum_results_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs index 584f36d4d63..cb584854876 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_serialized_results/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_path_query_serialized_results_v0( + pub(super) fn grove_get_path_query_serialized_results_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_with_optional/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_with_optional/v0/mod.rs index bd914b73b8d..4ee57d66e8d 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_path_query_with_optional/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_path_query_with_optional/v0/mod.rs @@ -10,7 +10,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_path_query_with_optional_v0( + pub(super) fn grove_get_path_query_with_optional_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query/v0/mod.rs index 3b9a9614a5f..ecc4d49907d 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query/v0/mod.rs @@ -11,7 +11,7 @@ impl Drive { /// Pushes the cost to `drive_operations` and returns the return value. /// Verbose should be generally set to false unless one needs to prove /// subsets of a proof. - pub(crate) fn grove_get_proved_path_query_v0( + pub(super) fn grove_get_proved_path_query_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs index 3d3d4aad5d2..40a47aa901a 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_proved_path_query_with_conditional/v0/mod.rs @@ -12,7 +12,7 @@ impl Drive { /// Pushes the cost to `drive_operations` and returns the return value. /// Verbose should be generally set to false unless one needs to prove /// subsets of a proof. - pub(crate) fn grove_get_proved_path_query_with_conditional_v0<B: AsRef<[u8]>>( + pub(super) fn grove_get_proved_path_query_with_conditional_v0<B: AsRef<[u8]>>( &self, root_path: SubtreePath<B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw/v0/mod.rs index a564abc2730..0d6778540ce 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_raw/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw/v0/mod.rs @@ -13,7 +13,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// grove_get_raw basically means that there are no reference hops, this only matters /// when calculating worst case costs - pub(crate) fn grove_get_raw_v0<B: AsRef<[u8]>>( + pub(super) fn grove_get_raw_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], @@ -24,18 +24,18 @@ impl Drive { ) -> Result<Option<Element>, Error> { match direct_query_type { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, } => { let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); let key_info = KeyInfo::KnownKey(key.to_vec()); let cost = match query_target { - QueryTarget::QueryTargetTree(flags_size, is_sum_tree) => { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { GroveDb::average_case_for_get_tree( &key_info_path, &key_info, flags_size, - is_sum_tree, + tree_type, in_tree_using_sums, &drive_version.grove_version, ) diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/mod.rs new file mode 100644 index 00000000000..cd9d7a4d928 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/mod.rs @@ -0,0 +1,55 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; + +use dpp::version::drive_versions::DriveVersion; + +use grovedb::TransactionArg; +use grovedb_path::SubtreePath; + +impl Drive { + /// Handles the retrieval of a raw element from GroveDB at the specified path and key. + /// The operation cost is added to `drive_operations` for later processing. + /// + /// # Parameters + /// * `path`: The groveDB hierarchical authenticated structure path from where the element is to be retrieved. + /// * `key`: The key of the element to be retrieved from the subtree. + /// * `direct_query_type`: The type of query to perform, whether stateless or stateful. + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(Some(Element))` if the operation was successful and the element was found. + /// * `Ok(None)` if the operation was successful but the element was not found. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + pub fn grove_get_raw_item<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + direct_query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Vec<u8>, Error> { + match drive_version.grove_methods.basic.grove_get_raw_item { + 0 => self.grove_get_raw_item_v0( + path, + key, + direct_query_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_get_raw_item".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/v0/mod.rs new file mode 100644 index 00000000000..4f7dc34a369 --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_item/v0/mod.rs @@ -0,0 +1,83 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::grove_operations::{DirectQueryType, QueryTarget}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, GroveDb, TransactionArg}; +use grovedb_costs::CostContext; +use grovedb_path::SubtreePath; +use itertools::Itertools; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// grove_get_raw_item basically means that there are no reference hops, this only matters + /// when calculating worst case costs + pub(super) fn grove_get_raw_item_v0<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + direct_query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Vec<u8>, Error> { + match direct_query_type { + DirectQueryType::StatelessDirectQuery { + in_tree_type: in_tree_using_sums, + query_target, + } => { + let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); + let key_info = KeyInfo::KnownKey(key.to_vec()); + let cost = match query_target { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { + GroveDb::average_case_for_get_tree( + &key_info_path, + &key_info, + flags_size, + tree_type, + in_tree_using_sums, + &drive_version.grove_version, + ) + } + QueryTarget::QueryTargetValue(estimated_value_size) => { + GroveDb::average_case_for_get_raw( + &key_info_path, + &key_info, + estimated_value_size, + in_tree_using_sums, + &drive_version.grove_version, + ) + } + }?; + + drive_operations.push(CalculatedCostOperation(cost)); + Ok(vec![]) + } + DirectQueryType::StatefulDirectQuery => { + //todo remove path clone + let CostContext { value, cost } = self.grove.get_raw( + path.clone(), + key, + transaction, + &drive_version.grove_version, + ); + drive_operations.push(CalculatedCostOperation(cost)); + let element = value.map_err(Error::GroveDB)?; + match element { + Element::Item(value, _) => Ok(value), + _ => Err(Error::Drive(DriveError::CorruptedDriveState(format!( + "path {}/0x{} does not refer to an item", + path.to_vec() + .iter() + .map(|bytes| format!("0x{}", hex::encode(bytes))) + .join("/"), + hex::encode(key) + )))), + } + } + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional/v0/mod.rs index 9b9a5be3bbb..90e2b2b0043 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional/v0/mod.rs @@ -13,7 +13,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// grove_get_raw basically means that there are no reference hops, this only matters /// when calculating worst case costs - pub(crate) fn grove_get_raw_optional_v0<B: AsRef<[u8]>>( + pub(super) fn grove_get_raw_optional_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], @@ -24,18 +24,18 @@ impl Drive { ) -> Result<Option<Element>, Error> { match direct_query_type { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, } => { let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); let key_info = KeyInfo::KnownKey(key.to_vec()); let cost = match query_target { - QueryTarget::QueryTargetTree(flags_size, is_sum_tree) => { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { GroveDb::average_case_for_get_tree( &key_info_path, &key_info, flags_size, - is_sum_tree, + tree_type, in_tree_using_sums, &drive_version.grove_version, ) diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/mod.rs new file mode 100644 index 00000000000..667e956ce9b --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/mod.rs @@ -0,0 +1,59 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::util::grove_operations::DirectQueryType; + +use dpp::version::drive_versions::DriveVersion; + +use grovedb::TransactionArg; +use grovedb_path::SubtreePath; + +impl Drive { + /// Handles the retrieval of a raw element from GroveDB at the specified path and key. + /// The operation cost is added to `drive_operations` for later processing. + /// + /// # Parameters + /// * `path`: The groveDB hierarchical authenticated structure path from where the element is to be retrieved. + /// * `key`: The key of the element to be retrieved from the subtree. + /// * `direct_query_type`: The type of query to perform, whether stateless or stateful. + /// * `transaction`: The groveDB transaction associated with this operation. + /// * `drive_operations`: A vector to collect the costs of operations for later computation. + /// * `platform_version`: The platform version to select the correct function version to run. + /// + /// # Returns + /// * `Ok(Some(Element))` if the operation was successful and the element was found. + /// * `Ok(None)` if the operation was successful but the element was not found. + /// * `Err(DriveError::UnknownVersionMismatch)` if the platform version does not match known versions. + pub fn grove_get_raw_optional_item<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + direct_query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Option<Vec<u8>>, Error> { + match drive_version + .grove_methods + .basic + .grove_get_raw_optional_item + { + 0 => self.grove_get_raw_optional_item_v0( + path, + key, + direct_query_type, + transaction, + drive_operations, + drive_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "grove_get_raw_optional_item".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/v0/mod.rs new file mode 100644 index 00000000000..3ca57601fda --- /dev/null +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_optional_item/v0/mod.rs @@ -0,0 +1,84 @@ +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::fees::op::LowLevelDriveOperation; +use crate::fees::op::LowLevelDriveOperation::CalculatedCostOperation; +use crate::util::grove_operations::{DirectQueryType, QueryTarget}; +use grovedb::batch::key_info::KeyInfo; +use grovedb::batch::KeyInfoPath; +use grovedb::{Element, GroveDb, TransactionArg}; +use grovedb_costs::CostContext; +use grovedb_path::SubtreePath; +use itertools::Itertools; +use platform_version::version::drive_versions::DriveVersion; + +impl Drive { + /// grove_get_raw_item basically means that there are no reference hops, this only matters + /// when calculating worst case costs + pub(super) fn grove_get_raw_optional_item_v0<B: AsRef<[u8]>>( + &self, + path: SubtreePath<'_, B>, + key: &[u8], + direct_query_type: DirectQueryType, + transaction: TransactionArg, + drive_operations: &mut Vec<LowLevelDriveOperation>, + drive_version: &DriveVersion, + ) -> Result<Option<Vec<u8>>, Error> { + match direct_query_type { + DirectQueryType::StatelessDirectQuery { + in_tree_type: in_tree_using_sums, + query_target, + } => { + let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); + let key_info = KeyInfo::KnownKey(key.to_vec()); + let cost = match query_target { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { + GroveDb::average_case_for_get_tree( + &key_info_path, + &key_info, + flags_size, + tree_type, + in_tree_using_sums, + &drive_version.grove_version, + ) + } + QueryTarget::QueryTargetValue(estimated_value_size) => { + GroveDb::average_case_for_get_raw( + &key_info_path, + &key_info, + estimated_value_size, + in_tree_using_sums, + &drive_version.grove_version, + ) + } + }?; + + drive_operations.push(CalculatedCostOperation(cost)); + Ok(None) + } + DirectQueryType::StatefulDirectQuery => { + //todo remove path clone + let CostContext { value, cost } = self.grove.get_raw_optional( + path.clone(), + key, + transaction, + &drive_version.grove_version, + ); + drive_operations.push(CalculatedCostOperation(cost)); + let element = value.map_err(Error::GroveDB)?; + match element { + Some(Element::Item(value, _)) => Ok(Some(value)), + None => Ok(None), + _ => Err(Error::Drive(DriveError::CorruptedDriveState(format!( + "path {}/0x{} does not refer to an item", + path.to_vec() + .iter() + .map(|bytes| format!("0x{}", hex::encode(bytes))) + .join("/"), + hex::encode(key) + )))), + } + } + } + } +} diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query/v0/mod.rs index eebeb4b5241..2deec8ba8b7 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query/v0/mod.rs @@ -10,7 +10,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB raw path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_raw_path_query_v0( + pub(super) fn grove_get_raw_path_query_v0( &self, path_query: &PathQuery, transaction: TransactionArg, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs index add7c65d917..1e852fcb775 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_path_query_with_optional/v0/mod.rs @@ -10,7 +10,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB path query. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_get_raw_path_query_with_optional_v0( + pub(super) fn grove_get_raw_path_query_with_optional_v0( &self, path_query: &PathQuery, error_if_intermediate_path_tree_not_present: bool, diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_raw_value_u64_from_encoded_var_vec/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_raw_value_u64_from_encoded_var_vec/v0/mod.rs index 368a7d29330..07418407bbb 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_raw_value_u64_from_encoded_var_vec/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_raw_value_u64_from_encoded_var_vec/v0/mod.rs @@ -10,7 +10,7 @@ use integer_encoding::VarInt; impl Drive { /// grove_get_direct_u64 is a helper function to get a - pub(crate) fn grove_get_raw_value_u64_from_encoded_var_vec_v0<B: AsRef<[u8]>>( + pub(super) fn grove_get_raw_value_u64_from_encoded_var_vec_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs index 65bd03f3e30..f163c9ac51b 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_get_sum_tree_total_value/v0/mod.rs @@ -25,18 +25,18 @@ impl Drive { ) -> Result<i64, Error> { match query_type { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, } => { let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); let key_info = KeyInfo::KnownKey(key.to_vec()); let cost = match query_target { - QueryTarget::QueryTargetTree(flags_size, is_sum_tree) => { + QueryTarget::QueryTargetTree(flags_size, tree_type) => { Ok(GroveDb::average_case_for_get_tree( &key_info_path, &key_info, flags_size, - is_sum_tree, + tree_type, in_tree_using_sums, &drive_version.grove_version, )?) diff --git a/packages/rs-drive/src/util/grove_operations/grove_has_raw/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_has_raw/v0/mod.rs index 52b3eaaa969..f6b57a7c6f6 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_has_raw/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_has_raw/v0/mod.rs @@ -14,7 +14,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Gets the return value and the cost of a groveDB `has_raw` operation. /// Pushes the cost to `drive_operations` and returns the return value. - pub(crate) fn grove_has_raw_v0<B: AsRef<[u8]>>( + pub(super) fn grove_has_raw_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], @@ -25,18 +25,18 @@ impl Drive { ) -> Result<bool, Error> { let CostContext { value, cost } = match query_type { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, } => { let key_info_path = KeyInfoPath::from_known_owned_path(path.to_vec()); let key_info = KeyInfo::KnownKey(key.to_vec()); let cost = match query_target { - QueryTarget::QueryTargetTree(flags_len, is_sum_tree) => { + QueryTarget::QueryTargetTree(flags_len, tree_type) => { GroveDb::average_case_for_has_raw_tree( &key_info_path, &key_info, flags_len, - is_sum_tree, + tree_type, in_tree_using_sums, &drive_version.grove_version, )? diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert/v0/mod.rs index f9c81c65c7c..f949ecc605b 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of inserting an element in groveDB to `drive_operations`. - pub(crate) fn grove_insert_v0<B: AsRef<[u8]>>( + pub(super) fn grove_insert_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_empty_sum_tree/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_empty_sum_tree/v0/mod.rs index a025023bf33..2ea0ae20d8e 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_empty_sum_tree/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_empty_sum_tree/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of inserting an empty sum tree in groveDB to `drive_operations`. - pub fn grove_insert_empty_sum_tree_v0<B: AsRef<[u8]>>( + pub(super) fn grove_insert_empty_sum_tree_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_empty_tree/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_empty_tree/v0/mod.rs index 6628036899f..4a0a2d34880 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_empty_tree/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_empty_tree/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of inserting an empty tree in groveDB to `drive_operations`. - pub(crate) fn grove_insert_empty_tree_v0<B: AsRef<[u8]>>( + pub(super) fn grove_insert_empty_tree_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists/v0/mod.rs index b03297457cd..4d27e254599 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of inserting an element in groveDB where the path key does not yet exist /// to `drive_operations`. - pub(crate) fn grove_insert_if_not_exists_v0<B: AsRef<[u8]>>( + pub(super) fn grove_insert_if_not_exists_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs index 69b55ba2d76..86bb679a397 100644 --- a/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/grove_insert_if_not_exists_return_existing_element/v0/mod.rs @@ -9,7 +9,7 @@ use platform_version::version::drive_versions::DriveVersion; impl Drive { /// Pushes the `OperationCost` of inserting an element in groveDB where the path key does not yet exist /// to `drive_operations`. - pub(crate) fn grove_insert_if_not_exists_return_existing_element_v0<B: AsRef<[u8]>>( + pub(super) fn grove_insert_if_not_exists_return_existing_element_v0<B: AsRef<[u8]>>( &self, path: SubtreePath<'_, B>, key: &[u8], diff --git a/packages/rs-drive/src/util/grove_operations/mod.rs b/packages/rs-drive/src/util/grove_operations/mod.rs index 41736ed442e..098d8259cde 100644 --- a/packages/rs-drive/src/util/grove_operations/mod.rs +++ b/packages/rs-drive/src/util/grove_operations/mod.rs @@ -21,6 +21,9 @@ pub mod grove_delete; /// Fetch raw grove data pub mod grove_get_raw; +/// Fetch raw grove data and match that is item +pub mod grove_get_raw_item; + /// Fetch raw grove data if it exists pub mod grove_get_raw_optional; @@ -57,6 +60,9 @@ pub mod grove_has_raw; /// Batch insert operation into empty tree pub mod batch_insert_empty_tree; +/// Batch insert operation into empty sum tree +pub mod batch_insert_empty_sum_tree; + /// Batch insert operation into empty tree, but only if it doesn't already exist pub mod batch_insert_empty_tree_if_not_exists; @@ -126,12 +132,21 @@ pub mod grove_get_proved_path_query_with_conditional; /// Inserts an element if it does not exist and returns the existing element if it does in GroveDB. pub mod grove_insert_if_not_exists_return_existing_element; +/// Batch inserts sum item if not already existing +pub mod batch_insert_sum_item_if_not_exists; /// Moved items that are found in a path query to a new path. pub mod batch_move_items_in_path_query; +/// Get the total value from a big sum tree +pub mod grove_get_big_sum_tree_total_value; +/// Get total value from sum tree in grove if it exists +pub mod grove_get_optional_sum_tree_total_value; +/// Fetch raw grove data if it exists, None otherwise +pub mod grove_get_raw_optional_item; + use grovedb_costs::CostContext; -use grovedb::EstimatedLayerInformation; +use grovedb::{EstimatedLayerInformation, MaybeTree, TreeType}; use crate::error::Error; use crate::fees::op::LowLevelDriveOperation; @@ -179,7 +194,7 @@ pub enum BatchDeleteApplyType { /// Stateless batch delete StatelessBatchDelete { /// Are we deleting in a sum tree - is_sum_tree: bool, + in_tree_type: TreeType, /// What is the estimated key size estimated_key_size: u32, /// What is the estimated value size @@ -188,7 +203,7 @@ pub enum BatchDeleteApplyType { /// Stateful batch delete StatefulBatchDelete { /// Are we known to be in a subtree and does this subtree have sums - is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + is_known_to_be_subtree_with_sum: Option<MaybeTree>, }, } @@ -198,9 +213,9 @@ pub enum BatchMoveApplyType { /// Stateless batch move StatelessBatchMove { /// Are we moving from inside a sum tree - in_tree_using_sums: bool, + in_tree_type: TreeType, /// Are we moving a sum tree - is_sum_tree: bool, + tree_type: TreeType, /// What is the estimated key size estimated_key_size: u32, /// What is the estimated value size @@ -211,7 +226,7 @@ pub enum BatchMoveApplyType { /// Stateful batch move StatefulBatchMove { /// Are we known to be in a subtree and does this subtree have sums - is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + is_known_to_be_subtree_with_sum: Option<MaybeTree>, }, } @@ -221,12 +236,12 @@ pub enum BatchDeleteUpTreeApplyType { /// Stateless batch delete StatelessBatchDelete { /// The estimated layer info - estimated_layer_info: IntMap<EstimatedLayerInformation>, + estimated_layer_info: IntMap<u16, EstimatedLayerInformation>, }, /// Stateful batch delete StatefulBatchDelete { /// Are we known to be in a subtree and does this subtree have sums - is_known_to_be_subtree_with_sum: Option<(IsSubTree, IsSumSubTree)>, + is_known_to_be_subtree_with_sum: Option<MaybeTree>, }, } @@ -237,9 +252,9 @@ pub enum BatchInsertTreeApplyType { /// Stateless batch insert tree StatelessBatchInsertTree { /// Does this tree use sums? - in_tree_using_sums: bool, + in_tree_type: TreeType, /// Are we inserting in a sum tree - is_sum_tree: bool, + tree_type: TreeType, /// The flags length flags_len: FlagsLen, }, @@ -259,12 +274,12 @@ impl BatchInsertTreeApplyType { pub(crate) fn to_direct_query_type(self) -> DirectQueryType { match self { BatchInsertTreeApplyType::StatelessBatchInsertTree { - in_tree_using_sums, - is_sum_tree, + in_tree_type, + tree_type, flags_len, } => DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, - query_target: QueryTarget::QueryTargetTree(flags_len, is_sum_tree), + in_tree_type, + query_target: QueryTarget::QueryTargetTree(flags_len, tree_type), }, BatchInsertTreeApplyType::StatefulBatchInsertTree => { DirectQueryType::StatefulDirectQuery @@ -274,11 +289,12 @@ impl BatchInsertTreeApplyType { } /// Batch insert apply type +#[derive(Clone, Copy)] pub enum BatchInsertApplyType { /// Stateless batch insert StatelessBatchInsert { /// Does this tree use sums? - in_tree_using_sums: bool, + in_tree_type: TreeType, /// the type of Target (Tree or Value) target: QueryTarget, }, @@ -297,10 +313,10 @@ impl BatchInsertApplyType { pub(crate) fn to_direct_query_type(&self) -> DirectQueryType { match self { BatchInsertApplyType::StatelessBatchInsert { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, target, } => DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: *in_tree_using_sums, + in_tree_type: *in_tree_using_sums, query_target: *target, }, BatchInsertApplyType::StatefulBatchInsert => DirectQueryType::StatefulDirectQuery, @@ -316,7 +332,7 @@ pub type FlagsLen = u32; /// Query target pub enum QueryTarget { /// tree - QueryTargetTree(FlagsLen, IsSumTree), + QueryTargetTree(FlagsLen, TreeType), /// value QueryTargetValue(u32), } @@ -325,9 +341,8 @@ impl QueryTarget { /// Length pub(crate) fn len(&self) -> u32 { match self { - QueryTarget::QueryTargetTree(flags_len, is_sum_tree) => { - let len = if *is_sum_tree { 11 } else { 3 }; - *flags_len + len + QueryTarget::QueryTargetTree(flags_len, tree_type) => { + *flags_len + tree_type.inner_node_type().cost() + 3 } QueryTarget::QueryTargetValue(len) => *len, } @@ -341,7 +356,7 @@ pub enum DirectQueryType { /// Stateless direct query StatelessDirectQuery { /// Does this tree use sums? - in_tree_using_sums: bool, + in_tree_type: TreeType, /// the type of Target (Tree or Value) query_target: QueryTarget, }, @@ -353,10 +368,10 @@ impl From<DirectQueryType> for QueryType { fn from(value: DirectQueryType) -> Self { match value { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type, query_target, } => QueryType::StatelessQuery { - in_tree_using_sums, + in_tree_type, query_target, estimated_reference_sizes: vec![], }, @@ -397,10 +412,10 @@ impl DirectQueryType { pub(crate) fn add_reference_sizes(self, reference_sizes: Vec<u32>) -> QueryType { match self { DirectQueryType::StatelessDirectQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, } => QueryType::StatelessQuery { - in_tree_using_sums, + in_tree_type: in_tree_using_sums, query_target, estimated_reference_sizes: reference_sizes, }, @@ -415,7 +430,7 @@ pub enum QueryType { /// Stateless query StatelessQuery { /// Does this tree use sums? - in_tree_using_sums: bool, + in_tree_type: TreeType, /// the type of Target (Tree or Value) query_target: QueryTarget, /// The estimated sizes of references @@ -429,11 +444,11 @@ impl From<BatchDeleteApplyType> for QueryType { fn from(value: BatchDeleteApplyType) -> Self { match value { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_value_size, .. } => QueryType::StatelessQuery { - in_tree_using_sums: is_sum_tree, + in_tree_type: is_sum_tree, query_target: QueryTarget::QueryTargetValue(estimated_value_size), estimated_reference_sizes: vec![], }, @@ -446,11 +461,11 @@ impl From<&BatchDeleteApplyType> for QueryType { fn from(value: &BatchDeleteApplyType) -> Self { match value { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_value_size, .. } => QueryType::StatelessQuery { - in_tree_using_sums: *is_sum_tree, + in_tree_type: *is_sum_tree, query_target: QueryTarget::QueryTargetValue(*estimated_value_size), estimated_reference_sizes: vec![], }, @@ -463,11 +478,11 @@ impl From<BatchDeleteApplyType> for DirectQueryType { fn from(value: BatchDeleteApplyType) -> Self { match value { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_value_size, .. } => DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: is_sum_tree, + in_tree_type: is_sum_tree, query_target: QueryTarget::QueryTargetValue(estimated_value_size), }, BatchDeleteApplyType::StatefulBatchDelete { .. } => { @@ -481,11 +496,11 @@ impl From<&BatchDeleteApplyType> for DirectQueryType { fn from(value: &BatchDeleteApplyType) -> Self { match value { BatchDeleteApplyType::StatelessBatchDelete { - is_sum_tree, + in_tree_type: is_sum_tree, estimated_value_size, .. } => DirectQueryType::StatelessDirectQuery { - in_tree_using_sums: *is_sum_tree, + in_tree_type: *is_sum_tree, query_target: QueryTarget::QueryTargetValue(*estimated_value_size), }, BatchDeleteApplyType::StatefulBatchDelete { .. } => { diff --git a/packages/rs-drive/src/util/object_size_info/contract_info.rs b/packages/rs-drive/src/util/object_size_info/contract_info.rs index d5bde596fae..7e8713f62dd 100644 --- a/packages/rs-drive/src/util/object_size_info/contract_info.rs +++ b/packages/rs-drive/src/util/object_size_info/contract_info.rs @@ -1,10 +1,14 @@ #[cfg(feature = "server")] use crate::drive::contract::DataContractFetchInfo; +#[cfg(feature = "server")] use crate::drive::Drive; +#[cfg(feature = "server")] use crate::error::document::DocumentError; +#[cfg(feature = "server")] use crate::error::Error; #[cfg(feature = "server")] use crate::fees::op::LowLevelDriveOperation; +#[cfg(feature = "server")] use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; use dpp::data_contract::document_type::DocumentTypeRef; @@ -13,6 +17,7 @@ use dpp::identifier::Identifier; use dpp::ProtocolError; #[cfg(feature = "server")] use grovedb::TransactionArg; +#[cfg(feature = "server")] use platform_version::version::PlatformVersion; use std::sync::Arc; diff --git a/packages/rs-drive/src/util/object_size_info/document_info.rs b/packages/rs-drive/src/util/object_size_info/document_info.rs index e2ad23c4f5a..e671b293a88 100644 --- a/packages/rs-drive/src/util/object_size_info/document_info.rs +++ b/packages/rs-drive/src/util/object_size_info/document_info.rs @@ -48,6 +48,7 @@ pub trait DocumentInfoV0Methods { &self, key_path: &str, document_type: DocumentTypeRef, + platform_version: &PlatformVersion, ) -> Result<u16, Error>; /// Gets the raw path for the given document type fn get_raw_for_document_type( @@ -111,6 +112,7 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { &self, key_path: &str, document_type: DocumentTypeRef, + platform_version: &PlatformVersion, ) -> Result<u16, Error> { match key_path { "$ownerId" | "$id" => Ok(DEFAULT_HASH_SIZE_U16), @@ -128,11 +130,14 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { key_path ))) })?; - let estimated_size = property.property_type.middle_byte_size_ceil().ok_or({ - Error::Drive(DriveError::CorruptedCodeExecution( - "document type must have a max size", - )) - })?; + let estimated_size = property + .property_type + .middle_byte_size_ceil(platform_version)? + .ok_or({ + Error::Drive(DriveError::CorruptedCodeExecution( + "document type must have a max size", + )) + })?; Ok(estimated_size) } } @@ -217,8 +222,10 @@ impl<'a> DocumentInfoV0Methods for DocumentInfo<'a> { )) })?; - let estimated_middle_size = - property.property_type.middle_byte_size_ceil().ok_or({ + let estimated_middle_size = property + .property_type + .middle_byte_size_ceil(platform_version)? + .ok_or({ Error::Drive(DriveError::CorruptedCodeExecution( "document type must have a max size", )) diff --git a/packages/rs-drive/src/util/operations/apply_batch_grovedb_operations/v0/mod.rs b/packages/rs-drive/src/util/operations/apply_batch_grovedb_operations/v0/mod.rs index af240c94907..22622d5adf1 100644 --- a/packages/rs-drive/src/util/operations/apply_batch_grovedb_operations/v0/mod.rs +++ b/packages/rs-drive/src/util/operations/apply_batch_grovedb_operations/v0/mod.rs @@ -9,7 +9,7 @@ use std::collections::HashMap; impl Drive { /// Applies a batch of groveDB operations if apply is True, otherwise gets the cost of the operations. - pub(crate) fn apply_batch_grovedb_operations_v0( + pub(super) fn apply_batch_grovedb_operations_v0( &self, estimated_costs_only_with_layer_info: Option< HashMap<KeyInfoPath, EstimatedLayerInformation>, diff --git a/packages/rs-drive/src/util/test_helpers/mod.rs b/packages/rs-drive/src/util/test_helpers/mod.rs index 81447b46915..8600f2eddbd 100644 --- a/packages/rs-drive/src/util/test_helpers/mod.rs +++ b/packages/rs-drive/src/util/test_helpers/mod.rs @@ -40,18 +40,25 @@ pub fn setup_contract( drive: &Drive, path: &str, contract_id: Option<[u8; 32]>, + owner_id: Option<[u8; 32]>, + contract_modification: Option<impl FnOnce(&mut DataContract)>, transaction: TransactionArg, + use_platform_version: Option<&PlatformVersion>, ) -> DataContract { - let platform_version = PlatformVersion::latest(); - let contract = json_document_to_contract_with_ids( + let platform_version = use_platform_version.unwrap_or(PlatformVersion::latest()); + let mut contract = json_document_to_contract_with_ids( path, contract_id.map(Identifier::from), - None, + owner_id.map(Identifier::from), false, //no need to validate the data contracts in tests for drive platform_version, ) .expect("expected to get json based contract"); + if let Some(contract_modification) = contract_modification { + contract_modification(&mut contract); + } + drive .apply_contract( &contract, diff --git a/packages/rs-drive/src/util/test_helpers/setup.rs b/packages/rs-drive/src/util/test_helpers/setup.rs index d80f600def9..bbb935219cc 100644 --- a/packages/rs-drive/src/util/test_helpers/setup.rs +++ b/packages/rs-drive/src/util/test_helpers/setup.rs @@ -36,10 +36,14 @@ impl Default for SetupFeePoolsOptions { #[cfg(feature = "full")] /// Sets up Drive using a temporary directory and the optionally given Drive configuration settings. -pub fn setup_drive(drive_config: Option<DriveConfig>) -> Drive { +pub fn setup_drive( + drive_config: Option<DriveConfig>, + specific_platform_version: Option<&PlatformVersion>, +) -> Drive { let tmp_dir = TempDir::new().unwrap(); - let (drive, _) = Drive::open(tmp_dir, drive_config).expect("should open Drive successfully"); + let (drive, _) = Drive::open(tmp_dir, drive_config, specific_platform_version) + .expect("should open Drive successfully"); drive } @@ -49,10 +53,13 @@ pub fn setup_drive(drive_config: Option<DriveConfig>) -> Drive { pub fn setup_drive_with_initial_state_structure( specific_platform_version: Option<&PlatformVersion>, ) -> Drive { - let drive = setup_drive(Some(DriveConfig { - batching_consistency_verification: true, - ..Default::default() - })); + let drive = setup_drive( + Some(DriveConfig { + batching_consistency_verification: true, + ..Default::default() + }), + specific_platform_version, + ); let platform_version = specific_platform_version.unwrap_or(PlatformVersion::latest()); drive diff --git a/packages/rs-drive/src/util/type_constants.rs b/packages/rs-drive/src/util/type_constants.rs index 517a08a2751..8979cca62a9 100644 --- a/packages/rs-drive/src/util/type_constants.rs +++ b/packages/rs-drive/src/util/type_constants.rs @@ -11,6 +11,8 @@ pub const DEFAULT_HASH_SIZE_U32: u32 = 32; /// Default float size pub const DEFAULT_FLOAT_SIZE: u32 = 8; /// u64 size +pub const U64_SIZE_U32: u32 = 8; +/// u64 size pub const U64_SIZE_U16: u16 = 8; /// u64 size pub const U64_SIZE_U8: u8 = 8; diff --git a/packages/rs-drive/src/verify/group/mod.rs b/packages/rs-drive/src/verify/group/mod.rs new file mode 100644 index 00000000000..d77cec3ea0f --- /dev/null +++ b/packages/rs-drive/src/verify/group/mod.rs @@ -0,0 +1,4 @@ +mod verify_action_signers; +mod verify_active_action_infos; +mod verify_group_info; +mod verify_group_infos_in_contract; diff --git a/packages/rs-drive/src/verify/group/verify_action_signers/mod.rs b/packages/rs-drive/src/verify/group/verify_action_signers/mod.rs new file mode 100644 index 00000000000..e708038af44 --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_action_signers/mod.rs @@ -0,0 +1,78 @@ +mod v0; + +use crate::drive::Drive; +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the proof of action signer information within a contract. + /// + /// This method validates and extracts action signer information stored in a contract based on the provided proof. + /// It uses the proof to confirm the integrity and authenticity of the action signer data. The method supports + /// different versions for backward compatibility and forwards the verification logic to the appropriate versioned implementation. + /// + /// # Type Parameters + /// - `T`: The output container type that implements `FromIterator`. This is used to collect the verified action signer information + /// as pairs of [`Identifier`] and [`GroupMemberPower`]. + /// + /// # Arguments + /// - `proof`: A byte slice containing the cryptographic proof for the active_action information. + /// - `contract_id`: The identifier of the contract whose active_action information is being verified. + /// - `start_active_action_contract_position`: An optional starting position for the active_action query, combined with a [`StartAtIncluded`] flag + /// to indicate whether the start position is inclusive. + /// - `limit`: An optional limit on the number of active_actions to verify. + /// - `verify_subset_of_proof`: A boolean flag indicating whether to verify only a subset of the proof (useful for optimizations). + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok((RootHash, T))`: On success, returns a tuple containing: + /// - `RootHash`: The root hash of the Merkle tree, confirming the proof's validity. + /// - `T`: A collection of verified active_action information as pairs of [`GroupContractPosition`] and [`Group`]. + /// + /// # Errors + /// - [`Error::Proof`]: If the proof is invalid, corrupted, or contains unexpected data structures. + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - Any other errors propagated from the versioned implementation. + pub fn verify_action_signers<T: FromIterator<(Identifier, GroupMemberPower)>>( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .group + .verify_action_signers + { + 0 => Self::verify_action_signers_v0( + proof, + contract_id, + group_contract_position, + action_status, + action_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_action_signers".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/group/verify_action_signers/v0/mod.rs b/packages/rs-drive/src/verify/group/verify_action_signers/v0/mod.rs new file mode 100644 index 00000000000..2cffb68635f --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_action_signers/v0/mod.rs @@ -0,0 +1,72 @@ +use crate::drive::Drive; +use grovedb::Element::SumItem; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::data_contract::group::GroupMemberPower; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_action_signers_v0<T: FromIterator<(Identifier, GroupMemberPower)>>( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + action_id: Identifier, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Drive::group_action_signers_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + action_id.to_buffer(), + ); + + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? + } else { + GroveDb::verify_query(proof, &path_query, &platform_version.drive.grove_version)? + }; + let values = proved_key_values + .into_iter() + .filter_map(|(_, key, element)| { + let id: Identifier = match key.try_into() { + Ok(id) => id, + Err(_) => { + return Some(Err(Error::Proof(ProofError::IncorrectProof( + "identifier was not 32 bytes long".to_string(), + )))) + } + }; + match element { + Some(SumItem(value, ..)) => { + let signing_power: GroupMemberPower = match value.try_into() { + Ok(signing_power) => signing_power, + Err(_) => { + return Some(Err(Error::Proof(ProofError::IncorrectProof( + "signed power should be encodable on a u32 integer".to_string(), + )))) + } + }; + + Some(Ok((id, signing_power))) + } + None => None, + _ => Some(Err(Error::Proof(ProofError::IncorrectProof( + "element should be a sum item representing member signed power".to_string(), + )) + .into())), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } +} diff --git a/packages/rs-drive/src/verify/group/verify_active_action_infos/mod.rs b/packages/rs-drive/src/verify/group/verify_active_action_infos/mod.rs new file mode 100644 index 00000000000..d0d81ecd694 --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_active_action_infos/mod.rs @@ -0,0 +1,81 @@ +mod v0; + +use crate::drive::Drive; +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the proof of action information within a contract. + /// + /// This method validates and extracts action information stored in a contract based on the provided proof. + /// It uses the proof to confirm the integrity and authenticity of the action data. The method supports + /// different versions for backward compatibility and forwards the verification logic to the appropriate versioned implementation. + /// + /// # Type Parameters + /// - `T`: The output container type that implements `FromIterator`. This is used to collect the verified action information + /// as pairs of [`Identifier`] and [`GroupAction`]. + /// + /// # Arguments + /// - `proof`: A byte slice containing the cryptographic proof for the active_action information. + /// - `contract_id`: The identifier of the contract whose active_action information is being verified. + /// - `start_active_action_contract_position`: An optional starting position for the active_action query, combined with a [`StartAtIncluded`] flag + /// to indicate whether the start position is inclusive. + /// - `limit`: An optional limit on the number of active_actions to verify. + /// - `verify_subset_of_proof`: A boolean flag indicating whether to verify only a subset of the proof (useful for optimizations). + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok((RootHash, T))`: On success, returns a tuple containing: + /// - `RootHash`: The root hash of the Merkle tree, confirming the proof's validity. + /// - `T`: A collection of verified active_action information as pairs of [`GroupContractPosition`] and [`Group`]. + /// + /// # Errors + /// - [`Error::Proof`]: If the proof is invalid, corrupted, or contains unexpected data structures. + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - Any other errors propagated from the versioned implementation. + pub fn verify_action_infos_in_contract<T: FromIterator<(Identifier, GroupAction)>>( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .group + .verify_action_infos + { + 0 => Self::verify_action_infos_in_contract_v0( + proof, + contract_id, + group_contract_position, + action_status, + start_action_id, + limit, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_action_infos_in_contract".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/group/verify_active_action_infos/v0/mod.rs b/packages/rs-drive/src/verify/group/verify_active_action_infos/v0/mod.rs new file mode 100644 index 00000000000..972ddc10827 --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_active_action_infos/v0/mod.rs @@ -0,0 +1,74 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::data_contract::GroupContractPosition; +use dpp::group::group_action::GroupAction; +use dpp::group::group_action_status::GroupActionStatus; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::serialization::PlatformDeserializable; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_action_infos_in_contract_v0<T: FromIterator<(Identifier, GroupAction)>>( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + action_status: GroupActionStatus, + start_action_id: Option<(Identifier, StartAtIncluded)>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Drive::group_action_infos_query( + contract_id.to_buffer(), + group_contract_position, + action_status, + start_action_id.map(|(s, i)| (s.to_buffer(), i)), + limit, + ); + + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? + } else { + GroveDb::verify_query(proof, &path_query, &platform_version.drive.grove_version)? + }; + let values = proved_key_values + .into_iter() + .filter_map(|(path, _, element)| { + let Some(last_path_component) = path.last() else { + return Some(Err(Error::Proof(ProofError::IncorrectProof( + "last path component is empty".to_string(), + )))); + }; + let action_id = match Identifier::from_bytes(last_path_component) { + Ok(action_id) => action_id, + Err(e) => return Some(Err(e.into())), + }; + + match element { + Some(Item(value, ..)) => { + let active_action = match GroupAction::deserialize_from_bytes(&value) { + Ok(active_action) => active_action, + + Err(e) => return Some(Err(e.into())), + }; + Some(Ok((action_id, active_action))) + } + None => None, + Some(element) => Some(Err(Error::Proof(ProofError::IncorrectProof(format!( + "group action should be in an item, however a {} was returned", + element.type_str() + ))))), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } +} diff --git a/packages/rs-drive/src/verify/group/verify_group_info/mod.rs b/packages/rs-drive/src/verify/group/verify_group_info/mod.rs new file mode 100644 index 00000000000..ded3f812feb --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_group_info/mod.rs @@ -0,0 +1,69 @@ +mod v0; + +use crate::drive::Drive; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the proof of a single group's information within a contract. + /// + /// This method validates and extracts a specific group's information stored in a contract based on the provided proof. + /// It ensures the integrity and authenticity of the data associated with the specified group position in the contract. + /// The method supports multiple versions for backward compatibility and forwards the verification logic + /// to the appropriate versioned implementation. + /// + /// # Arguments + /// - `proof`: A byte slice containing the cryptographic proof for the group information. + /// - `contract_id`: The identifier of the contract containing the group information. + /// - `group_contract_position`: The position of the group within the contract to verify. + /// - `verify_subset_of_proof`: A boolean flag indicating whether to verify only a subset of the proof (useful for optimizations). + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok((RootHash, Option<Group>))`: On success, returns a tuple containing: + /// - `RootHash`: The root hash of the Merkle tree, confirming the proof's validity. + /// - `Option<Group>`: The verified group information if it exists, or `None` if the group is absent. + /// - `Err(Error)`: If verification fails, returns an [`Error`] indicating the cause of failure. + /// + /// # Errors + /// - [`Error::Proof`]: If the proof is invalid, corrupted, or contains unexpected data structures. + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - [`Error::GroveDB`]: If the data deserialization or conversion fails during proof verification. + pub fn verify_group_info( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<Group>), Error> { + match platform_version + .drive + .methods + .verify + .group + .verify_group_info + { + 0 => Self::verify_group_info_v0( + proof, + contract_id, + group_contract_position, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_group_info".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/group/verify_group_info/v0/mod.rs b/packages/rs-drive/src/verify/group/verify_group_info/v0/mod.rs new file mode 100644 index 00000000000..0b2ae2397c3 --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_group_info/v0/mod.rs @@ -0,0 +1,57 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::serialization::PlatformDeserializable; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_group_info_v0( + proof: &[u8], + contract_id: Identifier, + group_contract_position: GroupContractPosition, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<Group>), Error> { + let path_query = Self::group_info_for_contract_id_and_group_contract_position_query( + contract_id.to_buffer(), + group_contract_position, + ); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + + if proved_key_values.len() != 1 { + return Err(Error::Proof(ProofError::CorruptedProof( + "we should always get back one element".to_string(), + ))); + } + + let element = proved_key_values.remove(0).2; + + let group = element + .map(|element| element.into_item_bytes().map_err(Error::GroveDB)) + .transpose()? + .map(|bytes| Group::deserialize_from_bytes(&bytes)) + .transpose()?; + + Ok((root_hash, group)) + } +} diff --git a/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/mod.rs b/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/mod.rs new file mode 100644 index 00000000000..0d20771bc67 --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/mod.rs @@ -0,0 +1,77 @@ +mod v0; + +use crate::drive::Drive; +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the proof of group information within a contract. + /// + /// This method validates and extracts group information stored in a contract based on the provided proof. + /// It uses the proof to confirm the integrity and authenticity of the group data. The method supports + /// different versions for backward compatibility and forwards the verification logic to the appropriate versioned implementation. + /// + /// # Type Parameters + /// - `T`: The output container type that implements `FromIterator`. This is used to collect the verified group information + /// as pairs of [`GroupContractPosition`] and [`Group`]. + /// + /// # Arguments + /// - `proof`: A byte slice containing the cryptographic proof for the group information. + /// - `contract_id`: The identifier of the contract whose group information is being verified. + /// - `start_group_contract_position`: An optional starting position for the group query, combined with a [`StartAtIncluded`] flag + /// to indicate whether the start position is inclusive. + /// - `limit`: An optional limit on the number of groups to verify. + /// - `verify_subset_of_proof`: A boolean flag indicating whether to verify only a subset of the proof (useful for optimizations). + /// - `platform_version`: A reference to the platform version, used to determine the appropriate versioned implementation. + /// + /// # Returns + /// - `Ok((RootHash, T))`: On success, returns a tuple containing: + /// - `RootHash`: The root hash of the Merkle tree, confirming the proof's validity. + /// - `T`: A collection of verified group information as pairs of [`GroupContractPosition`] and [`Group`]. + /// - `Err(Error)`: If verification fails, returns an [`Error`] indicating the cause of failure. + /// + /// # Errors + /// - [`Error::Proof`]: If the proof is invalid, corrupted, or contains unexpected data structures. + /// - [`Error::Drive(DriveError::UnknownVersionMismatch)`]: If the method is called with an unsupported platform version. + /// - Any other errors propagated from the versioned implementation. + pub fn verify_group_infos_in_contract<T: FromIterator<(GroupContractPosition, Group)>>( + proof: &[u8], + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .group + .verify_group_infos_in_contract + { + 0 => Self::verify_group_infos_in_contract_v0( + proof, + contract_id, + start_group_contract_position, + limit, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_group_infos_in_contract".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/v0/mod.rs b/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/v0/mod.rs new file mode 100644 index 00000000000..e594605f95b --- /dev/null +++ b/packages/rs-drive/src/verify/group/verify_group_infos_in_contract/v0/mod.rs @@ -0,0 +1,79 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::data_contract::group::Group; +use dpp::data_contract::GroupContractPosition; +use dpp::identifier::Identifier; +use dpp::prelude::StartAtIncluded; +use dpp::serialization::PlatformDeserializable; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_group_infos_in_contract_v0< + T: FromIterator<(GroupContractPosition, Group)>, + >( + proof: &[u8], + contract_id: Identifier, + start_group_contract_position: Option<(GroupContractPosition, StartAtIncluded)>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::group_infos_for_contract_id_query( + contract_id.to_buffer(), + start_group_contract_position, + limit, + ); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? + } else { + GroveDb::verify_query(proof, &path_query, &platform_version.drive.grove_version)? + }; + let values = proved_key_values + .into_iter() + .filter_map(|(path, _, element)| { + let key_bytes = match path.last() { + Some(contract_position_bytes) => contract_position_bytes, + None => { + return Some(Err(Error::Proof(ProofError::CorruptedProof( + "path can't be empty in proof".to_string(), + )))) + } + }; + let key_bytes: [u8; 2] = match key_bytes.clone().try_into().map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize( + "group contract position incorrect size", + )) + }) { + Ok(bytes) => bytes, + + Err(e) => return Some(Err(e)), + }; + let group_contract_position: GroupContractPosition = + GroupContractPosition::from_be_bytes(key_bytes); + match element { + Some(Item(value, ..)) => { + let group = match Group::deserialize_from_bytes(&value) { + Ok(group) => group, + + Err(e) => return Some(Err(e.into())), + }; + Some(Ok((group_contract_position, group))) + } + None => None, + Some(element) => Some(Err(Error::Proof(ProofError::IncorrectProof(format!( + "group should be in an item, however a {} was returned", + element.type_str() + ))))), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } +} diff --git a/packages/rs-drive/src/verify/mod.rs b/packages/rs-drive/src/verify/mod.rs index b4c627718e2..98d19c7bb06 100644 --- a/packages/rs-drive/src/verify/mod.rs +++ b/packages/rs-drive/src/verify/mod.rs @@ -10,8 +10,13 @@ pub mod single_document; /// System components (Epoch info etc...) verification methods on proofs pub mod system; +/// Group proof verification module +pub mod group; /// Verifies that a state transition contents exist in the proof pub mod state_transition; +/// Token proof verification module +pub mod tokens; +/// Voting proof verification module pub mod voting; /// Represents the root hash of the grovedb tree diff --git a/packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs b/packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs index d424fbe3289..c52ae174cee 100644 --- a/packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs +++ b/packages/rs-drive/src/verify/state_transition/verify_state_transition_was_executed_with_proof/v0/mod.rs @@ -1,6 +1,10 @@ use std::collections::BTreeMap; +use dpp::balances::credits::TokenAmount; use dpp::block::block_info::BlockInfo; use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::accessors::v1::DataContractV1Getters; +use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters; +use dpp::data_contract::config::v0::DataContractConfigGettersV0; use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; use dpp::document::{Document, DocumentV0Getters}; @@ -9,28 +13,39 @@ use dpp::document::property_names::PRICE; use dpp::fee::Credits; use dpp::identity::PartialIdentity; use dpp::platform_value::btreemap_extensions::BTreeValueMapHelper; +use dpp::prelude::Identifier; use dpp::state_transition::data_contract_create_transition::accessors::DataContractCreateTransitionAccessorsV0; use dpp::state_transition::data_contract_update_transition::accessors::DataContractUpdateTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::BatchedTransitionRef; use dpp::state_transition::identity_create_transition::accessors::IdentityCreateTransitionAccessorsV0; use dpp::state_transition::identity_credit_transfer_transition::accessors::IdentityCreditTransferTransitionAccessorsV0; use dpp::state_transition::identity_credit_withdrawal_transition::accessors::IdentityCreditWithdrawalTransitionAccessorsV0; use dpp::state_transition::identity_topup_transition::accessors::IdentityTopUpTransitionAccessorsV0; use dpp::state_transition::identity_update_transition::accessors::IdentityUpdateTransitionAccessorsV0; use dpp::state_transition::{StateTransition, StateTransitionLike}; -use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentFromCreateTransition; -use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_replace_transition::DocumentFromReplaceTransition; -use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use dpp::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use dpp::state_transition::batch_transition::document_create_transition::DocumentFromCreateTransition; +use dpp::state_transition::batch_transition::document_replace_transition::DocumentFromReplaceTransition; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_transition::{DocumentTransition, DocumentTransitionV0Methods}; +use dpp::state_transition::batch_transition::batched_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::token_transition::{TokenTransition, TokenTransitionV0Methods, TOKEN_HISTORY_ID_BYTES}; +use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::token_config_update_transition::v0::v0_methods::TokenConfigUpdateTransitionV0Methods; +use dpp::state_transition::batch_transition::token_destroy_frozen_funds_transition::v0::v0_methods::TokenDestroyFrozenFundsTransitionV0Methods; +use dpp::state_transition::batch_transition::token_emergency_action_transition::v0::v0_methods::TokenEmergencyActionTransitionV0Methods; +use dpp::state_transition::batch_transition::token_freeze_transition::v0::v0_methods::TokenFreezeTransitionV0Methods; +use dpp::state_transition::batch_transition::token_mint_transition::v0::v0_methods::TokenMintTransitionV0Methods; +use dpp::state_transition::batch_transition::token_transfer_transition::v0::v0_methods::TokenTransferTransitionV0Methods; +use dpp::state_transition::batch_transition::token_unfreeze_transition::v0::v0_methods::TokenUnfreezeTransitionV0Methods; use dpp::state_transition::masternode_vote_transition::accessors::MasternodeVoteTransitionAccessorsV0; use dpp::state_transition::proof_result::StateTransitionProofResult; -use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedMasternodeVote, VerifiedPartialIdentity}; +use dpp::state_transition::proof_result::StateTransitionProofResult::{VerifiedBalanceTransfer, VerifiedDataContract, VerifiedDocuments, VerifiedIdentity, VerifiedMasternodeVote, VerifiedPartialIdentity, VerifiedTokenActionWithDocument, VerifiedTokenBalance, VerifiedTokenBalanceAbsence, VerifiedTokenIdentitiesBalances, VerifiedTokenIdentityInfo, VerifiedTokenStatus}; +use dpp::tokens::info::v0::IdentityTokenInfoV0Accessors; +use dpp::tokens::status::v0::TokenStatusV0Accessors; use dpp::voting::vote_polls::VotePoll; use dpp::voting::votes::resource_vote::accessors::v0::ResourceVoteGettersV0; use dpp::voting::votes::Vote; @@ -91,11 +106,11 @@ impl Drive { } Ok((root_hash, VerifiedDataContract(contract))) } - StateTransition::DocumentsBatch(documents_batch_transition) => { - if documents_batch_transition.transitions().len() > 1 { + StateTransition::Batch(documents_batch_transition) => { + if documents_batch_transition.transitions_len() > 1 { return Err(Error::Proof(ProofError::InvalidTransition(format!("version {} does not support more than one document in a document batch transition", platform_version.protocol_version)))); } - let Some(transition) = documents_batch_transition.transitions().first() else { + let Some(transition) = documents_batch_transition.first_transition() else { return Err(Error::Proof(ProofError::InvalidTransition( "no transition in a document batch transition".to_string(), ))); @@ -103,168 +118,425 @@ impl Drive { let owner_id = documents_batch_transition.owner_id(); - let data_contract_id = transition.data_contract_id(); + match transition { + BatchedTransitionRef::Document(document_transition) => { + let data_contract_id = document_transition.data_contract_id(); - let contract = known_contracts_provider_fn(&data_contract_id)?.ok_or( - Error::Proof(ProofError::UnknownContract(format!( - "unknown contract with id {}", - data_contract_id - ))), - )?; + let contract = known_contracts_provider_fn(&data_contract_id)?.ok_or( + Error::Proof(ProofError::UnknownContract(format!( + "unknown contract with id {}", + data_contract_id + ))), + )?; - let document_type = contract - .document_type_for_name(transition.document_type_name()) - .map_err(|e| { - Error::Proof(ProofError::UnknownContract(format!( - "cannot fetch contract for document {} with id {}: {}", - transition.document_type_name(), - transition.data_contract_id(), - e - ))) - })?; - - let contested_status = - if let DocumentTransition::Create(create_transition) = transition { - if create_transition.prefunded_voting_balance().is_some() { - SingleDocumentDriveQueryContestedStatus::Contested - } else { - SingleDocumentDriveQueryContestedStatus::NotContested - } - } else { - SingleDocumentDriveQueryContestedStatus::NotContested - }; + let document_type = contract + .document_type_for_name(document_transition.document_type_name()) + .map_err(|e| { + Error::Proof(ProofError::UnknownContract(format!( + "cannot fetch contract for document {} with id {}: {}", + document_transition.document_type_name(), + document_transition.data_contract_id(), + e + ))) + })?; - match transition { - DocumentTransition::Create(_) => {} - DocumentTransition::Replace(_) => {} - DocumentTransition::Delete(_) => {} - DocumentTransition::Transfer(_) => {} - DocumentTransition::UpdatePrice(_) => {} - DocumentTransition::Purchase(_) => {} - } + let contested_status = + if let DocumentTransition::Create(create_transition) = + document_transition + { + if create_transition.prefunded_voting_balance().is_some() { + SingleDocumentDriveQueryContestedStatus::Contested + } else { + SingleDocumentDriveQueryContestedStatus::NotContested + } + } else { + SingleDocumentDriveQueryContestedStatus::NotContested + }; - let query = SingleDocumentDriveQuery { - contract_id: transition.data_contract_id().into_buffer(), - document_type_name: transition.document_type_name().clone(), - document_type_keeps_history: document_type.documents_keep_history(), - document_id: transition.base().id().into_buffer(), - block_time_ms: None, //None because we want latest - contested_status, - }; - let (root_hash, document) = - query.verify_proof(false, proof, document_type, platform_version)?; + let query = SingleDocumentDriveQuery { + contract_id: document_transition.data_contract_id().into_buffer(), + document_type_name: document_transition.document_type_name().clone(), + document_type_keeps_history: document_type.documents_keep_history(), + document_id: document_transition.base().id().into_buffer(), + block_time_ms: None, //None because we want latest + contested_status, + }; + let (root_hash, document) = + query.verify_proof(false, proof, document_type, platform_version)?; - match transition { - DocumentTransition::Create(create_transition) => { - let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (create)", create_transition.base().id()))))?; - let expected_document = Document::try_from_create_transition( - create_transition, - documents_batch_transition.owner_id(), - block_info, - &document_type, - platform_version, - )?; + match document_transition { + DocumentTransition::Create(create_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (create)", create_transition.base().id()))))?; + let expected_document = Document::try_from_create_transition( + create_transition, + documents_batch_transition.owner_id(), + block_info, + &document_type, + platform_version, + )?; + + let transient_fields = document_type + .transient_fields() + .iter() + .map(|a| a.as_str()) + .collect(); + + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + Some(transient_fields), + platform_version, + )? { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after create with id {}", create_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + document.id(), + Some(document), + )])), + )) + } + DocumentTransition::Replace(replace_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (replace)", replace_transition.base().id()))))?; + let expected_document = Document::try_from_replace_transition( + replace_transition, + documents_batch_transition.owner_id(), + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + document.created_at(), //we can trust the created at (as we don't care) + document.created_at_block_height(), //we can trust the created at block height (as we don't care) + document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) + block_info, + &document_type, + platform_version, + )?; + + let transient_fields = document_type + .transient_fields() + .iter() + .map(|a| a.as_str()) + .collect(); + + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + Some(transient_fields), + platform_version, + )? { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after replace with id {}", replace_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + document.id(), + Some(document), + )])), + )) + } + DocumentTransition::Transfer(transfer_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (transfer)", transfer_transition.base().id()))))?; + let recipient_owner_id = transfer_transition.recipient_owner_id(); + + if document.owner_id() != recipient_owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", transfer_transition.base().id())))); + } - let transient_fields = document_type - .transient_fields() - .iter() - .map(|a| a.as_str()) - .collect(); - - if !document.is_equal_ignoring_time_based_fields( - &expected_document, - Some(transient_fields), - platform_version, - )? { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after create with id {}", create_transition.base().id())))); + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + document.id(), + Some(document), + )])), + )) + } + DocumentTransition::Delete(delete_transition) => { + if document.is_some() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution contained document after delete with id {}", delete_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + delete_transition.base().id(), + None, + )])), + )) + } + DocumentTransition::UpdatePrice(update_price_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; + let new_document_price : Credits = document.properties().get_integer(PRICE).map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; + if new_document_price != update_price_transition.price() { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); + } + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + document.id(), + Some(document), + )])), + )) + } + DocumentTransition::Purchase(purchase_transition) => { + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (purchase)", purchase_transition.base().id()))))?; + + if document.owner_id() != owner_id { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", purchase_transition.base().id())))); + } + + Ok(( + root_hash, + VerifiedDocuments(BTreeMap::from([( + document.id(), + Some(document), + )])), + )) + } } - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), - )) } - DocumentTransition::Replace(replace_transition) => { - let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (replace)", replace_transition.base().id()))))?; - let expected_document = Document::try_from_replace_transition( - replace_transition, - documents_batch_transition.owner_id(), - document.created_at(), //we can trust the created at (as we don't care) - document.created_at_block_height(), //we can trust the created at block height (as we don't care) - document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) - document.created_at(), //we can trust the created at (as we don't care) - document.created_at_block_height(), //we can trust the created at block height (as we don't care) - document.created_at_core_block_height(), //we can trust the created at core block height (as we don't care) - block_info, - &document_type, - platform_version, + BatchedTransitionRef::Token(token_transition) => { + //todo group actions + let data_contract_id = token_transition.data_contract_id(); + let token_id = token_transition.token_id(); + + let contract = known_contracts_provider_fn(&data_contract_id)?.ok_or( + Error::Proof(ProofError::UnknownContract(format!( + "unknown contract with id {}", + data_contract_id + ))), )?; - let transient_fields = document_type - .transient_fields() - .iter() - .map(|a| a.as_str()) - .collect(); - - if !document.is_equal_ignoring_time_based_fields( - &expected_document, - Some(transient_fields), - platform_version, - )? { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document (time fields were not checked) after replace with id {}", replace_transition.base().id())))); - } + let identity_contract_nonce = + token_transition.base().identity_contract_nonce(); - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), - )) - } - DocumentTransition::Transfer(transfer_transition) => { - let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (transfer)", transfer_transition.base().id()))))?; - let recipient_owner_id = transfer_transition.recipient_owner_id(); + let document_type_name = + token_transition.historical_document_type_name().to_string(); + let document_type = token_transition.historical_document_type(&contract)?; - if document.owner_id() != recipient_owner_id { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", transfer_transition.base().id())))); - } + let token_config = contract.expected_token_configuration( + token_transition.base().token_contract_position(), + )?; + let keeps_historical_document = token_config.keeps_history(); + if keeps_historical_document { + let query = SingleDocumentDriveQuery { + contract_id: TOKEN_HISTORY_ID_BYTES, + document_type_name, + document_type_keeps_history: false, + document_id: token_transition + .historical_document_id(owner_id, identity_contract_nonce) + .to_buffer(), + block_time_ms: None, //None because we want latest + contested_status: + SingleDocumentDriveQueryContestedStatus::NotContested, + }; - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), - )) - } - DocumentTransition::Delete(delete_transition) => { - if document.is_some() { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution contained document after delete with id {}", delete_transition.base().id())))); - } - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([( - delete_transition.base().id(), - None, - )])), - )) - } - DocumentTransition::UpdatePrice(update_price_transition) => { - let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (update price)", update_price_transition.base().id()))))?; - let new_document_price : Credits = document.properties().get_integer(PRICE).map_err(|e| Error::Proof(ProofError::IncorrectProof(format!("proof did not contain a document that contained a price field with id {} expected to exist because of state transition (update price): {}", update_price_transition.base().id(), e))))?; - if new_document_price != update_price_transition.price() { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not contain expected document update of price after price update with id {}", update_price_transition.base().id())))); - } - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), - )) - } - DocumentTransition::Purchase(purchase_transition) => { - let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because of state transition (purchase)", purchase_transition.base().id()))))?; + let expected_document = token_transition.build_historical_document( + &contract, + token_id, + owner_id, + identity_contract_nonce, + &BlockInfo::default(), + token_config, + platform_version, + )?; + let (root_hash, document) = query.verify_proof( + false, + proof, + document_type, + platform_version, + )?; + let document = document.ok_or(Error::Proof(ProofError::IncorrectProof(format!("proof did not contain document with id {} expected to exist because the token keeps historical documents", token_transition.historical_document_type_name()))))?; + if !document.is_equal_ignoring_time_based_fields( + &expected_document, + Some(vec!["destroyedAmount"]), + platform_version, + )? { + return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not show the correct historical document {}, {}", document, expected_document)))); + } + Ok((root_hash, VerifiedTokenActionWithDocument(document))) + } else { + match token_transition { + TokenTransition::Burn(_) => { + let (root_hash, Some(balance)) = + Drive::verify_token_balance_for_identity_id( + proof, + token_id.into_buffer(), + owner_id.into_buffer(), + false, + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain token balance for identity {} expected to exist because of state transition (token burn)", owner_id)))); + }; + Ok((root_hash, VerifiedTokenBalance(owner_id, balance))) + } + TokenTransition::Mint(token_mint_transition) => { + let recipient_id = + token_mint_transition.recipient_id(token_config)?; + let (root_hash, Some(balance)) = + Drive::verify_token_balance_for_identity_id( + proof, + token_id.into_buffer(), + recipient_id.into_buffer(), + false, + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain token balance for identity {} expected to exist because of state transition (token mint)", recipient_id)))); + }; + Ok((root_hash, VerifiedTokenBalance(recipient_id, balance))) + } + TokenTransition::Transfer(token_transfer_transition) => { + let recipient_id = token_transfer_transition.recipient_id(); + let identity_ids = + [owner_id.to_buffer(), recipient_id.to_buffer()]; + let (root_hash, balances): ( + RootHash, + BTreeMap<Identifier, Option<TokenAmount>>, + ) = Drive::verify_token_balances_for_identity_ids( + proof, + token_id.into_buffer(), + &identity_ids, + false, + platform_version, + )?; - if document.owner_id() != owner_id { - return Err(Error::Proof(ProofError::IncorrectProof(format!("proof of state transition execution did not have the transfer executed after expected transfer with id {}", purchase_transition.base().id())))); - } + let balances = balances.into_iter().map(|(id, maybe_balance)| { + let balance = maybe_balance.ok_or(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain token balance for identity {} expected to exist because of state transition (token transfer)", id))))?; + Ok((id, balance)) + }).collect::<Result<_, Error>>()?; - Ok(( - root_hash, - VerifiedDocuments(BTreeMap::from([(document.id(), Some(document))])), - )) + Ok((root_hash, VerifiedTokenIdentitiesBalances(balances))) + } + TokenTransition::Freeze(token_freeze_transition) => { + let (root_hash, Some(identity_token_info)) = + Drive::verify_token_info_for_identity_id( + proof, + token_id.into_buffer(), + token_freeze_transition + .frozen_identity_id() + .into_buffer(), + false, + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain token info for identity {} expected to exist because of state transition (token freeze)", token_freeze_transition.frozen_identity_id())))); + }; + if !identity_token_info.frozen() { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof contained token info saying this token was not frozen for identity {}", token_freeze_transition.frozen_identity_id())))); + } + Ok(( + root_hash, + VerifiedTokenIdentityInfo(owner_id, identity_token_info), + )) + } + TokenTransition::Unfreeze(token_unfreeze_transition) => { + let (root_hash, Some(identity_token_info)) = + Drive::verify_token_info_for_identity_id( + proof, + token_id.into_buffer(), + token_unfreeze_transition + .frozen_identity_id() + .into_buffer(), + false, + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof did not contain token info for identity {} expected to exist because of state transition (token freeze)", token_unfreeze_transition.frozen_identity_id())))); + }; + if identity_token_info.frozen() { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof contained token info saying this token was frozen for identity {} when we just unfroze it", token_unfreeze_transition.frozen_identity_id())))); + } + Ok(( + root_hash, + VerifiedTokenIdentityInfo(owner_id, identity_token_info), + )) + } + TokenTransition::DestroyFrozenFunds( + destroy_frozen_funds_transition, + ) => { + let (root_hash, maybe_token_amount) = + Drive::verify_token_balance_for_identity_id( + proof, + token_id.into_buffer(), + destroy_frozen_funds_transition + .frozen_identity_id() + .into_buffer(), + false, + platform_version, + )?; + if maybe_token_amount != Some(0) { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof contained non-zero token balance for identity {} expected to be zero because of state transition (token destroy frozen funds)", destroy_frozen_funds_transition.frozen_identity_id())))); + }; + Ok(( + root_hash, + VerifiedTokenBalanceAbsence( + destroy_frozen_funds_transition.frozen_identity_id(), + ), + )) + } + TokenTransition::EmergencyAction(emergency_action_transition) => { + let (root_hash, Some(token_status)) = + Drive::verify_token_status( + proof, + token_id.into_buffer(), + false, + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + "proof did not contain token status expected to exist because of state transition (token emergency action)".to_string()))); + }; + if token_status.paused() + != emergency_action_transition.emergency_action().paused() + { + return Err(Error::Proof(ProofError::IncorrectProof( + format!("proof contained token status saying this token is {}paused, but we expected {}paused", if token_status.paused() {""} else {"not "}, if emergency_action_transition.emergency_action().paused() {""} else {"not "})))); + } + Ok((root_hash, VerifiedTokenStatus(token_status))) + } + TokenTransition::ConfigUpdate(update) => { + let (root_hash, Some(updated_contract)) = + Drive::verify_contract( + proof, + Some(contract.config().keeps_history()), + false, + false, + contract.id().into_buffer(), + platform_version, + )? + else { + return Err(Error::Proof(ProofError::IncorrectProof( + "proof did not contain token status expected to exist because of state transition (token emergency action)".to_string()))); + }; + let mut expected_config = token_config.clone(); + expected_config.apply_token_configuration_item( + update.update_token_configuration_item().clone(), + ); + let new_token_config = updated_contract.expected_token_configuration( + token_transition.base().token_contract_position(), + ).map_err(|_| { + Error::Proof(ProofError::CorruptedProof("returned proof does not have a token configuration, which should not be possible".to_string())) + })?; + + if new_token_config != &expected_config { + return Err(Error::Proof(ProofError::IncorrectProof( + format!( + "expected token configuration does not match the token configuration from the proof: expected {}, found {}", + expected_config, new_token_config + )))); + } + Ok((root_hash, VerifiedDataContract(updated_contract))) + } + } + } } } } diff --git a/packages/rs-drive/src/verify/tokens/mod.rs b/packages/rs-drive/src/verify/tokens/mod.rs new file mode 100644 index 00000000000..ce99086b616 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/mod.rs @@ -0,0 +1,10 @@ +mod verify_token_balance_for_identity_id; +mod verify_token_balances_for_identity_id; +mod verify_token_balances_for_identity_ids; +mod verify_token_info_for_identity_id; +mod verify_token_infos_for_identity_id; +mod verify_token_infos_for_identity_ids; +mod verify_token_pre_programmed_distributions; +mod verify_token_status; +mod verify_token_statuses; +mod verify_token_total_supply_and_aggregated_identity_balance; diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/mod.rs new file mode 100644 index 00000000000..900dc9c637a --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/mod.rs @@ -0,0 +1,75 @@ +mod v0; + +use crate::drive::Drive; +use dpp::balances::credits::TokenAmount; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the token balance of a specific identity using a cryptographic proof. + /// + /// This function validates the token balance associated with an identity by verifying + /// the provided cryptographic proof. It ensures the correctness of the balance stored + /// for the given identity and token combination. + /// + /// # Parameters + /// + /// - `proof`: A slice of bytes containing the cryptographic proof of the token balance. + /// - `token_id`: A 32-byte identifier representing the unique ID of the token to verify. + /// - `identity_id`: A 32-byte identifier representing the identity whose token balance + /// is to be verified. + /// - `verify_subset_of_proof`: A boolean indicating whether to verify only a subset of + /// the provided proof. + /// - `platform_version`: A reference to the [PlatformVersion] object specifying which + /// implementation version of the function to invoke. + /// + /// # Returns + /// + /// Returns a `Result` containing: + /// - `Ok((RootHash, Option<TokenAmount>))`: A tuple where: + /// - `RootHash`: The root hash of the data structure at the time the proof was generated. + /// - `Option<TokenAmount>`: The token balance if it exists, or `None` if the balance is absent. + /// - `Err(Error)`: An error if the verification fails due to an invalid proof, incorrect data, + /// or version mismatch. + /// + /// # Errors + /// + /// This function may return an `Error` in the following cases: + /// - The provided proof is invalid or corrupted. + /// - The token balance data is missing, inconsistent, or does not match the proof. + /// - The specified platform version does not match any known or supported implementations. + pub fn verify_token_balance_for_identity_id( + proof: &[u8], + token_id: [u8; 32], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<TokenAmount>), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_balance_for_identity_id + { + 0 => Self::verify_token_balance_for_identity_id_v0( + proof, + token_id, + identity_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_balance_for_identity_id".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/v0/mod.rs new file mode 100644 index 00000000000..e65abd89ed8 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balance_for_identity_id/v0/mod.rs @@ -0,0 +1,51 @@ +use crate::drive::Drive; +use grovedb::Element::SumItem; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::balances::credits::TokenAmount; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_balance_for_identity_id_v0( + proof: &[u8], + token_id: [u8; 32], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<TokenAmount>), Error> { + let path_query = Self::token_balance_for_identity_id_query(token_id, identity_id); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == 1 { + let proved_key_value = proved_key_values.remove(0); + match proved_key_value.2 { + Some(SumItem(value, ..)) => Ok((root_hash, Some(value as TokenAmount))), + None => Ok((root_hash, None)), + _ => Err(Error::Proof(ProofError::IncorrectValueSize( + "proof did not point to a sum item", + ))), + } + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: 1, + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/mod.rs new file mode 100644 index 00000000000..dd2c0888597 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/mod.rs @@ -0,0 +1,75 @@ +mod v0; + +use crate::drive::Drive; +use dpp::balances::credits::TokenAmount; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the balances of tokens held by a specific identity using a cryptographic proof. + /// + /// This method checks the cryptographic proof to verify the balances of a list of tokens + /// associated with the given identity ID. It dispatches to version-specific implementations + /// based on the platform version. + /// + /// # Parameters + /// - `proof`: The cryptographic proof to verify. + /// - `token_ids`: A list of token IDs to verify (each a 32-byte array). + /// - `identity_id`: The unique identifier of the identity (32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, T))`: + /// - `RootHash`: The verified root hash of the database. + /// - `T`: A collection of `(token ID, token balance)` pairs. + /// + /// # Errors + /// - `Error::Drive(DriveError::UnknownVersionMismatch)`: + /// - Occurs when the platform version does not match any known version for this method. + /// - `Error::Proof(ProofError::WrongElementCount)`: + /// - If the number of elements in the proof does not match the number of token IDs. + /// - `Error::Proof(ProofError::IncorrectValueSize)`: + /// - If the token ID size or proof value size is invalid. + /// - `Error::Proof(ProofError::InvalidSumItemValue)`: + /// - If the proof element does not represent a valid sum item. + /// - `Error::Proof(ProofError::InvalidItemType)`: + /// - If the proof element is not a sum item as expected for balances. + pub fn verify_token_balances_for_identity_id< + T: FromIterator<(I, Option<TokenAmount>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_balances_for_identity_id + { + 0 => Self::verify_token_balances_for_identity_id_v0( + proof, + token_ids, + identity_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_balances_for_identity_id".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/v0/mod.rs new file mode 100644 index 00000000000..a8943461320 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_id/v0/mod.rs @@ -0,0 +1,72 @@ +use crate::drive::Drive; +use grovedb::Element::SumItem; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::balances::credits::TokenAmount; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_balances_for_identity_id_v0< + T: FromIterator<(I, Option<TokenAmount>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::token_balances_for_identity_id_query(token_ids, identity_id); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == token_ids.len() { + let values = proved_key_values + .into_iter() + .map(|proved_key_value| { + let token_id: [u8; 32] = proved_key_value + .0 + .get(2) + .ok_or(Error::Proof(ProofError::IncorrectValueSize( + "path should have at least 3 elements in returned proof", + )))? + .clone() + .try_into() + .map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize("token id size")) + })?; + match proved_key_value.2 { + Some(SumItem(value, ..)) => { + Ok((token_id.into(), Some(value as TokenAmount))) + } + None => Ok((token_id.into(), None)), + _ => Err(Error::Proof(ProofError::IncorrectValueSize( + "proof did not point to a sum item", + ))), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: token_ids.len(), + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/mod.rs new file mode 100644 index 00000000000..6959213d81e --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/mod.rs @@ -0,0 +1,80 @@ +mod v0; + +use crate::drive::Drive; +use dpp::balances::credits::TokenAmount; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the token balances for a set of identity IDs. + /// + /// This function checks the token balances of multiple identities by verifying the provided + /// proof against the specified token ID and identity IDs. It also supports verifying a subset + /// of a larger proof if necessary. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. This is used + /// to verify the validity of the identity and its associated balance. + /// - `token_id`: A 32-byte array representing the unique identifier for the token whose balance + /// is being verified. + /// - `identity_ids`: A slice of 32-byte arrays, each representing a unique identity ID. These + /// are the identities whose token balances are being verified. + /// - `verify_subset_of_proof`: A boolean flag indicating whether the proof being verified is a + /// subset of a larger proof. If `true`, the verification will consider only a part of the proof. + /// - `platform_version`: The version of the platform against which the identity token balances are + /// being verified. This ensures compatibility with the correct API version. + /// + /// # Returns + /// + /// - `Result<(RootHash, BTreeMap<[u8; 32], Option<TokenAmount>>), Error>`: If the verification is successful: + /// - `RootHash`: The root hash of the GroveDB, representing the state of the database. + /// - `BTreeMap<[u8; 32], Option<TokenAmount>>`: A map of identity IDs to their associated token balances. + /// The `Option<TokenAmount>` can be `Some(TokenAmount)` if a balance exists or `None` if no balance is found. + /// + /// # Errors + /// + /// The function will return an `Error` if any of the following occur: + /// + /// - The provided authentication proof is invalid. + /// - The provided identity ID does not correspond to a valid balance. + /// - The provided platform version is unknown or unsupported. + /// + pub fn verify_token_balances_for_identity_ids< + T: FromIterator<(I, Option<TokenAmount>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_balances_for_identity_ids + { + 0 => Self::verify_token_balances_for_identity_ids_v0( + proof, + token_id, + identity_ids, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_balances_for_identity_ids".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/v0/mod.rs new file mode 100644 index 00000000000..3bfa94f7a91 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_balances_for_identity_ids/v0/mod.rs @@ -0,0 +1,71 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::balances::credits::TokenAmount; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_balances_for_identity_ids_v0< + T: FromIterator<(I, Option<TokenAmount>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::token_balances_for_identity_ids_query(token_id, identity_ids); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == identity_ids.len() { + let values = proved_key_values + .into_iter() + .map(|proved_key_value| { + let key: [u8; 32] = proved_key_value + .1 + .try_into() + .map_err(|_| Error::Proof(ProofError::IncorrectValueSize("value size")))?; + let maybe_element = proved_key_value.2; + match maybe_element { + None => Ok((key.into(), None)), + Some(element) => { + let balance: TokenAmount = element + .as_sum_item_value() + .map_err(Error::GroveDB)? + .try_into() + .map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize( + "balance was negative", + )) + })?; + Ok((key.into(), Some(balance))) + } + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: identity_ids.len(), + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/mod.rs new file mode 100644 index 00000000000..d61562f6875 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/mod.rs @@ -0,0 +1,73 @@ +mod v0; + +use crate::drive::Drive; +use dpp::tokens::info::IdentityTokenInfo; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the token information for a specific identity using a cryptographic proof. + /// + /// This function verifies the association between a token and an identity by processing the provided + /// cryptographic proof. It checks the existence and correctness of the token's information in the + /// context of the specified identity. + /// + /// # Parameters + /// + /// - `proof`: A slice of bytes containing the cryptographic proof of the token's information. + /// - `token_id`: A 32-byte identifier representing the unique ID of the token to verify. + /// - `identity_id`: A 32-byte identifier representing the identity associated with the token. + /// - `verify_subset_of_proof`: A boolean indicating whether to verify only a subset of the provided proof. + /// - `platform_version`: A reference to the [PlatformVersion] object specifying which implementation + /// version of the function to invoke. + /// + /// # Returns + /// + /// Returns a `Result` containing: + /// - `Ok((RootHash, Option<IdentityTokenInfo>))`: A tuple where: + /// - `RootHash`: The root hash of the data structure at the time the proof was generated. + /// - `Option<IdentityTokenInfo>`: The token information if it exists, or `None` if the token information + /// is absent. + /// - `Err(Error)`: An error if the verification fails due to an invalid proof, incorrect data, or version mismatch. + /// + /// # Errors + /// + /// This function may return an `Error` in the following cases: + /// - The provided proof is invalid or corrupted. + /// - The token's information is missing, inconsistent, or does not match the proof. + /// - The specified platform version does not match any known or supported implementations. + pub fn verify_token_info_for_identity_id( + proof: &[u8], + token_id: [u8; 32], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<IdentityTokenInfo>), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_info_for_identity_id + { + 0 => Self::verify_token_info_for_identity_id_v0( + proof, + token_id, + identity_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_info_for_identity_id".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/v0/mod.rs new file mode 100644 index 00000000000..0d90766948a --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_info_for_identity_id/v0/mod.rs @@ -0,0 +1,55 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_info_for_identity_id_v0( + proof: &[u8], + token_id: [u8; 32], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<IdentityTokenInfo>), Error> { + let path_query = Self::token_info_for_identity_id_query(token_id, identity_id); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == 1 { + let proved_key_value = proved_key_values.remove(0); + match proved_key_value.2 { + Some(Item(value, ..)) => Ok(( + root_hash, + Some(IdentityTokenInfo::deserialize_from_bytes(&value)?), + )), + None => Ok((root_hash, None)), + _ => Err(Error::Proof(ProofError::IncorrectValueSize( + "proof did not point to an item", + ))), + } + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: 1, + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/mod.rs new file mode 100644 index 00000000000..e0a39d6263a --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/mod.rs @@ -0,0 +1,74 @@ +mod v0; + +use crate::drive::Drive; +use dpp::tokens::info::IdentityTokenInfo; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies token information for a specific identity using a cryptographic proof. + /// + /// This method retrieves information about the specified tokens for a given identity ID from the + /// cryptographic proof. It dispatches to version-specific implementations based on the platform version. + /// + /// # Parameters + /// - `proof`: The cryptographic proof to verify. + /// - `token_ids`: A list of token IDs to verify (each a 32-byte array). + /// - `identity_id`: The unique identifier of the identity (32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, T))`: + /// - `RootHash`: The verified root hash of the database. + /// - `T`: A collection of `(token ID, token info)` pairs. + /// + /// # Errors + /// - `Error::Drive(DriveError::UnknownVersionMismatch)`: + /// - Occurs when the platform version does not match any known version for this method. + /// - `Error::Proof(ProofError::WrongElementCount)`: + /// - If the number of elements in the proof does not match the number of token IDs. + /// - `Error::Proof(ProofError::IncorrectValueSize)`: + /// - If the token ID size or proof value size is invalid. + /// - `Error::Proof(ProofError::DeserializationFailed)`: + /// - If the token info cannot be deserialized from the proof. + /// - `Error::Proof(ProofError::InvalidItemType)`: + /// - If the proof element is not an expected item type (e.g., `Item`). + pub fn verify_token_infos_for_identity_id< + T: FromIterator<(I, Option<IdentityTokenInfo>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_infos_for_identity_id + { + 0 => Self::verify_token_infos_for_identity_id_v0( + proof, + token_ids, + identity_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_infos_for_identity_id".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/v0/mod.rs new file mode 100644 index 00000000000..e94d164d311 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_id/v0/mod.rs @@ -0,0 +1,74 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_infos_for_identity_id_v0< + T: FromIterator<(I, Option<IdentityTokenInfo>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_ids: &[[u8; 32]], + identity_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::token_infos_for_identity_id_query(token_ids, identity_id); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == token_ids.len() { + let values = proved_key_values + .into_iter() + .map(|proved_key_value| { + let token_id: [u8; 32] = proved_key_value + .0 + .get(2) + .ok_or(Error::Proof(ProofError::IncorrectProof( + "path should have at least 3 elements in returned proof".to_string(), + )))? + .clone() + .try_into() + .map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize("token id size")) + })?; + match proved_key_value.2 { + Some(Item(value, ..)) => Ok(( + token_id.into(), + Some(IdentityTokenInfo::deserialize_from_bytes(&value)?), + )), + None => Ok((token_id.into(), None)), + _ => Err(Error::Proof(ProofError::IncorrectProof( + "proof did not point to an item as expected for token info".to_string(), + ))), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: token_ids.len(), + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/mod.rs new file mode 100644 index 00000000000..b936762a97d --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/mod.rs @@ -0,0 +1,79 @@ +mod v0; + +use crate::drive::Drive; +use dpp::tokens::info::IdentityTokenInfo; + +use crate::error::drive::DriveError; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the token infos for a set of identity IDs. + /// + /// This function checks the token infos of multiple identities by verifying the provided + /// proof against the specified token ID and identity IDs. It also supports verifying a subset + /// of a larger proof if necessary. + /// + /// # Parameters + /// + /// - `proof`: A byte slice representing the proof of authentication from the user. This is used + /// to verify the validity of the identity and its associated info. + /// - `token_id`: A 32-byte array representing the unique identifier for the token whose info + /// is being verified. + /// - `identity_ids`: A slice of 32-byte arrays, each representing a unique identity ID. These + /// are the identities whose token infos are being verified. + /// - `verify_subset_of_proof`: A boolean flag indicating whether the proof being verified is a + /// subset of a larger proof. If `true`, the verification will consider only a part of the proof. + /// - `platform_version`: The version of the platform against which the identity token infos are + /// being verified. This ensures compatibility with the correct API version. + /// + /// # Returns + /// + /// - `Result<(RootHash, BTreeMap<[u8; 32], Option<IdentityTokenInfo>>), Error>`: If the verification is successful: + /// - `RootHash`: The root hash of the GroveDB, representing the state of the database. + /// - `BTreeMap<[u8; 32], Option<IdentityTokenInfo>>`: A map of identity IDs to their associated token infos. + /// + /// # Errors + /// + /// The function will return an `Error` if any of the following occur: + /// + /// - The provided authentication proof is invalid. + /// - The provided identity ID does not correspond to a valid info. + /// - The provided platform version is unknown or unsupported. + /// + pub fn verify_token_infos_for_identity_ids< + T: FromIterator<(I, Option<IdentityTokenInfo>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_infos_for_identity_ids + { + 0 => Self::verify_token_infos_for_identity_ids_v0( + proof, + token_id, + identity_ids, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_infos_for_identity_ids".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/v0/mod.rs new file mode 100644 index 00000000000..4c4a6092e47 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_infos_for_identity_ids/v0/mod.rs @@ -0,0 +1,65 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::info::IdentityTokenInfo; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_infos_for_identity_ids_v0< + T: FromIterator<(I, Option<IdentityTokenInfo>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_id: [u8; 32], + identity_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::token_infos_for_identity_ids_query(token_id, identity_ids); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == identity_ids.len() { + let values = proved_key_values + .into_iter() + .map(|proved_key_value| { + let key: [u8; 32] = proved_key_value + .1 + .try_into() + .map_err(|_| Error::Proof(ProofError::IncorrectValueSize("value size")))?; + let maybe_element = proved_key_value.2; + match maybe_element { + None => Ok((key.into(), None)), + Some(element) => { + let info_bytes = element.as_item_bytes().map_err(Error::GroveDB)?; + let info = IdentityTokenInfo::deserialize_from_bytes(info_bytes)?; + Ok((key.into(), Some(info))) + } + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: identity_ids.len(), + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/mod.rs new file mode 100644 index 00000000000..14459c02970 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/mod.rs @@ -0,0 +1,71 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; +use dpp::prelude::TimestampMillis; + +use crate::error::Error; + +use crate::verify::RootHash; + +use crate::drive::tokens::distribution::queries::QueryPreProgrammedDistributionStartAt; +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the pre-programmed token distributions using a cryptographic proof. + /// + /// This function checks the proof and reconstructs the token’s pre-programmed distributions + /// for all timestamps and recipients. It uses generics to allow flexibility in return types. + /// + /// # Parameters + /// - `proof`: The cryptographic proof. + /// - `token_id`: The ID of the token (32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, T))`: + /// - `RootHash`: The verified root hash of the database. + /// - `T`: A collection implementing `FromIterator<(TimestampMillis, D)>` where `D` + /// implements `FromIterator<(Identifier, TokenAmount)>`. + /// + /// # Errors + /// - `Error::Drive(DriveError::UnknownVersionMismatch)` if the platform version is unsupported. + /// - `Error::Proof(ProofError::WrongElementCount)` if the number of elements in the proof is incorrect. + /// - `Error::Proof(ProofError::InvalidSumItemValue)` if the element does not represent a valid sum item. + pub fn verify_token_pre_programmed_distributions< + T: FromIterator<(TimestampMillis, D)>, + D: FromIterator<(Identifier, TokenAmount)>, + >( + proof: &[u8], + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_pre_programmed_distributions + { + 0 => Self::verify_token_pre_programmed_distributions_v0( + proof, + token_id, + start_at, + limit, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_pre_programmed_distributions".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/v0/mod.rs new file mode 100644 index 00000000000..c6b9c69935b --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_pre_programmed_distributions/v0/mod.rs @@ -0,0 +1,115 @@ +use crate::drive::tokens::distribution::queries::{ + pre_programmed_distributions_query, QueryPreProgrammedDistributionStartAt, +}; +use crate::drive::Drive; +use crate::error::proof::ProofError; +use crate::error::Error; +use crate::verify::RootHash; +use dpp::balances::credits::TokenAmount; +use dpp::identifier::Identifier; +use dpp::identity::TimestampMillis; +use grovedb::Element::SumItem; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; +use std::collections::BTreeMap; + +impl Drive { + /// Version 0: Verifies the pre-programmed token distributions using a cryptographic proof. + /// + /// This function checks the proof and reconstructs the token’s pre-programmed distributions + /// using generics to allow flexibility in return types. + /// + /// # Parameters + /// - `proof`: The cryptographic proof. + /// - `token_id`: The ID of the token (32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, T))`: + /// - `RootHash`: The verified root hash of the database. + /// - `T`: A collection implementing `FromIterator<(TimestampMillis, D)>` where `D` + /// implements `FromIterator<(Identifier, TokenAmount)>`. + pub(super) fn verify_token_pre_programmed_distributions_v0< + T: FromIterator<(TimestampMillis, D)>, + D: FromIterator<(Identifier, TokenAmount)>, + >( + proof: &[u8], + token_id: [u8; 32], + start_at: Option<QueryPreProgrammedDistributionStartAt>, + limit: Option<u16>, + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = pre_programmed_distributions_query(token_id, start_at, limit); + + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query(proof, &path_query, &platform_version.drive.grove_version)? + } else { + GroveDb::verify_query(proof, &path_query, &platform_version.drive.grove_version)? + }; + + // Group values by TimestampMillis first + let grouped_data = proved_key_values.into_iter().try_fold( + BTreeMap::<TimestampMillis, Vec<(Identifier, TokenAmount)>>::new(), + |mut acc, (mut path, key, element)| { + let time_bytes = path.pop().ok_or_else(|| { + Error::Proof(ProofError::IncorrectElementPath { + expected: path_query.path.clone(), + actual: path.clone(), + }) + })?; + + if time_bytes.len() != 8 { + return Err(Error::Proof(ProofError::IncorrectValueSize( + "time key in pre-programmed distributions is not 8 bytes", + ))); + } + + let time = TimestampMillis::from_be_bytes(time_bytes.try_into().map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize( + "failed to convert timestamp bytes", + )) + })?); + + let recipient = Identifier::from_bytes(&key).map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize( + "failed to parse recipient identifier", + )) + })?; + + let sum_item = match element { + Some(SumItem(value, ..)) if value >= 0 => value as TokenAmount, + Some(SumItem(_, ..)) => { + return Err(Error::Proof(ProofError::CorruptedProof( + "negative token amount in pre-programmed distribution".to_string(), + ))); + } + _ => { + return Err(Error::Proof(ProofError::CorruptedProof( + "proof element was not a sum item".to_string(), + ))); + } + }; + + // Push to the vector for this timestamp + acc.entry(time) + .or_insert_with(Vec::new) + .push((recipient, sum_item)); + + Ok(acc) + }, + )?; + + // Convert grouped data into the final generic result structure `T` + let result = grouped_data + .into_iter() + .map(|(time, recipients)| { + let inner = recipients.into_iter().collect::<D>(); + (time, inner) + }) + .collect::<T>(); + + Ok((root_hash, result)) + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_status/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_status/mod.rs new file mode 100644 index 00000000000..d88fdf14bd9 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_status/mod.rs @@ -0,0 +1,68 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use dpp::tokens::status::TokenStatus; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the status of a token using a provided cryptographic proof. + /// + /// This function takes a cryptographic proof, a token ID, and other parameters to verify + /// the existence and status of a token in the data structure. It delegates the verification + /// process to the appropriate versioned implementation based on the platform version. + /// + /// # Parameters + /// + /// - `proof`: A slice of bytes representing the cryptographic proof of the token's status. + /// - `token_id`: A 32-byte identifier representing the unique ID of the token. + /// - `verify_subset_of_proof`: A boolean indicating whether to verify a subset of the provided proof. + /// - `platform_version`: A reference to the [PlatformVersion] object that specifies which version + /// of the function implementation to invoke. + /// + /// # Returns + /// + /// Returns a `Result` containing: + /// - `Ok((RootHash, Option<TokenStatus>))`: A tuple where: + /// - `RootHash`: The root hash of the data structure at the time the proof was created. + /// - `Option<TokenStatus>`: The status of the token if it exists, or `None` if the token does not exist. + /// - `Err(Error)`: An error if the verification fails due to an invalid proof, incorrect data, or version mismatch. + /// + /// # Errors + /// + /// This function can return an `Error` in the following cases: + /// - The proof is invalid or corrupted. + /// - The token's status data is missing or inconsistent. + /// - The platform version does not match any of the known implementations. + pub fn verify_token_status( + proof: &[u8], + token_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<TokenStatus>), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_status + { + 0 => Self::verify_token_status_v0( + proof, + token_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_status".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_status/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_status/v0/mod.rs new file mode 100644 index 00000000000..0ed0bc36c9c --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_status/v0/mod.rs @@ -0,0 +1,54 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::status::TokenStatus; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_status_v0( + proof: &[u8], + token_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, Option<TokenStatus>), Error> { + let path_query = Self::token_status_query(token_id); + let (root_hash, mut proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == 1 { + let proved_key_value = proved_key_values.remove(0); + match proved_key_value.2 { + Some(Item(value, ..)) => Ok(( + root_hash, + Some(TokenStatus::deserialize_from_bytes(&value)?), + )), + None => Ok((root_hash, None)), + _ => Err(Error::Proof(ProofError::IncorrectValueSize( + "proof did not point to an item", + ))), + } + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: 1, + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_statuses/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_statuses/mod.rs new file mode 100644 index 00000000000..8cb213ff901 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_statuses/mod.rs @@ -0,0 +1,67 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use dpp::tokens::status::TokenStatus; + +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the statuses of multiple tokens using a cryptographic proof. + /// + /// This method validates the cryptographic proof to retrieve the statuses of the specified token IDs. + /// It dispatches to version-specific implementations based on the provided platform version. + /// + /// # Parameters + /// - `proof`: The cryptographic proof to verify. + /// - `token_ids`: A list of token IDs to verify (each a 32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, T))`: + /// - `RootHash`: The verified root hash of the database. + /// - `T`: A collection of `(token ID, token status)` pairs. + /// + /// # Errors + /// - `Error::Drive(DriveError::UnknownVersionMismatch)`: + /// - Occurs when the platform version does not match any known version for this method. + /// - `Error::Proof(ProofError::WrongElementCount)`: + /// - If the number of elements in the proof does not match the number of token IDs. + /// - `Error::Proof(ProofError::IncorrectValueSize)`: + /// - If the token ID size or proof value size is invalid. + /// - `Error::Proof(ProofError::DeserializationFailed)`: + /// - If the token status cannot be deserialized from the proof. + /// - `Error::Proof(ProofError::InvalidItemType)`: + /// - If the proof element is not an expected item type (e.g., `Item`). + pub fn verify_token_statuses<T: FromIterator<(I, Option<TokenStatus>)>, I: From<[u8; 32]>>( + proof: &[u8], + token_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_statuses + { + 0 => Self::verify_token_statuses_v0( + proof, + token_ids, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_statuses".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_statuses/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_statuses/v0/mod.rs new file mode 100644 index 00000000000..aa6ad189c02 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_statuses/v0/mod.rs @@ -0,0 +1,65 @@ +use crate::drive::Drive; +use grovedb::Element::Item; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::serialization::PlatformDeserializable; +use dpp::tokens::status::TokenStatus; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_statuses_v0< + T: FromIterator<(I, Option<TokenStatus>)>, + I: From<[u8; 32]>, + >( + proof: &[u8], + token_ids: &[[u8; 32]], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, T), Error> { + let path_query = Self::token_statuses_query(token_ids); + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == token_ids.len() { + let values = proved_key_values + .into_iter() + .map(|proved_key_value| { + let token_id: [u8; 32] = proved_key_value.1.try_into().map_err(|_| { + Error::Proof(ProofError::IncorrectValueSize("token id size")) + })?; + match proved_key_value.2 { + Some(Item(value, ..)) => Ok(( + token_id.into(), + Some(TokenStatus::deserialize_from_bytes(&value)?), + )), + None => Ok((token_id.into(), None)), + _ => Err(Error::Proof(ProofError::IncorrectValueSize( + "proof did not point to an item as expected for token info", + ))), + } + }) + .collect::<Result<T, Error>>()?; + Ok((root_hash, values)) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: token_ids.len(), + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/mod.rs new file mode 100644 index 00000000000..4515948dfd6 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/mod.rs @@ -0,0 +1,64 @@ +mod v0; + +use crate::drive::Drive; +use crate::error::drive::DriveError; +use crate::error::Error; +use crate::verify::RootHash; +use dpp::balances::total_single_token_balance::TotalSingleTokenBalance; +use dpp::version::PlatformVersion; + +impl Drive { + /// Verifies the total token supply and aggregated identity balances for a given token. + /// + /// This method checks the cryptographic proof to verify the total supply of a token and the + /// aggregated balances of identities associated with that token. It dispatches to version-specific + /// implementations based on the provided platform version. + /// + /// # Parameters + /// - `proof`: The cryptographic proof to verify. + /// - `token_id`: The unique identifier of the token (32-byte array). + /// - `verify_subset_of_proof`: Whether to verify only a subset of the proof. + /// - `platform_version`: The current platform version. + /// + /// # Returns + /// - `Ok((RootHash, TotalSingleTokenBalance))`: + /// - `RootHash`: The verified root hash of the database. + /// - `TotalSingleTokenBalance`: The total supply and aggregated identity balances of the token. + /// + /// # Errors + /// - `Error::Drive(DriveError::UnknownVersionMismatch)`: + /// - Occurs when the platform version does not match any known version for this method. + /// - `Error::Proof(ProofError::UnexpectedResultProof)`: + /// - If the token does not exist in the proof. + /// - If the token's supply is not found in the proof. + /// - `Error::Proof(ProofError::WrongElementCount)`: + /// - If the proof does not contain exactly two expected elements (total supply and aggregated balances). + /// - `Error::Proof(ProofError::InvalidSumItemValue)`: + /// - If the retrieved proof element is not a valid sum item. + pub fn verify_token_total_supply_and_aggregated_identity_balance( + proof: &[u8], + token_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, TotalSingleTokenBalance), Error> { + match platform_version + .drive + .methods + .verify + .token + .verify_token_total_supply_and_aggregated_identity_balance + { + 0 => Self::verify_token_total_supply_and_aggregated_identity_balance_v0( + proof, + token_id, + verify_subset_of_proof, + platform_version, + ), + version => Err(Error::Drive(DriveError::UnknownVersionMismatch { + method: "verify_token_total_supply_and_aggregated_identity_balance".to_string(), + known_versions: vec![0], + received: version, + })), + } + } +} diff --git a/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/v0/mod.rs b/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/v0/mod.rs new file mode 100644 index 00000000000..5fd81f013f3 --- /dev/null +++ b/packages/rs-drive/src/verify/tokens/verify_token_total_supply_and_aggregated_identity_balance/v0/mod.rs @@ -0,0 +1,73 @@ +use crate::drive::Drive; + +use crate::error::proof::ProofError; +use crate::error::Error; + +use crate::verify::RootHash; + +use dpp::balances::total_single_token_balance::TotalSingleTokenBalance; +use dpp::prelude::Identifier; +use grovedb::GroveDb; +use platform_version::version::PlatformVersion; + +impl Drive { + pub(super) fn verify_token_total_supply_and_aggregated_identity_balance_v0( + proof: &[u8], + token_id: [u8; 32], + verify_subset_of_proof: bool, + platform_version: &PlatformVersion, + ) -> Result<(RootHash, TotalSingleTokenBalance), Error> { + let path_query = Self::token_total_supply_and_aggregated_identity_balances_query( + token_id, + platform_version, + )?; + let (root_hash, proved_key_values) = if verify_subset_of_proof { + GroveDb::verify_subset_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + } else { + GroveDb::verify_query_with_absence_proof( + proof, + &path_query, + &platform_version.drive.grove_version, + )? + }; + if proved_key_values.len() == 2 { + let ( + _aggregated_identity_balances_path, + _aggregated_identity_balances_key, + Some(aggregated_identity_balances_element), + ) = proved_key_values.get(0).unwrap() + else { + return Err(Error::Proof(ProofError::UnexpectedResultProof(format!( + "Token {} most likely does not exist", + Identifier::new(token_id) + )))); + }; + let (_total_supply_path, _total_supply_key, Some(total_supply_element)) = + proved_key_values.get(1).unwrap() + else { + return Err(Error::Proof(ProofError::UnexpectedResultProof(format!( + "Token {} has no known supply", + Identifier::new(token_id) + )))); + }; + + Ok(( + root_hash, + TotalSingleTokenBalance { + token_supply: total_supply_element.as_sum_item_value()?, + aggregated_token_account_balances: aggregated_identity_balances_element + .as_sum_tree_value()?, + }, + )) + } else { + Err(Error::Proof(ProofError::WrongElementCount { + expected: 2, + got: proved_key_values.len(), + })) + } + } +} diff --git a/packages/rs-drive/tests/deterministic_root_hash.rs b/packages/rs-drive/tests/deterministic_root_hash.rs index e2cd8cc75e4..690fce96091 100644 --- a/packages/rs-drive/tests/deterministic_root_hash.rs +++ b/packages/rs-drive/tests/deterministic_root_hash.rs @@ -19,9 +19,11 @@ mod tests { /// Tests that the root hash is being calculated correctly after inserting empty subtrees into /// the root tree and the DPNS contract. - fn test_root_hash_with_batches(drive: &Drive, db_transaction: &Transaction) { - let platform_version = PlatformVersion::latest(); - + fn test_root_hash_with_batches( + drive: &Drive, + db_transaction: &Transaction, + platform_version: &PlatformVersion, + ) { // [1644293142180] INFO (35 on bf3bb2a2796a): createTree // path: [] // pathHash: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" @@ -297,20 +299,45 @@ mod tests { .unwrap() .expect("should return app hash"); - let expected_app_hash = "1b80f4a9f00597b3f1ddca904b3cee67576868adcdd802c0a3f91e14209bb402"; + // We expect a different app hash because data contract is not serialized the same way + let expected_app_hash = match platform_version.protocol_version { + 0..7 => "1b80f4a9f00597b3f1ddca904b3cee67576868adcdd802c0a3f91e14209bb402", + _ => "387fe8e2298bb33e0ff79fd377eccb14109fb2534c7338c535bd74b5b8580580", + }; assert_eq!(hex::encode(app_hash), expected_app_hash); } /// Runs `test_root_hash_with_batches` 10 times. #[test] - fn test_deterministic_root_hash_with_batches() { - let drive = setup_drive(None); + fn test_deterministic_root_hash_with_batches_first_platform_version() { + let drive = setup_drive(None, None); + + let platform_version = PlatformVersion::first(); + + let db_transaction = drive.grove.start_transaction(); + + for _ in 0..10 { + test_root_hash_with_batches(&drive, &db_transaction, platform_version); + + drive + .grove + .rollback_transaction(&db_transaction) + .expect("transaction should be rolled back"); + } + } + + /// Runs `test_root_hash_with_batches` 10 times. + #[test] + fn test_deterministic_root_hash_with_batches_latest_platform_version() { + let drive = setup_drive(None, None); + + let platform_version = PlatformVersion::latest(); let db_transaction = drive.grove.start_transaction(); for _ in 0..10 { - test_root_hash_with_batches(&drive, &db_transaction); + test_root_hash_with_batches(&drive, &db_transaction, platform_version); drive .grove diff --git a/packages/rs-drive/tests/query_tests.rs b/packages/rs-drive/tests/query_tests.rs index d8c3a84dfb3..0c6b9328dc9 100644 --- a/packages/rs-drive/tests/query_tests.rs +++ b/packages/rs-drive/tests/query_tests.rs @@ -196,10 +196,14 @@ impl PersonWithOptionalValues { #[cfg(feature = "server")] /// Inserts the test "family" contract and adds `count` documents containing randomly named people to it. -pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { +pub fn setup_family_tests( + count: u32, + seed: u64, + platform_version: &PlatformVersion, +) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); - let drive = setup_drive(Some(drive_config)); + let drive = setup_drive(Some(drive_config), None); let db_transaction = drive.grove.start_transaction(); @@ -208,8 +212,6 @@ pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { add_init_contracts_structure_operations(&mut batch); - let platform_version = PlatformVersion::latest(); - drive .grove_apply_batch(batch, false, Some(&db_transaction), &platform_version.drive) .expect("expected to create contracts tree successfully"); @@ -219,7 +221,10 @@ pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { &drive, "tests/supporting_files/contract/family/family-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + Some(platform_version), ); let people = Person::random_people(count, seed); @@ -269,7 +274,7 @@ pub fn setup_family_tests(count: u32, seed: u64) -> (Drive, DataContract) { pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); - let drive = setup_drive(Some(drive_config)); + let drive = setup_drive(Some(drive_config), None); let db_transaction = drive.grove.start_transaction(); @@ -289,7 +294,10 @@ pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContr &drive, "tests/supporting_files/contract/family/family-contract-fields-optional.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let people = PersonWithOptionalValues::random_people(count, seed); @@ -338,7 +346,7 @@ pub fn setup_family_tests_with_nulls(count: u32, seed: u64) -> (Drive, DataContr pub fn setup_family_tests_only_first_name_index(count: u32, seed: u64) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); - let drive = setup_drive(Some(drive_config)); + let drive = setup_drive(Some(drive_config), None); let db_transaction = drive.grove.start_transaction(); @@ -358,7 +366,10 @@ pub fn setup_family_tests_only_first_name_index(count: u32, seed: u64) -> (Drive &drive, "tests/supporting_files/contract/family/family-contract-only-first-name-index.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let people = Person::random_people(count, seed); @@ -803,8 +814,9 @@ pub fn setup_dpns_tests_with_batches( count: u32, total_owners: Option<u32>, seed: u64, + platform_version: &PlatformVersion, ) -> (Drive, DataContract) { - let drive = setup_drive(Some(DriveConfig::default())); + let drive = setup_drive(Some(DriveConfig::default()), None); let db_transaction = drive.grove.start_transaction(); @@ -813,8 +825,6 @@ pub fn setup_dpns_tests_with_batches( add_init_contracts_structure_operations(&mut batch); - let platform_version = PlatformVersion::latest(); - drive .grove_apply_batch(batch, false, Some(&db_transaction), &platform_version.drive) .expect("expected to create contracts tree successfully"); @@ -824,7 +834,10 @@ pub fn setup_dpns_tests_with_batches( &drive, "tests/supporting_files/contract/dpns/dpns-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + Some(platform_version), ); add_domains_to_contract( @@ -851,7 +864,7 @@ pub fn setup_withdrawal_tests( total_owners: Option<u32>, seed: u64, ) -> (Drive, DataContract) { - let drive = setup_drive(Some(DriveConfig::default())); + let drive = setup_drive(Some(DriveConfig::default()), None); let db_transaction = drive.grove.start_transaction(); @@ -871,7 +884,10 @@ pub fn setup_withdrawal_tests( &drive, "tests/supporting_files/contract/withdrawals/withdrawals-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); add_withdrawals_to_contract( @@ -894,7 +910,7 @@ pub fn setup_withdrawal_tests( #[cfg(feature = "server")] /// Sets up the References contract to test queries on. pub fn setup_references_tests(_count: u32, _seed: u64) -> (Drive, DataContract) { - let drive = setup_drive(Some(DriveConfig::default())); + let drive = setup_drive(Some(DriveConfig::default()), None); let db_transaction = drive.grove.start_transaction(); @@ -914,7 +930,10 @@ pub fn setup_references_tests(_count: u32, _seed: u64) -> (Drive, DataContract) &drive, "tests/supporting_files/contract/references/references_with_contract_history.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); drive @@ -929,7 +948,7 @@ pub fn setup_references_tests(_count: u32, _seed: u64) -> (Drive, DataContract) #[cfg(feature = "server")] /// Sets up and inserts random domain name data to the DPNS contract to test queries on. pub fn setup_dpns_tests_label_not_required(count: u32, seed: u64) -> (Drive, DataContract) { - let drive = setup_drive(Some(DriveConfig::default())); + let drive = setup_drive(Some(DriveConfig::default()), None); let db_transaction = drive.grove.start_transaction(); @@ -949,7 +968,10 @@ pub fn setup_dpns_tests_label_not_required(count: u32, seed: u64) -> (Drive, Dat &drive, "tests/supporting_files/contract/dpns/dpns-contract-label-not-required.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); add_domains_to_contract(&drive, &contract, Some(&db_transaction), count, None, seed); @@ -965,7 +987,7 @@ pub fn setup_dpns_tests_label_not_required(count: u32, seed: u64) -> (Drive, Dat #[cfg(feature = "server")] /// Sets up the DPNS contract and inserts data from the given path to test queries on. pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { - let drive = setup_drive(None); + let drive = setup_drive(None, None); let db_transaction = drive.grove.start_transaction(); @@ -984,7 +1006,10 @@ pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { &drive, "tests/supporting_files/contract/dpns/dpns-contract.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + None, ); let file = File::open(path).expect("should read domains from file"); @@ -1037,7 +1062,8 @@ pub fn setup_dpns_test_with_data(path: &str) -> (Drive, DataContract) { #[test] #[ignore] fn test_query_many() { - let (drive, contract) = setup_family_tests(1600, 73509); + let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_family_tests(1600, 73509, platform_version); let db_transaction = drive.grove.start_transaction(); let platform_version = PlatformVersion::latest(); @@ -1081,107 +1107,1442 @@ fn test_query_many() { .expect("transaction should be committed"); } -#[cfg(feature = "server")] -#[test] -fn test_reference_proof_single_index() { - let (drive, contract) = setup_family_tests_only_first_name_index(1, 73509); +#[cfg(feature = "server")] +#[test] +fn test_reference_proof_single_index() { + let (drive, contract) = setup_family_tests_only_first_name_index(1, 73509); + + let platform_version = PlatformVersion::latest(); + + let db_transaction = drive.grove.start_transaction(); + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + + // A query getting all elements by firstName + + let query_value = json!({ + "where": [ + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) + .expect("proof should be executed"); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); +} + +#[cfg(feature = "server")] +#[test] +fn test_non_existence_reference_proof_single_index() { + let (drive, contract) = setup_family_tests_only_first_name_index(0, 73509); + + let platform_version = PlatformVersion::latest(); + + let db_transaction = drive.grove.start_transaction(); + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + + // A query getting all elements by firstName + + let query_value = json!({ + "where": [ + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) + .expect("proof should be executed"); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); +} + +#[cfg(feature = "server")] +#[test] +fn test_family_basic_queries_first_version() { + let platform_version = PlatformVersion::first(); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); + + let db_transaction = drive.grove.start_transaction(); + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + + let expected_app_hash = vec![ + 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, + 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, + ]; + + assert_eq!(root_hash.as_slice(), expected_app_hash); + + let all_names = [ + "Adey".to_string(), + "Briney".to_string(), + "Cammi".to_string(), + "Celinda".to_string(), + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + "Noellyn".to_string(), + "Prissie".to_string(), + ]; + + // A query getting all elements by firstName + + let query_value = json!({ + "where": [ + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + assert_eq!(names, all_names); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name is Adey (which should exist) + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(results.len(), 1); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name is Adey and lastName Randolf + + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"], + ["lastName", "==", "Randolf"] + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + let document = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize from bytes"); + let last_name = document + .get("lastName") + .expect("we should be able to get the last name") + .as_text() + .expect("last name must be a string"); + + assert_eq!(last_name, "Randolf"); + + // A query getting all people who's first name is in a range with a single element Adey, + // order by lastName (this should exist) + + let query_value = json!({ + "where": [ + ["firstName", "in", ["Adey"]] + ], + "orderBy": [ + ["firstName", "asc"], + ["lastName", "asc"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name is Adey, order by lastName (which should exist) + + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"] + ], + "orderBy": [ + ["lastName", "asc"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + let document = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize from bytes"); + let last_name = document + .get("lastName") + .expect("we should be able to get the last name") + .as_text() + .expect("last name must be a string"); + + assert_eq!(last_name, "Randolf"); + + // A query getting all people who's first name is Chris (which is not exist) + + let query_value = json!({ + "where": [ + ["firstName", "==", "Chris"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 0); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting a middle name + + let query_value = json!({ + "where": [ + ["middleName", "==", "Briggs"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let (proof_root_hash, proof_results, _) = drive + .query_proof_of_documents_using_cbor_encoded_query_only_get_elements( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name is before Chris + + let query_value = json!({ + "where": [ + ["firstName", "<", "Chris"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_before_chris = [ + "Adey".to_string(), + "Briney".to_string(), + "Cammi".to_string(), + "Celinda".to_string(), + ]; + assert_eq!(names, expected_names_before_chris); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name starts with C + + let query_value = json!({ + "where": [ + ["firstName", "StartsWith", "C"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_starting_with_c = ["Cammi".to_string(), "Celinda".to_string()]; + assert_eq!(names, expected_names_starting_with_c); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name starts with C, but limit to 1 and be descending + + let query_value = json!({ + "where": [ + ["firstName", "StartsWith", "C"] + ], + "limit": 1, + "orderBy": [ + ["firstName", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_starting_with_c_desc_1 = ["Celinda".to_string()]; + assert_eq!(names, expected_names_starting_with_c_desc_1); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting all people who's first name is between Chris and Noellyn included + + let query_value = json!({ + "where": [ + ["firstName", ">", "Chris"], + ["firstName", "<=", "Noellyn"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + assert_eq!(results.len(), 5); + + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_between_names = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + "Noellyn".to_string(), + ]; + + assert_eq!(names, expected_between_names); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting back elements having specific names + + let query_value = json!({ + "where": [ + ["firstName", "in", names] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + assert_eq!(names, expected_between_names); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + let query_value = json!({ + "where": [ + ["firstName", "in", names] + ], + "limit": 100, + "orderBy": [ + ["firstName", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_reversed_between_names = [ + "Noellyn".to_string(), + "Meta".to_string(), + "Kevina".to_string(), + "Gilligan".to_string(), + "Dalia".to_string(), + ]; + + assert_eq!(names, expected_reversed_between_names); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting back elements having specific names and over a certain age + + let query_value = json!({ + "where": [ + ["firstName", "in", names], + ["age", ">=", 45] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"], + ["age", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_45_over = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + ]; + + assert_eq!(names, expected_names_45_over); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + // A query getting back elements having specific names and over a certain age + + let query_value = json!({ + "where": [ + ["firstName", "in", names], + ["age", ">", 48] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"], + ["age", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + // Kevina is 48 so she should be now excluded, Dalia is 68, Gilligan is 49 and Meta is 59 + + let expected_names_over_48 = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Meta".to_string(), + ]; + + assert_eq!(names, expected_names_over_48); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); + + let ages: HashMap<String, u8> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let name = name_value + .as_text() + .expect("the first name should be a string") + .to_string(); + let age_value = document + .get("age") + .expect("we should be able to get the age"); + let age: u8 = age_value.to_integer().expect("expected u8 value"); + (name, age) + }) + .collect(); + + let meta_age = ages + .get("Meta") + .expect("we should be able to get Kevina as she is 48"); + + assert_eq!(*meta_age, 59); + + // fetching by $id + let mut rng = rand::rngs::StdRng::seed_from_u64(84594); + let id_bytes = bs58::decode("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD") + .into_vec() + .expect("this should decode"); + + let owner_id_bytes = bs58::decode("BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj") + .into_vec() + .expect("this should decode"); + + let fixed_person = Person { + id: id_bytes, + owner_id: owner_id_bytes, + first_name: String::from("Wisdom"), + middle_name: String::from("Madabuchukwu"), + last_name: String::from("Ogwu"), + age: rng.gen_range(0..85), + }; + let serialized_person = serde_json::to_value(fixed_person).expect("serialized person"); + let person_cbor = cbor_serializer::serializable_value_to_cbor(&serialized_person, Some(0)) + .expect("expected to serialize to cbor"); + let document = Document::from_cbor(person_cbor.as_slice(), None, None, platform_version) + .expect("document should be properly deserialized"); + + let document_type = contract + .document_type_for_name("person") + .expect("expected to get document type"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + drive + .add_document_for_contract( + DocumentAndContractInfo { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&document, storage_flags)), + owner_id: None, + }, + contract: &contract, + document_type, + }, + true, + BlockInfo::genesis(), + true, + Some(&db_transaction), + platform_version, + None, + ) + .expect("document should be inserted"); + + let id_two_bytes = bs58::decode("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179") + .into_vec() + .expect("should decode"); + let owner_id_bytes = bs58::decode("Di8dtJXv3L2YnzDNUN4w5rWLPSsSAzv6hLMMQbg3eyVA") + .into_vec() + .expect("this should decode"); + let next_person = Person { + id: id_two_bytes, + owner_id: owner_id_bytes, + first_name: String::from("Wdskdfslgjfdlj"), + middle_name: String::from("Mdsfdsgsdl"), + last_name: String::from("dkfjghfdk"), + age: rng.gen_range(0..85), + }; + let serialized_person = serde_json::to_value(next_person).expect("serialized person"); + let person_cbor = cbor_serializer::serializable_value_to_cbor(&serialized_person, Some(0)) + .expect("expected to serialize to cbor"); + let document = Document::from_cbor(person_cbor.as_slice(), None, None, platform_version) + .expect("document should be properly deserialized"); + + let document_type = contract + .document_type_for_name("person") + .expect("expected to get document type"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + drive + .add_document_for_contract( + DocumentAndContractInfo { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&document, storage_flags)), + owner_id: None, + }, + contract: &contract, + document_type, + }, + true, + BlockInfo::genesis(), + true, + Some(&db_transaction), + platform_version, + None, + ) + .expect("document should be inserted"); + + let query_value = json!({ + "where": [ + ["$id", "in", vec![String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // TODO: Add test for proofs after transaction + // drive.grove.commit_transaction(db_transaction).expect("unable to commit transaction"); + // let (proof_root_hash, proof_results) = drive + // .query_documents_from_contract_as_grove_proof_only_get_elements( + // &contract, + // person_document_type, + // query_cbor.as_slice(), + // None, + // ) + // .expect("query should be executed"); + // assert_eq!(root_hash, proof_root_hash); + // assert_eq!(results, proof_results); + // let db_transaction = drive.grove.start_transaction(); + + // fetching by $id with order by + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "orderBy": [["$id", "asc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + document_type, + platform_version, + ) + .expect("we should be able to deserialize the document"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 76, 161, 17, 201, 152, 232, 129, 48, 168, 13, 49, 10, 218, 53, 118, 136, 165, 198, 189, + 116, 116, 22, 133, 92, 104, 165, 186, 249, 94, 81, 45, 20, + ] + ); + + // fetching by $id with order by desc + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "orderBy": [["$id", "desc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + document_type, + platform_version, + ) + .expect("we should be able to deserialize the document"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 140, 161, 17, 201, 152, 232, 129, 48, 168, 13, 49, 10, 218, 53, 118, 136, 165, 198, + 189, 116, 116, 22, 133, 92, 104, 165, 186, 249, 94, 81, 45, 20, + ] + ); + + // + // // fetching with empty where and orderBy + // + let query_value = json!({}); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 12); + + // + // // fetching with empty where and orderBy $id desc + // + let query_value = json!({ + "orderBy": [["$id", "desc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 12); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + document_type, + platform_version, + ) + .expect("we should be able to deserialize the document"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 249, 170, 70, 122, 181, 31, 35, 176, 175, 131, 70, 150, 250, 223, 194, 203, 175, 200, + 107, 252, 199, 227, 154, 105, 89, 57, 38, 85, 236, 192, 254, 88, + ] + ); + + // + // // fetching with ownerId in a set of values + // + let query_value = json!({ + "where": [ + ["$ownerId", "in", ["BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj", "Di8dtJXv3L2YnzDNUN4w5rWLPSsSAzv6hLMMQbg3eyVA"]] + ], + "orderBy": [["$ownerId", "desc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + // + // // fetching with ownerId equal and orderBy + // + let query_value = json!({ + "where": [ + ["$ownerId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"] + ], + "orderBy": [["$ownerId", "asc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // query empty contract with nested path queries + + let dashpay_contract = json_document_to_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract.json", + false, + platform_version, + ) + .expect("expected to get cbor document"); + + drive + .apply_contract( + &dashpay_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + None, + platform_version, + ) + .expect("expected to apply contract successfully"); + + let query_value = json!({ + "where": [ + ["$ownerId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"], + ["toUserId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"], + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &dashpay_contract, + dashpay_contract + .document_type_for_name("contactRequest") + .expect("should have contact document type"), + &query_cbor, + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 0); - let platform_version = PlatformVersion::latest(); + // using non existing document in startAt - let db_transaction = drive.grove.start_transaction(); + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("5A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF178")]], + ], + "orderBy": [["$id", "asc"]], + }); - let root_hash = drive - .grove - .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) - .unwrap() - .expect("there is always a root hash"); + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); - // A query getting all elements by firstName + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // using non existing document in startAt let query_value = json!({ "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], ], - "limit": 100, - "orderBy": [ - ["firstName", "asc"] - ] + "startAt": String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF178"), + "orderBy": [["$id", "asc"]], }); - let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) .expect("expected to serialize to cbor"); + let person_document_type = contract .document_type_for_name("person") .expect("contract should have a person document type"); - let query = DriveDocumentQuery::from_cbor( - where_cbor.as_slice(), + + let result = drive.query_documents_cbor_from_contract( &contract, person_document_type, - &drive.config, - ) - .expect("query should be built"); - let (results, _, _) = query - .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) - .expect("proof should be executed"); - - let (proof_root_hash, proof_results, _) = query - .execute_with_proof_only_get_elements(&drive, None, None, platform_version) - .expect("we should be able to a proof"); - assert_eq!(root_hash, proof_root_hash); - assert_eq!(results, proof_results); -} - -#[cfg(feature = "server")] -#[test] -fn test_non_existence_reference_proof_single_index() { - let (drive, contract) = setup_family_tests_only_first_name_index(0, 73509); - - let platform_version = PlatformVersion::latest(); - - let db_transaction = drive.grove.start_transaction(); + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ); - let root_hash = drive - .grove - .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) - .unwrap() - .expect("there is always a root hash"); + assert!( + matches!(result, Err(Error::Query(QuerySyntaxError::StartDocumentNotFound(message))) if message == "startAt document not found") + ); - // A query getting all elements by firstName + // using non existing document in startAfter let query_value = json!({ "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], ], - "limit": 100, - "orderBy": [ - ["firstName", "asc"] - ] + "startAfter": String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF178"), + "orderBy": [["$id", "asc"]], }); - let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) .expect("expected to serialize to cbor"); + let person_document_type = contract .document_type_for_name("person") .expect("contract should have a person document type"); - let query = DriveDocumentQuery::from_cbor( - where_cbor.as_slice(), + + let result = drive.query_documents_cbor_from_contract( &contract, person_document_type, - &drive.config, - ) - .expect("query should be built"); - let (results, _, _) = query - .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) - .expect("proof should be executed"); + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ); - let (proof_root_hash, proof_results, _) = query - .execute_with_proof_only_get_elements(&drive, None, None, platform_version) - .expect("we should be able to a proof"); - assert_eq!(root_hash, proof_root_hash); - assert_eq!(results, proof_results); + assert!( + matches!(result, Err(Error::Query(QuerySyntaxError::StartDocumentNotFound(message))) if message == "startAfter document not found") + ); + + // validate eventual root hash + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + + assert_eq!( + root_hash.as_slice(), + vec![ + 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, + 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231 + ], + ); } #[cfg(feature = "server")] #[test] fn test_family_basic_queries() { - let (drive, contract) = setup_family_tests(10, 73509); let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); let db_transaction = drive.grove.start_transaction(); @@ -1192,8 +2553,8 @@ fn test_family_basic_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, - 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, + 63, 90, 74, 129, 70, 204, 232, 67, 190, 85, 133, 79, 254, 245, 203, 180, 77, 67, 94, 22, + 180, 99, 51, 251, 82, 117, 211, 14, 136, 51, 228, 177, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2506,8 +3867,8 @@ fn test_family_basic_queries() { assert_eq!( root_hash.as_slice(), vec![ - 251, 69, 177, 93, 128, 236, 106, 87, 205, 123, 80, 61, 44, 107, 186, 193, 22, 192, 239, - 7, 107, 110, 97, 197, 59, 245, 26, 12, 63, 91, 248, 231, + 187, 202, 114, 108, 228, 21, 246, 191, 11, 30, 112, 178, 38, 36, 145, 109, 238, 11, + 210, 210, 0, 227, 175, 151, 149, 166, 143, 15, 144, 255, 82, 229, ], ); } @@ -2515,9 +3876,8 @@ fn test_family_basic_queries() { #[cfg(feature = "server")] #[test] fn test_family_person_update() { - let (drive, contract) = setup_family_tests(10, 73509); - let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); let epoch_change_fee_version_test: Lazy<CachedEpochIndexFeeVersions> = Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); @@ -2645,9 +4005,8 @@ fn test_family_person_update() { #[cfg(feature = "server")] #[test] fn test_family_starts_at_queries() { - let (drive, contract) = setup_family_tests(10, 73509); - let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); let db_transaction = drive.grove.start_transaction(); @@ -2658,8 +4017,8 @@ fn test_family_starts_at_queries() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, - 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, + 63, 90, 74, 129, 70, 204, 232, 67, 190, 85, 133, 79, 254, 245, 203, 180, 77, 67, 94, 22, + 180, 99, 51, 251, 82, 117, 211, 14, 136, 51, 228, 177, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -2908,10 +4267,11 @@ fn test_family_starts_at_queries() { #[cfg(feature = "server")] #[test] fn test_family_sql_query() { + let platform_version = PlatformVersion::latest(); // These helpers confirm that sql statements produce the same drive query // as their json counterparts, helpers above confirm that the json queries // produce the correct result set - let (drive, contract) = setup_family_tests(10, 73509); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); let person_document_type = contract .document_type_for_name("person") .expect("contract should have a person document type"); @@ -3109,8 +4469,8 @@ fn test_family_with_nulls_query() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 92, 186, 224, 49, 242, 195, 32, 14, 46, 55, 244, 57, 55, 191, 10, 119, 228, 132, 91, 235, - 170, 114, 36, 41, 126, 136, 180, 51, 132, 17, 26, 182, + 144, 185, 8, 30, 191, 97, 149, 182, 117, 203, 98, 187, 156, 93, 168, 171, 134, 112, 221, + 230, 249, 131, 86, 1, 26, 92, 242, 25, 251, 187, 192, 182, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3219,9 +4579,8 @@ fn test_family_with_nulls_query() { #[cfg(feature = "server")] #[test] fn test_query_with_cached_contract() { - let (drive, contract) = setup_family_tests(10, 73509); - let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_family_tests(10, 73509, platform_version); let db_transaction = drive.grove.start_transaction(); @@ -3233,8 +4592,8 @@ fn test_query_with_cached_contract() { // Make sure the state is deterministic let expected_app_hash = vec![ - 32, 210, 24, 196, 148, 43, 20, 34, 0, 116, 183, 136, 32, 210, 163, 183, 214, 6, 152, 86, - 46, 45, 88, 13, 23, 41, 37, 70, 129, 119, 211, 12, + 63, 90, 74, 129, 70, 204, 232, 67, 190, 85, 133, 79, 254, 245, 203, 180, 77, 67, 94, 22, + 180, 99, 51, 251, 82, 117, 211, 14, 136, 51, 228, 177, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -3292,9 +4651,8 @@ fn test_query_with_cached_contract() { #[cfg(feature = "server")] #[test] fn test_dpns_query_contract_verification() { - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); - let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); let root_hash = drive .grove @@ -3368,10 +4726,9 @@ fn test_contract_keeps_history_fetch_and_verification() { #[cfg(feature = "server")] #[test] -fn test_dpns_query() { - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); - - let platform_version = PlatformVersion::latest(); +fn test_dpns_query_first_version() { + let platform_version = PlatformVersion::first(); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, &platform_version); let db_transaction = drive.grove.start_transaction(); @@ -3919,9 +5276,10 @@ fn test_dpns_insertion_with_aliases() { #[cfg(feature = "server")] #[test] -fn test_dpns_query_start_at() { +fn test_dpns_query_start_at_first_version() { + let platform_version = PlatformVersion::first(); // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); let platform_version = PlatformVersion::latest(); @@ -4011,11 +5369,107 @@ fn test_dpns_query_start_at() { assert_eq!(results, proof_results); } +#[cfg(feature = "server")] +#[test] +fn test_dpns_query_start_at_latest_version() { + let platform_version = PlatformVersion::latest(); + // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); + + let platform_version = PlatformVersion::latest(); + + let db_transaction = drive.grove.start_transaction(); + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + + let expected_app_hash = vec![ + 248, 74, 104, 110, 129, 228, 194, 1, 4, 239, 134, 54, 105, 172, 221, 43, 101, 133, 235, + 146, 182, 153, 212, 118, 189, 99, 227, 14, 94, 83, 17, 98, + ]; + + assert_eq!(root_hash.as_slice(), expected_app_hash,); + + // let all_names = [ + // "amalle".to_string(), + // "anna-diane".to_string(), + // "atalanta".to_string(), + // "eden".to_string(), + // "laureen".to_string(), + // "leone".to_string(), + // "marilyn".to_string(), + // "minna".to_string(), + // "mora".to_string(), + // "phillie".to_string(), + // ]; + + // A query getting one element starting with a in dash parent domain asc + + let anna_id = hex::decode("0e97eb86ceca4309751616089336a127a5d48282712473b2d0fc5663afb1a080") + .expect("expected to decode id"); + let encoded_start_at = bs58::encode(anna_id).into_string(); + + let query_value = json!({ + "where": [ + ["normalizedParentDomainName", "==", "dash"] + ], + "startAt": encoded_start_at, + "limit": 1, + "orderBy": [ + ["normalizedLabel", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let domain_document_type = contract + .document_type_for_name("domain") + .expect("contract should have a domain document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + domain_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), domain_document_type, platform_version) + .expect("we should be able to deserialize the document"); + let normalized_label_value = document + .get("normalizedLabel") + .expect("we should be able to get the first name"); + let normalized_label = normalized_label_value + .as_text() + .expect("the normalized label should be a string"); + String::from(normalized_label) + }) + .collect(); + + let a_names = ["anna-diane".to_string()]; + + assert_eq!(names, a_names); + + let (proof_root_hash, proof_results, _) = query + .execute_with_proof_only_get_elements(&drive, None, None, platform_version) + .expect("we should be able to a proof"); + assert_eq!(root_hash, proof_root_hash); + assert_eq!(results, proof_results); +} + #[cfg(feature = "server")] #[test] fn test_dpns_query_start_after() { + let platform_version = PlatformVersion::latest(); // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); let platform_version = PlatformVersion::latest(); @@ -4028,8 +5482,8 @@ fn test_dpns_query_start_after() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 142, 246, 25, 166, 52, 184, 158, 102, 192, 111, 173, 255, 155, 125, 53, 233, 98, 241, 201, - 233, 2, 58, 47, 90, 209, 207, 147, 204, 83, 68, 183, 143, + 248, 74, 104, 110, 129, 228, 194, 1, 4, 239, 134, 54, 105, 172, 221, 43, 101, 133, 235, + 146, 182, 153, 212, 118, 189, 99, 227, 14, 94, 83, 17, 98, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4108,8 +5562,9 @@ fn test_dpns_query_start_after() { #[cfg(feature = "server")] #[test] fn test_dpns_query_start_at_desc() { + let platform_version = PlatformVersion::latest(); // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); let platform_version = PlatformVersion::latest(); @@ -4122,8 +5577,8 @@ fn test_dpns_query_start_at_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 142, 246, 25, 166, 52, 184, 158, 102, 192, 111, 173, 255, 155, 125, 53, 233, 98, 241, 201, - 233, 2, 58, 47, 90, 209, 207, 147, 204, 83, 68, 183, 143, + 248, 74, 104, 110, 129, 228, 194, 1, 4, 239, 134, 54, 105, 172, 221, 43, 101, 133, 235, + 146, 182, 153, 212, 118, 189, 99, 227, 14, 94, 83, 17, 98, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4202,8 +5657,9 @@ fn test_dpns_query_start_at_desc() { #[cfg(feature = "server")] #[test] fn test_dpns_query_start_after_desc() { + let platform_version = PlatformVersion::latest(); // The point of this test is to test the situation where we have a start at a certain value for the DPNS query. - let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456); + let (drive, contract) = setup_dpns_tests_with_batches(10, None, 11456, platform_version); let platform_version = PlatformVersion::latest(); @@ -4216,8 +5672,8 @@ fn test_dpns_query_start_after_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 142, 246, 25, 166, 52, 184, 158, 102, 192, 111, 173, 255, 155, 125, 53, 233, 98, 241, 201, - 233, 2, 58, 47, 90, 209, 207, 147, 204, 83, 68, 183, 143, + 248, 74, 104, 110, 129, 228, 194, 1, 4, 239, 134, 54, 105, 172, 221, 43, 101, 133, 235, + 146, 182, 153, 212, 118, 189, 99, 227, 14, 94, 83, 17, 98, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4410,8 +5866,8 @@ fn test_dpns_query_start_at_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 72, 138, 172, 70, 225, 95, 64, 122, 142, 96, 131, 223, 154, 119, 132, 79, 182, 97, 202, 63, - 120, 116, 39, 217, 25, 208, 176, 49, 242, 138, 67, 112, + 11, 67, 98, 193, 214, 56, 66, 244, 193, 131, 252, 190, 5, 52, 29, 96, 160, 27, 222, 78, 91, + 150, 54, 85, 81, 249, 14, 74, 213, 181, 254, 120, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4615,8 +6071,8 @@ fn test_dpns_query_start_after_with_null_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 72, 138, 172, 70, 225, 95, 64, 122, 142, 96, 131, 223, 154, 119, 132, 79, 182, 97, 202, 63, - 120, 116, 39, 217, 25, 208, 176, 49, 242, 138, 67, 112, + 11, 67, 98, 193, 214, 56, 66, 244, 193, 131, 252, 190, 5, 52, 29, 96, 160, 27, 222, 78, 91, + 150, 54, 85, 81, 249, 14, 74, 213, 181, 254, 120, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -4825,8 +6281,8 @@ fn test_dpns_query_start_after_with_null_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 72, 138, 172, 70, 225, 95, 64, 122, 142, 96, 131, 223, 154, 119, 132, 79, 182, 97, 202, 63, - 120, 116, 39, 217, 25, 208, 176, 49, 242, 138, 67, 112, + 11, 67, 98, 193, 214, 56, 66, 244, 193, 131, 252, 190, 5, 52, 29, 96, 160, 27, 222, 78, 91, + 150, 54, 85, 81, 249, 14, 74, 213, 181, 254, 120, ]; assert_eq!(root_hash.as_slice(), expected_app_hash,); @@ -5038,8 +6494,8 @@ fn test_withdrawals_query_by_owner_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 144, 177, 24, 41, 104, 174, 220, 135, 164, 0, 240, 215, 42, 60, 249, 142, 150, 169, 135, - 72, 151, 35, 238, 131, 164, 229, 106, 83, 198, 109, 65, 211, + 27, 172, 224, 121, 173, 248, 170, 255, 202, 209, 7, 83, 203, 185, 208, 102, 157, 75, 55, + 21, 217, 212, 91, 174, 144, 146, 135, 92, 97, 156, 166, 6, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -5118,8 +6574,8 @@ fn test_withdrawals_query_start_after_query_by_owner_id() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 144, 177, 24, 41, 104, 174, 220, 135, 164, 0, 240, 215, 42, 60, 249, 142, 150, 169, 135, - 72, 151, 35, 238, 131, 164, 229, 106, 83, 198, 109, 65, 211, + 27, 172, 224, 121, 173, 248, 170, 255, 202, 209, 7, 83, 203, 185, 208, 102, 157, 75, 55, + 21, 217, 212, 91, 174, 144, 146, 135, 92, 97, 156, 166, 6, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); @@ -5219,8 +6675,8 @@ fn test_withdrawals_query_start_after_query_by_owner_id_desc() { .expect("there is always a root hash"); let expected_app_hash = vec![ - 144, 177, 24, 41, 104, 174, 220, 135, 164, 0, 240, 215, 42, 60, 249, 142, 150, 169, 135, - 72, 151, 35, 238, 131, 164, 229, 106, 83, 198, 109, 65, 211, + 27, 172, 224, 121, 173, 248, 170, 255, 202, 209, 7, 83, 203, 185, 208, 102, 157, 75, 55, + 21, 217, 212, 91, 174, 144, 146, 135, 92, 97, 156, 166, 6, ]; assert_eq!(root_hash.as_slice(), expected_app_hash); diff --git a/packages/rs-drive/tests/query_tests_history.rs b/packages/rs-drive/tests/query_tests_history.rs index c14dfeca9e9..1aa1b98fe48 100644 --- a/packages/rs-drive/tests/query_tests_history.rs +++ b/packages/rs-drive/tests/query_tests_history.rs @@ -161,15 +161,14 @@ pub fn setup( count: usize, restrict_to_inserts: Option<Vec<usize>>, seed: u64, + platform_version: &PlatformVersion, ) -> (Drive, DataContract) { let drive_config = DriveConfig::default(); - let platform_version = PlatformVersion::latest(); - let epoch_change_fee_version_test: Lazy<CachedEpochIndexFeeVersions> = Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); - let drive = setup_drive(Some(drive_config)); + let drive = setup_drive(Some(drive_config), None); let db_transaction = drive.grove.start_transaction(); @@ -187,7 +186,10 @@ pub fn setup( &drive, "tests/supporting_files/contract/family/family-contract-with-history.json", None, + None, + None::<fn(&mut DataContract)>, Some(&db_transaction), + Some(platform_version), ); let block_times: Vec<u64> = vec![0, 15, 100, 1000]; @@ -250,15 +252,15 @@ pub fn setup( #[test] fn test_setup() { let range_inserts = vec![0, 2]; - setup(10, Some(range_inserts), 73509); + let platform_version = PlatformVersion::latest(); + setup(10, Some(range_inserts), 73509, platform_version); } #[cfg(feature = "server")] #[test] -fn test_query_historical() { - let (drive, contract) = setup(10, None, 73509); - - let platform_version = PlatformVersion::latest(); +fn test_query_historical_first_platform_version() { + let platform_version = PlatformVersion::first(); + let (drive, contract) = setup(10, None, 73509, platform_version); let epoch_change_fee_version_test: Lazy<CachedEpochIndexFeeVersions> = Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); @@ -1644,3 +1646,1394 @@ fn test_query_historical() { ] ); } + +#[cfg(feature = "server")] +#[test] +fn test_query_historical_latest_platform_version() { + let platform_version = PlatformVersion::latest(); + let (drive, contract) = setup(10, None, 73509, platform_version); + + let epoch_change_fee_version_test: Lazy<CachedEpochIndexFeeVersions> = + Lazy::new(|| BTreeMap::from([(0, FeeVersion::first())])); + + let db_transaction = drive.grove.start_transaction(); + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + assert_eq!( + root_hash.as_slice(), + vec![ + 5, 227, 59, 163, 38, 58, 181, 91, 23, 56, 47, 52, 138, 63, 5, 54, 205, 249, 205, 225, + 78, 225, 195, 2, 104, 6, 11, 77, 56, 69, 113, 237, + ] + ); + + let all_names = [ + "Adey".to_string(), + "Briney".to_string(), + "Cammi".to_string(), + "Celinda".to_string(), + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + "Noellyn".to_string(), + "Prissie".to_string(), + ]; + + // A query getting all elements by firstName + + let query_value = json!({ + "where": [ + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, Some(&db_transaction), platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + assert_eq!(names, all_names); + + // A query getting all people who's first name is Chris (which should exist) + + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // A query getting all people who's first name is Adey and lastName Randolf + + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"], + ["lastName", "==", "Randolf"] + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let document = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize the cbor"); + let last_name = document + .get("lastName") + .expect("we should be able to get the last name") + .as_text() + .expect("last name must be a string"); + + assert_eq!(last_name, "Randolf"); + + // A query getting all people who's first name is in a range with a single element Adey, + // order by lastName (this should exist) + + let query_value = json!({ + "where": [ + ["firstName", "in", ["Adey"]] + ], + "orderBy": [ + ["firstName", "asc"], + ["lastName", "asc"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // A query getting all people who's first name is Adey, order by lastName (which should exist) + + let query_value = json!({ + "where": [ + ["firstName", "==", "Adey"] + ], + "orderBy": [ + ["lastName", "asc"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let document = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize the cbor"); + let last_name = document + .get("lastName") + .expect("we should be able to get the last name") + .as_text() + .expect("last name must be a string"); + + assert_eq!(last_name, "Randolf"); + + // A query getting all people who's first name is Chris (which is not exist) + + let query_value = json!({ + "where": [ + ["firstName", "==", "Chris"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 0); + + // A query getting a middle name + + let query_value = json!({ + "where": [ + ["middleName", "==", "Briggs"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + None, + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // A query getting all people who's first name is before Chris + + let query_value = json!({ + "where": [ + ["firstName", "<", "Chris"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_before_chris = [ + "Adey".to_string(), + "Briney".to_string(), + "Cammi".to_string(), + "Celinda".to_string(), + ]; + assert_eq!(names, expected_names_before_chris); + + // A query getting all people who's first name is before Chris + + let query_value = json!({ + "where": [ + ["firstName", "StartsWith", "C"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_names_before_chris = ["Cammi".to_string(), "Celinda".to_string()]; + assert_eq!(names, expected_names_before_chris); + + // A query getting all people who's first name is between Chris and Noellyn included + + let query_value = json!({ + "where": [ + ["firstName", ">", "Chris"], + ["firstName", "<=", "Noellyn"] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + assert_eq!(results.len(), 5); + + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_between_names = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + "Noellyn".to_string(), + ]; + + assert_eq!(names, expected_between_names); + + // A query getting all people who's first name is between Chris and Noellyn included + // However here there will be a startAt of the ID of Kevina + + // Let's first get the ID of Kevina + let ids: HashMap<String, Vec<u8>> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let name = name_value + .as_text() + .expect("the first name should be a string") + .to_string(); + (name, document.id().to_vec()) + }) + .collect(); + + let kevina_id = ids + .get("Kevina") + .expect("We should be able to get back Kevina's Id"); + let kevina_encoded_id = bs58::encode(kevina_id).into_string(); + + let query_value = json!({ + "where": [ + ["firstName", ">", "Chris"], + ["firstName", "<=", "Noellyn"] + ], + "startAt": kevina_encoded_id, //Kevina + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + assert_eq!(results.len(), 3); + + let reduced_names_after: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_reduced_names = [ + "Kevina".to_string(), + "Meta".to_string(), + "Noellyn".to_string(), + ]; + + assert_eq!(reduced_names_after, expected_reduced_names); + + // Now lets try startsAfter + + let query_value = json!({ + "where": [ + ["firstName", ">", "Chris"], + ["firstName", "<=", "Noellyn"] + ], + "startAfter": kevina_encoded_id, //Kevina + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + assert_eq!(results.len(), 2); + + let reduced_names_after: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let expected_reduced_names = ["Meta".to_string(), "Noellyn".to_string()]; + + assert_eq!(reduced_names_after, expected_reduced_names); + + // A query getting back elements having specific names + + let query_value = json!({ + "where": [ + ["firstName", "in", names] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + assert_eq!(names, expected_between_names); + + let query_value = json!({ + "where": [ + ["firstName", "in", names] + ], + "limit": 100, + "orderBy": [ + ["firstName", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .clone() + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + let ages: Vec<u64> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let age_value = document + .get("age") + .expect("we should be able to get the age"); + let age: u64 = age_value + .to_integer() + .expect("the age should be put in an u64"); + age + }) + .collect(); + + let expected_reversed_between_names = [ + "Noellyn".to_string(), // 40 + "Meta".to_string(), // 69 + "Kevina".to_string(), // 58 + "Gilligan".to_string(), // 59 + "Dalia".to_string(), // 78 + ]; + + assert_eq!(names, expected_reversed_between_names); + + let expected_ages = [40, 69, 58, 59, 78]; + + assert_eq!(ages, expected_ages); + + // A query getting back elements having specific names and over a certain age + + let query_value = json!({ + "where": [ + ["firstName", "in", names], + ["age", ">=", 45] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"], + ["age", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + // Kevina is 55, and is excluded from this test + let expected_names_45_over = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Kevina".to_string(), + "Meta".to_string(), + ]; + + assert_eq!(names, expected_names_45_over); + + // A query getting back elements having specific names and over a certain age + + let query_value = json!({ + "where": [ + ["firstName", "in", names], + ["age", ">", 58] + ], + "limit": 100, + "orderBy": [ + ["firstName", "asc"], + ["age", "desc"] + ] + }); + let where_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + let query = DriveDocumentQuery::from_cbor( + where_cbor.as_slice(), + &contract, + person_document_type, + &drive.config, + ) + .expect("query should be built"); + let (results, _, _) = query + .execute_raw_results_no_proof(&drive, None, None, platform_version) + .expect("proof should be executed"); + let names: Vec<String> = results + .iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let first_name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let first_name = first_name_value + .as_text() + .expect("the first name should be a string"); + String::from(first_name) + }) + .collect(); + + // Kevina is 48 so she should be now excluded, Dalia is 68, Gilligan is 49 and Meta is 59 + + let expected_names_over_48 = [ + "Dalia".to_string(), + "Gilligan".to_string(), + "Meta".to_string(), + ]; + + assert_eq!(names, expected_names_over_48); + + let ages: HashMap<String, u8> = results + .into_iter() + .map(|result| { + let document = + Document::from_bytes(result.as_slice(), person_document_type, platform_version) + .expect("we should be able to deserialize the cbor"); + let name_value = document + .get("firstName") + .expect("we should be able to get the first name"); + let name = name_value + .as_text() + .expect("the first name should be a string") + .to_string(); + let age_value = document + .get("age") + .expect("we should be able to get the age"); + let age: u8 = age_value.to_integer().expect("age should be an integer"); + (name, age) + }) + .collect(); + + let meta_age = ages + .get("Meta") + .expect("we should be able to get Kevina as she is 48"); + + assert_eq!(*meta_age, 69); + + // fetching by $id + let mut rng = rand::rngs::StdRng::seed_from_u64(84594); + let id_bytes = bs58::decode("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD") + .into_vec() + .expect("this should decode"); + + let owner_id_bytes = bs58::decode("BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj") + .into_vec() + .expect("this should decode"); + + let fixed_person = Person { + id: id_bytes, + owner_id: owner_id_bytes, + first_name: String::from("Wisdom"), + middle_name: String::from("Madabuchukwu"), + last_name: String::from("Ogwu"), + message: Some(String::from("Oh no")), + age: rng.gen_range(0..85), + }; + let serialized_person = serde_json::to_value(fixed_person).expect("serialized person"); + let person_cbor = cbor_serializer::serializable_value_to_cbor(&serialized_person, Some(0)) + .expect("expected to serialize to cbor"); + let document = Document::from_cbor(person_cbor.as_slice(), None, None, platform_version) + .expect("document should be properly deserialized"); + + let document_type = contract + .document_type_for_name("person") + .expect("expected to get document type"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + drive + .add_document_for_contract( + DocumentAndContractInfo { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&document, storage_flags)), + owner_id: None, + }, + contract: &contract, + document_type, + }, + true, + BlockInfo::genesis(), + true, + Some(&db_transaction), + platform_version, + Some(&epoch_change_fee_version_test), + ) + .expect("document should be inserted"); + + let id_two_bytes = bs58::decode("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179") + .into_vec() + .expect("should decode"); + let owner_id_bytes = bs58::decode("Di8dtJXv3L2YnzDNUN4w5rWLPSsSAzv6hLMMQbg3eyVA") + .into_vec() + .expect("this should decode"); + let next_person = Person { + id: id_two_bytes, + owner_id: owner_id_bytes, + first_name: String::from("Wdskdfslgjfdlj"), + middle_name: String::from("Mdsfdsgsdl"), + last_name: String::from("dkfjghfdk"), + message: Some(String::from("Bad name")), + age: rng.gen_range(0..85), + }; + let serialized_person = serde_json::to_value(next_person).expect("serialized person"); + let person_cbor = cbor_serializer::serializable_value_to_cbor(&serialized_person, Some(0)) + .expect("expected to serialize to cbor"); + let document = Document::from_cbor(person_cbor.as_slice(), None, None, platform_version) + .expect("document should be properly deserialized"); + + let document_type = contract + .document_type_for_name("person") + .expect("expected to get document type"); + + let storage_flags = Some(Cow::Owned(StorageFlags::SingleEpoch(0))); + + drive + .add_document_for_contract( + DocumentAndContractInfo { + owned_document_info: OwnedDocumentInfo { + document_info: DocumentRefInfo((&document, storage_flags)), + owner_id: None, + }, + contract: &contract, + document_type, + }, + true, + BlockInfo::genesis(), + true, + Some(&db_transaction), + platform_version, + None, + ) + .expect("document should be inserted"); + + let query_value = json!({ + "where": [ + ["$id", "in", vec![String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let query_value = json!({ + "where": [ + ["$id", "==", "6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179"] + ] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + let query_value = json!({ + "where": [ + ["$id", "==", "6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179"] + ], + "blockTime": 300 + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // fetching by $id with order by + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "orderBy": [["$id", "asc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize the cbor"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 76, 161, 17, 201, 152, 232, 129, 48, 168, 13, 49, 10, 218, 53, 118, 136, 165, 198, 189, + 116, 116, 22, 133, 92, 104, 165, 186, 249, 94, 81, 45, 20 + ] + .as_slice() + ); + + // fetching by $id with order by desc + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "orderBy": [["$id", "desc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize the cbor"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 140, 161, 17, 201, 152, 232, 129, 48, 168, 13, 49, 10, 218, 53, 118, 136, 165, 198, + 189, 116, 116, 22, 133, 92, 104, 165, 186, 249, 94, 81, 45, 20 + ] + .as_slice() + ); + + // + // // fetching with empty where and orderBy + // + let query_value = json!({}); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 12); + + // + // // fetching with empty where and orderBy $id desc + // + let query_value = json!({ + "orderBy": [["$id", "desc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 12); + + let last_person = Document::from_bytes( + results.first().unwrap().as_slice(), + person_document_type, + platform_version, + ) + .expect("we should be able to deserialize the cbor"); + + assert_eq!( + last_person.id().to_vec(), + vec![ + 249, 170, 70, 122, 181, 31, 35, 176, 175, 131, 70, 150, 250, 223, 194, 203, 175, 200, + 107, 252, 199, 227, 154, 105, 89, 57, 38, 85, 236, 192, 254, 88 + ] + .as_slice() + ); + + let message_value = last_person.get("message").unwrap(); + + let message = message_value + .as_text() + .expect("the message should be a string") + .to_string(); + + assert_eq!( + message, + String::from("“Since it’s the customer that pays our salary, our responsibility is to make the product they want, when they want it, and deliv") + ); + + // + // // fetching with empty where and orderBy $id desc with a blockTime + // + let query_value = json!({ + "orderBy": [["$id", "desc"]], + "blockTime": 300 + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect_err("not yet implemented"); + + // assert_eq!(results.len(), 12); + // + // let last_person = Document::from_bytes(results.first().unwrap().as_slice(), person_document_type, platform_version) + // .expect("we should be able to deserialize the cbor"); + // + // assert_eq!( + // last_person.id, + // vec![ + // 249, 170, 70, 122, 181, 31, 35, 176, 175, 131, 70, 150, 250, 223, 194, 203, 175, 200, + // 107, 252, 199, 227, 154, 105, 89, 57, 38, 85, 236, 192, 254, 88 + // ] + // .as_slice() + // ); + // + // let message_value = last_person.get("message").unwrap(); + // + // let message = message_value + // .as_text() + // .expect("the message should be a string") + // .to_string(); + // + // assert_eq!( + // message, + // String::from("“Since it’s the customer that pays our salary, our responsibility is to make the product they want, when they want it, and deliver quality that satisfies them.” Retired factory worker, Kiyoshi Tsutsumi (Osono et al 2008, 136)") + // ); + + // + // // fetching with ownerId in a set of values + // + let query_value = json!({ + "where": [ + ["$ownerId", "in", ["BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj", "Di8dtJXv3L2YnzDNUN4w5rWLPSsSAzv6hLMMQbg3eyVA"]] + ], + "orderBy": [["$ownerId", "desc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 2); + + // + // // fetching with ownerId equal and orderBy + // + let query_value = json!({ + "where": [ + ["$ownerId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"] + ], + "orderBy": [["$ownerId", "asc"]] + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 1); + + // query empty contract with nested path queries + + let dashpay_contract = json_document_to_contract( + "tests/supporting_files/contract/dashpay/dashpay-contract.json", + false, + platform_version, + ) + .expect("expected to get cbor document"); + + drive + .apply_contract( + &dashpay_contract, + BlockInfo::default(), + true, + StorageFlags::optional_default_as_cow(), + Some(&db_transaction), + platform_version, + ) + .expect("expected to apply contract successfully"); + + let query_value = json!({ + "where": [ + ["$ownerId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"], + ["toUserId", "==", "BYR3zJgXDuz1BYAkEagwSjVqTcE1gbqEojd6RwAGuMzj"], + ], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let (results, _, _) = drive + .query_documents_cbor_from_contract( + &dashpay_contract, + dashpay_contract + .document_type_for_name("contactRequest") + .expect("should have contact document type"), + &query_cbor, + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ) + .expect("query should be executed"); + + assert_eq!(results.len(), 0); + + // using non existing document in startAt + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "startAt": String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF178"), + "orderBy": [["$id", "asc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let result = drive.query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ); + + assert!( + matches!(result, Err(Error::Query(QuerySyntaxError::StartDocumentNotFound(message))) if message == "startAt document not found") + ); + + // using non-existing document in startAfter + + let query_value = json!({ + "where": [ + ["$id", "in", [String::from("ATxXeP5AvY4aeUFA6WRo7uaBKTBgPQCjTrgtNpCMNVRD"), String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF179")]], + ], + "startAfter": String::from("6A8SGgdmj2NtWCYoYDPDpbsYkq2MCbgi6Lx4ALLfF178"), + "orderBy": [["$id", "asc"]], + }); + + let query_cbor = cbor_serializer::serializable_value_to_cbor(&query_value, None) + .expect("expected to serialize to cbor"); + + let person_document_type = contract + .document_type_for_name("person") + .expect("contract should have a person document type"); + + let result = drive.query_documents_cbor_from_contract( + &contract, + person_document_type, + query_cbor.as_slice(), + None, + Some(&db_transaction), + Some(platform_version.protocol_version), + ); + + assert!( + matches!(result, Err(Error::Query(QuerySyntaxError::StartDocumentNotFound(message))) if message == "startAfter document not found") + ); + + // validate eventual root hash + + let root_hash = drive + .grove + .root_hash(Some(&db_transaction), &platform_version.drive.grove_version) + .unwrap() + .expect("there is always a root hash"); + assert_eq!( + root_hash.as_slice(), + vec![ + 203, 160, 200, 71, 200, 156, 249, 93, 201, 35, 171, 6, 57, 176, 159, 104, 26, 253, 141, + 193, 153, 0, 212, 9, 207, 239, 250, 51, 68, 228, 210, 164 + ] + ); +} diff --git a/packages/rs-drive/tests/supporting_files/contract/tokens/token-example-contract.json b/packages/rs-drive/tests/supporting_files/contract/tokens/token-example-contract.json new file mode 100644 index 00000000000..2a47ff22bc3 --- /dev/null +++ b/packages/rs-drive/tests/supporting_files/contract/tokens/token-example-contract.json @@ -0,0 +1,23 @@ +{ + "$format_version": "0", + "id": "AcYUCSvAmUwryNsQqkqqD1o3BnFuzepGtR3Mhh2swLk6", + "ownerId": "HLfavpy1B2mVHnpYYDKDVM76eWJRqvPfuuASy7cyJBXC", + "version": 1, + "tokens": { + "flurgon": { + "shouldCapitalize": true, + "pluralForm": "flurgons", + "maintainer": "GQcEb4CaXEXtPUpnJyHUt78jDij6etgEXUKyect7ZRSm", + "initialSupply": 100000000000, + "decimals": 8, + "transferable": true, + "maxSupply": 100000000000, + "roles": { + "maintainer": { + "canMint": true, + "canBurn": true + } + } + } + } +} diff --git a/packages/rs-json-schema-compatibility-validator/Cargo.toml b/packages/rs-json-schema-compatibility-validator/Cargo.toml index 2fb64eea2b3..a4211f6d181 100644 --- a/packages/rs-json-schema-compatibility-validator/Cargo.toml +++ b/packages/rs-json-schema-compatibility-validator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "json-schema-compatibility-validator" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true authors = ["Ivan Shumkov <ivan@shumkov.ru>"] diff --git a/packages/rs-platform-serialization-derive/Cargo.toml b/packages/rs-platform-serialization-derive/Cargo.toml index 68edf0d4be3..ea275283925 100644 --- a/packages/rs-platform-serialization-derive/Cargo.toml +++ b/packages/rs-platform-serialization-derive/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization-derive" authors = ["Samuel Westrich <sam@dash.org>"] description = "Bincode serialization and deserialization derivations" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-serialization/Cargo.toml b/packages/rs-platform-serialization/Cargo.toml index b5aa7e738ef..6a4e6f586c6 100644 --- a/packages/rs-platform-serialization/Cargo.toml +++ b/packages/rs-platform-serialization/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-serialization" authors = ["Samuel Westrich <sam@dash.org>"] description = "Bincode based serialization and deserialization" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value-convertible/Cargo.toml b/packages/rs-platform-value-convertible/Cargo.toml index b12f62e75f5..dacf12b51f8 100644 --- a/packages/rs-platform-value-convertible/Cargo.toml +++ b/packages/rs-platform-value-convertible/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-value-convertible" authors = ["Samuel Westrich <sam@dash.org>"] description = "Convertion to and from platform values" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-platform-value/Cargo.toml b/packages/rs-platform-value/Cargo.toml index c4d4b01a840..96ffe094647 100644 --- a/packages/rs-platform-value/Cargo.toml +++ b/packages/rs-platform-value/Cargo.toml @@ -2,14 +2,14 @@ name = "platform-value" authors = ["Samuel Westrich <sam@dash.org>"] description = "A simple value module" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined", optional = true } +ciborium = { version = "0.2.2", optional = true } thiserror = "1.0.64" bs58 = "0.5.1" base64 = "0.22.1" @@ -18,8 +18,6 @@ serde = { version = "1.0.197", features = ["derive"] } serde_json = { version = "1.0", features = ["preserve_order"], optional = true } rand = { version = "0.8.4", features = ["small_rng"] } treediff = "5.0.0" -regex = "1.7.1" -lazy_static = "1.4.0" platform-serialization = { path = "../rs-platform-serialization" } platform-version = { path = "../rs-platform-version" } indexmap = "2.0.2" diff --git a/packages/rs-platform-value/src/inner_value.rs b/packages/rs-platform-value/src/inner_value.rs index c92828e91c0..d8606bd478b 100644 --- a/packages/rs-platform-value/src/inner_value.rs +++ b/packages/rs-platform-value/src/inner_value.rs @@ -361,7 +361,7 @@ impl Value { Self::inner_array_mut_ref(map, key) } - pub fn get_array_slice<'a>(&'a self, key: &'a str) -> Result<&[Value], Error> { + pub fn get_array_slice<'a>(&'a self, key: &'a str) -> Result<&'a [Value], Error> { let map = self.to_map()?; Self::inner_array_slice(map, key) } diff --git a/packages/rs-platform-value/src/inner_value_at_path.rs b/packages/rs-platform-value/src/inner_value_at_path.rs index d98dc7cc6b8..b117c20e715 100644 --- a/packages/rs-platform-value/src/inner_value_at_path.rs +++ b/packages/rs-platform-value/src/inner_value_at_path.rs @@ -1,28 +1,40 @@ use crate::value_map::ValueMapHelper; use crate::{error, Error, Value, ValueMap}; -use lazy_static::lazy_static; -use regex::Regex; use std::collections::BTreeMap; pub(crate) fn is_array_path(text: &str) -> Result<Option<(&str, Option<usize>)>, Error> { - lazy_static! { - static ref RE: Regex = Regex::new(r"(\w+)\[(\d+)?\]").unwrap(); + // 1. Find the last '[' character. + let Some(open_bracket_pos) = text.rfind('[') else { + return Ok(None); + }; + + // 2. Check if `text` ends with ']'. + if !text.ends_with(']') { + return Ok(None); } - RE.captures(text) - .map(|captures| { - Ok(( - captures.get(1).unwrap().as_str(), - captures - .get(2) - .map(|m| { - m.as_str() - .parse::<usize>() - .map_err(|_| Error::IntegerSizeError) - }) - .transpose()?, - )) - }) - .transpose() + + // 3. Extract the portion before the '[' as the field name. + let field_name = &text[..open_bracket_pos]; + + // 4. Ensure the field name consists only of word characters + if field_name.is_empty() || !field_name.chars().all(|c| c.is_alphanumeric() || c == '_') { + return Ok(None); + } + + // 5. Extract the portion inside the brackets. + let inside_brackets = &text[open_bracket_pos + 1..text.len() - 1]; + + // 6. If the inside is empty, there is no index number + if inside_brackets.is_empty() { + return Ok(Some((field_name, None))); + } + + // 7. Otherwise, parse the inside as a number (usize). + let index = inside_brackets + .parse::<usize>() + .map_err(|_| Error::IntegerSizeError)?; + + Ok(Some((field_name, Some(index)))) } impl Value { @@ -371,7 +383,8 @@ impl Value { } } #[cfg(test)] -mod test { +mod tests { + use super::*; use crate::platform_value; #[test] @@ -406,4 +419,76 @@ mod test { platform_value!("new_value") ); } + + mod is_array_path { + use super::*; + + #[test] + fn test_valid_no_index() { + let result = is_array_path("array[]"); + assert!(result.is_ok()); + let maybe_tuple = result.unwrap(); + assert!(maybe_tuple.is_some()); + let (field_name, index) = maybe_tuple.unwrap(); + assert_eq!(field_name, "array"); + assert_eq!(index, None); + } + + #[test] + fn test_valid_with_index() { + let result = is_array_path("arr[123]"); + assert!(result.is_ok()); + let maybe_tuple = result.unwrap(); + assert!(maybe_tuple.is_some()); + let (field_name, index) = maybe_tuple.unwrap(); + assert_eq!(field_name, "arr"); + assert_eq!(index, Some(123)); + } + + #[test] + fn test_no_brackets() { + let result = is_array_path("no_brackets"); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn test_missing_closing_bracket() { + let result = is_array_path("array["); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn test_non_alphanumeric_field() { + let result = is_array_path("arr-test[123]"); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn test_empty_field_name() { + let result = is_array_path("[123]"); + assert!(result.is_ok()); + assert!(result.unwrap().is_none()); + } + + #[test] + fn test_non_numeric_index() { + let result = is_array_path("array[abc]"); + assert!(result.is_err()); + assert_eq!(result.unwrap_err(), Error::IntegerSizeError); + } + + #[test] + fn test_empty_index() { + let result = is_array_path("array[]"); + assert!(result.is_ok()); + let maybe_tuple = result.unwrap(); + assert!(maybe_tuple.is_some()); + let (field_name, index) = maybe_tuple.unwrap(); + assert_eq!(field_name, "array"); + assert_eq!(index, None); + } + } } diff --git a/packages/rs-platform-version/Cargo.toml b/packages/rs-platform-version/Cargo.toml index 143bef1e6b8..e678d3be655 100644 --- a/packages/rs-platform-version/Cargo.toml +++ b/packages/rs-platform-version/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-version" authors = ["Samuel Westrich <sam@dash.org>"] description = "Versioning library for Platform" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" @@ -11,7 +11,7 @@ license = "MIT" thiserror = { version = "1.0.63" } bincode = { version = "2.0.0-rc.3" } versioned-feature-core = { git = "https://github.com/dashpay/versioned-feature-core", version = "1.0.0" } -grovedb-version = { version = "2.1.0" } +grovedb-version = { git = "https://github.com/dashpay/grovedb", rev= "44c2244bbccd3e6e684729e8cf620644f7ebbf70" } once_cell = "1.19.0" [features] diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs index 91fd85cbae1..237f7c75c0e 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/mod.rs @@ -1,5 +1,6 @@ use versioned_feature_core::{FeatureVersion, FeatureVersionBounds}; pub mod v1; +pub mod v2; #[derive(Clone, Debug, Default)] pub struct DPPContractVersions { @@ -22,6 +23,7 @@ pub struct DataContractMethodVersions { pub validate_document: FeatureVersion, pub validate_update: FeatureVersion, pub schema: FeatureVersion, + pub validate_groups: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs index 5483e66c954..467d3670338 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v1.rs @@ -19,6 +19,7 @@ pub const CONTRACT_VERSIONS_V1: DPPContractVersions = DPPContractVersions { validate_document: 0, validate_update: 0, schema: 0, + validate_groups: 0, }, document_type_versions: DocumentTypeVersions { index_versions: DocumentTypeIndexVersions { diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs new file mode 100644 index 00000000000..854a3dc331b --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_contract_versions/v2.rs @@ -0,0 +1,55 @@ +use crate::version::dpp_versions::dpp_contract_versions::{ + DPPContractVersions, DataContractMethodVersions, DocumentTypeClassMethodVersions, + DocumentTypeIndexVersions, DocumentTypeMethodVersions, DocumentTypeSchemaVersions, + DocumentTypeVersions, RecursiveSchemaValidatorVersions, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const CONTRACT_VERSIONS_V2: DPPContractVersions = DPPContractVersions { + max_serialized_size: 65000, + contract_serialization_version: FeatureVersionBounds { + min_version: 0, + max_version: 1, + default_current_version: 1, //changed + }, + contract_structure_version: 1, //changed + created_data_contract_structure: 0, + config: 0, + methods: DataContractMethodVersions { + validate_document: 0, + validate_update: 0, + schema: 0, + validate_groups: 0, + }, + document_type_versions: DocumentTypeVersions { + index_versions: DocumentTypeIndexVersions { + index_levels_from_indices: 0, + }, + class_method_versions: DocumentTypeClassMethodVersions { + try_from_schema: 0, + create_document_types_from_document_schemas: 1, //changed to allow contracts with only tokens + }, + structure_version: 0, + schema: DocumentTypeSchemaVersions { + enrich_with_base_schema: 0, + find_identifier_and_binary_paths: 0, + validate_max_depth: 0, + max_depth: 256, + recursive_schema_validator_versions: RecursiveSchemaValidatorVersions { + traversal_validator: 0, + }, + validate_schema_compatibility: 0, + }, + methods: DocumentTypeMethodVersions { + create_document_from_data: 0, + create_document_with_prevalidated_properties: 0, + prefunded_voting_balance_for_document: 0, + contested_vote_poll_for_document: 0, + estimated_size: 0, + index_for_types: 0, + max_size: 0, + serialize_value_for_key: 0, + deserialize_value_for_key: 0, + }, + }, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs index a39362f90ec..e541023efc6 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/mod.rs @@ -1,6 +1,7 @@ use versioned_feature_core::FeatureVersion; pub mod v1; +pub mod v2; #[derive(Clone, Debug, Default)] pub struct DPPMethodVersions { diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v2.rs new file mode 100644 index 00000000000..d15ed3eaaf2 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_method_versions/v2.rs @@ -0,0 +1,5 @@ +use crate::version::dpp_versions::dpp_method_versions::DPPMethodVersions; +pub const DPP_METHOD_VERSIONS_V2: DPPMethodVersions = DPPMethodVersions { + epoch_core_reward_credits_for_distribution: 0, + daily_withdrawal_limit: 1, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs index 3ad838e5de7..8d69f6f8b6d 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/mod.rs @@ -1,6 +1,7 @@ use versioned_feature_core::FeatureVersionBounds; pub mod v1; +pub mod v2; #[derive(Clone, Debug, Default)] pub struct DPPStateTransitionSerializationVersions { @@ -13,7 +14,7 @@ pub struct DPPStateTransitionSerializationVersions { pub masternode_vote_state_transition: FeatureVersionBounds, pub contract_create_state_transition: FeatureVersionBounds, pub contract_update_state_transition: FeatureVersionBounds, - pub documents_batch_state_transition: FeatureVersionBounds, + pub batch_state_transition: FeatureVersionBounds, pub document_base_state_transition: FeatureVersionBounds, pub document_create_state_transition: DocumentFeatureVersionBounds, pub document_replace_state_transition: DocumentFeatureVersionBounds, diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs index 917b8405f08..944e613c26f 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v1.rs @@ -50,7 +50,7 @@ pub const STATE_TRANSITION_SERIALIZATION_VERSIONS_V1: DPPStateTransitionSerializ max_version: 0, default_current_version: 0, }, - documents_batch_state_transition: FeatureVersionBounds { + batch_state_transition: FeatureVersionBounds { min_version: 0, max_version: 0, default_current_version: 0, diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v2.rs new file mode 100644 index 00000000000..1df489c45e7 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_state_transition_serialization_versions/v2.rs @@ -0,0 +1,105 @@ +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::{ + DPPStateTransitionSerializationVersions, DocumentFeatureVersionBounds, +}; +use versioned_feature_core::FeatureVersionBounds; + +pub const STATE_TRANSITION_SERIALIZATION_VERSIONS_V2: DPPStateTransitionSerializationVersions = + DPPStateTransitionSerializationVersions { + identity_public_key_in_creation: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_top_up_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_withdrawal_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_credit_transfer_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + masternode_vote_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_create_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + contract_update_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + batch_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 1, + default_current_version: 1, + }, + document_base_state_transition: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + document_create_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_replace_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_delete_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_transfer_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_update_price_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + document_purchase_state_transition: DocumentFeatureVersionBounds { + bounds: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, + }; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/mod.rs new file mode 100644 index 00000000000..2fa2f4f9050 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/mod.rs @@ -0,0 +1,9 @@ +pub mod v1; + +use versioned_feature_core::FeatureVersion; + +#[derive(Clone, Debug, Default)] +pub struct DPPTokenVersions { + pub identity_token_info_default_structure_version: FeatureVersion, + pub identity_token_status_default_structure_version: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/v1.rs new file mode 100644 index 00000000000..d36fdbf9a20 --- /dev/null +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_token_versions/v1.rs @@ -0,0 +1,6 @@ +use crate::version::dpp_versions::dpp_token_versions::DPPTokenVersions; + +pub const TOKEN_VERSIONS_V1: DPPTokenVersions = DPPTokenVersions { + identity_token_info_default_structure_version: 0, + identity_token_status_default_structure_version: 0, +}; diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs index ebaa11678f9..b96453f6236 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/mod.rs @@ -15,10 +15,12 @@ pub struct DPPValidationVersions { pub struct DataContractValidationVersions { pub validate: FeatureVersion, pub validate_config_update: FeatureVersion, + pub validate_token_config_update: FeatureVersion, pub validate_index_definitions: FeatureVersion, pub validate_index_naming_duplicates: FeatureVersion, pub validate_not_defined_properties: FeatureVersion, pub validate_property_definition: FeatureVersion, + pub validate_token_config_groups_exist: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs index e698694e626..6b92b0d5493 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v1.rs @@ -13,10 +13,12 @@ pub const DPP_VALIDATION_VERSIONS_V1: DPPValidationVersions = DPPValidationVersi data_contract: DataContractValidationVersions { validate: 0, validate_config_update: 0, + validate_token_config_update: 0, validate_index_definitions: 0, validate_index_naming_duplicates: 0, validate_not_defined_properties: 0, validate_property_definition: 0, + validate_token_config_groups_exist: 0, }, document_type: DocumentTypeValidationVersions { validate_update: 0, diff --git a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs index 71223907111..05f6c867066 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/dpp_validation_versions/v2.rs @@ -13,10 +13,12 @@ pub const DPP_VALIDATION_VERSIONS_V2: DPPValidationVersions = DPPValidationVersi data_contract: DataContractValidationVersions { validate: 0, validate_config_update: 0, + validate_token_config_update: 0, validate_index_definitions: 0, validate_index_naming_duplicates: 0, validate_not_defined_properties: 0, validate_property_definition: 0, + validate_token_config_groups_exist: 0, }, document_type: DocumentTypeValidationVersions { validate_update: 0, diff --git a/packages/rs-platform-version/src/version/dpp_versions/mod.rs b/packages/rs-platform-version/src/version/dpp_versions/mod.rs index e51203512c0..c58be60aec4 100644 --- a/packages/rs-platform-version/src/version/dpp_versions/mod.rs +++ b/packages/rs-platform-version/src/version/dpp_versions/mod.rs @@ -9,6 +9,7 @@ pub mod dpp_state_transition_conversion_versions; pub mod dpp_state_transition_method_versions; pub mod dpp_state_transition_serialization_versions; pub mod dpp_state_transition_versions; +pub mod dpp_token_versions; pub mod dpp_validation_versions; pub mod dpp_voting_versions; @@ -23,6 +24,7 @@ use dpp_state_transition_conversion_versions::DPPStateTransitionConversionVersio use dpp_state_transition_method_versions::DPPStateTransitionMethodVersions; use dpp_state_transition_serialization_versions::DPPStateTransitionSerializationVersions; use dpp_state_transition_versions::DPPStateTransitionVersions; +use dpp_token_versions::DPPTokenVersions; use dpp_validation_versions::DPPValidationVersions; use dpp_voting_versions::DPPVotingVersions; @@ -39,6 +41,7 @@ pub struct DPPVersion { pub document_versions: DPPDocumentVersions, pub identity_versions: DPPIdentityVersions, pub voting_versions: DPPVotingVersions, + pub token_versions: DPPTokenVersions, pub asset_lock_versions: DPPAssetLockVersions, pub methods: DPPMethodVersions, pub factory_versions: DPPFactoryVersions, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs index 48caab4b3ca..18afbf4a153 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/mod.rs @@ -4,6 +4,8 @@ pub mod v1; pub mod v2; pub mod v3; pub mod v4; +pub mod v5; +pub mod v6; #[derive(Clone, Debug, Default)] pub struct DriveAbciMethodVersions { @@ -12,6 +14,7 @@ pub struct DriveAbciMethodVersions { pub core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions, pub protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions, pub block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions, + pub tokens_processing: DriveAbciTokensProcessingMethodVersions, pub core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants, pub core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions, pub fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions, @@ -75,7 +78,12 @@ pub struct DriveAbciInitializationMethodVersions { #[derive(Clone, Debug, Default)] pub struct DriveAbciBlockFeeProcessingMethodVersions { pub add_process_epoch_change_operations: FeatureVersion, - pub process_block_fees: FeatureVersion, + pub process_block_fees_and_validate_sum_trees: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciTokensProcessingMethodVersions { + pub validate_token_aggregated_balance: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs index e6e1c63a401..922358607b9 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v1.rs @@ -8,7 +8,8 @@ use crate::version::drive_abci_versions::drive_abci_method_versions::{ DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, }; pub const DRIVE_ABCI_METHOD_VERSIONS_V1: DriveAbciMethodVersions = DriveAbciMethodVersions { @@ -52,7 +53,10 @@ pub const DRIVE_ABCI_METHOD_VERSIONS_V1: DriveAbciMethodVersions = DriveAbciMeth }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, - process_block_fees: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, }, core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { choose_quorum: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs index 1e355fa6a2e..fa1db356869 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v2.rs @@ -8,7 +8,8 @@ use crate::version::drive_abci_versions::drive_abci_method_versions::{ DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, }; pub const DRIVE_ABCI_METHOD_VERSIONS_V2: DriveAbciMethodVersions = DriveAbciMethodVersions { @@ -53,7 +54,10 @@ pub const DRIVE_ABCI_METHOD_VERSIONS_V2: DriveAbciMethodVersions = DriveAbciMeth }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, - process_block_fees: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, }, core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { choose_quorum: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs index 2b48e7a0340..c6439e23fdb 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v3.rs @@ -8,7 +8,8 @@ use crate::version::drive_abci_versions::drive_abci_method_versions::{ DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, }; pub const DRIVE_ABCI_METHOD_VERSIONS_V3: DriveAbciMethodVersions = DriveAbciMethodVersions { @@ -52,7 +53,10 @@ pub const DRIVE_ABCI_METHOD_VERSIONS_V3: DriveAbciMethodVersions = DriveAbciMeth }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, - process_block_fees: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, }, core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { choose_quorum: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs index bedfb591c30..b3d961563cd 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v4.rs @@ -8,7 +8,8 @@ use crate::version::drive_abci_versions::drive_abci_method_versions::{ DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, }; pub const DRIVE_ABCI_METHOD_VERSIONS_V4: DriveAbciMethodVersions = DriveAbciMethodVersions { @@ -52,7 +53,10 @@ pub const DRIVE_ABCI_METHOD_VERSIONS_V4: DriveAbciMethodVersions = DriveAbciMeth }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, - process_block_fees: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, }, core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { choose_quorum: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v5.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v5.rs new file mode 100644 index 00000000000..1490bd06ed9 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v5.rs @@ -0,0 +1,129 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, +}; + +pub const DRIVE_ABCI_METHOD_VERSIONS_V5: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 1, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 0, + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 1, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 1, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: Some(0), + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + // We changed `pool_withdrawals_into_transactions_queue` to v1 in order to add pool + // withdrawals on any validator quorums. v0 allowed us to pool only on the first two + // quorums as workaround for Core v21 bug. + pool_withdrawals_into_transactions_queue: 1, + update_broadcasted_withdrawal_statuses: 0, + // Rebroadcasting should also no longer use the first two quorums only + rebroadcast_expired_withdrawal_documents: 1, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 1, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 2, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v6.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v6.rs new file mode 100644 index 00000000000..8e29725ed6e --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_method_versions/v6.rs @@ -0,0 +1,126 @@ +use crate::version::drive_abci_versions::drive_abci_method_versions::{ + DriveAbciBlockEndMethodVersions, DriveAbciBlockFeeProcessingMethodVersions, + DriveAbciBlockStartMethodVersions, DriveAbciCoreBasedUpdatesMethodVersions, + DriveAbciCoreChainLockMethodVersionsAndConstants, DriveAbciCoreInstantSendLockMethodVersions, + DriveAbciEngineMethodVersions, DriveAbciEpochMethodVersions, + DriveAbciFeePoolInwardsDistributionMethodVersions, + DriveAbciFeePoolOutwardsDistributionMethodVersions, + DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, + DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, + DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, +}; + +// Introduced in Protocol version 8 for tokens +pub const DRIVE_ABCI_METHOD_VERSIONS_V6: DriveAbciMethodVersions = DriveAbciMethodVersions { + engine: DriveAbciEngineMethodVersions { + init_chain: 0, + check_tx: 0, + run_block_proposal: 0, + finalize_block_proposal: 0, + consensus_params_update: 1, + }, + initialization: DriveAbciInitializationMethodVersions { + initial_core_height_and_time: 0, + create_genesis_state: 1, // register the additional contracts (tokens and wallet utils) + }, + core_based_updates: DriveAbciCoreBasedUpdatesMethodVersions { + update_core_info: 0, + update_masternode_list: 0, + update_quorum_info: 0, + masternode_updates: DriveAbciMasternodeIdentitiesUpdatesMethodVersions { + get_voter_identity_key: 0, + get_operator_identity_keys: 0, + get_owner_identity_withdrawal_key: 0, + get_owner_identity_owner_key: 0, + get_voter_identifier_from_masternode_list_item: 0, + get_operator_identifier_from_masternode_list_item: 0, + create_operator_identity: 0, + create_owner_identity: 1, + create_voter_identity: 0, + disable_identity_keys: 0, + update_masternode_identities: 0, + update_operator_identity: 0, + update_owner_withdrawal_address: 1, + update_voter_identity: 0, + }, + }, + protocol_upgrade: DriveAbciProtocolUpgradeMethodVersions { + check_for_desired_protocol_upgrade: 1, + upgrade_protocol_version_on_epoch_change: 0, + perform_events_on_first_block_of_protocol_change: Some(0), + protocol_version_upgrade_percentage_needed: 67, + }, + block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { + add_process_epoch_change_operations: 0, + process_block_fees_and_validate_sum_trees: 1, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, + }, + core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { + choose_quorum: 0, + verify_chain_lock: 0, + verify_chain_lock_locally: 0, + verify_chain_lock_through_core: 0, + make_sure_core_is_synced_to_chain_lock: 0, + recent_block_count_amount: 2, + }, + core_instant_send_lock: DriveAbciCoreInstantSendLockMethodVersions { + verify_recent_signature_locally: 0, + }, + fee_pool_inwards_distribution: DriveAbciFeePoolInwardsDistributionMethodVersions { + add_distribute_block_fees_into_pools_operations: 0, + add_distribute_storage_fee_to_epochs_operations: 0, + }, + fee_pool_outwards_distribution: DriveAbciFeePoolOutwardsDistributionMethodVersions { + add_distribute_fees_from_oldest_unpaid_epoch_pool_to_proposers_operations: 0, + add_epoch_pool_to_proposers_payout_operations: 0, + find_oldest_epoch_needing_payment: 0, + fetch_reward_shares_list_for_masternode: 0, + }, + withdrawals: DriveAbciIdentityCreditWithdrawalMethodVersions { + build_untied_withdrawal_transactions_from_documents: 0, + dequeue_and_build_unsigned_withdrawal_transactions: 0, + fetch_transactions_block_inclusion_status: 0, + pool_withdrawals_into_transactions_queue: 1, + update_broadcasted_withdrawal_statuses: 0, + rebroadcast_expired_withdrawal_documents: 1, + append_signatures_and_broadcast_withdrawal_transactions: 0, + cleanup_expired_locks_of_withdrawal_amounts: 0, + }, + voting: DriveAbciVotingMethodVersions { + keep_record_of_finished_contested_resource_vote_poll: 0, + clean_up_after_vote_poll_end: 0, + clean_up_after_contested_resources_vote_poll_end: 1, + check_for_ended_vote_polls: 0, + tally_votes_for_contested_document_resource_vote_poll: 0, + award_document_to_winner: 0, + delay_vote_poll: 0, + run_dao_platform_events: 0, + remove_votes_for_removed_masternodes: 0, + }, + state_transition_processing: DriveAbciStateTransitionProcessingMethodVersions { + execute_event: 0, + process_raw_state_transitions: 0, + decode_raw_state_transitions: 0, + validate_fees_of_event: 0, + }, + epoch: DriveAbciEpochMethodVersions { + gather_epoch_info: 0, + get_genesis_time: 0, + }, + block_start: DriveAbciBlockStartMethodVersions { + clear_drive_block_cache: 0, + }, + block_end: DriveAbciBlockEndMethodVersions { + update_state_cache: 0, + update_drive_cache: 0, + validator_set_update: 2, + }, + platform_state_storage: DriveAbciPlatformStateStorageMethodVersions { + fetch_platform_state: 0, + store_platform_state: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs index 8b010c9c3de..7a5d65bd3ea 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs @@ -10,10 +10,12 @@ pub struct DriveAbciQueryVersions { pub document_query: FeatureVersionBounds, pub prefunded_specialized_balances: DriveAbciQueryPrefundedSpecializedBalancesVersions, pub identity_based_queries: DriveAbciQueryIdentityVersions, + pub token_queries: DriveAbciQueryTokenVersions, pub validator_queries: DriveAbciQueryValidatorVersions, pub data_contract_based_queries: DriveAbciQueryDataContractVersions, pub voting_based_queries: DriveAbciQueryVotingVersions, pub system: DriveAbciQuerySystemVersions, + pub group_queries: DriveAbciQueryGroupVersions, } #[derive(Clone, Debug, Default)] @@ -21,6 +23,25 @@ pub struct DriveAbciQueryPrefundedSpecializedBalancesVersions { pub balance: FeatureVersionBounds, } +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryTokenVersions { + pub identity_token_balances: FeatureVersionBounds, + pub identities_token_balances: FeatureVersionBounds, + pub identities_token_infos: FeatureVersionBounds, + pub identity_token_infos: FeatureVersionBounds, + pub token_statuses: FeatureVersionBounds, + pub token_total_supply: FeatureVersionBounds, + pub token_pre_programmed_distributions: FeatureVersionBounds, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveAbciQueryGroupVersions { + pub group_info: FeatureVersionBounds, + pub group_infos: FeatureVersionBounds, + pub group_actions: FeatureVersionBounds, + pub group_action_signers: FeatureVersionBounds, +} + #[derive(Clone, Debug, Default)] pub struct DriveAbciQueryIdentityVersions { pub identity: FeatureVersionBounds, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs index b6af08405cf..494dfa6f097 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs @@ -1,7 +1,8 @@ use crate::version::drive_abci_versions::drive_abci_query_versions::{ - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryGroupVersions, + DriveAbciQueryIdentityVersions, DriveAbciQueryPrefundedSpecializedBalancesVersions, + DriveAbciQuerySystemVersions, DriveAbciQueryTokenVersions, DriveAbciQueryValidatorVersions, + DriveAbciQueryVersions, DriveAbciQueryVotingVersions, }; use versioned_feature_core::FeatureVersionBounds; @@ -72,6 +73,43 @@ pub const DRIVE_ABCI_QUERY_VERSIONS_V1: DriveAbciQueryVersions = DriveAbciQueryV default_current_version: 0, }, }, + token_queries: DriveAbciQueryTokenVersions { + identity_token_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_token_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_token_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_token_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_statuses: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_total_supply: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_pre_programmed_distributions: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, validator_queries: DriveAbciQueryValidatorVersions { proposed_block_counts_by_evonode_ids: FeatureVersionBounds { min_version: 0, @@ -165,4 +203,26 @@ pub const DRIVE_ABCI_QUERY_VERSIONS_V1: DriveAbciQueryVersions = DriveAbciQueryV default_current_version: 0, }, }, + group_queries: DriveAbciQueryGroupVersions { + group_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_actions: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_action_signers: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }; diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs index 4bd5ff6269c..587366149e8 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/mod.rs @@ -2,6 +2,7 @@ pub mod v1; pub mod v2; pub mod v3; pub mod v4; +pub mod v5; use versioned_feature_core::{FeatureVersion, OptionalFeatureVersion}; @@ -45,7 +46,7 @@ pub struct DriveAbciStateTransitionValidationVersions { pub masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion, pub contract_create_state_transition: DriveAbciStateTransitionValidationVersion, pub contract_update_state_transition: DriveAbciStateTransitionValidationVersion, - pub documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions, + pub batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions, } #[derive(Clone, Debug, Default)] @@ -97,6 +98,25 @@ pub struct DriveAbciDocumentsStateTransitionValidationVersions { pub document_transfer_transition_state_validation: FeatureVersion, pub document_purchase_transition_state_validation: FeatureVersion, pub document_update_price_transition_state_validation: FeatureVersion, + pub token_mint_transition_structure_validation: FeatureVersion, + pub token_burn_transition_structure_validation: FeatureVersion, + pub token_transfer_transition_structure_validation: FeatureVersion, + pub token_issuance_transition_state_validation: FeatureVersion, + pub token_burn_transition_state_validation: FeatureVersion, + pub token_transfer_transition_state_validation: FeatureVersion, + pub token_base_transition_structure_validation: FeatureVersion, + pub token_base_transition_state_validation: FeatureVersion, + pub token_freeze_transition_structure_validation: FeatureVersion, + pub token_unfreeze_transition_structure_validation: FeatureVersion, + pub token_freeze_transition_state_validation: FeatureVersion, + pub token_unfreeze_transition_state_validation: FeatureVersion, + pub token_destroy_frozen_funds_transition_structure_validation: FeatureVersion, + pub token_destroy_frozen_funds_transition_state_validation: FeatureVersion, + pub token_emergency_action_transition_structure_validation: FeatureVersion, + pub token_emergency_action_transition_state_validation: FeatureVersion, + pub token_config_update_transition_structure_validation: FeatureVersion, + pub token_config_update_transition_state_validation: FeatureVersion, + pub token_base_transition_group_action_validation: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs index 20820165d1d..7b397d96426 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v1.rs @@ -97,7 +97,7 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V1: DriveAbciValidationVersions = state: 0, transform_into_action: 0, }, - documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, @@ -129,6 +129,25 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V1: DriveAbciValidationVersions = document_transfer_transition_state_validation: 0, document_purchase_transition_state_validation: 0, document_update_price_transition_state_validation: 0, + token_mint_transition_structure_validation: 0, + token_burn_transition_structure_validation: 0, + token_transfer_transition_structure_validation: 0, + token_issuance_transition_state_validation: 0, + token_burn_transition_state_validation: 0, + token_transfer_transition_state_validation: 0, + token_base_transition_structure_validation: 0, + token_base_transition_state_validation: 0, + token_freeze_transition_structure_validation: 0, + token_unfreeze_transition_structure_validation: 0, + token_freeze_transition_state_validation: 0, + token_unfreeze_transition_state_validation: 0, + token_destroy_frozen_funds_transition_structure_validation: 0, + token_destroy_frozen_funds_transition_state_validation: 0, + token_emergency_action_transition_structure_validation: 0, + token_emergency_action_transition_state_validation: 0, + token_config_update_transition_structure_validation: 0, + token_config_update_transition_state_validation: 0, + token_base_transition_group_action_validation: 0, }, }, has_nonce_validation: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs index 7cd1b593538..3df6d962f52 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v2.rs @@ -97,7 +97,7 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V2: DriveAbciValidationVersions = state: 0, transform_into_action: 0, }, - documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, @@ -129,6 +129,25 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V2: DriveAbciValidationVersions = document_transfer_transition_state_validation: 0, document_purchase_transition_state_validation: 0, document_update_price_transition_state_validation: 0, + token_mint_transition_structure_validation: 0, + token_burn_transition_structure_validation: 0, + token_transfer_transition_structure_validation: 0, + token_issuance_transition_state_validation: 0, + token_burn_transition_state_validation: 0, + token_transfer_transition_state_validation: 0, + token_base_transition_structure_validation: 0, + token_base_transition_state_validation: 0, + token_freeze_transition_structure_validation: 0, + token_unfreeze_transition_structure_validation: 0, + token_freeze_transition_state_validation: 0, + token_unfreeze_transition_state_validation: 0, + token_destroy_frozen_funds_transition_structure_validation: 0, + token_destroy_frozen_funds_transition_state_validation: 0, + token_emergency_action_transition_structure_validation: 0, + token_emergency_action_transition_state_validation: 0, + token_config_update_transition_structure_validation: 0, + token_config_update_transition_state_validation: 0, + token_base_transition_group_action_validation: 0, }, }, has_nonce_validation: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs index 42f4068cdd9..e3aadceb22d 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v3.rs @@ -97,7 +97,7 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V3: DriveAbciValidationVersions = state: 0, transform_into_action: 0, }, - documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, @@ -129,6 +129,25 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V3: DriveAbciValidationVersions = document_transfer_transition_state_validation: 0, document_purchase_transition_state_validation: 0, document_update_price_transition_state_validation: 0, + token_mint_transition_structure_validation: 0, + token_burn_transition_structure_validation: 0, + token_transfer_transition_structure_validation: 0, + token_issuance_transition_state_validation: 0, + token_burn_transition_state_validation: 0, + token_transfer_transition_state_validation: 0, + token_base_transition_structure_validation: 0, + token_base_transition_state_validation: 0, + token_freeze_transition_structure_validation: 0, + token_unfreeze_transition_structure_validation: 0, + token_freeze_transition_state_validation: 0, + token_unfreeze_transition_state_validation: 0, + token_destroy_frozen_funds_transition_structure_validation: 0, + token_destroy_frozen_funds_transition_state_validation: 0, + token_emergency_action_transition_structure_validation: 0, + token_emergency_action_transition_state_validation: 0, + token_config_update_transition_structure_validation: 0, + token_config_update_transition_state_validation: 0, + token_base_transition_group_action_validation: 0, }, }, has_nonce_validation: 0, diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v4.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v4.rs index ff70d44107d..aa0ded10270 100644 --- a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v4.rs +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v4.rs @@ -6,6 +6,9 @@ use crate::version::drive_abci_versions::drive_abci_validation_versions::{ DriveAbciValidationVersions, PenaltyAmounts, }; +// We introduced nonce validation for masternode voting in this version, and changed the call +// for nonce validation, however the actual validation for masternode voting was faulty, which is +// why we introduced V5. (We also are making an emergency hard fork). pub const DRIVE_ABCI_VALIDATION_VERSIONS_V4: DriveAbciValidationVersions = DriveAbciValidationVersions { state_transitions: DriveAbciStateTransitionValidationVersions { @@ -97,7 +100,7 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V4: DriveAbciValidationVersions = state: 0, transform_into_action: 0, }, - documents_batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { balance_pre_check: 0, basic_structure: 0, advanced_structure: 0, @@ -129,9 +132,28 @@ pub const DRIVE_ABCI_VALIDATION_VERSIONS_V4: DriveAbciValidationVersions = document_transfer_transition_state_validation: 0, document_purchase_transition_state_validation: 0, document_update_price_transition_state_validation: 0, + token_mint_transition_structure_validation: 0, + token_burn_transition_structure_validation: 0, + token_transfer_transition_structure_validation: 0, + token_issuance_transition_state_validation: 0, + token_burn_transition_state_validation: 0, + token_transfer_transition_state_validation: 0, + token_base_transition_structure_validation: 0, + token_base_transition_state_validation: 0, + token_freeze_transition_structure_validation: 0, + token_unfreeze_transition_structure_validation: 0, + token_freeze_transition_state_validation: 0, + token_unfreeze_transition_state_validation: 0, + token_destroy_frozen_funds_transition_structure_validation: 0, + token_destroy_frozen_funds_transition_state_validation: 0, + token_emergency_action_transition_structure_validation: 0, + token_emergency_action_transition_state_validation: 0, + token_config_update_transition_structure_validation: 0, + token_config_update_transition_state_validation: 0, + token_base_transition_group_action_validation: 0, }, }, - has_nonce_validation: 1, + has_nonce_validation: 1, // <---- changed this process_state_transition: 0, state_transition_to_execution_event_for_check_tx: 0, penalties: PenaltyAmounts { diff --git a/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v5.rs b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v5.rs new file mode 100644 index 00000000000..0c3bcfea280 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_validation_versions/v5.rs @@ -0,0 +1,170 @@ +use crate::version::drive_abci_versions::drive_abci_validation_versions::{ + DriveAbciAssetLockValidationVersions, DriveAbciDocumentsStateTransitionValidationVersions, + DriveAbciStateTransitionCommonValidationVersions, DriveAbciStateTransitionValidationVersion, + DriveAbciStateTransitionValidationVersions, DriveAbciValidationConstants, + DriveAbciValidationDataTriggerAndBindingVersions, DriveAbciValidationDataTriggerVersions, + DriveAbciValidationVersions, PenaltyAmounts, +}; + +// In this version we change the nonce validation of masternode voting. +// There was a bug before this where the nonce validation would validate using the owner identity +// instead of the voting identity. +// This is not the same issue as before when we didn't validate nonces on masternode votes at all. +pub const DRIVE_ABCI_VALIDATION_VERSIONS_V5: DriveAbciValidationVersions = + DriveAbciValidationVersions { + state_transitions: DriveAbciStateTransitionValidationVersions { + common_validation_methods: DriveAbciStateTransitionCommonValidationVersions { + asset_locks: DriveAbciAssetLockValidationVersions { + fetch_asset_lock_transaction_output_sync: 0, + verify_asset_lock_is_not_spent_and_has_enough_balance: 0, + }, + validate_identity_public_key_contract_bounds: 0, + validate_identity_public_key_ids_dont_exist_in_state: 0, + validate_identity_public_key_ids_exist_in_state: 0, + validate_state_transition_identity_signed: 0, + validate_unique_identity_public_key_hashes_in_state: 0, + validate_master_key_uniqueness: 0, + validate_simple_pre_check_balance: 0, + }, + max_asset_lock_usage_attempts: 16, + identity_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: Some(0), + identity_signatures: Some(0), + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_top_up_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: None, + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition: + DriveAbciStateTransitionValidationVersion { + basic_structure: Some(1), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + identity_credit_withdrawal_state_transition_purpose_matches_requirements: 0, + identity_credit_transfer_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + masternode_vote_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: Some(0), + identity_signatures: None, + advanced_minimum_balance_pre_check: Some(0), + nonce: Some(1), // <---- Changed this here + state: 0, + transform_into_action: 0, + }, + contract_create_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: Some(0), + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + contract_update_state_transition: DriveAbciStateTransitionValidationVersion { + basic_structure: None, + advanced_structure: None, + identity_signatures: None, + advanced_minimum_balance_pre_check: None, + nonce: Some(0), + state: 0, + transform_into_action: 0, + }, + batch_state_transition: DriveAbciDocumentsStateTransitionValidationVersions { + balance_pre_check: 0, + basic_structure: 0, + advanced_structure: 0, + state: 0, + revision: 0, + transform_into_action: 0, + data_triggers: DriveAbciValidationDataTriggerAndBindingVersions { + bindings: 0, + triggers: DriveAbciValidationDataTriggerVersions { + create_contact_request_data_trigger: 0, + create_domain_data_trigger: 0, + create_identity_data_trigger: 0, + create_feature_flag_data_trigger: 0, + create_masternode_reward_shares_data_trigger: 0, + delete_withdrawal_data_trigger: 0, + reject_data_trigger: 0, + }, + }, + is_allowed: 0, + document_create_transition_structure_validation: 0, + document_delete_transition_structure_validation: 0, + document_replace_transition_structure_validation: 0, + document_transfer_transition_structure_validation: 0, + document_purchase_transition_structure_validation: 0, + document_update_price_transition_structure_validation: 0, + document_create_transition_state_validation: 1, + document_delete_transition_state_validation: 0, + document_replace_transition_state_validation: 0, + document_transfer_transition_state_validation: 0, + document_purchase_transition_state_validation: 0, + document_update_price_transition_state_validation: 0, + token_mint_transition_structure_validation: 0, + token_burn_transition_structure_validation: 0, + token_transfer_transition_structure_validation: 0, + token_issuance_transition_state_validation: 0, + token_burn_transition_state_validation: 0, + token_transfer_transition_state_validation: 0, + token_base_transition_structure_validation: 0, + token_base_transition_state_validation: 0, + token_freeze_transition_structure_validation: 0, + token_unfreeze_transition_structure_validation: 0, + token_freeze_transition_state_validation: 0, + token_unfreeze_transition_state_validation: 0, + token_destroy_frozen_funds_transition_structure_validation: 0, + token_destroy_frozen_funds_transition_state_validation: 0, + token_emergency_action_transition_structure_validation: 0, + token_emergency_action_transition_state_validation: 0, + token_config_update_transition_structure_validation: 0, + token_config_update_transition_state_validation: 0, + token_base_transition_group_action_validation: 0, + }, + }, + has_nonce_validation: 1, + process_state_transition: 0, + state_transition_to_execution_event_for_check_tx: 0, + penalties: PenaltyAmounts { + identity_id_not_correct: 50000000, + unique_key_already_present: 10000000, + validation_of_added_keys_structure_failure: 10000000, + validation_of_added_keys_proof_of_possession_failure: 50000000, + }, + event_constants: DriveAbciValidationConstants { + maximum_vote_polls_to_process: 2, + maximum_contenders_to_consider: 100, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs index 18cf2d3a4f6..a216992f698 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/mod.rs @@ -1,6 +1,7 @@ use versioned_feature_core::FeatureVersion; pub mod v1; +pub mod v2; #[derive(Clone, Debug, Default)] pub struct DriveContractMethodVersions { diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v2.rs b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v2.rs new file mode 100644 index 00000000000..5197624ade2 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_contract_method_versions/v2.rs @@ -0,0 +1,33 @@ +use crate::version::drive_versions::drive_contract_method_versions::{ + DriveContractApplyMethodVersions, DriveContractCostsMethodVersions, + DriveContractGetMethodVersions, DriveContractInsertMethodVersions, DriveContractMethodVersions, + DriveContractProveMethodVersions, DriveContractUpdateMethodVersions, +}; + +pub const DRIVE_CONTRACT_METHOD_VERSIONS_V2: DriveContractMethodVersions = + DriveContractMethodVersions { + prove: DriveContractProveMethodVersions { + prove_contract: 0, + prove_contract_history: 0, + prove_contracts: 0, + }, + apply: DriveContractApplyMethodVersions { + apply_contract: 0, + apply_contract_with_serialization: 0, + }, + insert: DriveContractInsertMethodVersions { + add_contract_to_storage: 0, + insert_contract: 1, // <--- changed to v1 (for token insertion + }, + update: DriveContractUpdateMethodVersions { update_contract: 1 }, // <--- changed to v1 (for token insertion) + costs: DriveContractCostsMethodVersions { + add_estimation_costs_for_contract_insertion: 0, + }, + get: DriveContractGetMethodVersions { + fetch_contract: 0, + fetch_contract_with_history: 0, + get_cached_contract_with_fetch_info: 0, + get_contract_with_fetch_info: 0, + get_contracts_with_fetch_info: 0, + }, + }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs index 0d116b4104a..4e60e2c417d 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/mod.rs @@ -28,6 +28,7 @@ pub struct DriveCreditPoolEpochsMethodVersions { pub get_epochs_proposer_block_count: FeatureVersion, pub add_update_pending_epoch_refunds_operations: FeatureVersion, pub is_epochs_proposers_tree_empty: FeatureVersion, + pub add_epoch_processing_credits_for_distribution_operation: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs index 43117298860..7c2252edfb8 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_credit_pool_method_versions/v1.rs @@ -25,6 +25,7 @@ pub const CREDIT_POOL_METHOD_VERSIONS_V1: DriveCreditPoolMethodVersions = get_epochs_proposer_block_count: 0, add_update_pending_epoch_refunds_operations: 0, is_epochs_proposers_tree_empty: 0, + add_epoch_processing_credits_for_distribution_operation: 0, }, pending_epoch_refunds: DriveCreditPoolPendingEpochRefundsMethodVersions { add_delete_pending_epoch_refunds_except_specified: 0, diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/mod.rs new file mode 100644 index 00000000000..c2a337ebe41 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/mod.rs @@ -0,0 +1,43 @@ +use grovedb_version::version::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveGroupMethodVersions { + pub fetch: DriveGroupFetchMethodVersions, + pub prove: DriveGroupProveMethodVersions, + pub insert: DriveGroupInsertMethodVersions, + pub cost_estimation: DriveGroupCostEstimationMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroupFetchMethodVersions { + pub fetch_action_id_signers_power: FeatureVersion, + pub fetch_active_action_info: FeatureVersion, + pub fetch_action_id_info_keep_serialized: FeatureVersion, + pub fetch_action_id_has_signer: FeatureVersion, + pub fetch_group_info: FeatureVersion, + pub fetch_group_infos: FeatureVersion, + pub fetch_action_infos: FeatureVersion, + pub fetch_action_signers: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroupProveMethodVersions { + pub prove_group_info: FeatureVersion, + pub prove_group_infos: FeatureVersion, + pub prove_action_infos: FeatureVersion, + pub prove_action_signers: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroupInsertMethodVersions { + pub add_new_groups: FeatureVersion, + pub add_group_action: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveGroupCostEstimationMethodVersions { + pub for_add_group_action: FeatureVersion, + pub for_add_group: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/v1.rs new file mode 100644 index 00000000000..e6ee9e129f7 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_group_method_versions/v1.rs @@ -0,0 +1,31 @@ +use crate::version::drive_versions::drive_group_method_versions::{ + DriveGroupCostEstimationMethodVersions, DriveGroupFetchMethodVersions, + DriveGroupInsertMethodVersions, DriveGroupMethodVersions, DriveGroupProveMethodVersions, +}; + +pub const DRIVE_GROUP_METHOD_VERSIONS_V1: DriveGroupMethodVersions = DriveGroupMethodVersions { + fetch: DriveGroupFetchMethodVersions { + fetch_action_id_signers_power: 0, + fetch_active_action_info: 0, + fetch_action_id_info_keep_serialized: 0, + fetch_action_id_has_signer: 0, + fetch_group_info: 0, + fetch_group_infos: 0, + fetch_action_infos: 0, + fetch_action_signers: 0, + }, + prove: DriveGroupProveMethodVersions { + prove_group_info: 0, + prove_group_infos: 0, + prove_action_infos: 0, + prove_action_signers: 0, + }, + insert: DriveGroupInsertMethodVersions { + add_new_groups: 0, + add_group_action: 0, + }, + cost_estimation: DriveGroupCostEstimationMethodVersions { + for_add_group_action: 0, + for_add_group: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs index c61b52f2504..71d7fc8b00c 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/mod.rs @@ -33,6 +33,10 @@ pub struct DriveGroveBasicMethodVersions { pub grove_get_proved_path_query_with_conditional: FeatureVersion, pub grove_get_sum_tree_total_value: FeatureVersion, pub grove_has_raw: FeatureVersion, + pub grove_get_raw_item: FeatureVersion, + pub grove_get_optional_sum_tree_total_value: FeatureVersion, + pub grove_get_raw_optional_item: FeatureVersion, + pub grove_get_big_sum_tree_total_value: FeatureVersion, } #[derive(Clone, Debug, Default)] @@ -40,6 +44,7 @@ pub struct DriveGroveBatchMethodVersions { pub batch_insert_empty_tree: FeatureVersion, pub batch_insert_empty_tree_if_not_exists: FeatureVersion, pub batch_insert_empty_tree_if_not_exists_check_existing_operations: FeatureVersion, + pub batch_insert_sum_item_if_not_exists: FeatureVersion, pub batch_insert_sum_item_or_add_to_if_already_exists: FeatureVersion, pub batch_insert: FeatureVersion, pub batch_insert_if_not_exists: FeatureVersion, @@ -51,6 +56,7 @@ pub struct DriveGroveBatchMethodVersions { pub batch_remove_raw: FeatureVersion, pub batch_delete_up_tree_while_empty: FeatureVersion, pub batch_refresh_reference: FeatureVersion, + pub batch_insert_empty_sum_tree: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs index 6dc9b44503c..0fa2d7d09c9 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_grove_method_versions/v1.rs @@ -26,11 +26,16 @@ pub const DRIVE_GROVE_METHOD_VERSIONS_V1: DriveGroveMethodVersions = DriveGroveM grove_get_proved_path_query_with_conditional: 0, grove_get_sum_tree_total_value: 0, grove_has_raw: 0, + grove_get_raw_item: 0, + grove_get_optional_sum_tree_total_value: 0, + grove_get_raw_optional_item: 0, + grove_get_big_sum_tree_total_value: 0, }, batch: DriveGroveBatchMethodVersions { batch_insert_empty_tree: 0, batch_insert_empty_tree_if_not_exists: 0, batch_insert_empty_tree_if_not_exists_check_existing_operations: 0, + batch_insert_sum_item_if_not_exists: 0, batch_insert_sum_item_or_add_to_if_already_exists: 0, batch_insert: 0, batch_insert_if_not_exists: 0, @@ -42,6 +47,7 @@ pub const DRIVE_GROVE_METHOD_VERSIONS_V1: DriveGroveMethodVersions = DriveGroveM batch_remove_raw: 0, batch_delete_up_tree_while_empty: 0, batch_refresh_reference: 0, + batch_insert_empty_sum_tree: 0, }, apply: DriveGroveApplyMethodVersions { grove_apply_operation: 0, diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs index c44788e4c36..7528ec11a40 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/mod.rs @@ -58,6 +58,8 @@ pub struct DriveIdentityContractInfoMethodVersions { pub struct DriveIdentityCostEstimationMethodVersions { pub for_authentication_keys_security_level_in_key_reference_tree: FeatureVersion, pub for_balances: FeatureVersion, + pub for_token_balances: FeatureVersion, + pub for_token_total_supply: FeatureVersion, pub for_contract_info: FeatureVersion, pub for_contract_info_group: FeatureVersion, pub for_contract_info_group_keys: FeatureVersion, @@ -67,6 +69,9 @@ pub struct DriveIdentityCostEstimationMethodVersions { pub for_purpose_in_key_reference_tree: FeatureVersion, pub for_root_key_reference_tree: FeatureVersion, pub for_update_revision: FeatureVersion, + pub for_token_identity_infos: FeatureVersion, + pub for_token_pre_programmed_distribution: FeatureVersion, + pub for_root_token_ms_interval_distribution: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs index 098f38ab7c2..3db719ae7fa 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_identity_method_versions/v1.rs @@ -119,6 +119,8 @@ pub const DRIVE_IDENTITY_METHOD_VERSIONS_V1: DriveIdentityMethodVersions = cost_estimation: DriveIdentityCostEstimationMethodVersions { for_authentication_keys_security_level_in_key_reference_tree: 0, for_balances: 0, + for_token_balances: 0, + for_token_total_supply: 0, for_contract_info: 0, for_contract_info_group: 0, for_contract_info_group_keys: 0, @@ -128,6 +130,9 @@ pub const DRIVE_IDENTITY_METHOD_VERSIONS_V1: DriveIdentityMethodVersions = for_purpose_in_key_reference_tree: 0, for_root_key_reference_tree: 0, for_update_revision: 0, + for_token_identity_infos: 0, + for_token_pre_programmed_distribution: 0, + for_root_token_ms_interval_distribution: 0, }, withdrawals: DriveIdentityWithdrawalMethodVersions { document: DriveIdentityWithdrawalDocumentMethodVersions { diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs index c4825489080..23c81d18ce4 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/mod.rs @@ -20,6 +20,9 @@ pub struct DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions pub document_replace_transition: FeatureVersion, pub document_transfer_transition: FeatureVersion, pub document_update_price_transition: FeatureVersion, + pub token_burn_transition: FeatureVersion, + pub token_mint_transition: FeatureVersion, + pub token_transfer_transition: FeatureVersion, pub documents_batch_transition: FeatureVersion, pub identity_create_transition: FeatureVersion, pub identity_credit_transfer_transition: FeatureVersion, @@ -30,6 +33,11 @@ pub struct DriveStateTransitionActionConvertToHighLevelOperationsMethodVersions pub bump_identity_data_contract_nonce: FeatureVersion, pub bump_identity_nonce: FeatureVersion, pub partially_use_asset_lock: FeatureVersion, + pub token_freeze_transition: FeatureVersion, + pub token_unfreeze_transition: FeatureVersion, + pub token_emergency_action_transition: FeatureVersion, + pub token_destroy_frozen_funds_transition: FeatureVersion, + pub token_config_update_transition: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs index 45e732c99c4..5db70c5c197 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_state_transition_method_versions/v1.rs @@ -22,6 +22,9 @@ pub const DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1: DriveStateTransitionMethodV document_replace_transition: 0, document_transfer_transition: 0, document_update_price_transition: 0, + token_burn_transition: 0, + token_mint_transition: 0, + token_transfer_transition: 0, documents_batch_transition: 0, identity_create_transition: 0, identity_credit_transfer_transition: 0, @@ -32,5 +35,10 @@ pub const DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1: DriveStateTransitionMethodV bump_identity_data_contract_nonce: 0, bump_identity_nonce: 0, partially_use_asset_lock: 0, + token_freeze_transition: 0, + token_unfreeze_transition: 0, + token_emergency_action_transition: 0, + token_destroy_frozen_funds_transition: 0, + token_config_update_transition: 0, }, }; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/mod.rs new file mode 100644 index 00000000000..79ae0f0348a --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/mod.rs @@ -0,0 +1,62 @@ +use versioned_feature_core::FeatureVersion; + +pub mod v1; + +#[derive(Clone, Debug, Default)] +pub struct DriveTokenMethodVersions { + pub fetch: DriveTokenFetchMethodVersions, + pub prove: DriveTokenProveMethodVersions, + pub update: DriveTokenUpdateMethodVersions, + pub calculate_total_tokens_balance: FeatureVersion, + pub distribution: DriveTokenDistributionMethodVersions, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveTokenDistributionMethodVersions { + pub add_perpetual_distribution: FeatureVersion, + pub add_pre_programmed_distributions: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveTokenFetchMethodVersions { + pub identity_token_balance: FeatureVersion, + pub identity_token_balances: FeatureVersion, + pub identities_token_balances: FeatureVersion, + pub identity_token_info: FeatureVersion, + pub identity_token_infos: FeatureVersion, + pub identities_token_infos: FeatureVersion, + pub token_statuses: FeatureVersion, + pub token_status: FeatureVersion, + pub token_total_supply: FeatureVersion, + pub token_total_aggregated_identity_balances: FeatureVersion, + pub pre_programmed_distributions: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveTokenProveMethodVersions { + pub identity_token_balance: FeatureVersion, + pub identity_token_balances: FeatureVersion, + pub identities_token_balances: FeatureVersion, + pub identity_token_info: FeatureVersion, + pub identity_token_infos: FeatureVersion, + pub identities_token_infos: FeatureVersion, + pub token_statuses: FeatureVersion, + pub total_supply_and_aggregated_identity_balances: FeatureVersion, + pub pre_programmed_distributions: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveTokenUpdateMethodVersions { + pub create_token_trees: FeatureVersion, + pub burn: FeatureVersion, + pub mint: FeatureVersion, + pub transfer: FeatureVersion, + pub add_to_token_total_supply: FeatureVersion, + pub remove_from_token_total_supply: FeatureVersion, + pub remove_from_identity_token_balance: FeatureVersion, + pub add_to_identity_token_balance: FeatureVersion, + pub add_transaction_history_operations: FeatureVersion, + pub freeze: FeatureVersion, + pub unfreeze: FeatureVersion, + pub apply_status: FeatureVersion, +} diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/v1.rs new file mode 100644 index 00000000000..d9c6f85d2f3 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/drive_token_method_versions/v1.rs @@ -0,0 +1,50 @@ +use crate::version::drive_versions::drive_token_method_versions::{ + DriveTokenDistributionMethodVersions, DriveTokenFetchMethodVersions, DriveTokenMethodVersions, + DriveTokenProveMethodVersions, DriveTokenUpdateMethodVersions, +}; + +pub const DRIVE_TOKEN_METHOD_VERSIONS_V1: DriveTokenMethodVersions = DriveTokenMethodVersions { + fetch: DriveTokenFetchMethodVersions { + identity_token_balance: 0, + identity_token_balances: 0, + identities_token_balances: 0, + identity_token_info: 0, + identity_token_infos: 0, + identities_token_infos: 0, + token_statuses: 0, + token_status: 0, + token_total_supply: 0, + token_total_aggregated_identity_balances: 0, + pre_programmed_distributions: 0, + }, + prove: DriveTokenProveMethodVersions { + identity_token_balance: 0, + identity_token_balances: 0, + identities_token_balances: 0, + identity_token_info: 0, + identity_token_infos: 0, + identities_token_infos: 0, + token_statuses: 0, + total_supply_and_aggregated_identity_balances: 0, + pre_programmed_distributions: 0, + }, + update: DriveTokenUpdateMethodVersions { + create_token_trees: 0, + burn: 0, + mint: 0, + transfer: 0, + add_to_token_total_supply: 0, + remove_from_token_total_supply: 0, + remove_from_identity_token_balance: 0, + add_to_identity_token_balance: 0, + add_transaction_history_operations: 0, + freeze: 0, + unfreeze: 0, + apply_status: 0, + }, + calculate_total_tokens_balance: 0, + distribution: DriveTokenDistributionMethodVersions { + add_perpetual_distribution: 0, + add_pre_programmed_distributions: 0, + }, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs index 39d42551360..f8082f48198 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rs @@ -7,6 +7,8 @@ pub struct DriveVerifyMethodVersions { pub contract: DriveVerifyContractMethodVersions, pub document: DriveVerifyDocumentMethodVersions, pub identity: DriveVerifyIdentityMethodVersions, + pub group: DriveVerifyGroupMethodVersions, + pub token: DriveVerifyTokenMethodVersions, pub single_document: DriveVerifySingleDocumentMethodVersions, pub system: DriveVerifySystemMethodVersions, pub voting: DriveVerifyVoteMethodVersions, @@ -42,6 +44,28 @@ pub struct DriveVerifyIdentityMethodVersions { pub verify_identity_revision_for_identity_id: FeatureVersion, } +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyGroupMethodVersions { + pub verify_group_info: FeatureVersion, + pub verify_group_infos_in_contract: FeatureVersion, + pub verify_action_infos: FeatureVersion, + pub verify_action_signers: FeatureVersion, +} + +#[derive(Clone, Debug, Default)] +pub struct DriveVerifyTokenMethodVersions { + pub verify_token_balances_for_identity_ids: FeatureVersion, + pub verify_token_balances_for_identity_id: FeatureVersion, + pub verify_token_infos_for_identity_ids: FeatureVersion, + pub verify_token_infos_for_identity_id: FeatureVersion, + pub verify_token_statuses: FeatureVersion, + pub verify_token_total_supply_and_aggregated_identity_balance: FeatureVersion, + pub verify_token_balance_for_identity_id: FeatureVersion, + pub verify_token_info_for_identity_id: FeatureVersion, + pub verify_token_status: FeatureVersion, + pub verify_token_pre_programmed_distributions: FeatureVersion, +} + #[derive(Clone, Debug, Default)] pub struct DriveVerifyVoteMethodVersions { pub verify_masternode_vote: FeatureVersion, diff --git a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs index 4c40371f83d..666ab416ca7 100644 --- a/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rs @@ -1,8 +1,8 @@ use crate::version::drive_versions::drive_verify_method_versions::{ DriveVerifyContractMethodVersions, DriveVerifyDocumentMethodVersions, - DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, + DriveVerifyGroupMethodVersions, DriveVerifyIdentityMethodVersions, DriveVerifyMethodVersions, DriveVerifySingleDocumentMethodVersions, DriveVerifyStateTransitionMethodVersions, - DriveVerifySystemMethodVersions, DriveVerifyVoteMethodVersions, + DriveVerifySystemMethodVersions, DriveVerifyTokenMethodVersions, DriveVerifyVoteMethodVersions, }; pub const DRIVE_VERIFY_METHOD_VERSIONS_V1: DriveVerifyMethodVersions = DriveVerifyMethodVersions { @@ -29,6 +29,24 @@ pub const DRIVE_VERIFY_METHOD_VERSIONS_V1: DriveVerifyMethodVersions = DriveVeri verify_identities_contract_keys: 0, verify_identity_revision_for_identity_id: 0, }, + group: DriveVerifyGroupMethodVersions { + verify_group_info: 0, + verify_group_infos_in_contract: 0, + verify_action_infos: 0, + verify_action_signers: 0, + }, + token: DriveVerifyTokenMethodVersions { + verify_token_balances_for_identity_ids: 0, + verify_token_balances_for_identity_id: 0, + verify_token_infos_for_identity_ids: 0, + verify_token_infos_for_identity_id: 0, + verify_token_statuses: 0, + verify_token_total_supply_and_aggregated_identity_balance: 0, + verify_token_balance_for_identity_id: 0, + verify_token_info_for_identity_id: 0, + verify_token_status: 0, + verify_token_pre_programmed_distributions: 0, + }, single_document: DriveVerifySingleDocumentMethodVersions { verify_proof: 0, verify_proof_keep_serialized: 0, diff --git a/packages/rs-platform-version/src/version/drive_versions/mod.rs b/packages/rs-platform-version/src/version/drive_versions/mod.rs index b8c3fae487d..dd5c1b1a155 100644 --- a/packages/rs-platform-version/src/version/drive_versions/mod.rs +++ b/packages/rs-platform-version/src/version/drive_versions/mod.rs @@ -2,10 +2,12 @@ use crate::version::FeatureVersion; use drive_contract_method_versions::DriveContractMethodVersions; use drive_credit_pool_method_versions::DriveCreditPoolMethodVersions; use drive_document_method_versions::DriveDocumentMethodVersions; +use drive_group_method_versions::DriveGroupMethodVersions; use drive_grove_method_versions::DriveGroveMethodVersions; use drive_identity_method_versions::DriveIdentityMethodVersions; use drive_state_transition_method_versions::DriveStateTransitionMethodVersions; use drive_structure_version::DriveStructureVersion; +use drive_token_method_versions::DriveTokenMethodVersions; use drive_verify_method_versions::DriveVerifyMethodVersions; use drive_vote_method_versions::DriveVoteMethodVersions; use grovedb_version::version::GroveVersion; @@ -13,14 +15,18 @@ use grovedb_version::version::GroveVersion; pub mod drive_contract_method_versions; pub mod drive_credit_pool_method_versions; pub mod drive_document_method_versions; +pub mod drive_group_method_versions; pub mod drive_grove_method_versions; pub mod drive_identity_method_versions; pub mod drive_state_transition_method_versions; pub mod drive_structure_version; +pub mod drive_token_method_versions; pub mod drive_verify_method_versions; pub mod drive_vote_method_versions; pub mod v1; pub mod v2; +pub mod v3; +pub mod v4; #[derive(Clone, Debug, Default)] pub struct DriveVersion { @@ -45,6 +51,7 @@ pub struct DriveMethodVersions { pub asset_lock: DriveAssetLockMethodVersions, pub verify: DriveVerifyMethodVersions, pub identity: DriveIdentityMethodVersions, + pub token: DriveTokenMethodVersions, pub platform_system: DrivePlatformSystemMethodVersions, pub operations: DriveOperationsMethodVersion, pub batch_operations: DriveBatchOperationsMethodVersion, @@ -52,6 +59,7 @@ pub struct DriveMethodVersions { pub prove: DriveProveMethodVersions, pub state_transitions: DriveStateTransitionMethodVersions, pub platform_state: DrivePlatformStateMethodVersions, + pub group: DriveGroupMethodVersions, } #[derive(Clone, Debug, Default)] @@ -85,6 +93,7 @@ pub struct DrivePrefundedSpecializedMethodVersions { pub deduct_from_prefunded_specialized_balance: FeatureVersion, pub deduct_from_prefunded_specialized_balance_operations: FeatureVersion, pub estimated_cost_for_prefunded_specialized_balance_update: FeatureVersion, + pub empty_prefunded_specialized_balance: FeatureVersion, } #[derive(Clone, Debug, Default)] diff --git a/packages/rs-platform-version/src/version/drive_versions/v1.rs b/packages/rs-platform-version/src/version/drive_versions/v1.rs index bbe1a12746f..1daae27b5b7 100644 --- a/packages/rs-platform-version/src/version/drive_versions/v1.rs +++ b/packages/rs-platform-version/src/version/drive_versions/v1.rs @@ -1,10 +1,12 @@ use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_group_method_versions::v1::DRIVE_GROUP_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_token_method_versions::v1::DRIVE_TOKEN_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_vote_method_versions::v1::DRIVE_VOTE_METHOD_VERSIONS_V1; use crate::version::drive_versions::{ @@ -61,6 +63,7 @@ pub const DRIVE_VERSION_V1: DriveVersion = DriveVersion { }, verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + token: DRIVE_TOKEN_METHOD_VERSIONS_V1, platform_system: DrivePlatformSystemMethodVersions { estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, @@ -93,7 +96,9 @@ pub const DRIVE_VERSION_V1: DriveVersion = DriveVersion { deduct_from_prefunded_specialized_balance: 0, deduct_from_prefunded_specialized_balance_operations: 0, estimated_cost_for_prefunded_specialized_balance_update: 0, + empty_prefunded_specialized_balance: 0, }, + group: DRIVE_GROUP_METHOD_VERSIONS_V1, }, grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, grove_version: GROVE_V1, diff --git a/packages/rs-platform-version/src/version/drive_versions/v2.rs b/packages/rs-platform-version/src/version/drive_versions/v2.rs index 5747bc732be..b76e79c7f97 100644 --- a/packages/rs-platform-version/src/version/drive_versions/v2.rs +++ b/packages/rs-platform-version/src/version/drive_versions/v2.rs @@ -1,10 +1,12 @@ use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_group_method_versions::v1::DRIVE_GROUP_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_token_method_versions::v1::DRIVE_TOKEN_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_vote_method_versions::v2::DRIVE_VOTE_METHOD_VERSIONS_V2; use crate::version::drive_versions::{ @@ -61,6 +63,7 @@ pub const DRIVE_VERSION_V2: DriveVersion = DriveVersion { }, verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + token: DRIVE_TOKEN_METHOD_VERSIONS_V1, platform_system: DrivePlatformSystemMethodVersions { estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, @@ -93,7 +96,9 @@ pub const DRIVE_VERSION_V2: DriveVersion = DriveVersion { deduct_from_prefunded_specialized_balance: 0, deduct_from_prefunded_specialized_balance_operations: 0, estimated_cost_for_prefunded_specialized_balance_update: 0, + empty_prefunded_specialized_balance: 0, }, + group: DRIVE_GROUP_METHOD_VERSIONS_V1, }, grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, grove_version: GROVE_V1, diff --git a/packages/rs-platform-version/src/version/drive_versions/v3.rs b/packages/rs-platform-version/src/version/drive_versions/v3.rs new file mode 100644 index 00000000000..4af61e282eb --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/v3.rs @@ -0,0 +1,105 @@ +use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_group_method_versions::v1::DRIVE_GROUP_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_token_method_versions::v1::DRIVE_TOKEN_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_vote_method_versions::v2::DRIVE_VOTE_METHOD_VERSIONS_V2; +use crate::version::drive_versions::{ + DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, + DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, + DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DrivePrefundedSpecializedMethodVersions, DriveProtocolUpgradeVersions, + DriveProveMethodVersions, DriveSystemEstimationCostsMethodVersions, DriveVersion, +}; +use grovedb_version::version::v1::GROVE_V1; + +pub const DRIVE_VERSION_V3: DriveVersion = DriveVersion { + structure: DRIVE_STRUCTURE_V1, + methods: DriveMethodVersions { + initialization: DriveInitializationMethodVersions { + create_initial_state_structure: 0, + }, + credit_pools: CREDIT_POOL_METHOD_VERSIONS_V1, + protocol_upgrade: DriveProtocolUpgradeVersions { + clear_version_information: 0, + fetch_versions_with_counter: 0, + fetch_proved_versions_with_counter: 0, + fetch_validator_version_votes: 0, + fetch_proved_validator_version_votes: 0, + remove_validators_proposed_app_versions: 0, + update_validator_proposed_app_version: 0, + }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, + balances: DriveBalancesMethodVersions { + add_to_system_credits: 0, + add_to_system_credits_operations: 0, + remove_from_system_credits: 0, + remove_from_system_credits_operations: 0, + calculate_total_credits_balance: 0, + }, + document: DRIVE_DOCUMENT_METHOD_VERSIONS_V1, + vote: DRIVE_VOTE_METHOD_VERSIONS_V2, + contract: DRIVE_CONTRACT_METHOD_VERSIONS_V1, + fees: DriveFeesMethodVersions { calculate_fee: 0 }, + estimated_costs: DriveEstimatedCostsMethodVersions { + add_estimation_costs_for_levels_up_to_contract: 0, + add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, + }, + asset_lock: DriveAssetLockMethodVersions { + add_asset_lock_outpoint: 0, + add_estimation_costs_for_adding_asset_lock: 0, + fetch_asset_lock_outpoint_info: 0, + }, + verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, + identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + token: DRIVE_TOKEN_METHOD_VERSIONS_V1, + platform_system: DrivePlatformSystemMethodVersions { + estimation_costs: DriveSystemEstimationCostsMethodVersions { + for_total_system_credits_update: 0, + }, + }, + operations: DriveOperationsMethodVersion { + rollback_transaction: 0, + drop_cache: 0, + commit_transaction: 0, + apply_partial_batch_low_level_drive_operations: 0, + apply_partial_batch_grovedb_operations: 0, + apply_batch_low_level_drive_operations: 0, + apply_batch_grovedb_operations: 0, + }, + state_transitions: DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1, + batch_operations: DriveBatchOperationsMethodVersion { + convert_drive_operations_to_grove_operations: 0, + apply_drive_operations: 0, + }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, + prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { + fetch_single: 0, + prove_single: 0, + add_prefunded_specialized_balance: 0, + add_prefunded_specialized_balance_operations: 1, //changed in v3 + deduct_from_prefunded_specialized_balance: 1, //changed in v3 + deduct_from_prefunded_specialized_balance_operations: 0, + estimated_cost_for_prefunded_specialized_balance_update: 0, + empty_prefunded_specialized_balance: 0, + }, + group: DRIVE_GROUP_METHOD_VERSIONS_V1, + }, + grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, + grove_version: GROVE_V1, +}; diff --git a/packages/rs-platform-version/src/version/drive_versions/v4.rs b/packages/rs-platform-version/src/version/drive_versions/v4.rs new file mode 100644 index 00000000000..34af21d7d20 --- /dev/null +++ b/packages/rs-platform-version/src/version/drive_versions/v4.rs @@ -0,0 +1,105 @@ +use crate::version::drive_versions::drive_contract_method_versions::v2::DRIVE_CONTRACT_METHOD_VERSIONS_V2; +use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_group_method_versions::v1::DRIVE_GROUP_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_token_method_versions::v1::DRIVE_TOKEN_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_vote_method_versions::v2::DRIVE_VOTE_METHOD_VERSIONS_V2; +use crate::version::drive_versions::{ + DriveAssetLockMethodVersions, DriveBalancesMethodVersions, DriveBatchOperationsMethodVersion, + DriveEstimatedCostsMethodVersions, DriveFeesMethodVersions, DriveFetchMethodVersions, + DriveInitializationMethodVersions, DriveMethodVersions, DriveOperationsMethodVersion, + DrivePlatformStateMethodVersions, DrivePlatformSystemMethodVersions, + DrivePrefundedSpecializedMethodVersions, DriveProtocolUpgradeVersions, + DriveProveMethodVersions, DriveSystemEstimationCostsMethodVersions, DriveVersion, +}; +use grovedb_version::version::v2::GROVE_V2; + +pub const DRIVE_VERSION_V4: DriveVersion = DriveVersion { + structure: DRIVE_STRUCTURE_V1, + methods: DriveMethodVersions { + initialization: DriveInitializationMethodVersions { + create_initial_state_structure: 1, // changed here to 1 to add token sum trees + }, + credit_pools: CREDIT_POOL_METHOD_VERSIONS_V1, + protocol_upgrade: DriveProtocolUpgradeVersions { + clear_version_information: 0, + fetch_versions_with_counter: 0, + fetch_proved_versions_with_counter: 0, + fetch_validator_version_votes: 0, + fetch_proved_validator_version_votes: 0, + remove_validators_proposed_app_versions: 0, + update_validator_proposed_app_version: 0, + }, + prove: DriveProveMethodVersions { + prove_elements: 0, + prove_multiple_state_transition_results: 0, + }, + balances: DriveBalancesMethodVersions { + add_to_system_credits: 0, + add_to_system_credits_operations: 0, + remove_from_system_credits: 0, + remove_from_system_credits_operations: 0, + calculate_total_credits_balance: 0, + }, + document: DRIVE_DOCUMENT_METHOD_VERSIONS_V1, + vote: DRIVE_VOTE_METHOD_VERSIONS_V2, + contract: DRIVE_CONTRACT_METHOD_VERSIONS_V2, // changed in v4 + fees: DriveFeesMethodVersions { calculate_fee: 0 }, + estimated_costs: DriveEstimatedCostsMethodVersions { + add_estimation_costs_for_levels_up_to_contract: 0, + add_estimation_costs_for_levels_up_to_contract_document_type_excluded: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract: 0, + add_estimation_costs_for_contested_document_tree_levels_up_to_contract_document_type_excluded: 0, + }, + asset_lock: DriveAssetLockMethodVersions { + add_asset_lock_outpoint: 0, + add_estimation_costs_for_adding_asset_lock: 0, + fetch_asset_lock_outpoint_info: 0, + }, + verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, + identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + token: DRIVE_TOKEN_METHOD_VERSIONS_V1, + platform_system: DrivePlatformSystemMethodVersions { + estimation_costs: DriveSystemEstimationCostsMethodVersions { + for_total_system_credits_update: 0, + }, + }, + operations: DriveOperationsMethodVersion { + rollback_transaction: 0, + drop_cache: 0, + commit_transaction: 0, + apply_partial_batch_low_level_drive_operations: 0, + apply_partial_batch_grovedb_operations: 0, + apply_batch_low_level_drive_operations: 0, + apply_batch_grovedb_operations: 0, + }, + state_transitions: DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1, + batch_operations: DriveBatchOperationsMethodVersion { + convert_drive_operations_to_grove_operations: 0, + apply_drive_operations: 0, + }, + platform_state: DrivePlatformStateMethodVersions { + fetch_platform_state_bytes: 0, + store_platform_state_bytes: 0, + }, + fetch: DriveFetchMethodVersions { fetch_elements: 0 }, + prefunded_specialized_balances: DrivePrefundedSpecializedMethodVersions { + fetch_single: 0, + prove_single: 0, + add_prefunded_specialized_balance: 0, + add_prefunded_specialized_balance_operations: 1, + deduct_from_prefunded_specialized_balance: 1, + deduct_from_prefunded_specialized_balance_operations: 0, + estimated_cost_for_prefunded_specialized_balance_update: 0, + empty_prefunded_specialized_balance: 0, + }, + group: DRIVE_GROUP_METHOD_VERSIONS_V1, + }, + grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, + grove_version: GROVE_V2, //changed in V4 +}; diff --git a/packages/rs-platform-version/src/version/fee/processing/mod.rs b/packages/rs-platform-version/src/version/fee/processing/mod.rs index a4f33696c06..715e060c4a5 100644 --- a/packages/rs-platform-version/src/version/fee/processing/mod.rs +++ b/packages/rs-platform-version/src/version/fee/processing/mod.rs @@ -9,6 +9,7 @@ pub struct FeeProcessingVersion { 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, @@ -39,6 +40,9 @@ impl From<FeeProcessingVersionFieldsBeforeVersion1Point4> for FeeProcessingVersi .fetch_identity_balance_and_revision_processing_cost, fetch_identity_cost_per_look_up_key_by_id: old .fetch_identity_cost_per_look_up_key_by_id, + fetch_identity_token_balance_processing_cost: FEE_VERSION1 + .processing + .fetch_identity_token_balance_processing_cost, fetch_prefunded_specialized_balance_processing_cost: old .fetch_prefunded_specialized_balance_processing_cost, fetch_single_identity_key_processing_cost: old diff --git a/packages/rs-platform-version/src/version/fee/processing/v1.rs b/packages/rs-platform-version/src/version/fee/processing/v1.rs index b6ba5ca9986..fae3ec4939b 100644 --- a/packages/rs-platform-version/src/version/fee/processing/v1.rs +++ b/packages/rs-platform-version/src/version/fee/processing/v1.rs @@ -5,6 +5,7 @@ pub const FEE_PROCESSING_VERSION1: FeeProcessingVersion = FeeProcessingVersion { fetch_identity_revision_processing_cost: 9000, fetch_identity_balance_and_revision_processing_cost: 15000, fetch_identity_cost_per_look_up_key_by_id: 9000, + fetch_identity_token_balance_processing_cost: 10000, fetch_prefunded_specialized_balance_processing_cost: 10000, fetch_single_identity_key_processing_cost: 10000, perform_network_threshold_signing: 100000000, // 1mDash (2.5 cents at 25$/Dash) diff --git a/packages/rs-platform-version/src/version/mocks/v2_test.rs b/packages/rs-platform-version/src/version/mocks/v2_test.rs index 931ef19b974..9a11e69178a 100644 --- a/packages/rs-platform-version/src/version/mocks/v2_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v2_test.rs @@ -10,14 +10,16 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::drive_abci_method_versions::v1::DRIVE_ABCI_METHOD_VERSIONS_V1; use crate::version::drive_abci_versions::drive_abci_query_versions::{ - DriveAbciQueryDataContractVersions, DriveAbciQueryIdentityVersions, - DriveAbciQueryPrefundedSpecializedBalancesVersions, DriveAbciQuerySystemVersions, - DriveAbciQueryValidatorVersions, DriveAbciQueryVersions, DriveAbciQueryVotingVersions, + DriveAbciQueryDataContractVersions, DriveAbciQueryGroupVersions, + DriveAbciQueryIdentityVersions, DriveAbciQueryPrefundedSpecializedBalancesVersions, + DriveAbciQuerySystemVersions, DriveAbciQueryTokenVersions, DriveAbciQueryValidatorVersions, + DriveAbciQueryVersions, DriveAbciQueryVotingVersions, }; use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; use crate::version::drive_abci_versions::drive_abci_validation_versions::v1::DRIVE_ABCI_VALIDATION_VERSIONS_V1; @@ -26,10 +28,12 @@ use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::drive_contract_method_versions::v1::DRIVE_CONTRACT_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_credit_pool_method_versions::v1::CREDIT_POOL_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_document_method_versions::v1::DRIVE_DOCUMENT_METHOD_VERSIONS_V1; +use crate::version::drive_versions::drive_group_method_versions::v1::DRIVE_GROUP_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_grove_method_versions::v1::DRIVE_GROVE_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_identity_method_versions::v1::DRIVE_IDENTITY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_state_transition_method_versions::v1::DRIVE_STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_structure_version::v1::DRIVE_STRUCTURE_V1; +use crate::version::drive_versions::drive_token_method_versions::v1::DRIVE_TOKEN_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_verify_method_versions::v1::DRIVE_VERIFY_METHOD_VERSIONS_V1; use crate::version::drive_versions::drive_vote_method_versions::v1::DRIVE_VOTE_METHOD_VERSIONS_V1; use crate::version::drive_versions::{ @@ -95,6 +99,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { }, verify: DRIVE_VERIFY_METHOD_VERSIONS_V1, identity: DRIVE_IDENTITY_METHOD_VERSIONS_V1, + token: DRIVE_TOKEN_METHOD_VERSIONS_V1, platform_system: DrivePlatformSystemMethodVersions { estimation_costs: DriveSystemEstimationCostsMethodVersions { for_total_system_credits_update: 0, @@ -127,7 +132,9 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { deduct_from_prefunded_specialized_balance: 0, deduct_from_prefunded_specialized_balance_operations: 0, estimated_cost_for_prefunded_specialized_balance_update: 0, + empty_prefunded_specialized_balance: 0, }, + group: DRIVE_GROUP_METHOD_VERSIONS_V1, }, grove_methods: DRIVE_GROVE_METHOD_VERSIONS_V1, grove_version: GROVE_V1, @@ -204,6 +211,43 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + token_queries: DriveAbciQueryTokenVersions { + identity_token_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_token_balances: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identities_token_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + identity_token_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_statuses: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_total_supply: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + token_pre_programmed_distributions: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, validator_queries: DriveAbciQueryValidatorVersions { proposed_block_counts_by_evonode_ids: FeatureVersionBounds { min_version: 0, @@ -297,6 +341,28 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { default_current_version: 0, }, }, + group_queries: DriveAbciQueryGroupVersions { + group_info: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_infos: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_actions: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + group_action_signers: FeatureVersionBounds { + min_version: 0, + max_version: 0, + default_current_version: 0, + }, + }, }, }, dpp: DPPVersion { @@ -310,6 +376,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, @@ -324,6 +391,7 @@ pub const TEST_PLATFORM_V2: PlatformVersion = PlatformVersion { withdrawal_transactions_per_block_limit: 4, retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, + max_contract_group_size: 256, }, consensus: ConsensusVersions { tenderdash_consensus_version: 0, diff --git a/packages/rs-platform-version/src/version/mocks/v3_test.rs b/packages/rs-platform-version/src/version/mocks/v3_test.rs index 4c54dfbfef0..3a8964266da 100644 --- a/packages/rs-platform-version/src/version/mocks/v3_test.rs +++ b/packages/rs-platform-version/src/version/mocks/v3_test.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; @@ -23,7 +24,8 @@ use crate::version::drive_abci_versions::drive_abci_method_versions::{ DriveAbciIdentityCreditWithdrawalMethodVersions, DriveAbciInitializationMethodVersions, DriveAbciMasternodeIdentitiesUpdatesMethodVersions, DriveAbciMethodVersions, DriveAbciPlatformStateStorageMethodVersions, DriveAbciProtocolUpgradeMethodVersions, - DriveAbciStateTransitionProcessingMethodVersions, DriveAbciVotingMethodVersions, + DriveAbciStateTransitionProcessingMethodVersions, DriveAbciTokensProcessingMethodVersions, + DriveAbciVotingMethodVersions, }; use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; @@ -85,7 +87,10 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { }, block_fee_processing: DriveAbciBlockFeeProcessingMethodVersions { add_process_epoch_change_operations: 0, - process_block_fees: 0, + process_block_fees_and_validate_sum_trees: 0, + }, + tokens_processing: DriveAbciTokensProcessingMethodVersions { + validate_token_aggregated_balance: 0, }, core_chain_lock: DriveAbciCoreChainLockMethodVersionsAndConstants { choose_quorum: 0, @@ -167,6 +172,7 @@ pub const TEST_PLATFORM_V3: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/mod.rs b/packages/rs-platform-version/src/version/mod.rs index b143a1daf15..5718d916d07 100644 --- a/packages/rs-platform-version/src/version/mod.rs +++ b/packages/rs-platform-version/src/version/mod.rs @@ -1,5 +1,5 @@ mod protocol_version; -use crate::version::v7::PROTOCOL_VERSION_7; +use crate::version::v9::PROTOCOL_VERSION_9; pub use protocol_version::*; mod consensus_versions; @@ -19,8 +19,10 @@ pub mod v4; pub mod v5; pub mod v6; pub mod v7; +pub mod v8; +pub mod v9; pub type ProtocolVersion = u32; -pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_7; +pub const LATEST_VERSION: ProtocolVersion = PROTOCOL_VERSION_9; pub const INITIAL_PROTOCOL_VERSION: ProtocolVersion = 1; diff --git a/packages/rs-platform-version/src/version/protocol_version.rs b/packages/rs-platform-version/src/version/protocol_version.rs index d793384c729..d25532718f2 100644 --- a/packages/rs-platform-version/src/version/protocol_version.rs +++ b/packages/rs-platform-version/src/version/protocol_version.rs @@ -22,6 +22,9 @@ use crate::version::v4::PLATFORM_V4; use crate::version::v5::PLATFORM_V5; use crate::version::v6::PLATFORM_V6; use crate::version::v7::PLATFORM_V7; +use crate::version::v8::PLATFORM_V8; +use crate::version::v9::PLATFORM_V9; + use crate::version::ProtocolVersion; pub use versioned_feature_core::*; @@ -45,6 +48,8 @@ pub const PLATFORM_VERSIONS: &[PlatformVersion] = &[ PLATFORM_V5, PLATFORM_V6, PLATFORM_V7, + PLATFORM_V8, + PLATFORM_V9, ]; #[cfg(feature = "mock-versions")] @@ -53,7 +58,7 @@ pub static PLATFORM_TEST_VERSIONS: OnceLock<Vec<PlatformVersion>> = OnceLock::ne #[cfg(feature = "mock-versions")] const DEFAULT_PLATFORM_TEST_VERSIONS: &[PlatformVersion] = &[TEST_PLATFORM_V2, TEST_PLATFORM_V3]; -pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V7; +pub const LATEST_PLATFORM_VERSION: &PlatformVersion = &PLATFORM_V9; pub const DESIRED_PLATFORM_VERSION: &PlatformVersion = LATEST_PLATFORM_VERSION; diff --git a/packages/rs-platform-version/src/version/system_limits/mod.rs b/packages/rs-platform-version/src/version/system_limits/mod.rs index 0dd2c5b9227..4460d29d13a 100644 --- a/packages/rs-platform-version/src/version/system_limits/mod.rs +++ b/packages/rs-platform-version/src/version/system_limits/mod.rs @@ -9,4 +9,5 @@ pub struct SystemLimits { 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, } diff --git a/packages/rs-platform-version/src/version/system_limits/v1.rs b/packages/rs-platform-version/src/version/system_limits/v1.rs index 6dacce0b353..b62f7bfcd0c 100644 --- a/packages/rs-platform-version/src/version/system_limits/v1.rs +++ b/packages/rs-platform-version/src/version/system_limits/v1.rs @@ -8,4 +8,5 @@ pub const SYSTEM_LIMITS_V1: SystemLimits = SystemLimits { withdrawal_transactions_per_block_limit: 4, retry_signing_expired_withdrawal_documents_per_block_limit: 1, max_withdrawal_amount: 50_000_000_000_000, //500 Dash + max_contract_group_size: 256, }; diff --git a/packages/rs-platform-version/src/version/v1.rs b/packages/rs-platform-version/src/version/v1.rs index f7803b32c58..5f32d406fae 100644 --- a/packages/rs-platform-version/src/version/v1.rs +++ b/packages/rs-platform-version/src/version/v1.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v1::DPP_VALIDATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_voting_versions::v1::VOTING_VERSION_V1; use crate::version::dpp_versions::DPPVersion; @@ -49,6 +50,7 @@ pub const PLATFORM_V1: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V1, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v2.rs b/packages/rs-platform-version/src/version/v2.rs index 6e1ed400947..f97bee41394 100644 --- a/packages/rs-platform-version/src/version/v2.rs +++ b/packages/rs-platform-version/src/version/v2.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v1:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v1::STATE_TRANSITION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v1::VOTING_VERSION_V1; use crate::version::dpp_versions::DPPVersion; @@ -49,6 +50,7 @@ pub const PLATFORM_V2: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V1, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v3.rs b/packages/rs-platform-version/src/version/v3.rs index f3856bc1e6c..c92b8ab225c 100644 --- a/packages/rs-platform-version/src/version/v3.rs +++ b/packages/rs-platform-version/src/version/v3.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; @@ -56,6 +57,7 @@ pub const PLATFORM_V3: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v4.rs b/packages/rs-platform-version/src/version/v4.rs index d0b58943744..a6086b01ef7 100644 --- a/packages/rs-platform-version/src/version/v4.rs +++ b/packages/rs-platform-version/src/version/v4.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; @@ -51,6 +52,7 @@ pub const PLATFORM_V4: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v5.rs b/packages/rs-platform-version/src/version/v5.rs index 988531b3d09..1679fff28a5 100644 --- a/packages/rs-platform-version/src/version/v5.rs +++ b/packages/rs-platform-version/src/version/v5.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; @@ -51,6 +52,7 @@ pub const PLATFORM_V5: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v6.rs b/packages/rs-platform-version/src/version/v6.rs index b282d1b7520..3ae597d99f7 100644 --- a/packages/rs-platform-version/src/version/v6.rs +++ b/packages/rs-platform-version/src/version/v6.rs @@ -10,6 +10,7 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; @@ -50,6 +51,7 @@ pub const PLATFORM_V6: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v7.rs b/packages/rs-platform-version/src/version/v7.rs index ee532689970..1c1824b3203 100644 --- a/packages/rs-platform-version/src/version/v7.rs +++ b/packages/rs-platform-version/src/version/v7.rs @@ -10,13 +10,14 @@ use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2:: use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; use crate::version::dpp_versions::DPPVersion; use crate::version::drive_abci_versions::drive_abci_method_versions::v4::DRIVE_ABCI_METHOD_VERSIONS_V4; use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; -use crate::version::drive_abci_versions::drive_abci_validation_versions::v4::DRIVE_ABCI_VALIDATION_VERSIONS_V4; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v5::DRIVE_ABCI_VALIDATION_VERSIONS_V5; use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; use crate::version::drive_abci_versions::DriveAbciVersion; use crate::version::drive_versions::v2::DRIVE_VERSION_V2; @@ -28,15 +29,14 @@ use crate::version::ProtocolVersion; pub const PROTOCOL_VERSION_7: ProtocolVersion = 7; -/// This version adds token support. -//todo: make changes +/// This version fixes masternode voting nonce issue. pub const PLATFORM_V7: PlatformVersion = PlatformVersion { protocol_version: PROTOCOL_VERSION_7, drive: DRIVE_VERSION_V2, drive_abci: DriveAbciVersion { structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, methods: DRIVE_ABCI_METHOD_VERSIONS_V4, - validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V4, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V5, // <--- changed to V5 withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, query: DRIVE_ABCI_QUERY_VERSIONS_V1, }, @@ -51,6 +51,7 @@ pub const PLATFORM_V7: PlatformVersion = PlatformVersion { document_versions: DOCUMENT_VERSIONS_V1, identity_versions: IDENTITY_VERSIONS_V1, voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, methods: DPP_METHOD_VERSIONS_V1, factory_versions: DPP_FACTORY_VERSIONS_V1, diff --git a/packages/rs-platform-version/src/version/v8.rs b/packages/rs-platform-version/src/version/v8.rs new file mode 100644 index 00000000000..9b6e7eff5ac --- /dev/null +++ b/packages/rs-platform-version/src/version/v8.rs @@ -0,0 +1,71 @@ +use crate::version::consensus_versions::ConsensusVersions; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v1::CONTRACT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v2::DPP_METHOD_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v1::STATE_TRANSITION_SERIALIZATION_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v5::DRIVE_ABCI_METHOD_VERSIONS_V5; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v5::DRIVE_ABCI_VALIDATION_VERSIONS_V5; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v3::DRIVE_VERSION_V3; +use crate::version::fee::v1::FEE_VERSION1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; + +pub const PROTOCOL_VERSION_8: ProtocolVersion = 8; + +/// This version contains some fixes for withdrawals and nfts. +pub const PLATFORM_V8: PlatformVersion = PlatformVersion { + protocol_version: PROTOCOL_VERSION_8, + //changed to V3 because of an error in add_prefunded_specialized_balance_operations + drive: DRIVE_VERSION_V3, + drive_abci: DriveAbciVersion { + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + // We changed `pool_withdrawals_into_transactions_queue` to v1 in order to add pool + // withdrawals on any validator quorums. v0 allowed us to pool only on the first two + // quorums as workaround for Core v21 bug. + methods: DRIVE_ABCI_METHOD_VERSIONS_V5, + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V5, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, + }, + dpp: DPPVersion { + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V1, + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V2, + contract_versions: CONTRACT_VERSIONS_V1, + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + // We changed `daily_withdrawal_limit` to v1 to increase daily withdrawal limit + // to 2000 Dash. + methods: DPP_METHOD_VERSIONS_V2, + factory_versions: DPP_FACTORY_VERSIONS_V1, + }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, + fee_version: FEE_VERSION1, + system_limits: SYSTEM_LIMITS_V1, + consensus: ConsensusVersions { + tenderdash_consensus_version: 1, + }, +}; diff --git a/packages/rs-platform-version/src/version/v9.rs b/packages/rs-platform-version/src/version/v9.rs new file mode 100644 index 00000000000..e8713306d2f --- /dev/null +++ b/packages/rs-platform-version/src/version/v9.rs @@ -0,0 +1,66 @@ +use crate::version::consensus_versions::ConsensusVersions; +use crate::version::dpp_versions::dpp_asset_lock_versions::v1::DPP_ASSET_LOCK_VERSIONS_V1; +use crate::version::dpp_versions::dpp_contract_versions::v2::CONTRACT_VERSIONS_V2; +use crate::version::dpp_versions::dpp_costs_versions::v1::DPP_COSTS_VERSIONS_V1; +use crate::version::dpp_versions::dpp_document_versions::v1::DOCUMENT_VERSIONS_V1; +use crate::version::dpp_versions::dpp_factory_versions::v1::DPP_FACTORY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_identity_versions::v1::IDENTITY_VERSIONS_V1; +use crate::version::dpp_versions::dpp_method_versions::v1::DPP_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_conversion_versions::v2::STATE_TRANSITION_CONVERSION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_method_versions::v1::STATE_TRANSITION_METHOD_VERSIONS_V1; +use crate::version::dpp_versions::dpp_state_transition_serialization_versions::v2::STATE_TRANSITION_SERIALIZATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_state_transition_versions::v2::STATE_TRANSITION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_token_versions::v1::TOKEN_VERSIONS_V1; +use crate::version::dpp_versions::dpp_validation_versions::v2::DPP_VALIDATION_VERSIONS_V2; +use crate::version::dpp_versions::dpp_voting_versions::v2::VOTING_VERSION_V2; +use crate::version::dpp_versions::DPPVersion; +use crate::version::drive_abci_versions::drive_abci_method_versions::v6::DRIVE_ABCI_METHOD_VERSIONS_V6; +use crate::version::drive_abci_versions::drive_abci_query_versions::v1::DRIVE_ABCI_QUERY_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_structure_versions::v1::DRIVE_ABCI_STRUCTURE_VERSIONS_V1; +use crate::version::drive_abci_versions::drive_abci_validation_versions::v4::DRIVE_ABCI_VALIDATION_VERSIONS_V4; +use crate::version::drive_abci_versions::drive_abci_withdrawal_constants::v2::DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2; +use crate::version::drive_abci_versions::DriveAbciVersion; +use crate::version::drive_versions::v4::DRIVE_VERSION_V4; +use crate::version::fee::v1::FEE_VERSION1; +use crate::version::protocol_version::PlatformVersion; +use crate::version::system_data_contract_versions::v1::SYSTEM_DATA_CONTRACT_VERSIONS_V1; +use crate::version::system_limits::v1::SYSTEM_LIMITS_V1; +use crate::version::ProtocolVersion; + +pub const PROTOCOL_VERSION_9: ProtocolVersion = 9; + +/// This version adds token support. +//todo: make changes +pub const PLATFORM_V9: PlatformVersion = PlatformVersion { + protocol_version: PROTOCOL_VERSION_9, + drive: DRIVE_VERSION_V4, // changed (for data contract insert) + drive_abci: DriveAbciVersion { + structs: DRIVE_ABCI_STRUCTURE_VERSIONS_V1, + methods: DRIVE_ABCI_METHOD_VERSIONS_V6, // changed because of the genesis state + validation_and_processing: DRIVE_ABCI_VALIDATION_VERSIONS_V4, + withdrawal_constants: DRIVE_ABCI_WITHDRAWAL_CONSTANTS_V2, + query: DRIVE_ABCI_QUERY_VERSIONS_V1, + }, + dpp: DPPVersion { + costs: DPP_COSTS_VERSIONS_V1, + validation: DPP_VALIDATION_VERSIONS_V2, + state_transition_serialization_versions: STATE_TRANSITION_SERIALIZATION_VERSIONS_V2, // changed + state_transition_conversion_versions: STATE_TRANSITION_CONVERSION_VERSIONS_V2, + state_transition_method_versions: STATE_TRANSITION_METHOD_VERSIONS_V1, + state_transitions: STATE_TRANSITION_VERSIONS_V2, + contract_versions: CONTRACT_VERSIONS_V2, // changed + document_versions: DOCUMENT_VERSIONS_V1, + identity_versions: IDENTITY_VERSIONS_V1, + voting_versions: VOTING_VERSION_V2, + token_versions: TOKEN_VERSIONS_V1, + asset_lock_versions: DPP_ASSET_LOCK_VERSIONS_V1, + methods: DPP_METHOD_VERSIONS_V1, + factory_versions: DPP_FACTORY_VERSIONS_V1, + }, + system_data_contracts: SYSTEM_DATA_CONTRACT_VERSIONS_V1, + fee_version: FEE_VERSION1, + system_limits: SYSTEM_LIMITS_V1, + consensus: ConsensusVersions { + tenderdash_consensus_version: 1, + }, +}; diff --git a/packages/rs-platform-versioning/Cargo.toml b/packages/rs-platform-versioning/Cargo.toml index 31a5c62aafe..e2c02f7e96d 100644 --- a/packages/rs-platform-versioning/Cargo.toml +++ b/packages/rs-platform-versioning/Cargo.toml @@ -2,7 +2,7 @@ name = "platform-versioning" authors = ["Samuel Westrich <sam@dash.org>"] description = "Version derivation" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/rs-sdk/Cargo.toml b/packages/rs-sdk/Cargo.toml index 61054444aa2..1008a9b35ca 100644 --- a/packages/rs-sdk/Cargo.toml +++ b/packages/rs-sdk/Cargo.toml @@ -1,29 +1,32 @@ [package] name = "dash-sdk" -version = "1.6.2" +version = "1.8.0" edition = "2021" [dependencies] arc-swap = { version = "1.7.1" } -backon = { version = "1.2", features = ["tokio-sleep"] } +backon = { version = "1.2", default-features = false } chrono = { version = "0.4.38" } dpp = { path = "../rs-dpp", default-features = false, features = [ "dash-sdk-features", ] } -dapi-grpc = { path = "../dapi-grpc" } + +dapi-grpc = { path = "../dapi-grpc", default-features = false } rs-dapi-client = { path = "../rs-dapi-client", default-features = false } drive = { path = "../rs-drive", default-features = false, features = [ "verify", ] } -drive-proof-verifier = { path = "../rs-drive-proof-verifier" } + +drive-proof-verifier = { path = "../rs-drive-proof-verifier", default-features = false } dapi-grpc-macros = { path = "../rs-dapi-grpc-macros" } http = { version = "1.1" } +rustls-pemfile = { version = "2.0.0" } thiserror = "1.0.64" -tokio = { version = "1.40", features = ["macros", "rt-multi-thread"] } +tokio = { version = "1.40", features = ["macros", "time"] } tokio-util = { version = "0.7.12" } async-trait = { version = "0.1.83" } -ciborium = { git = "https://github.com/qrayven/ciborium", branch = "feat-ser-null-as-undefined" } +ciborium = { version = "0.2.2" } serde = { version = "1.0.197", default-features = false, features = [ "rc", ], optional = true } @@ -35,14 +38,18 @@ envy = { version = "0.4.2", optional = true } futures = { version = "0.3.30" } derive_more = { version = "1.0", features = ["from"] } # dashcore-rpc is only needed for core rpc; TODO remove once we have correct core rpc impl -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", tag = "v0.37.0" } lru = { version = "0.12.5", optional = true } bip37-bloom-filter = { git = "https://github.com/dashpay/rs-bip37-bloom-filter", branch = "develop" } zeroize = { version = "1.8", features = ["derive"] } +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +tokio = { version = "1.40", features = ["macros", "time", "rt-multi-thread"] } + [dev-dependencies] +rs-dapi-client = { path = "../rs-dapi-client" } +drive-proof-verifier = { path = "../rs-drive-proof-verifier" } tokio = { version = "1.40", features = ["macros", "rt-multi-thread"] } -rs-dapi-client = { path = "../rs-dapi-client", features = ["mocks"] } base64 = { version = "0.22.1" } tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } dpp = { path = "../rs-dpp", features = [ @@ -53,11 +60,12 @@ dpp = { path = "../rs-dpp", features = [ data-contracts = { path = "../data-contracts" } tokio-test = { version = "0.4.4" } clap = { version = "4.5.4", features = ["derive"] } -sanitize-filename = { version = "0.5.0" } +sanitize-filename = { version = "0.6.0" } test-case = { version = "3.3.1" } +assert_matches = "1.5.0" [features] -default = ["mocks", "offline-testing"] +default = ["mocks", "offline-testing", "dapi-grpc/client"] mocks = [ "dep:serde", @@ -87,6 +95,9 @@ offline-testing = ["mocks"] # Requires configuration of Dash Platform connectivity. # See [README.md] for more details. # +# Without this feature enabled, tests will use test vectors from `tests/vectors/` instead of connecting to live +# Dash Platform. +# # If both `offline-testing` and `network-testing` are enabled, "offline-testing" will take precedence. network-testing = ["mocks"] @@ -105,3 +116,6 @@ system-data-contracts = ["dpp/data-contracts"] name = "read_contract" required-features = ["mocks"] + +[lib] +crate-type = ["cdylib", "rlib"] diff --git a/packages/rs-sdk/README.md b/packages/rs-sdk/README.md index c14b9bbd592..4c993d9e18a 100644 --- a/packages/rs-sdk/README.md +++ b/packages/rs-sdk/README.md @@ -74,7 +74,14 @@ cargo test -p dash-sdk --no-default-features --features network-testing ## Offline Testing Offline testing uses the vectors generated using `packages/rs-sdk/scripts/generate_test_vectors.sh` script. -These vectors must be saved in `packages/rs-sdk/tests/vectors`. +This script will connect to node defined in `packages/rs-sdk/tests/.env`, execute all tests against it and +update test vectors in `packages/rs-sdk/tests/vectors`. + +To generate test vectors against a testnet node (or other remote node), you can use helper script +`packages/rs-sdk/scripts/connect_to_remote.sh` which will generate `.env` file for you and tunnel connection to Dash +Core RPC on the remote host. + +Refer to rich comments / help in the forementioned scripts for more details. ### Generating test vectors diff --git a/packages/rs-sdk/scripts/connect_to_remote.sh b/packages/rs-sdk/scripts/connect_to_remote.sh new file mode 100755 index 00000000000..87455b6f0b4 --- /dev/null +++ b/packages/rs-sdk/scripts/connect_to_remote.sh @@ -0,0 +1,91 @@ +#! /bin/bash + +set -e -o pipefail + +CORE_USER=dashmate + +function usage() { + + echo This script connects to a remote node and runs the SDK tests on it. + echo It establishes SSH tunnel to the remote node and uses DAPI and Core RPC + echo services running on the remote node to run the tests. + echo + echo Note: you can use + echo + echo "Usage: $0 <remote-user@remote-node> [ssh arguments]" + echo " remote-user: The username to use for SSH connection." + echo " remote-node: The IP address or hostname of the remote node." + echo " ssh arguments: Additional arguments to pass to the SSH command." + echo + echo "Example: $0 ubuntu@1.2.3.4 sudo -u dashmate" + exit 1 +} + +if [ "$#" -lt 1 ]; then + usage +fi + +REMOTE="$1" + +# Validate remote format +if ! echo "$REMOTE" | grep -q "@"; then + echo "Error: Remote must be in format user@host" + usage +fi + +# REMOTE_USER=$(echo "$1" | cut -d@ -f1) +REMOTE_NODE=$(echo "$1" | cut -d@ -f2) + +SSH_ARGS=${*:2} + +echo -n Reading configuration from remote "$REMOTE" using \`dashmate config get\` command... +# read core username and password from the remote node +CORE_PORT=$(ssh "$REMOTE" ${SSH_ARGS} dashmate config get core.rpc.port) +CORE_PASSWORD=$(ssh "$REMOTE" ${SSH_ARGS} dashmate config get "core.rpc.users.${CORE_USER}.password") + +DAPI_PORT=$(ssh "$REMOTE" ${SSH_ARGS} dashmate config get platform.gateway.listeners.dapiAndDrive.port) +DAPI_SSL_ENABLED=$(ssh "$REMOTE" ${SSH_ARGS} dashmate config get platform.gateway.ssl.enabled) + +echo " done." + +# Double check that the variables are set +if [ -z "$CORE_PORT" ] || [ -z "$CORE_PASSWORD" ] || [ -z "$DAPI_PORT" ] || [ -z "$DAPI_SSL_ENABLED" ]; then + echo "Failed to read configuration from the remote node." + exit 1 +fi + +ENV_FILE="$(realpath "$0" | xargs dirname)/../tests/.env" +echo -n Generating "${ENV_FILE}" file for the SDK tests... + +cat >"${ENV_FILE}" <<EOF +# Configuration of tests and examples, generated by $(realpath "$0") + +DASH_SDK_PLATFORM_HOST="${REMOTE_NODE}" +DASH_SDK_PLATFORM_PORT=${DAPI_PORT} +DASH_SDK_PLATFORM_SSL=${DAPI_SSL_ENABLED} + + +DASH_SDK_CORE_HOST=127.0.0.1 +DASH_SDK_CORE_PORT=12367 +DASH_SDK_CORE_USER="${CORE_USER}" +DASH_SDK_CORE_PASSWORD="${CORE_PASSWORD}" +EOF + +trap 'rm -f "${ENV_FILE}"' INT TERM EXIT # cleanup + +chmod 600 "${ENV_FILE}" + +echo " done." +echo +echo "Configured DAPI endpoint: ${REMOTE_NODE}:${DAPI_PORT}, SSL: ${DAPI_SSL_ENABLED}" +echo +echo "Establishing SSH tunnel to the remote node ${REMOTE_NODE} to forward Dash Core RPC:" +echo " 127.0.0.1:12367-> ${REMOTE_NODE}:${CORE_PORT}" +echo +echo "To stop the tunnel, press Ctrl+C." + +ssh -L "12367:127.0.0.1:${CORE_PORT}" "$REMOTE" \ + -o ServerAliveInterval=60 \ + -o ServerAliveCountMax=3 \ + -o ExitOnForwardFailure=yes \ + -N ${SSH_ARGS} diff --git a/packages/rs-sdk/scripts/generate_test_vectors.sh b/packages/rs-sdk/scripts/generate_test_vectors.sh index a5530e7d93e..aad6afdb183 100755 --- a/packages/rs-sdk/scripts/generate_test_vectors.sh +++ b/packages/rs-sdk/scripts/generate_test_vectors.sh @@ -15,7 +15,8 @@ # its test vector is generated. # # Otherwise, all existing test vectors are removed and regenerated. - +# +# HINT: You can use `connect_to_remote.sh` script to use some remote node (like testnet) to generate test vectors. CARGO_DIR="$(realpath "$(dirname "$0")/..")" pushd "$CARGO_DIR" diff --git a/packages/rs-sdk/src/error.rs b/packages/rs-sdk/src/error.rs index 75e114a8008..26dd8db9dd3 100644 --- a/packages/rs-sdk/src/error.rs +++ b/packages/rs-sdk/src/error.rs @@ -1,4 +1,5 @@ //! Definitions of errors +use dapi_grpc::platform::v0::StateTransitionBroadcastError as StateTransitionBroadcastErrorProto; use dapi_grpc::tonic::Code; use dpp::consensus::ConsensusError; use dpp::serialization::PlatformDeserializable; @@ -79,6 +80,47 @@ pub enum Error { /// Remote node is stale; try another server #[error(transparent)] StaleNode(#[from] StaleNodeError), + + /// Error returned when trying to broadcast a state transition + #[error(transparent)] + StateTransitionBroadcastError(#[from] StateTransitionBroadcastError), +} + +/// State transition broadcast error +#[derive(Debug, thiserror::Error)] +#[error("state transition broadcast error: {message}")] +pub struct StateTransitionBroadcastError { + /// Error code + pub code: u32, + /// Error message + pub message: String, + /// Consensus error caused the state transition broadcast error + pub cause: Option<ConsensusError>, +} + +impl TryFrom<StateTransitionBroadcastErrorProto> for StateTransitionBroadcastError { + type Error = Error; + + fn try_from(value: StateTransitionBroadcastErrorProto) -> Result<Self, Self::Error> { + let cause = if value.data.len() > 0 { + let consensus_error = + ConsensusError::deserialize_from_bytes(&value.data).map_err(|e| { + tracing::debug!("Failed to deserialize consensus error: {}", e); + + Error::Protocol(e) + })?; + + Some(consensus_error) + } else { + None + }; + + Ok(Self { + code: value.code, + message: value.message, + cause, + }) + } } // TODO: Decompose DapiClientError to more specific errors like connection, node error instead of DAPI client error @@ -90,16 +132,25 @@ impl From<DapiClientError> for Error { .metadata() .get_bin("dash-serialized-consensus-error-bin") { - return ConsensusError::deserialize_from_bytes( - consensus_error_value.as_encoded_bytes(), - ) - .map(|consensus_error| { - Self::Protocol(ProtocolError::ConsensusError(Box::new(consensus_error))) - }) - .unwrap_or_else(|e| { - tracing::debug!("Failed to deserialize consensus error: {}", e); - Self::Protocol(e) - }); + return consensus_error_value + .to_bytes() + .map(|bytes| { + ConsensusError::deserialize_from_bytes(&bytes) + .map(|consensus_error| { + Self::Protocol(ProtocolError::ConsensusError(Box::new( + consensus_error, + ))) + }) + .unwrap_or_else(|e| { + tracing::debug!("Failed to deserialize consensus error: {}", e); + Self::Protocol(e) + }) + }) + .unwrap_or_else(|e| { + tracing::debug!("Failed to deserialize consensus error: {}", e); + // TODO: Introduce a specific error for this case + Self::Generic(format!("Invalid consensus error encoding: {e}")) + }); } // Otherwise we parse the error code and act accordingly if status.code() == Code::AlreadyExists { @@ -170,3 +221,92 @@ pub enum StaleNodeError { tolerance_ms: u64, }, } + +#[cfg(test)] +mod tests { + use super::*; + + mod from_dapi_client_error { + use super::*; + use assert_matches::assert_matches; + use base64::Engine; + use dapi_grpc::tonic::metadata::{MetadataMap, MetadataValue}; + use dpp::consensus::basic::identity::IdentityAssetLockProofLockedTransactionMismatchError; + use dpp::consensus::basic::BasicError; + use dpp::dashcore::hashes::Hash; + use dpp::dashcore::Txid; + use dpp::serialization::PlatformSerializableWithPlatformVersion; + use dpp::version::PlatformVersion; + + #[test] + fn test_already_exists() { + let error = DapiClientError::Transport(TransportError::Grpc( + dapi_grpc::tonic::Status::new(Code::AlreadyExists, "Object already exists"), + )); + + let sdk_error: Error = error.into(); + assert!(matches!(sdk_error, Error::AlreadyExists(_))); + } + + #[test] + fn test_consensus_error() { + let platform_version = PlatformVersion::latest(); + + let consensus_error = ConsensusError::BasicError( + BasicError::IdentityAssetLockProofLockedTransactionMismatchError( + IdentityAssetLockProofLockedTransactionMismatchError::new( + Txid::from_byte_array([0; 32]), + Txid::from_byte_array([1; 32]), + ), + ), + ); + + let consensus_error_bytes = consensus_error + .serialize_to_bytes_with_platform_version(platform_version) + .expect("serialize consensus error to bytes"); + + let mut metadata = MetadataMap::new(); + metadata.insert_bin( + "dash-serialized-consensus-error-bin", + MetadataValue::from_bytes(&consensus_error_bytes), + ); + + let status = + dapi_grpc::tonic::Status::with_metadata(Code::InvalidArgument, "Test", metadata); + + let error = DapiClientError::Transport(TransportError::Grpc(status)); + + let sdk_error = Error::from(error); + + assert_matches!( + sdk_error, + Error::Protocol(ProtocolError::ConsensusError(e)) if matches!(*e, ConsensusError::BasicError( + BasicError::IdentityAssetLockProofLockedTransactionMismatchError(_) + )) + ); + } + + #[test] + fn test_consensus_error_with_fixture() { + let consensus_error_bytes = base64::engine::general_purpose::STANDARD.decode("ATUgJOJEYbuHBqyTeApO/ptxQ8IAw8nm9NbGROu1nyE/kqcgDTlFeUG0R4wwVcbZJMFErL+VSn63SUpP49cequ3fsKw=").expect("decode base64"); + let consensus_error = MetadataValue::from_bytes(&consensus_error_bytes); + + let mut metadata = MetadataMap::new(); + metadata.insert_bin("dash-serialized-consensus-error-bin", consensus_error); + + let status = + dapi_grpc::tonic::Status::with_metadata(Code::InvalidArgument, "Test", metadata); + + let error = DapiClientError::Transport(TransportError::Grpc(status)); + + let sdk_error = Error::from(error); + + assert_matches!( + sdk_error, + Error::Protocol(ProtocolError::ConsensusError(e)) if matches!(*e, ConsensusError::BasicError( + BasicError::IdentityAssetLockProofLockedTransactionMismatchError(_) + )) + ); + } + } +} diff --git a/packages/rs-sdk/src/platform/document_query.rs b/packages/rs-sdk/src/platform/document_query.rs index 1da50d73f86..39ec37d736a 100644 --- a/packages/rs-sdk/src/platform/document_query.rs +++ b/packages/rs-sdk/src/platform/document_query.rs @@ -342,7 +342,7 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> { after.len(), )) })?), - true, + false, ), }; diff --git a/packages/rs-sdk/src/platform/transition.rs b/packages/rs-sdk/src/platform/transition.rs index c82a494d2df..234537179de 100644 --- a/packages/rs-sdk/src/platform/transition.rs +++ b/packages/rs-sdk/src/platform/transition.rs @@ -17,3 +17,6 @@ pub mod waitable; pub mod withdraw_from_identity; pub use txid::TxId; + +mod builder; +pub mod fungible_tokens; diff --git a/packages/rs-sdk/src/platform/transition/broadcast.rs b/packages/rs-sdk/src/platform/transition/broadcast.rs index f7c3f75d32e..72957948b28 100644 --- a/packages/rs-sdk/src/platform/transition/broadcast.rs +++ b/packages/rs-sdk/src/platform/transition/broadcast.rs @@ -1,9 +1,13 @@ use super::broadcast_request::BroadcastRequestForStateTransition; use super::put_settings::PutSettings; +use crate::error::StateTransitionBroadcastError; use crate::platform::block_info_from_metadata::block_info_from_metadata; use crate::sync::retry; use crate::{Error, Sdk}; -use dapi_grpc::platform::v0::{Proof, WaitForStateTransitionResultResponse}; +use dapi_grpc::platform::v0::wait_for_state_transition_result_response::wait_for_state_transition_result_response_v0; +use dapi_grpc::platform::v0::{ + wait_for_state_transition_result_response, Proof, WaitForStateTransitionResultResponse, +}; use dapi_grpc::platform::VersionedGrpcResponse; use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; @@ -80,6 +84,30 @@ impl BroadcastStateTransition for StateTransition { let response = request.execute(sdk, request_settings).await.inner_into()?; let grpc_response: &WaitForStateTransitionResultResponse = &response.inner; + + // We use match here to have a compilation error if a new version of the response is introduced + let state_transition_broadcast_error = match &grpc_response.version { + Some(wait_for_state_transition_result_response::Version::V0(result)) => { + match &result.result { + Some(wait_for_state_transition_result_response_v0::Result::Error(e)) => { + Some(e) + } + _ => None, + } + } + None => None, + }; + + if let Some(e) = state_transition_broadcast_error { + let state_transition_broadcast_error: StateTransitionBroadcastError = + StateTransitionBroadcastError::try_from(e.clone()) + .wrap_to_execution_result(&response)? + .inner; + + return Err(Error::from(state_transition_broadcast_error)) + .wrap_to_execution_result(&response); + } + let metadata = grpc_response .metadata() .wrap_to_execution_result(&response)? diff --git a/packages/rs-sdk/src/platform/transition/builder.rs b/packages/rs-sdk/src/platform/transition/builder.rs new file mode 100644 index 00000000000..6c4549561d4 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/builder.rs @@ -0,0 +1,95 @@ +use crate::platform::transition::broadcast::BroadcastStateTransition; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::balances::credits::TokenAmount; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::state_transition::StateTransition; +use dpp::version::PlatformVersion; + +/// Trait for building state transitions +pub trait StateTransitionBuilder { + /// Returns the settings for the state transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings>; + + /// Signs the state transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error>; + + /// Broadcasts the state transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The broadcasted state transition or an error + async fn broadcast( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let state_transition = self + .sign(sdk, identity_public_key, signer, platform_version) + .await?; + + state_transition.broadcast(sdk, self.settings()).await?; + + Ok(state_transition) + } + + /// Broadcasts the state transition and waits for the result + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<(Identifier, TokenAmount), Error>` - The result of the broadcasted state transition or an error + async fn broadcast_and_wait_for_result( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<(Identifier, TokenAmount), Error> { + let state_transition = self + .broadcast(sdk, identity_public_key, signer, platform_version) + .await?; + + state_transition + .wait_for_response(sdk, self.settings()) + .await + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs new file mode 100644 index 00000000000..f0595d18410 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/burn.rs @@ -0,0 +1,177 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::balances::credits::TokenAmount; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token burn transitions +pub struct TokenBurnTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + owner_id: Identifier, + amount: TokenAmount, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenBurnTransitionBuilder<'a> { + /// Creates a new `TokenBurnTransitionBuilder` + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `owner_id` - The identifier of the token owner + /// * `amount` - The amount of tokens to burn + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + owner_id: Identifier, + amount: TokenAmount, + ) -> Self { + Self { + data_contract, + token_position, + owner_id, + amount, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Adds a public note to the token burn transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token burn transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token burn transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + self + } + + /// Adds settings to the token burn transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenBurnTransitionBuilder<'_> { + /// Returns the settings for the token burn transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token burn transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.owner_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_burn_transition( + token_id, + self.owner_id, + self.data_contract.id(), + self.token_position, + self.amount, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs new file mode 100644 index 00000000000..e82e4becbe0 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/destroy.rs @@ -0,0 +1,185 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token destroy funds transitions +pub struct TokenDestroyFrozenFundsTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + frozen_identity_id: Identifier, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenDestroyFrozenFundsTransitionBuilder<'a> { + /// Start building a mint tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `actor_id` - The identifier of the actor + /// * `frozen_identity_id` - The identifier of the frozen identity + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + frozen_identity_id: Identifier, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + actor_id, + frozen_identity_id, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Adds a public note to the token destroy transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token destroy transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token destroy transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + + // TODO: Simplify group actions automatically find position if group action is required + + self + } + + /// Adds settings to the token destroy transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenDestroyFrozenFundsTransitionBuilder<'_> { + /// Returns the settings for the token destroy transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token destroy transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.actor_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_destroy_frozen_funds_transition( + token_id, + self.actor_id, + self.data_contract.id(), + self.token_position, + self.frozen_identity_id, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/emergency_action.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/emergency_action.rs new file mode 100644 index 00000000000..b8c45390cd9 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/emergency_action.rs @@ -0,0 +1,214 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::tokens::emergency_action::TokenEmergencyAction; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast emergency action transitions +pub struct TokenEmergencyActionTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + action: TokenEmergencyAction, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenEmergencyActionTransitionBuilder<'a> { + /// Start building a pause tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `actor_id` - The identifier of the actor + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn pause( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + actor_id, + action: TokenEmergencyAction::Pause, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Start building a resume tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `actor_id` - The identifier of the actor + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn resume( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + actor_id, + action: TokenEmergencyAction::Resume, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Adds a public note to the token emergency action transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token emergency action transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token emergency action transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + + // TODO: Simplify group actions automatically find position if group action is required + + self + } + + /// Adds settings to the token emergency action transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenEmergencyActionTransitionBuilder<'_> { + /// Returns the settings for the token emergency action transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token emergency action transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.actor_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_emergency_action_transition( + token_id, + self.actor_id, + self.data_contract.id(), + self.token_position, + self.action, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs new file mode 100644 index 00000000000..0ac89e66c2d --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/freeze.rs @@ -0,0 +1,185 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token freeze transitions +pub struct TokenFreezeTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + freeze_identity_id: Identifier, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenFreezeTransitionBuilder<'a> { + /// Start building a mint tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `actor_id` - The identifier of the actor + /// * `freeze_identity_id` - The identifier of the frozen identity + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + freeze_identity_id: Identifier, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + actor_id, + freeze_identity_id, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Adds a public note to the token freeze transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token freeze transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token freeze transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + + // TODO: Simplify group actions automatically find position if group action is required + + self + } + + /// Adds settings to the token freeze transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenFreezeTransitionBuilder<'_> { + /// Returns the settings for the token freeze transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token freeze transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.actor_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_freeze_transition( + token_id, + self.actor_id, + self.data_contract.id(), + self.token_position, + self.freeze_identity_id, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs new file mode 100644 index 00000000000..380f7cfe21d --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/mint.rs @@ -0,0 +1,206 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::balances::credits::TokenAmount; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token mint transitions +pub struct TokenMintTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + issuer_id: Identifier, + amount: TokenAmount, + recipient_id: Option<Identifier>, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenMintTransitionBuilder<'a> { + /// Start building a mint tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `issuer_id` - The identifier of the issuer + /// * `amount` - The amount of tokens to mint + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + issuer_id: Identifier, + amount: TokenAmount, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + issuer_id, + amount, + recipient_id: None, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Sets the recipient identity ID for the minted tokens + /// + /// # Arguments + /// + /// * `issued_to_id` - The identifier of the recipient + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn issued_to_identity_id(mut self, issued_to_id: Identifier) -> Self { + self.recipient_id = Some(issued_to_id); + + // TODO: Validate with minting_allow_choosing_destination + + self + } + + /// Adds a public note to the token mint transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token mint transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token mint transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + + // TODO: Simplify group actions automatically find position if group action is required + + self + } + + /// Adds settings to the token mint transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenMintTransitionBuilder<'_> { + /// Returns the settings for the token mint transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token mint transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.issuer_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_mint_transition( + token_id, + self.issuer_id, + self.data_contract.id(), + self.token_position, + self.amount, + self.recipient_id, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs new file mode 100644 index 00000000000..add8db703aa --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/mod.rs @@ -0,0 +1,9 @@ +//! Fungible token state transitions + +pub mod burn; +pub mod destroy; +pub mod emergency_action; +pub mod freeze; +pub mod mint; +pub mod transfer; +pub mod unfreeze; diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs new file mode 100644 index 00000000000..281907b0799 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/transfer.rs @@ -0,0 +1,211 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::balances::credits::TokenAmount; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::{calculate_token_id, PrivateEncryptedNote, SharedEncryptedNote}; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token transfer transitions +pub struct TokenTransferTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + issuer_id: Identifier, + amount: TokenAmount, + recipient_id: Identifier, + public_note: Option<String>, + shared_encrypted_note: Option<SharedEncryptedNote>, + private_encrypted_note: Option<PrivateEncryptedNote>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, +} + +impl<'a> TokenTransferTransitionBuilder<'a> { + /// Start building a mint tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `sender_id` - The identifier of the sender + /// * `recipient_id` - The identifier of the recipient + /// * `amount` - The amount of tokens to transfer + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + sender_id: Identifier, + recipient_id: Identifier, + amount: TokenAmount, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + issuer_id: sender_id, + amount, + recipient_id, + public_note: None, + settings: None, + user_fee_increase: None, + private_encrypted_note: None, + shared_encrypted_note: None, + } + } + + /// Adds a shared encrypted note to the token transfer transition + /// + /// # Arguments + /// + /// * `shared_encrypted_note` - The shared encrypted note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_shared_encrypted_note( + mut self, + shared_encrypted_note: SharedEncryptedNote, + ) -> Self { + self.shared_encrypted_note = Some(shared_encrypted_note); + self + } + + /// Adds a public note to the token transfer transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a private encrypted note to the token transfer transition + /// + /// # Arguments + /// + /// * `private_encrypted_note` - The private encrypted note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_private_encrypted_note( + mut self, + private_encrypted_note: PrivateEncryptedNote, + ) -> Self { + self.private_encrypted_note = Some(private_encrypted_note); + + self + } + + /// Adds a user fee increase to the token transfer transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds settings to the token transfer transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenTransferTransitionBuilder<'_> { + /// Returns the settings for the token transfer transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token transfer transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.issuer_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_transfer_transition( + token_id, + self.issuer_id, + self.data_contract.id(), + self.token_position, + self.amount, + self.recipient_id, + self.public_note.clone(), + self.shared_encrypted_note.clone(), + self.private_encrypted_note.clone(), + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs b/packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs new file mode 100644 index 00000000000..6cb837a18e1 --- /dev/null +++ b/packages/rs-sdk/src/platform/transition/fungible_tokens/unfreeze.rs @@ -0,0 +1,185 @@ +use crate::platform::transition::builder::StateTransitionBuilder; +use crate::platform::transition::put_settings::PutSettings; +use crate::platform::Identifier; +use crate::{Error, Sdk}; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::{DataContract, TokenContractPosition}; +use dpp::group::GroupStateTransitionInfoStatus; +use dpp::identity::signer::Signer; +use dpp::identity::IdentityPublicKey; +use dpp::prelude::UserFeeIncrease; +use dpp::state_transition::batch_transition::methods::v1::DocumentsBatchTransitionMethodsV1; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::StateTransition; +use dpp::tokens::calculate_token_id; +use dpp::version::PlatformVersion; + +/// A builder to configure and broadcast token unfreeze transitions +pub struct TokenUnfreezeTransitionBuilder<'a> { + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + unfreeze_identity_id: Identifier, + public_note: Option<String>, + settings: Option<PutSettings>, + user_fee_increase: Option<UserFeeIncrease>, + using_group_info: Option<GroupStateTransitionInfoStatus>, +} + +impl<'a> TokenUnfreezeTransitionBuilder<'a> { + /// Start building a mint tokens request for the provided DataContract. + /// + /// # Arguments + /// + /// * `data_contract` - A reference to the data contract + /// * `token_position` - The position of the token in the contract + /// * `actor_id` - The identifier of the actor + /// * `unfreeze_identity_id` - The identifier of the identity to unfreeze + /// + /// # Returns + /// + /// * `Self` - The new builder instance + pub fn new( + data_contract: &'a DataContract, + token_position: TokenContractPosition, + actor_id: Identifier, + unfreeze_identity_id: Identifier, + ) -> Self { + // TODO: Validate token position + + Self { + data_contract, + token_position, + actor_id, + unfreeze_identity_id, + public_note: None, + settings: None, + user_fee_increase: None, + using_group_info: None, + } + } + + /// Adds a public note to the token unfreeze transition + /// + /// # Arguments + /// + /// * `note` - The public note to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_public_note(mut self, note: String) -> Self { + self.public_note = Some(note); + self + } + + /// Adds a user fee increase to the token unfreeze transition + /// + /// # Arguments + /// + /// * `user_fee_increase` - The user fee increase to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_user_fee_increase(mut self, user_fee_increase: UserFeeIncrease) -> Self { + self.user_fee_increase = Some(user_fee_increase); + self + } + + /// Adds group information to the token unfreeze transition + /// + /// # Arguments + /// + /// * `group_info` - The group information to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_using_group_info(mut self, group_info: GroupStateTransitionInfoStatus) -> Self { + self.using_group_info = Some(group_info); + + // TODO: Simplify group actions automatically find position if group action is required + + self + } + + /// Adds settings to the token unfreeze transition + /// + /// # Arguments + /// + /// * `settings` - The settings to add + /// + /// # Returns + /// + /// * `Self` - The updated builder + pub fn with_settings(mut self, settings: PutSettings) -> Self { + self.settings = Some(settings); + self + } +} + +impl StateTransitionBuilder for TokenUnfreezeTransitionBuilder<'_> { + /// Returns the settings for the token unfreeze transition + /// + /// # Returns + /// + /// * `Option<PutSettings>` - The settings, if any + fn settings(&self) -> Option<PutSettings> { + self.settings + } + + /// Signs the token unfreeze transition + /// + /// # Arguments + /// + /// * `sdk` - The SDK instance + /// * `identity_public_key` - The public key of the identity + /// * `signer` - The signer instance + /// * `platform_version` - The platform version + /// + /// # Returns + /// + /// * `Result<StateTransition, Error>` - The signed state transition or an error + async fn sign( + &self, + sdk: &Sdk, + identity_public_key: &IdentityPublicKey, + signer: &impl Signer, + platform_version: &PlatformVersion, + ) -> Result<StateTransition, Error> { + let token_id = Identifier::from(calculate_token_id( + self.data_contract.id().as_bytes(), + self.token_position, + )); + + let identity_contract_nonce = sdk + .get_identity_contract_nonce( + self.actor_id, + self.data_contract.id(), + false, + self.settings, + ) + .await?; + + let state_transition = BatchTransition::new_token_unfreeze_transition( + token_id, + self.actor_id, + self.data_contract.id(), + self.token_position, + self.unfreeze_identity_id, + self.public_note.clone(), + self.using_group_info, + identity_public_key, + identity_contract_nonce, + self.user_fee_increase.unwrap_or_default(), + signer, + platform_version, + None, + None, + None, + )?; + + Ok(state_transition) + } +} diff --git a/packages/rs-sdk/src/platform/transition/purchase_document.rs b/packages/rs-sdk/src/platform/transition/purchase_document.rs index 530c1c6b83e..8423bd66d05 100644 --- a/packages/rs-sdk/src/platform/transition/purchase_document.rs +++ b/packages/rs-sdk/src/platform/transition/purchase_document.rs @@ -9,8 +9,8 @@ use dpp::fee::Credits; use dpp::identity::signer::Signer; use dpp::identity::IdentityPublicKey; use dpp::prelude::Identifier; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::StateTransition; #[async_trait::async_trait] @@ -65,7 +65,7 @@ impl<S: Signer> PurchaseDocument<S> for Document { let settings = settings.unwrap_or_default(); - let transition = DocumentsBatchTransition::new_document_purchase_transition_from_document( + let transition = BatchTransition::new_document_purchase_transition_from_document( self.clone(), document_type.as_ref(), purchaser_id, diff --git a/packages/rs-sdk/src/platform/transition/put_document.rs b/packages/rs-sdk/src/platform/transition/put_document.rs index 3ef5c5c864f..a18b9143ea4 100644 --- a/packages/rs-sdk/src/platform/transition/put_document.rs +++ b/packages/rs-sdk/src/platform/transition/put_document.rs @@ -7,8 +7,8 @@ use dpp::data_contract::document_type::DocumentType; use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::signer::Signer; use dpp::identity::IdentityPublicKey; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::StateTransition; #[async_trait::async_trait] @@ -60,7 +60,7 @@ impl<S: Signer> PutDocument<S> for Document { let settings = settings.unwrap_or_default(); - let transition = DocumentsBatchTransition::new_document_creation_transition_from_document( + let transition = BatchTransition::new_document_creation_transition_from_document( self.clone(), document_type.as_ref(), document_state_transition_entropy, diff --git a/packages/rs-sdk/src/platform/transition/transfer.rs b/packages/rs-sdk/src/platform/transition/transfer.rs index 7bd7ddd3644..b939d05ff02 100644 --- a/packages/rs-sdk/src/platform/transition/transfer.rs +++ b/packages/rs-sdk/src/platform/transition/transfer.rs @@ -32,7 +32,7 @@ pub trait TransferToIdentity: Waitable { signing_transfer_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option<PutSettings>, - ) -> Result<u64, Error>; + ) -> Result<(u64, u64), Error>; } #[async_trait::async_trait] @@ -45,7 +45,7 @@ impl TransferToIdentity for Identity { signing_transfer_key_to_use: Option<&IdentityPublicKey>, signer: S, settings: Option<PutSettings>, - ) -> Result<u64, Error> { + ) -> Result<(u64, u64), Error> { let new_identity_nonce = sdk.get_identity_nonce(self.id(), true, settings).await?; let user_fee_increase = settings.and_then(|settings| settings.user_fee_increase); let state_transition = IdentityCreditTransferTransition::try_from_identity( @@ -60,10 +60,21 @@ impl TransferToIdentity for Identity { None, )?; - let identity: PartialIdentity = state_transition.broadcast_and_wait(sdk, settings).await?; + let (sender, receiver): (PartialIdentity, PartialIdentity) = + state_transition.broadcast_and_wait(sdk, settings).await?; - identity.balance.ok_or(Error::DapiClientError( - "expected an identity balance after transfer".to_string(), - )) + let sender_balance = sender.balance.ok_or_else(|| { + Error::DapiClientError( + "expected an identity balance after transfer (sender)".to_string(), + ) + })?; + + let receiver_balance = receiver.balance.ok_or_else(|| { + Error::DapiClientError( + "expected an identity balance after transfer (receiver)".to_string(), + ) + })?; + + Ok((sender_balance, receiver_balance)) } } diff --git a/packages/rs-sdk/src/platform/transition/transfer_document.rs b/packages/rs-sdk/src/platform/transition/transfer_document.rs index 2106141ae3e..bd4a87e2dd6 100644 --- a/packages/rs-sdk/src/platform/transition/transfer_document.rs +++ b/packages/rs-sdk/src/platform/transition/transfer_document.rs @@ -8,8 +8,8 @@ use dpp::data_contract::document_type::DocumentType; use dpp::document::{Document, DocumentV0Getters}; use dpp::identity::signer::Signer; use dpp::identity::IdentityPublicKey; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::StateTransition; use rs_dapi_client::{DapiRequest, IntoInner}; @@ -62,7 +62,7 @@ impl<S: Signer> TransferDocument<S> for Document { let settings = settings.unwrap_or_default(); - let transition = DocumentsBatchTransition::new_document_transfer_transition_from_document( + let transition = BatchTransition::new_document_transfer_transition_from_document( self.clone(), document_type.as_ref(), recipient_id, diff --git a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs index 99a5642bf9f..e0bb06e0eff 100644 --- a/packages/rs-sdk/src/platform/transition/update_price_of_document.rs +++ b/packages/rs-sdk/src/platform/transition/update_price_of_document.rs @@ -9,8 +9,9 @@ use dpp::document::{Document, DocumentV0Getters}; use dpp::fee::Credits; use dpp::identity::signer::Signer; use dpp::identity::IdentityPublicKey; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::state_transition::batch_transition::BatchTransition; +use dpp::state_transition::proof_result::StateTransitionProofResult; use dpp::state_transition::StateTransition; #[async_trait::async_trait] @@ -62,20 +63,19 @@ impl<S: Signer> UpdatePriceOfDocument<S> for Document { let settings = settings.unwrap_or_default(); - let transition = - DocumentsBatchTransition::new_document_update_price_transition_from_document( - self.clone(), - document_type.as_ref(), - price, - &identity_public_key, - new_identity_contract_nonce, - settings.user_fee_increase.unwrap_or_default(), - signer, - sdk.version(), - None, - None, - None, - )?; + let transition = BatchTransition::new_document_update_price_transition_from_document( + self.clone(), + document_type.as_ref(), + price, + &identity_public_key, + new_identity_contract_nonce, + settings.user_fee_increase.unwrap_or_default(), + signer, + sdk.version(), + None, + None, + None, + )?; // response is empty for a broadcast, result comes from the stream wait for state transition result transition.broadcast(sdk, Some(settings)).await?; diff --git a/packages/rs-sdk/src/platform/transition/waitable.rs b/packages/rs-sdk/src/platform/transition/waitable.rs index a63acb0949e..c17436776d7 100644 --- a/packages/rs-sdk/src/platform/transition/waitable.rs +++ b/packages/rs-sdk/src/platform/transition/waitable.rs @@ -43,7 +43,7 @@ impl Waitable for Document { state_transition: StateTransition, settings: Option<PutSettings>, ) -> Result<Self, Error> { - let doc_id = if let StateTransition::DocumentsBatch(transition) = &state_transition { + let doc_id = if let StateTransition::Batch(transition) = &state_transition { let ids = transition.modified_data_ids(); if ids.len() != 1 { return Err(Error::Protocol( diff --git a/packages/rs-sdk/src/sdk.rs b/packages/rs-sdk/src/sdk.rs index c823df2eae4..699165e5369 100644 --- a/packages/rs-sdk/src/sdk.rs +++ b/packages/rs-sdk/src/sdk.rs @@ -10,6 +10,8 @@ use crate::platform::{Fetch, Identifier}; use arc_swap::{ArcSwapAny, ArcSwapOption}; use dapi_grpc::mock::Mockable; use dapi_grpc::platform::v0::{Proof, ResponseMetadata}; +#[cfg(not(target_arch = "wasm32"))] +use dapi_grpc::tonic::transport::Certificate; use dpp::bincode; use dpp::bincode::error::DecodeError; use dpp::dashcore::Network; @@ -35,6 +37,7 @@ use std::fmt::Debug; use std::num::NonZeroUsize; #[cfg(feature = "mocks")] use std::path::{Path, PathBuf}; +use std::str::FromStr; use std::sync::atomic::Ordering; use std::sync::{atomic, Arc}; use std::time::{SystemTime, UNIX_EPOCH}; @@ -273,6 +276,7 @@ impl Sdk { Ok(()) } + // TODO: Changed to public for tests /// Retrieve object `O` from proof contained in `request` (of type `R`) and `response`. /// /// This method is used to retrieve objects from proofs returned by Dash Platform. @@ -538,11 +542,14 @@ impl Sdk { } } + // TODO: Move to settings /// Indicate if the sdk should request and verify proofs. pub fn prove(&self) -> bool { self.proofs } + // TODO: If we remove this setter we don't need to use ArcSwap. + // It's good enough to set Context once when you initialize the SDK. /// Set the [ContextProvider] to use. /// /// [ContextProvider] is used to access state information, like data contracts and quorum public keys. @@ -750,6 +757,10 @@ pub struct SdkBuilder { /// Cancellation token; once cancelled, all pending requests should be aborted. pub(crate) cancel_token: CancellationToken, + + /// CA certificate to use for TLS connections. + #[cfg(not(target_arch = "wasm32"))] + ca_certificate: Option<Certificate>, } impl Default for SdkBuilder { @@ -780,6 +791,8 @@ impl Default for SdkBuilder { cancel_token: CancellationToken::new(), version: PlatformVersion::latest(), + #[cfg(not(target_arch = "wasm32"))] + ca_certificate: None, #[cfg(feature = "mocks")] dump_dir: None, @@ -816,6 +829,14 @@ impl SdkBuilder { /// /// This is a helper method that preconfigures [SdkBuilder] for production use. /// Use this method if you want to connect to Dash Platform mainnet with production-ready product. + /// + /// ## Panics + /// + /// This method panics if the mainnet configuration cannot be loaded. + /// + /// ## Unstable + /// + /// This method is unstable and can be changed in the future. pub fn new_mainnet() -> Self { unimplemented!( "Mainnet address list not implemented yet. Use new() and provide address list." @@ -830,6 +851,43 @@ impl SdkBuilder { self } + /// Configure CA certificate to use when verifying TLS connections. + /// + /// Used mainly for testing purposes and local networks. + /// + /// If not set, uses standard system CA certificates. + #[cfg(not(target_arch = "wasm32"))] + pub fn with_ca_certificate(mut self, pem_certificate: Certificate) -> Self { + self.ca_certificate = Some(pem_certificate); + self + } + + /// Load CA certificate from file. + /// + /// This is a convenience method that reads the certificate from a file and sets it using + /// [SdkBuilder::with_ca_certificate()]. + #[cfg(not(target_arch = "wasm32"))] + pub fn with_ca_certificate_file( + self, + certificate_file_path: impl AsRef<std::path::Path>, + ) -> std::io::Result<Self> { + let pem = std::fs::read(certificate_file_path)?; + + // parse the certificate and check if it's valid + let mut verified_pem = std::io::BufReader::new(pem.as_slice()); + rustls_pemfile::certs(&mut verified_pem) + .next() + .ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::InvalidData, + "No valid certificates found in the file", + ) + })??; + + let cert = Certificate::from_pem(pem); + Ok(self.with_ca_certificate(cert)) + } + /// Configure request settings. /// /// Tune request settings used to connect to the Dash Platform. @@ -962,7 +1020,13 @@ impl SdkBuilder { let sdk= match self.addresses { // non-mock mode Some(addresses) => { - let dapi = DapiClient::new(addresses,dapi_client_settings); + #[allow(unused_mut)] // needs to be mutable for features other than wasm + let mut dapi = DapiClient::new(addresses, dapi_client_settings); + #[cfg(not(target_arch = "wasm32"))] + if let Some(pem) = self.ca_certificate { + dapi = dapi.with_ca_certificate(pem); + } + #[cfg(feature = "mocks")] let dapi = dapi.dump_dir(self.dump_dir.clone()); diff --git a/packages/rs-sdk/src/sync.rs b/packages/rs-sdk/src/sync.rs index 3b267f5a531..14a74acadd8 100644 --- a/packages/rs-sdk/src/sync.rs +++ b/packages/rs-sdk/src/sync.rs @@ -15,13 +15,14 @@ use std::{ future::Future, sync::{mpsc::SendError, Arc}, }; -use tokio::{runtime::TryCurrentError, sync::Mutex}; +use tokio::sync::Mutex; #[derive(Debug, thiserror::Error)] pub enum AsyncError { /// Not running inside tokio runtime + #[cfg(not(target_arch = "wasm32"))] #[error("not running inside tokio runtime: {0}")] - NotInTokioRuntime(#[from] TryCurrentError), + NotInTokioRuntime(#[from] tokio::runtime::TryCurrentError), /// Cannot receive response from async function #[error("cannot receive response from async function: {0}")] @@ -61,6 +62,7 @@ impl From<AsyncError> for crate::Error { /// /// Due to limitations of tokio runtime, we cannot use `tokio::runtime::Runtime::block_on` if we are already inside a tokio runtime. /// This function is a workaround for that limitation. +#[cfg(not(target_arch = "wasm32"))] pub fn block_on<F>(fut: F) -> Result<F::Output, AsyncError> where F: Future + Send + 'static, @@ -83,6 +85,15 @@ where Ok(resp) } +#[cfg(target_arch = "wasm32")] +pub fn block_on<F>(_fut: F) -> Result<F::Output, AsyncError> +where + F: Future + Send + 'static, + F::Output: Send, +{ + unimplemented!("block_on is not supported in wasm"); +} + /// Worker function that runs the provided future and sends the result back to the caller using oneshot channel. async fn worker<F: Future>( fut: F, @@ -229,6 +240,7 @@ where false } }) + .sleep(rs_dapi_client::transport::BackonSleeper::default()) .notify(|error, duration| { tracing::warn!(?duration, ?error, "request failed, retrying"); }) diff --git a/packages/rs-sdk/tests/.env.example b/packages/rs-sdk/tests/.env.example index 1a9222032eb..a731b25f530 100644 --- a/packages/rs-sdk/tests/.env.example +++ b/packages/rs-sdk/tests/.env.example @@ -3,10 +3,13 @@ DASH_SDK_PLATFORM_HOST="127.0.0.1" DASH_SDK_PLATFORM_PORT=2443 DASH_SDK_PLATFORM_SSL=false +# DASH_SDK_PLATFORM_CA_CERT_PATH=/some/path/to/ca.pem # ProTxHash of masternode that has at least 1 vote casted for DPNS name `testname` DASH_SDK_MASTERNODE_OWNER_PRO_REG_TX_HASH="6ac88f64622d9bc0cb79ad0f69657aa9488b213157d20ae0ca371fa5f04fb222" +# Dash Core host to use for RPC. Defaults to DASH_SDK_PLATFORM_HOST. +DASH_SDK_CORE_HOST=127.0.0.1 DASH_SDK_CORE_PORT=20002 DASH_SDK_CORE_USER="someuser" DASH_SDK_CORE_PASSWORD="verysecretpassword" diff --git a/packages/rs-sdk/tests/fetch/config.rs b/packages/rs-sdk/tests/fetch/config.rs index 5fc403560d2..a93eb2402c5 100644 --- a/packages/rs-sdk/tests/fetch/config.rs +++ b/packages/rs-sdk/tests/fetch/config.rs @@ -36,6 +36,11 @@ pub struct Config { /// Port of the Dash Platform node grpc interface #[serde(default)] pub platform_port: u16, + /// Host of the Dash Core RPC interface running on the Dash Platform node. + /// Defaults to the same as [platform_host](Config::platform_host). + #[serde(default)] + #[cfg_attr(not(feature = "network-testing"), allow(unused))] + pub core_host: Option<String>, /// Port of the Dash Core RPC interface running on the Dash Platform node #[serde(default)] pub core_port: u16, @@ -49,6 +54,10 @@ pub struct Config { #[serde(default)] pub platform_ssl: bool, + /// When platform_ssl is true, use the PEM-encoded CA certificate from provided absolute path to verify the server certificate. + #[serde(default)] + pub platform_ca_cert_path: Option<PathBuf>, + /// Directory where all generated test vectors will be saved. /// /// See [SdkBuilder::with_dump_dir()](crate::SdkBuilder::with_dump_dir()) for more details. @@ -180,14 +189,19 @@ impl Config { // offline testing takes precedence over network testing #[cfg(all(feature = "network-testing", not(feature = "offline-testing")))] let sdk = { + let core_host = self.core_host.as_ref().unwrap_or(&self.platform_host); // Dump all traffic to disk let builder = dash_sdk::SdkBuilder::new(self.address_list()).with_core( - &self.platform_host, + core_host, self.core_port, &self.core_user, &self.core_password, ); - + if let Some(cert_file) = &self.platform_ca_cert_path { + builder = builder + .with_ca_certificate_file(cert_file) + .expect("load CA cert"); + } #[cfg(feature = "generate-test-vectors")] let builder = { // When we use namespaces, clean up the namespaced dump dir before starting diff --git a/packages/rs-sdk/tests/fetch/data_contract.rs b/packages/rs-sdk/tests/fetch/data_contract.rs index 41ef33138e9..b6d47cdd5f0 100644 --- a/packages/rs-sdk/tests/fetch/data_contract.rs +++ b/packages/rs-sdk/tests/fetch/data_contract.rs @@ -8,6 +8,8 @@ use drive_proof_verifier::types::DataContractHistory; /// Given some dummy data contract ID, when I fetch data contract, I get None because it doesn't exist. #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_data_contract_read_not_found() { + super::common::setup_logs(); + pub const DATA_CONTRACT_ID_BYTES: [u8; 32] = [1; 32]; let id = Identifier::from_bytes(&DATA_CONTRACT_ID_BYTES).expect("parse identity id"); diff --git a/packages/search-contract/.eslintrc b/packages/search-contract/.eslintrc new file mode 100644 index 00000000000..cb6c7636b60 --- /dev/null +++ b/packages/search-contract/.eslintrc @@ -0,0 +1,18 @@ +{ + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } +} diff --git a/packages/search-contract/.mocharc.yml b/packages/search-contract/.mocharc.yml new file mode 100644 index 00000000000..164b941c1b6 --- /dev/null +++ b/packages/search-contract/.mocharc.yml @@ -0,0 +1,2 @@ +require: test/bootstrap.js +recursive: true diff --git a/packages/search-contract/Cargo.toml b/packages/search-contract/Cargo.toml new file mode 100644 index 00000000000..224c3542b75 --- /dev/null +++ b/packages/search-contract/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "search-contract" +description = "Search data contract schema and tools. Search contract is using to find other contracts and tokens" +version = "1.8.0" +edition = "2021" +rust-version.workspace = true +license = "MIT" + +[dependencies] +thiserror = "1.0.64" +platform-version = { path = "../rs-platform-version" } +serde_json = { version = "1.0" } +platform-value = { path = "../rs-platform-value" } diff --git a/packages/search-contract/LICENSE b/packages/search-contract/LICENSE new file mode 100644 index 00000000000..3be95833750 --- /dev/null +++ b/packages/search-contract/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 Dash Core Group, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/search-contract/README.md b/packages/search-contract/README.md new file mode 100644 index 00000000000..6f6caf4d9d6 --- /dev/null +++ b/packages/search-contract/README.md @@ -0,0 +1,26 @@ +# Search Contract + +[![Build Status](https://github.com/dashpay/platform/actions/workflows/release.yml/badge.svg)](https://github.com/dashpay/platform/actions/workflows/release.yml) +[![NPM version](https://img.shields.io/npm/v/@dashevo/wallet-contract.svg?style=flat-square)](https://npmjs.org/package/@dashevo/wallet-contract) + +JSON Contracts for Searching Data Contracts + +## Table of Contents + +- [Install](#install) +- [Contributing](#contributing) +- [License](#license) + +## Install + +```sh +npm install @dashevo/search-contract +``` + +## Contributing + +Feel free to dive in! [Open an issue](https://github.com/dashpay/platform/issues/new/choose) or submit PRs. + +## License + +[MIT](LICENSE) &copy; Dash Core Group, Inc. diff --git a/packages/search-contract/lib/systemIds.js b/packages/search-contract/lib/systemIds.js new file mode 100644 index 00000000000..7335d3d1635 --- /dev/null +++ b/packages/search-contract/lib/systemIds.js @@ -0,0 +1,4 @@ +module.exports = { + ownerId: '11111111111111111111111111111111', + contractId: '8v8CoKCDdBcQu1Y7GDNJjR7a5vkMmgpXycJURkaUhfU9', +}; diff --git a/packages/search-contract/package.json b/packages/search-contract/package.json new file mode 100644 index 00000000000..11dadc3d956 --- /dev/null +++ b/packages/search-contract/package.json @@ -0,0 +1,29 @@ +{ + "name": "@dashevo/search-contract", + "version": "1.6.2", + "description": "A contract that allows searching for contracts", + "scripts": { + "lint": "eslint .", + "test": "yarn run test:unit", + "test:unit": "mocha 'test/unit/**/*.spec.js'" + }, + "contributors": [ + { + "name": "Samuel Westrich", + "email": "sam@dash.org", + "url": "https://github.com/quantumexplorer" + } + ], + "license": "MIT", + "devDependencies": { + "@dashevo/wasm-dpp": "workspace:*", + "chai": "^4.3.10", + "dirty-chai": "^2.0.1", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.29.0", + "mocha": "^11.1.0", + "sinon": "^17.0.1", + "sinon-chai": "^3.7.0" + } +} diff --git a/packages/search-contract/schema/v1/search-contract-documents.json b/packages/search-contract/schema/v1/search-contract-documents.json new file mode 100644 index 00000000000..f146ecb3e6c --- /dev/null +++ b/packages/search-contract/schema/v1/search-contract-documents.json @@ -0,0 +1,62 @@ +{ + "contract": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "referenceType": "contract", + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byKeyword", + "properties": [ + { + "keyword": "asc" + } + ] + } + ], + "properties": { + "keyword": { + "type": "string", + "minLength": 3, + "maxLength": 50, + "position": 0 + } + }, + "required": [ + "$contractId", + "keyword" + ], + "additionalProperties": false + }, + "token": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "referenceType": "token", + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byKeyword", + "properties": [ + { + "keyword": "asc" + } + ] + } + ], + "properties": { + "keyword": { + "type": "string", + "minLength": 3, + "maxLength": 50, + "position": 0 + } + }, + "required": [ + "$tokenId", + "keyword" + ], + "additionalProperties": false + } +} diff --git a/packages/search-contract/src/error.rs b/packages/search-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/search-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec<FeatureVersion>, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/search-contract/src/lib.rs b/packages/search-contract/src/lib.rs new file mode 100644 index 00000000000..f7767ea6c26 --- /dev/null +++ b/packages/search-contract/src/lib.rs @@ -0,0 +1,37 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; +use platform_value::{Identifier, IdentifierBytes32}; +use platform_version::version::PlatformVersion; +use serde_json::Value; + +pub const ID_BYTES: [u8; 32] = [ + 92, 20, 14, 101, 92, 2, 101, 187, 194, 168, 8, 113, 109, 225, 132, 121, 133, 19, 89, 24, 173, + 81, 205, 253, 11, 118, 102, 75, 169, 91, 163, 124, +]; + +pub const OWNER_ID_BYTES: [u8; 32] = [0; 32]; + +pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); +pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); +pub fn load_definitions(platform_version: &PlatformVersion) -> Result<Option<Value>, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "search_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result<Value, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "search_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } +} diff --git a/packages/search-contract/src/v1/mod.rs b/packages/search-contract/src/v1/mod.rs new file mode 100644 index 00000000000..e5d6a067712 --- /dev/null +++ b/packages/search-contract/src/v1/mod.rs @@ -0,0 +1,27 @@ +use crate::Error; +use serde_json::Value; + +pub mod document_types { + pub mod contract { + pub const NAME: &str = "contract"; + + pub mod properties { + pub const KEY_INDEX: &str = "byKeyword"; + } + } + + pub mod token { + pub const NAME: &str = "token"; + + pub mod properties { + pub const KEY_INDEX: &str = "byKeyword"; + } + } +} + +pub fn load_documents_schemas() -> Result<Value, Error> { + serde_json::from_str(include_str!( + "../../schema/v1/search-contract-documents.json" + )) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/search-contract/test/.eslintrc b/packages/search-contract/test/.eslintrc new file mode 100644 index 00000000000..720ced73852 --- /dev/null +++ b/packages/search-contract/test/.eslintrc @@ -0,0 +1,12 @@ +{ + "env": { + "node": true, + "mocha": true + }, + "rules": { + "import/no-extraneous-dependencies": "off" + }, + "globals": { + "expect": true + } +} diff --git a/packages/search-contract/test/bootstrap.js b/packages/search-contract/test/bootstrap.js new file mode 100644 index 00000000000..7af04f464d7 --- /dev/null +++ b/packages/search-contract/test/bootstrap.js @@ -0,0 +1,30 @@ +const sinon = require('sinon'); +const sinonChai = require('sinon-chai'); + +const { expect, use } = require('chai'); +const dirtyChai = require('dirty-chai'); + +const { + default: loadWasmDpp, +} = require('@dashevo/wasm-dpp'); + +use(dirtyChai); +use(sinonChai); + +exports.mochaHooks = { + beforeAll: loadWasmDpp, + + beforeEach() { + if (!this.sinon) { + this.sinon = sinon.createSandbox(); + } else { + this.sinon.restore(); + } + }, + + afterEach() { + this.sinon.restore(); + }, +}; + +global.expect = expect; diff --git a/packages/search-contract/test/unit/searchContract.spec.js b/packages/search-contract/test/unit/searchContract.spec.js new file mode 100644 index 00000000000..2fd94a879b7 --- /dev/null +++ b/packages/search-contract/test/unit/searchContract.spec.js @@ -0,0 +1,187 @@ +const crypto = require('crypto'); + +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); +const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); + +const { expect } = require('chai'); +const walletContractDocumentsSchema = require('../../schema/v1/search-contract-documents.json'); + +const expectJsonSchemaError = (validationResult, errorCount = 1) => { + const errors = validationResult.getErrors(); + expect(errors) + .to + .have + .length(errorCount); + + const error = validationResult.getErrors()[0]; + expect(error) + .to + .be + .instanceof(JsonSchemaError); + + return error; +}; + +describe('Search Contract', () => { + let dpp; + let dataContract; + let identityId; + + beforeEach(async () => { + dpp = new DashPlatformProtocol( + { generate: () => crypto.randomBytes(32) }, + ); + + identityId = await generateRandomIdentifier(); + + dataContract = dpp.dataContract.create(identityId, BigInt(1), walletContractDocumentsSchema); + }); + + it('should have a valid contract definition', async () => { + expect(() => dpp.dataContract.create(identityId, BigInt(1), walletContractDocumentsSchema)) + .to + .not + .throw(); + }); + + describe('documents', () => { + describe('txMetadata', () => { + let rawTxMetadataDocument; + + beforeEach(() => { + rawTxMetadataDocument = { + keyIndex: 0, + encryptionKeyIndex: 100, + encryptedMetadata: crypto.randomBytes(64), + }; + }); + + describe('keyIndex', () => { + it('should be defined', async () => { + delete rawTxMetadataDocument.keyIndex; + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('keyIndex'); + }); + + it('should be a non-negative integer', async () => { + rawTxMetadataDocument.keyIndex = -1; + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + describe('encryptionKeyIndex', () => { + it('should be defined', async () => { + delete rawTxMetadataDocument.encryptionKeyIndex; + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('encryptionKeyIndex'); + }); + + it('should be a non-negative integer', async () => { + rawTxMetadataDocument.encryptionKeyIndex = -1; + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + describe('encryptedMetadata', () => { + it('should be defined', async () => { + delete rawTxMetadataDocument.encryptedMetadata; + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('required'); + expect(error.params.missingProperty) + .to + .equal('encryptedMetadata'); + }); + + it('should be not shorter than 32 bytes', async () => { + rawTxMetadataDocument.encryptedMetadata = crypto.randomBytes(31); + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('minItems'); + expect(error.instancePath) + .to + .equal('/encryptedMetadata'); + }); + + it('should be not longer than 4096 bytes', async () => { + rawTxMetadataDocument.encryptedMetadata = crypto.randomBytes(4097); + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('maxItems'); + expect(error.instancePath) + .to + .equal('/encryptedMetadata'); + }); + }); + + it('should not have additional properties', async () => { + rawTxMetadataDocument.someOtherProperty = 42; + + const document = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword) + .to + .equal('additionalProperties'); + expect(error.params.additionalProperties) + .to + .deep + .equal(['someOtherProperty']); + }); + + it('should be valid', async () => { + const txMetadata = dpp.document.create(dataContract, identityId, 'txMetadata', rawTxMetadataDocument); + + const result = await txMetadata.validate(dpp.protocolVersion); + + expect(result.isValid()) + .to + .be + .true(); + }); + }); + }); +}); diff --git a/packages/simple-signer/Cargo.toml b/packages/simple-signer/Cargo.toml index fea2aca5bb4..97ad29d953a 100644 --- a/packages/simple-signer/Cargo.toml +++ b/packages/simple-signer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "simple-signer" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true @@ -8,6 +8,6 @@ rust-version.workspace = true [dependencies] bincode = { version = "2.0.0-rc.3", features = ["serde"] } -dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore-rpc", tag = "v0.15.13" } +dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", tag = "v0.37.0" } dpp = { path = "../rs-dpp", features = ["abci"] } base64 = { version = "0.22.1" } diff --git a/packages/strategy-tests/Cargo.toml b/packages/strategy-tests/Cargo.toml index 0a86a80efc8..f7fa7e815ce 100644 --- a/packages/strategy-tests/Cargo.toml +++ b/packages/strategy-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "strategy-tests" -version = "1.6.2" +version = "1.8.0" authors = [ "Samuel Westrich <sam@dash.org>", "Ivan Shumkov <ivan@shumkov.ru>", @@ -46,4 +46,4 @@ platform-version = { path = "../rs-platform-version", features = [ ] } # For tests of grovedb verify -rocksdb = { version = "0.22.0" } +rocksdb = { version = "0.23.0" } diff --git a/packages/strategy-tests/src/lib.rs b/packages/strategy-tests/src/lib.rs index efdb702a482..6d5d3e5161f 100644 --- a/packages/strategy-tests/src/lib.rs +++ b/packages/strategy-tests/src/lib.rs @@ -37,34 +37,38 @@ use dpp::state_transition::StateTransition; use dpp::version::PlatformVersion; use drive::drive::identity::key::fetch::{IdentityKeysRequest, KeyRequestType}; +use bincode::{Decode, Encode}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; +use dpp::data_contract::document_type::DocumentType; +use dpp::fee::Credits; +use dpp::identifier::Identifier; +use dpp::identity::accessors::IdentityGettersV0; +use dpp::platform_value::{BinaryData, Bytes32, Value}; +use dpp::state_transition::batch_transition::batched_transition::document_delete_transition::DocumentDeleteTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_replace_transition::DocumentReplaceTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::DocumentTransferTransitionV0; +use dpp::state_transition::batch_transition::batched_transition::{ + DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition, +}; +use dpp::state_transition::batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dpp::state_transition::batch_transition::document_create_transition::{ + DocumentCreateTransition, DocumentCreateTransitionV0, +}; +use dpp::state_transition::batch_transition::{BatchTransition, BatchTransitionV0}; +use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; use dpp::state_transition::data_contract_update_transition::methods::DataContractUpdateTransitionMethodsV0; +use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; +use dpp::{dash_to_duffs, ProtocolError}; use operations::{DataContractUpdateAction, DataContractUpdateOp}; use platform_version::TryFromPlatformVersioned; use rand::prelude::StdRng; use rand::seq::{IteratorRandom, SliceRandom}; use rand::Rng; -use transitions::create_identity_credit_transfer_transition; +use simple_signer::signer::SimpleSigner; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::ops::RangeInclusive; -use bincode::{Decode, Encode}; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::identifier::Identifier; -use dpp::data_contract::document_type::DocumentType; -use dpp::fee::Credits; -use dpp::identity::accessors::IdentityGettersV0; -use dpp::platform_value::{BinaryData, Bytes32, Value}; -use dpp::{dash_to_duffs, ProtocolError}; -use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; -use dpp::state_transition::documents_batch_transition::document_create_transition::{DocumentCreateTransition, DocumentCreateTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::document_delete_transition::DocumentDeleteTransitionV0; -use dpp::state_transition::documents_batch_transition::document_transition::document_replace_transition::DocumentReplaceTransitionV0; -use dpp::state_transition::documents_batch_transition::{DocumentsBatchTransition, DocumentsBatchTransitionV0}; -use dpp::state_transition::documents_batch_transition::document_transition::{DocumentDeleteTransition, DocumentReplaceTransition, DocumentTransferTransition}; -use dpp::state_transition::data_contract_create_transition::methods::v0::DataContractCreateTransitionMethodsV0; -use dpp::state_transition::documents_batch_transition::document_transition::document_transfer_transition::DocumentTransferTransitionV0; -use simple_signer::signer::SimpleSigner; +use transitions::create_identity_credit_transfer_transition; pub mod frequency; pub mod operations; @@ -720,8 +724,8 @@ impl Strategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { + let document_batch_transition: BatchTransition = + BatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], user_fee_increase: 0, @@ -846,8 +850,8 @@ impl Strategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { + let document_batch_transition: BatchTransition = + BatchTransitionV0 { owner_id: identity.id(), transitions: vec![document_create_transition.into()], user_fee_increase: 0, @@ -936,15 +940,14 @@ impl Strategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id(), - transitions: vec![document_delete_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 1, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id(), + transitions: vec![document_delete_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 1, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -1034,15 +1037,14 @@ impl Strategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_replace_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 1, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_replace_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 1, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -1138,15 +1140,14 @@ impl Strategy { } .into(); - let document_batch_transition: DocumentsBatchTransition = - DocumentsBatchTransitionV0 { - owner_id: identity.id, - transitions: vec![document_transfer_transition.into()], - user_fee_increase: 0, - signature_public_key_id: 1, - signature: BinaryData::default(), - } - .into(); + let document_batch_transition: BatchTransition = BatchTransitionV0 { + owner_id: identity.id, + transitions: vec![document_transfer_transition.into()], + user_fee_increase: 0, + signature_public_key_id: 1, + signature: BinaryData::default(), + } + .into(); let mut document_batch_transition: StateTransition = document_batch_transition.into(); @@ -1919,28 +1920,22 @@ mod tests { let mut simple_signer = SimpleSigner::default(); - let (identity1, keys) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity1, keys) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys); - let (identity2, keys) = - Identity::random_identity_with_main_keys_with_private_key::<Vec<_>>( - 2, - &mut rng, - platform_version, - ) - .unwrap(); + let (mut identity2, keys) = Identity::random_identity_with_main_keys_with_private_key::< + Vec<_>, + >(2, &mut rng, platform_version) + .unwrap(); simple_signer.add_keys(keys); let start_identities = create_state_transitions_for_identities( - vec![identity1, identity2], + vec![&mut identity1, &mut identity2], &(dash_to_duffs!(1)..=dash_to_duffs!(1)), &mut simple_signer, &mut rng, diff --git a/packages/strategy-tests/src/operations.rs b/packages/strategy-tests/src/operations.rs index d35fc9f5036..4dcebb9f62a 100644 --- a/packages/strategy-tests/src/operations.rs +++ b/packages/strategy-tests/src/operations.rs @@ -8,7 +8,7 @@ use dpp::data_contract::document_type::random_document::{ use dpp::data_contract::document_type::v0::random_document_type::RandomDocumentTypeParameters; use dpp::data_contract::document_type::DocumentType; use dpp::data_contract::serialized_version::DataContractInSerializationFormat; -use dpp::data_contract::{DataContract as Contract, DataContract}; +use dpp::data_contract::{DataContract as Contract, DataContract, TokenContractPosition}; use dpp::fee::Credits; use dpp::identifier::Identifier; use dpp::identity::IdentityPublicKey; @@ -17,6 +17,7 @@ use dpp::serialization::{ PlatformDeserializableWithPotentialValidationFromVersionedStructure, PlatformSerializableWithPlatformVersion, }; +use dpp::tokens::token_event::TokenEvent; use dpp::voting::vote_choices::resource_vote_choice::ResourceVoteChoice; use dpp::ProtocolError; use dpp::ProtocolError::{PlatformDeserializationError, PlatformSerializationError}; @@ -29,6 +30,106 @@ use rand::prelude::StdRng; use std::collections::BTreeMap; use std::ops::{Range, RangeInclusive}; +#[derive(Clone, Debug, PartialEq)] +pub struct TokenOp { + pub contract: Contract, + pub token_id: Identifier, + pub token_pos: TokenContractPosition, + pub use_identity_with_id: Option<Identifier>, + pub action: TokenEvent, +} + +#[derive(Clone, Debug, Encode, Decode)] +pub struct TokenOpInSerializationFormat { + pub contract: DataContractInSerializationFormat, + pub token_id: Identifier, + pub token_pos: TokenContractPosition, + pub use_identity_with_id: Option<Identifier>, + pub action: TokenEvent, +} + +impl PlatformSerializableWithPlatformVersion for TokenOp { + type Error = ProtocolError; + + fn serialize_to_bytes_with_platform_version( + &self, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, ProtocolError> { + self.clone() + .serialize_consume_to_bytes_with_platform_version(platform_version) + } + + fn serialize_consume_to_bytes_with_platform_version( + self, + platform_version: &PlatformVersion, + ) -> Result<Vec<u8>, ProtocolError> { + let TokenOp { + contract, + token_id, + token_pos, + use_identity_with_id, + action, + } = self; + let data_contract_serialization_format: DataContractInSerializationFormat = + contract.try_into_platform_versioned(platform_version)?; + + let document_op = TokenOpInSerializationFormat { + contract: data_contract_serialization_format, + token_id, + token_pos, + use_identity_with_id, + action, + }; + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + bincode::encode_to_vec(document_op, config).map_err(|e| { + PlatformSerializationError(format!("unable to serialize DocumentOp: {}", e)) + }) + } +} + +impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for TokenOp { + fn versioned_deserialize( + data: &[u8], + full_validation: bool, + platform_version: &PlatformVersion, + ) -> Result<Self, ProtocolError> + where + Self: Sized, + { + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + let token_op_in_serialization_format: TokenOpInSerializationFormat = + bincode::borrow_decode_from_slice(data, config) + .map_err(|e| { + PlatformDeserializationError(format!("unable to deserialize DocumentOp: {}", e)) + })? + .0; + let TokenOpInSerializationFormat { + contract, + token_id, + token_pos, + use_identity_with_id, + action, + } = token_op_in_serialization_format; + let data_contract = DataContract::try_from_platform_versioned( + contract, + full_validation, + &mut vec![], + platform_version, + )?; + Ok(TokenOp { + contract: data_contract, + token_id, + token_pos, + use_identity_with_id, + action, + }) + } +} + #[derive(Clone, Debug, PartialEq, Encode, Decode)] pub enum DocumentAction { DocumentActionInsertRandom(DocumentFieldFillType, DocumentFieldFillSize), @@ -514,6 +615,7 @@ pub enum OperationType { ContractUpdate(DataContractUpdateOp), IdentityTransfer(Option<IdentityTransferInfo>), ResourceVote(ResourceVoteOp), + Token(TokenOp), } #[derive(Clone, Debug, Encode, Decode)] @@ -526,6 +628,7 @@ enum OperationTypeInSerializationFormat { ContractUpdate(Vec<u8>), IdentityTransfer(Option<IdentityTransferInfo>), ResourceVote(ResourceVoteOpSerializable), + Token(Vec<u8>), } impl PlatformSerializableWithPlatformVersion for OperationType { @@ -578,6 +681,11 @@ impl PlatformSerializableWithPlatformVersion for OperationType { resource_vote_op.try_into_platform_versioned(platform_version)?; OperationTypeInSerializationFormat::ResourceVote(vote_op_in_serialization_format) } + OperationType::Token(token_op) => { + let token_op_in_serialization_format = + token_op.serialize_consume_to_bytes_with_platform_version(platform_version)?; + OperationTypeInSerializationFormat::Token(token_op_in_serialization_format) + } }; let config = bincode::config::standard() .with_big_endian() @@ -642,6 +750,14 @@ impl PlatformDeserializableWithPotentialValidationFromVersionedStructure for Ope let vote_op = resource_vote_op.try_into_platform_versioned(platform_version)?; OperationType::ResourceVote(vote_op) } + OperationTypeInSerializationFormat::Token(serialized_token_op) => { + let token_op = TokenOp::versioned_deserialize( + serialized_token_op.as_slice(), + full_validation, + platform_version, + )?; + OperationType::Token(token_op) + } }) } } diff --git a/packages/strategy-tests/src/transitions.rs b/packages/strategy-tests/src/transitions.rs index c77b51e2903..d3607d179ab 100644 --- a/packages/strategy-tests/src/transitions.rs +++ b/packages/strategy-tests/src/transitions.rs @@ -1018,16 +1018,19 @@ pub fn create_identities_state_transitions( /// - When unable to generate random cryptographic keys. /// - When failing to transform an identity into its corresponding state transition. /// - Conversion and encoding errors related to the cryptographic data. -pub fn create_state_transitions_for_identities( - identities: Vec<Identity>, +pub fn create_state_transitions_for_identities<'a, I>( + identities: I, amount_range: &AmountRange, signer: &SimpleSigner, rng: &mut StdRng, platform_version: &PlatformVersion, -) -> Vec<(Identity, StateTransition)> { +) -> Vec<(Identity, StateTransition)> +where + I: IntoIterator<Item = &'a mut Identity>, +{ identities .into_iter() - .map(|mut identity| { + .map(|identity| { let (_, pk) = ECDSA_SECP256K1 .random_public_and_private_key_data(rng, platform_version) .unwrap(); @@ -1051,7 +1054,7 @@ pub fn create_state_transitions_for_identities( .expect("expected to transform identity into identity create transition"); identity.set_id(identity_create_transition.owner_id()); - (identity, identity_create_transition) + (identity.clone(), identity_create_transition) }) .collect() } diff --git a/packages/token-history-contract/.eslintrc b/packages/token-history-contract/.eslintrc new file mode 100644 index 00000000000..cb6c7636b60 --- /dev/null +++ b/packages/token-history-contract/.eslintrc @@ -0,0 +1,18 @@ +{ + "extends": "airbnb-base", + "rules": { + "no-plusplus": 0, + "eol-last": [ + "error", + "always" + ], + "class-methods-use-this": "off", + "curly": [ + "error", + "all" + ] + }, + "globals": { + "BigInt": true + } +} diff --git a/packages/token-history-contract/.mocharc.yml b/packages/token-history-contract/.mocharc.yml new file mode 100644 index 00000000000..164b941c1b6 --- /dev/null +++ b/packages/token-history-contract/.mocharc.yml @@ -0,0 +1,2 @@ +require: test/bootstrap.js +recursive: true diff --git a/packages/token-history-contract/Cargo.toml b/packages/token-history-contract/Cargo.toml new file mode 100644 index 00000000000..6168fe0c924 --- /dev/null +++ b/packages/token-history-contract/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "token-history-contract" +description = "Token history data contract schema and tools" +version = "1.8.0" +edition = "2021" +rust-version.workspace = true +license = "MIT" + +[dependencies] +thiserror = "1.0.64" +platform-version = { path = "../rs-platform-version" } +serde_json = { version = "1.0" } +platform-value = { path = "../rs-platform-value" } diff --git a/packages/token-history-contract/LICENSE b/packages/token-history-contract/LICENSE new file mode 100644 index 00000000000..3be95833750 --- /dev/null +++ b/packages/token-history-contract/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 Dash Core Group, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/token-history-contract/README.md b/packages/token-history-contract/README.md new file mode 100644 index 00000000000..ce6b5a62333 --- /dev/null +++ b/packages/token-history-contract/README.md @@ -0,0 +1,26 @@ +# Wallet Utils Contract + +[![Build Status](https://github.com/dashpay/platform/actions/workflows/release.yml/badge.svg)](https://github.com/dashpay/platform/actions/workflows/release.yml) +[![NPM version](https://img.shields.io/npm/v/@dashevo/wallet-contract.svg?style=flat-square)](https://npmjs.org/package/@dashevo/wallet-contract) + +JSON Contracts for Dash Wallet apps + +## Table of Contents + +- [Install](#install) +- [Contributing](#contributing) +- [License](#license) + +## Install + +```sh +npm install @dashevo/wallet-contract +``` + +## Contributing + +Feel free to dive in! [Open an issue](https://github.com/dashpay/platform/issues/new/choose) or submit PRs. + +## License + +[MIT](LICENSE) &copy; Dash Core Group, Inc. diff --git a/packages/token-history-contract/lib/systemIds.js b/packages/token-history-contract/lib/systemIds.js new file mode 100644 index 00000000000..a89ad1ed75d --- /dev/null +++ b/packages/token-history-contract/lib/systemIds.js @@ -0,0 +1,4 @@ +module.exports = { + ownerId: '11111111111111111111111111111111', + contractId: 'BqzxK9UQdAeXbE7zY78uq6MfWWk3TrXZWfstnMoHZGh1', +}; diff --git a/packages/token-history-contract/package.json b/packages/token-history-contract/package.json new file mode 100644 index 00000000000..43ee49dc462 --- /dev/null +++ b/packages/token-history-contract/package.json @@ -0,0 +1,29 @@ +{ + "name": "@dashevo/token-history-contract", + "version": "1.8.0-dev.2", + "description": "The token history contract", + "scripts": { + "lint": "eslint .", + "test": "yarn run test:unit", + "test:unit": "mocha 'test/unit/**/*.spec.js'" + }, + "contributors": [ + { + "name": "Samuel Westrich", + "email": "sam@dash.org", + "url": "https://github.com/quantumexplorer" + } + ], + "license": "MIT", + "devDependencies": { + "@dashevo/wasm-dpp": "workspace:*", + "chai": "^4.3.10", + "dirty-chai": "^2.0.1", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.29.0", + "mocha": "^11.1.0", + "sinon": "^17.0.1", + "sinon-chai": "^3.7.0" + } +} diff --git a/packages/token-history-contract/schema/v1/token-history-contract-documents.json b/packages/token-history-contract/schema/v1/token-history-contract-documents.json new file mode 100644 index 00000000000..f8d1af53b03 --- /dev/null +++ b/packages/token-history-contract/schema/v1/token-history-contract-documents.json @@ -0,0 +1,651 @@ +{ + "burn": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byDate", + "properties": [ + { + "tokenId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byAmount", + "properties": [ + { + "tokenId": "asc" + }, + { + "amount": "asc" + } + ] + }, + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "amount": { + "type": "integer", + "minimum": 0, + "description": "The amount that was burned", + "position": 1 + }, + "note": { + "type": "string", + "maxLength": 2048, + "description": "An optional explanation of why this burn took place", + "position": 2 + } + }, + "required": [ + "tokenId", + "amount", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "mint": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byDate", + "properties": [ + { + "tokenId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byAmount", + "properties": [ + { + "tokenId": "asc" + }, + { + "amount": "asc" + } + ] + }, + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byRecipientId", + "properties": [ + { + "tokenId": "asc" + }, + { + "recipientId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "recipientId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 1, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "amount": { + "type": "integer", + "minimum": 0, + "description": "The amount that was burned", + "position": 2 + }, + "note": { + "type": "string", + "maxLength": 2048, + "description": "An optional explanation of why this mint took place", + "position": 3 + } + }, + "required": [ + "tokenId", + "amount", + "recipientId", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "transfer": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byDate", + "properties": [ + { + "tokenId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byAmount", + "properties": [ + { + "tokenId": "asc" + }, + { + "amount": "asc" + } + ] + }, + { + "name": "from", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "to", + "properties": [ + { + "tokenId": "asc" + }, + { + "toIdentityId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "amount": { + "type": "integer", + "minimum": 0, + "description": "The amount that was burned", + "position": 1 + }, + "toIdentityId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The identity or the group Id", + "position": 2, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "encryptedPersonalNote": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 2048, + "description": "An optional encrypted explanation of why this transfer took place only meant for the sender", + "position": 3 + }, + "encryptedSharedNote": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 2048, + "description": "An optional encrypted explanation of why this transfer took place shared between the sender and the receiver", + "position": 4 + }, + "publicNote": { + "type": "string", + "maxLength": 2048, + "description": "An optional public explanation of why this transfer took place", + "position": 5 + }, + "senderKeyIndex": { + "type": "integer", + "minimum": 0, + "description": "Used with the encrypted shared note", + "position": 6 + }, + "recipientKeyIndex": { + "type": "integer", + "minimum": 0, + "description": "Used with the encrypted shared note", + "position": 7 + }, + "rootEncryptionKeyIndex": { + "type": "integer", + "minimum": 0, + "description": "Used with the encrypted private note", + "position": 8 + }, + "derivationEncryptionKeyIndex": { + "type": "integer", + "minimum": 0, + "description": "Used with the encrypted private note", + "position": 9 + } + }, + "required": [ + "tokenId", + "amount", + "toIdentityId", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "freeze": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byFrozenIdentityId", + "properties": [ + { + "tokenId": "asc" + }, + { + "frozenIdentityId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "frozenIdentityId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The identity Id of the frozen token account", + "position": 1, + "contentMediaType": "application/x.dash.dpp.identifier" + } + }, + "required": [ + "tokenId", + "frozenIdentityId", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "unfreeze": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byFrozenIdentityId", + "properties": [ + { + "tokenId": "asc" + }, + { + "frozenIdentityId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0 + }, + "frozenIdentityId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The identity Id of the frozen token account", + "position": 1 + } + }, + "required": [ + "tokenId", + "frozenIdentityId", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "destroyFrozenFunds": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byAmount", + "properties": [ + { + "tokenId": "asc" + }, + { + "destroyedAmount": "asc" + } + ] + }, + { + "name": "byFrozenIdentityId", + "properties": [ + { + "tokenId": "asc" + }, + { + "frozenIdentityId": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "frozenIdentityId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The identity Id of the frozen token account", + "position": 1, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "destroyedAmount": { + "type": "integer", + "minimum": 0, + "description": "The amount that was frost burned", + "position": 2 + } + }, + "required": [ + "tokenId", + "frozenIdentityId", + "destroyedAmount", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "emergencyAction": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "action": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byAction", + "properties": [ + { + "tokenId": "asc" + }, + { + "action": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "action": { + "type": "integer", + "minimum": 0, + "description": "The action we are performing", + "position": 1 + } + }, + "required": [ + "tokenId", + "action", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + }, + "configUpdate": { + "type": "object", + "documentsMutable": false, + "canBeDeleted": false, + "creationRestrictionMode": 2, + "indices": [ + { + "name": "byOwnerId", + "properties": [ + { + "tokenId": "asc" + }, + { + "$ownerId": "asc" + }, + { + "changeItemType": "asc" + }, + { + "$createdAt": "asc" + } + ] + }, + { + "name": "byChangeItemType", + "properties": [ + { + "tokenId": "asc" + }, + { + "changeItemType": "asc" + }, + { + "$createdAt": "asc" + } + ] + } + ], + "properties": { + "tokenId": { + "type": "array", + "byteArray": true, + "minItems": 32, + "maxItems": 32, + "description": "The token ID", + "position": 0, + "contentMediaType": "application/x.dash.dpp.identifier" + }, + "changeItemType": { + "type": "integer", + "minimum": 0, + "description": "The action we are performing", + "position": 1 + }, + "changeItem": { + "type": "array", + "byteArray": true, + "minItems": 1, + "description": "The change item in serialized form", + "position": 2 + } + }, + "required": [ + "tokenId", + "changeItemType", + "changeItem", + "$createdAt", + "$createdAtBlockHeight" + ], + "additionalProperties": false + } +} diff --git a/packages/token-history-contract/src/error.rs b/packages/token-history-contract/src/error.rs new file mode 100644 index 00000000000..d01bbcc91cf --- /dev/null +++ b/packages/token-history-contract/src/error.rs @@ -0,0 +1,17 @@ +use platform_version::version::FeatureVersion; + +#[derive(thiserror::Error, Debug)] +pub enum Error { + /// Platform expected some specific versions + #[error("platform unknown version on {method}, received: {received}")] + UnknownVersionMismatch { + /// method + method: String, + /// the allowed versions for this method + known_versions: Vec<FeatureVersion>, + /// requested core height + received: FeatureVersion, + }, + #[error("schema deserialize error: {0}")] + InvalidSchemaJson(#[from] serde_json::Error), +} diff --git a/packages/token-history-contract/src/lib.rs b/packages/token-history-contract/src/lib.rs new file mode 100644 index 00000000000..3bf08b2e25b --- /dev/null +++ b/packages/token-history-contract/src/lib.rs @@ -0,0 +1,37 @@ +mod error; +pub mod v1; + +pub use crate::error::Error; +use platform_value::{Identifier, IdentifierBytes32}; +use platform_version::version::PlatformVersion; +use serde_json::Value; + +pub const ID_BYTES: [u8; 32] = [ + 45, 67, 89, 21, 34, 216, 145, 78, 156, 243, 17, 58, 202, 190, 13, 92, 61, 40, 122, 201, 84, 99, + 187, 110, 233, 128, 63, 48, 172, 29, 210, 108, +]; + +pub const OWNER_ID_BYTES: [u8; 32] = [0; 32]; + +pub const ID: Identifier = Identifier(IdentifierBytes32(ID_BYTES)); +pub const OWNER_ID: Identifier = Identifier(IdentifierBytes32(OWNER_ID_BYTES)); +pub fn load_definitions(platform_version: &PlatformVersion) -> Result<Option<Value>, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => Ok(None), + version => Err(Error::UnknownVersionMismatch { + method: "wallet_contract::load_definitions".to_string(), + known_versions: vec![1], + received: version, + }), + } +} +pub fn load_documents_schemas(platform_version: &PlatformVersion) -> Result<Value, Error> { + match platform_version.system_data_contracts.withdrawals { + 1 => v1::load_documents_schemas(), + version => Err(Error::UnknownVersionMismatch { + method: "wallet_contract::load_documents_schemas".to_string(), + known_versions: vec![1], + received: version, + }), + } +} diff --git a/packages/token-history-contract/src/v1/mod.rs b/packages/token-history-contract/src/v1/mod.rs new file mode 100644 index 00000000000..ddd4fa11153 --- /dev/null +++ b/packages/token-history-contract/src/v1/mod.rs @@ -0,0 +1,21 @@ +use crate::Error; +use serde_json::Value; + +pub mod document_types { + pub mod tx_metadata { + pub const NAME: &str = "tx_metadata"; + + pub mod properties { + pub const KEY_INDEX: &str = "keyIndex"; + pub const ENCRYPTION_KEY_INDEX: &str = "encryptionKeyIndex"; + pub const ENCRYPTED_METADATA: &str = "encryptedMetadata"; + } + } +} + +pub fn load_documents_schemas() -> Result<Value, Error> { + serde_json::from_str(include_str!( + "../../schema/v1/token-history-contract-documents.json" + )) + .map_err(Error::InvalidSchemaJson) +} diff --git a/packages/token-history-contract/test/.eslintrc b/packages/token-history-contract/test/.eslintrc new file mode 100644 index 00000000000..720ced73852 --- /dev/null +++ b/packages/token-history-contract/test/.eslintrc @@ -0,0 +1,12 @@ +{ + "env": { + "node": true, + "mocha": true + }, + "rules": { + "import/no-extraneous-dependencies": "off" + }, + "globals": { + "expect": true + } +} diff --git a/packages/token-history-contract/test/bootstrap.js b/packages/token-history-contract/test/bootstrap.js new file mode 100644 index 00000000000..7af04f464d7 --- /dev/null +++ b/packages/token-history-contract/test/bootstrap.js @@ -0,0 +1,30 @@ +const sinon = require('sinon'); +const sinonChai = require('sinon-chai'); + +const { expect, use } = require('chai'); +const dirtyChai = require('dirty-chai'); + +const { + default: loadWasmDpp, +} = require('@dashevo/wasm-dpp'); + +use(dirtyChai); +use(sinonChai); + +exports.mochaHooks = { + beforeAll: loadWasmDpp, + + beforeEach() { + if (!this.sinon) { + this.sinon = sinon.createSandbox(); + } else { + this.sinon.restore(); + } + }, + + afterEach() { + this.sinon.restore(); + }, +}; + +global.expect = expect; diff --git a/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js new file mode 100644 index 00000000000..126bf84fa5a --- /dev/null +++ b/packages/token-history-contract/test/unit/tokenHistoryContract.spec.js @@ -0,0 +1,412 @@ +const crypto = require('crypto'); +const { + DashPlatformProtocol, + JsonSchemaError, +} = require('@dashevo/wasm-dpp'); +const generateRandomIdentifier = require('@dashevo/wasm-dpp/lib/test/utils/generateRandomIdentifierAsync'); +const { expect } = require('chai'); +const tokenHistoryContractDocumentsSchema = require('../../schema/v1/token-history-contract-documents.json'); + +const expectJsonSchemaError = (validationResult, errorCount = 1) => { + const errors = validationResult.getErrors(); + expect(errors).to.have.length(errorCount); + + const error = validationResult.getErrors()[0]; + expect(error).to.be.instanceof(JsonSchemaError); + + return error; +}; + +describe('Token History Contract', () => { + let dpp; + let dataContract; + let identityId; + + beforeEach(async () => { + dpp = new DashPlatformProtocol({ generate: () => crypto.randomBytes(32) }); + identityId = await generateRandomIdentifier(); + dataContract = dpp.dataContract.create( + identityId, + BigInt(1), + tokenHistoryContractDocumentsSchema, + ); + }); + + it('should have a valid contract definition', async () => { + const createContract = () => dpp.dataContract.create( + identityId, + BigInt(1), + tokenHistoryContractDocumentsSchema, + ); + + expect(createContract).to.not.throw(); + }); + + describe('documents', () => { + describe('burn', () => { + let rawBurnDocument; + + beforeEach(() => { + rawBurnDocument = { + tokenId: crypto.randomBytes(32), + amount: 100, + note: 'Burning tokens', + }; + }); + + describe('tokenId', () => { + it('should be defined', async () => { + delete rawBurnDocument.tokenId; + const document = dpp.document.create(dataContract, identityId, 'burn', rawBurnDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); + }); + }); + + describe('amount', () => { + it('should be defined', async () => { + delete rawBurnDocument.amount; + const document = dpp.document.create(dataContract, identityId, 'burn', rawBurnDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('amount'); + }); + + it('should be a non-negative integer', async () => { + rawBurnDocument.amount = -1; + const document = dpp.document.create(dataContract, identityId, 'burn', rawBurnDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + it('should not have additional properties', async () => { + rawBurnDocument.extraProp = 123; + const document = dpp.document.create(dataContract, identityId, 'burn', rawBurnDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal([ + 'extraProp', + ]); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'burn', rawBurnDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('mint', () => { + let rawMintDocument; + + beforeEach(() => { + rawMintDocument = { + tokenId: crypto.randomBytes(32), + recipientId: crypto.randomBytes(32), + amount: 1000, + note: 'Minting tokens', + }; + }); + + describe('tokenId', () => { + it('should be defined', async () => { + delete rawMintDocument.tokenId; + const document = dpp.document.create(dataContract, identityId, 'mint', rawMintDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); + }); + }); + + describe('recipientId', () => { + it('should be defined', async () => { + delete rawMintDocument.recipientId; + const document = dpp.document.create(dataContract, identityId, 'mint', rawMintDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('recipientId'); + }); + }); + + describe('amount', () => { + it('should be a non-negative integer', async () => { + rawMintDocument.amount = -1; + const document = dpp.document.create(dataContract, identityId, 'mint', rawMintDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + it('should not have additional properties', async () => { + rawMintDocument.extraField = 'foo'; + const document = dpp.document.create(dataContract, identityId, 'mint', rawMintDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['extraField']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'mint', rawMintDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('transfer', () => { + let rawTransferDocument; + + beforeEach(() => { + rawTransferDocument = { + tokenId: crypto.randomBytes(32), + amount: 10, + toIdentityId: crypto.randomBytes(32), + publicNote: 'Transfer tokens', + encryptedPersonalNote: crypto.randomBytes(32), + encryptedSharedNote: crypto.randomBytes(32), + senderKeyIndex: 0, + recipientKeyIndex: 1, + rootEncryptionKeyIndex: 2, + derivationEncryptionKeyIndex: 3, + }; + }); + + describe('tokenId', () => { + it('should be defined', async () => { + delete rawTransferDocument.tokenId; + const document = dpp.document.create(dataContract, identityId, 'transfer', rawTransferDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); + }); + }); + + describe('amount', () => { + it('should be a non-negative integer', async () => { + rawTransferDocument.amount = -1; + const document = dpp.document.create(dataContract, identityId, 'transfer', rawTransferDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + describe('toIdentityId', () => { + it('should be defined', async () => { + delete rawTransferDocument.toIdentityId; + const document = dpp.document.create(dataContract, identityId, 'transfer', rawTransferDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('toIdentityId'); + }); + }); + + it('should not have additional properties', async () => { + rawTransferDocument.foo = 'bar'; + const document = dpp.document.create(dataContract, identityId, 'transfer', rawTransferDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['foo']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'transfer', rawTransferDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('freeze', () => { + let rawFreezeDocument; + + beforeEach(() => { + rawFreezeDocument = { + tokenId: crypto.randomBytes(32), + frozenIdentityId: crypto.randomBytes(32), + }; + }); + + describe('tokenId', () => { + it('should be defined', async () => { + delete rawFreezeDocument.tokenId; + const document = dpp.document.create(dataContract, identityId, 'freeze', rawFreezeDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); + }); + }); + + describe('frozenIdentityId', () => { + it('should be defined', async () => { + delete rawFreezeDocument.frozenIdentityId; + const document = dpp.document.create(dataContract, identityId, 'freeze', rawFreezeDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('frozenIdentityId'); + }); + }); + + it('should not have additional properties', async () => { + rawFreezeDocument.something = true; + const document = dpp.document.create(dataContract, identityId, 'freeze', rawFreezeDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['something']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'freeze', rawFreezeDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('unfreeze', () => { + let rawUnfreezeDocument; + + beforeEach(() => { + rawUnfreezeDocument = { + tokenId: crypto.randomBytes(32), + frozenIdentityId: crypto.randomBytes(32), + }; + }); + + describe('tokenId', () => { + it('should be 32 bytes', async () => { + rawUnfreezeDocument.tokenId = crypto.randomBytes(33); + const document = dpp.document.create(dataContract, identityId, 'unfreeze', rawUnfreezeDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('maxItems'); + expect(error.instancePath).to.equal('/tokenId'); + }); + }); + + it('should not have additional properties', async () => { + rawUnfreezeDocument.foo = 'bar'; + const document = dpp.document.create(dataContract, identityId, 'unfreeze', rawUnfreezeDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['foo']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'unfreeze', rawUnfreezeDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('destroyFrozenFunds', () => { + let rawDestroyFrozenFundsDocument; + + beforeEach(() => { + rawDestroyFrozenFundsDocument = { + tokenId: crypto.randomBytes(32), + frozenIdentityId: crypto.randomBytes(32), + destroyedAmount: 500, + }; + }); + + describe('frozenIdentityId', () => { + it('should be defined', async () => { + delete rawDestroyFrozenFundsDocument.frozenIdentityId; + const document = dpp.document.create(dataContract, identityId, 'destroyFrozenFunds', rawDestroyFrozenFundsDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('frozenIdentityId'); + }); + }); + + describe('destroyedAmount', () => { + it('should be non-negative', async () => { + rawDestroyFrozenFundsDocument.destroyedAmount = -1; + const document = dpp.document.create(dataContract, identityId, 'destroyFrozenFunds', rawDestroyFrozenFundsDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + it('should not have additional properties', async () => { + rawDestroyFrozenFundsDocument.bar = 123; + const document = dpp.document.create(dataContract, identityId, 'destroyFrozenFunds', rawDestroyFrozenFundsDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['bar']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'destroyFrozenFunds', rawDestroyFrozenFundsDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + + describe('emergencyAction', () => { + let rawEmergencyActionDocument; + + beforeEach(() => { + rawEmergencyActionDocument = { + tokenId: crypto.randomBytes(32), + action: 1, + }; + }); + + describe('tokenId', () => { + it('should be defined', async () => { + delete rawEmergencyActionDocument.tokenId; + const document = dpp.document.create(dataContract, identityId, 'emergencyAction', rawEmergencyActionDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('required'); + expect(error.params.missingProperty).to.equal('tokenId'); + }); + }); + + describe('action', () => { + it('should be non-negative', async () => { + rawEmergencyActionDocument.action = -5; + const document = dpp.document.create(dataContract, identityId, 'emergencyAction', rawEmergencyActionDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('minimum'); + }); + }); + + it('should not have additional properties', async () => { + rawEmergencyActionDocument.xyz = 999; + const document = dpp.document.create(dataContract, identityId, 'emergencyAction', rawEmergencyActionDocument); + const validationResult = document.validate(dpp.protocolVersion); + const error = expectJsonSchemaError(validationResult); + expect(error.keyword).to.equal('additionalProperties'); + expect(error.params.additionalProperties).to.deep.equal(['xyz']); + }); + + it('should be valid', async () => { + const document = dpp.document.create(dataContract, identityId, 'emergencyAction', rawEmergencyActionDocument); + const validationResult = await document.validate(dpp.protocolVersion); + expect(validationResult.isValid()).to.be.true(); + }); + }); + }); +}); diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index ac909bef26d..772a4bf1294 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "8.6.2", + "version": "8.8.0", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", @@ -80,7 +80,7 @@ "karma-mocha-reporter": "^2.2.5", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^5.0.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "node-inspect-extracted": "^1.0.8", "nyc": "^15.1.0", "os-browserify": "^0.3.0", diff --git a/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsReader.spec.js b/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsReader.spec.js index 74e8512586c..3044588b4d5 100644 --- a/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsReader.spec.js +++ b/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsReader.spec.js @@ -21,7 +21,7 @@ describe('TransactionsReader - unit', () => { const DEFAULT_ADDRESSES = ['yfLBwbdPKpKd7bSZ9ABrzTiknu67nDMqTJ', 'yYcL6ezfPgUWNV8fEp2gkw69ArDn76vus2', 'yfLBwbdPKpKd7bSZ9ABrzTiknu67nDMqTJ']; - beforeEach(function () { + beforeEach(function it() { options = { network: NETWORK, maxRetries: 3, @@ -763,7 +763,7 @@ describe('TransactionsReader - unit', () => { .to.have.not.been.calledWith('error'); }); - it('should throw an error if invalid Merkle Block height provided', async function () { + it('should throw an error if invalid Merkle Block height provided', async function it() { await transactionsReader.startContinuousSync(fromBlockHeight, DEFAULT_ADDRESSES); continuousSyncStream.retryOnError = this.sinon.stub() @@ -798,7 +798,7 @@ describe('TransactionsReader - unit', () => { merkleBlock = mockMerkleBlock([]); }); - it('should emit error if Merkle Block rejected', async function () { + it('should emit error if Merkle Block rejected', async function it() { await transactionsReader.startContinuousSync(fromBlockHeight, DEFAULT_ADDRESSES); continuousSyncStream.retryOnError = this.sinon.stub() diff --git a/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsSyncWorker.spec.js b/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsSyncWorker.spec.js index 6e331c36305..aacd3b137db 100644 --- a/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsSyncWorker.spec.js +++ b/packages/wallet-lib/src/plugins/Workers/TransactionsSyncWorker/TransactionsSyncWorker.spec.js @@ -878,7 +878,7 @@ describe('TransactionsSyncWorker', () => { chainStore = storage.getDefaultChainStore(); }); - it('should not process same merkle block two times', function () { + it('should not process same merkle block two times', function it() { const merkleBlock = mockMerkleBlock([]); const merkleBlockHeight = 500; diff --git a/packages/wallet-utils-contract/Cargo.toml b/packages/wallet-utils-contract/Cargo.toml index b5ea373f76f..8cf721548c1 100644 --- a/packages/wallet-utils-contract/Cargo.toml +++ b/packages/wallet-utils-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "wallet-utils-contract" description = "Wallet data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/wallet-utils-contract/package.json b/packages/wallet-utils-contract/package.json index 2e3d19ab9d8..2202b5d64ef 100644 --- a/packages/wallet-utils-contract/package.json +++ b/packages/wallet-utils-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-utils-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "A contract and helper scripts for Wallet DApp", "scripts": { "lint": "eslint .", @@ -22,7 +22,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/packages/wasm-dpp/.eslintrc b/packages/wasm-dpp/.eslintrc index cbd305c321e..ec046c0d8a4 100644 --- a/packages/wasm-dpp/.eslintrc +++ b/packages/wasm-dpp/.eslintrc @@ -1,5 +1,8 @@ { "extends": "airbnb-base", + "env": { + "es2020": true + }, "rules": { "no-plusplus": 0, "eol-last": [ diff --git a/packages/wasm-dpp/Cargo.toml b/packages/wasm-dpp/Cargo.toml index 14efd66967f..185c2a5dd3d 100644 --- a/packages/wasm-dpp/Cargo.toml +++ b/packages/wasm-dpp/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "wasm-dpp" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true authors = ["Anton Suprunchuk <anton.suprunchuk@gmail.com>"] [lib] -crate-type = ["cdylib"] +crate-type = ["cdylib", "rlib"] [dependencies] serde = { version = "1.0.197", features = ["derive"] } @@ -15,7 +15,7 @@ serde_json = { version = "1.0", features = ["preserve_order"] } # Meantime if you want to update wasm-bindgen you also need to update version in: # - packages/wasm-dpp/scripts/build-wasm.sh # - Dockerfile -wasm-bindgen = { version = "=0.2.86" } +wasm-bindgen = { version = "=0.2.99" } js-sys = "0.3.53" web-sys = { version = "0.3.6", features = ["console"] } thiserror = { version = "1.0.63" } @@ -40,6 +40,7 @@ dpp = { path = "../rs-dpp", default-features = false, features = [ "extended-document", "document-value-conversion", "document-json-conversion", + "system_contracts" ] } itertools = { version = "0.13" } log = { version = "0.4.6" } @@ -49,11 +50,11 @@ hex = { version = "0.4" } paste = "1.0.14" anyhow = { version = "1.0.75" } # required, cargo-machete false positive -wasm-bindgen-futures = "0.4.33" +wasm-bindgen-futures = "0.4.49" async-trait = "0.1.59" bincode = "2.0.0-rc.3" [profile.release] lto = true -opt-level = 's' +opt-level = 'z' [package.metadata.cargo-machete] ignored = ["wasm-bindgen-futures"] diff --git a/packages/wasm-dpp/README.md b/packages/wasm-dpp/README.md index 73b3494c454..e16390f30ad 100644 --- a/packages/wasm-dpp/README.md +++ b/packages/wasm-dpp/README.md @@ -39,7 +39,7 @@ Library consumers must ignore class names minification for `@dashevo/wasm-dpp` l - Install [Rust](https://www.rust-lang.org/tools/install) v1.73+ - Add wasm32 target: `$ rustup target add wasm32-unknown-unknown` -- Install wasm-bingen-cli: `cargo install wasm-bindgen-cli@0.2.86` +- Install wasm-bingen-cli: `cargo install wasm-bindgen-cli@0.2.99` - *double-check that wasm-bindgen-cli version above matches wasm-bindgen version in Cargo.lock file* - *Depending on system, additional packages may need to be installed as a prerequisite for wasm-bindgen-cli. If anything is missing, installation will error and prompt what packages are missing (i.e. clang, llvm, libssl-dev)* diff --git a/packages/wasm-dpp/lib/index.ts b/packages/wasm-dpp/lib/index.ts index 8027f069bed..b4031ee4144 100644 --- a/packages/wasm-dpp/lib/index.ts +++ b/packages/wasm-dpp/lib/index.ts @@ -35,7 +35,7 @@ const loadDppModule = async () => { let wasmUrl = URL.createObjectURL(blob); await init(wasmUrl); } else { - dpp_module.initSync(bytes); + dpp_module.initSync({ module: bytes }); } } diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditTransferTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditTransferTransitionFixture.js index 1d810e979e8..57a6ef99373 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditTransferTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityCreditTransferTransitionFixture.js @@ -6,7 +6,7 @@ module.exports = async function getIdentityUpdateTransitionFixture() { await loadWasmDpp(); const stateTransition = new IdentityCreditTransferTransition(1); - stateTransition.setAmount(1000); + stateTransition.setAmount(BigInt(1000)); stateTransition.setIdentityId(await generateRandomIdentifier()); stateTransition.setRecipientId(await generateRandomIdentifier()); diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js index c5d7dcf0989..e9562683af8 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityFixture.js @@ -34,7 +34,7 @@ module.exports = async function getIdentityFixture(id = staticId, publicKeys = u const identity = new Identity(1); identity.setId(id); identity.setPublicKeys(newPublicKeys); - identity.setBalance(10000); + identity.setBalance(BigInt(10000)); return identity; }; diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index c21787955bf..99775ed793e 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "1.6.2", + "version": "1.8.0", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -73,7 +73,7 @@ "karma-webpack": "^5.0.0", "lodash": "^4.17.21", "long": "^5.2.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "path-browserify": "^1.0.1", "process": "^0.11.10", "sinon": "^17.0.1", diff --git a/packages/wasm-dpp/scripts/build-wasm.sh b/packages/wasm-dpp/scripts/build-wasm.sh index 0c154372bae..4dd833c452f 100755 --- a/packages/wasm-dpp/scripts/build-wasm.sh +++ b/packages/wasm-dpp/scripts/build-wasm.sh @@ -47,8 +47,9 @@ fi # EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0 --no-entry" cargo build --target=wasm32-unknown-emscripten --release # EMCC_CFLAGS="-s ERROR_ON_UNDEFINED_SYMBOLS=0 --no-entry" wasm-bindgen --out-dir=wasm --target=web --omit-default-module-path ../../target/wasm32-unknown-emscripten/release/wasm_dpp.wasm -# TODO: Must be somehow preinstalled? -#if [ "$PROFILE" == "release" ]; then -# echo "Optimizing wasm using Binaryen" -# wasm-opt -Os "$OUTPUT_FILE" -o "$OUTPUT_FILE" -#fi +if command -v wasm-opt &> /dev/null; then + echo "Optimizing wasm using Binaryen" + wasm-opt -tnh --flatten --rereloop -Oz --gufa -Oz --gufa -Oz "$OUTPUT_FILE" -o "$OUTPUT_FILE" +else + echo "wasm-opt command not found. Skipping wasm optimization." +fi diff --git a/packages/wasm-dpp/src/data_contract/data_contract.rs b/packages/wasm-dpp/src/data_contract/data_contract.rs index e0b2232f52b..7e390d70077 100644 --- a/packages/wasm-dpp/src/data_contract/data_contract.rs +++ b/packages/wasm-dpp/src/data_contract/data_contract.rs @@ -7,10 +7,11 @@ pub use serde::{Deserialize, Serialize}; use wasm_bindgen::prelude::*; use dpp::data_contract::schema::DataContractSchemaMethodsV0; -use dpp::data_contract::DataContract; +use dpp::data_contract::{DataContract, TokenContractPosition}; use dpp::platform_value::{platform_value, Value}; use dpp::data_contract::accessors::v0::{DataContractV0Getters, DataContractV0Setters}; +use dpp::data_contract::accessors::v1::DataContractV1Getters; use dpp::data_contract::config::DataContractConfig; use dpp::data_contract::conversion::json::DataContractJsonConversionMethodsV0; use dpp::data_contract::conversion::value::v0::DataContractValueConversionMethodsV0; @@ -22,6 +23,7 @@ use dpp::serialization::PlatformSerializableWithPlatformVersion; use dpp::version::PlatformVersion; use dpp::ProtocolError; +use crate::data_contract::tokens::TokenConfigurationWasm; use crate::identifier::identifier_from_js_value; use crate::metadata::MetadataWasm; use crate::utils::get_bool_from_options; @@ -313,8 +315,8 @@ impl DataContractWasm { } #[wasm_bindgen(js_name=setIdentityNonce)] - pub fn set_identity_nonce(&mut self, e: u64) -> Result<(), JsValue> { - self.identity_nonce = Some(e); + pub fn set_identity_nonce(&mut self, nonce: u64) -> Result<(), JsValue> { + self.identity_nonce = Some(nonce); Ok(()) } @@ -448,6 +450,18 @@ impl DataContractWasm { .with_js_error() .map(Into::into) } + + #[wasm_bindgen(js_name=getTokenConfiguration)] + pub fn token_configuration( + &self, + token_contract_position: TokenContractPosition, + ) -> Result<TokenConfigurationWasm, JsValue> { + self.inner + .expected_token_configuration(token_contract_position) + .map_err(ProtocolError::from) + .with_js_error() + .map(|token_configuration| token_configuration.clone().into()) + } } impl Inner for DataContractWasm { diff --git a/packages/wasm-dpp/src/data_contract/mod.rs b/packages/wasm-dpp/src/data_contract/mod.rs index baf6fb394a5..76458e5eb06 100644 --- a/packages/wasm-dpp/src/data_contract/mod.rs +++ b/packages/wasm-dpp/src/data_contract/mod.rs @@ -8,6 +8,7 @@ pub mod errors; mod state_transition; mod data_contract_facade; +pub mod tokens; // mod index; pub use data_contract_facade::DataContractFacadeWasm; diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs index 536995f2b1a..23a3b157fb0 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_create_transition/mod.rs @@ -81,6 +81,27 @@ impl DataContractCreateTransitionWasm { pub fn get_type(&self) -> u32 { self.0.state_transition_type() as u32 } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=getSignature)] + pub fn get_signature(&self) -> Buffer { + Buffer::from_bytes(self.0.signature().as_slice()) + } + + #[wasm_bindgen(js_name=getSignaturePublicKeyId)] + pub fn get_signature_public_key_id(&self) -> u32 { + self.0.signature_public_key_id() + } + // // #[wasm_bindgen(js_name=toJSON)] // pub fn to_json(&self, skip_signature: Option<bool>) -> Result<JsValue, JsValue> { diff --git a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs index 02fa59c0b1c..994835a5b6d 100644 --- a/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs +++ b/packages/wasm-dpp/src/data_contract/state_transition/data_contract_update_transition/mod.rs @@ -73,11 +73,36 @@ impl DataContractUpdateTransitionWasm { self.0.owner_id().into() } + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> u64 { + self.0.identity_contract_nonce() as u64 + } + #[wasm_bindgen(js_name=getType)] pub fn get_type(&self) -> u32 { self.0.state_transition_type() as u32 } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + + #[wasm_bindgen(js_name=getSignature)] + pub fn get_signature(&self) -> Buffer { + Buffer::from_bytes(self.0.signature().as_slice()) + } + + #[wasm_bindgen(js_name=getSignaturePublicKeyId)] + pub fn get_signature_public_key_id(&self) -> u32 { + self.0.signature_public_key_id() + } + // #[wasm_bindgen(js_name=toJSON)] // pub fn to_json(&self, skip_signature: Option<bool>) -> Result<JsValue, JsValue> { // let serializer = serde_wasm_bindgen::Serializer::json_compatible(); diff --git a/packages/wasm-dpp/src/data_contract/tokens.rs b/packages/wasm-dpp/src/data_contract/tokens.rs new file mode 100644 index 00000000000..90f12e7f8de --- /dev/null +++ b/packages/wasm-dpp/src/data_contract/tokens.rs @@ -0,0 +1,18 @@ +use dpp::data_contract::TokenConfiguration; +use wasm_bindgen::prelude::wasm_bindgen; + +#[derive(Debug, Clone)] +#[wasm_bindgen(js_name = "TokenConfiguration")] +pub struct TokenConfigurationWasm(TokenConfiguration); + +impl From<TokenConfiguration> for TokenConfigurationWasm { + fn from(value: TokenConfiguration) -> Self { + Self(value) + } +} + +impl Into<TokenConfiguration> for TokenConfigurationWasm { + fn into(self) -> TokenConfiguration { + self.0 + } +} diff --git a/packages/wasm-dpp/src/document/document_facade.rs b/packages/wasm-dpp/src/document/document_facade.rs index 609794eaa99..f713a421f2e 100644 --- a/packages/wasm-dpp/src/document/document_facade.rs +++ b/packages/wasm-dpp/src/document/document_facade.rs @@ -4,7 +4,7 @@ use wasm_bindgen::{prelude::*, JsValue}; use crate::document::factory::DocumentFactoryWASM; use crate::{DataContractWasm, ExtendedDocumentWasm}; -use crate::document::state_transition::document_batch_transition::DocumentsBatchTransitionWasm; +use crate::document::state_transition::batch_transition::BatchTransitionWasm; #[derive(Clone)] #[wasm_bindgen(js_name=DocumentFacade)] @@ -95,8 +95,8 @@ impl DocumentFacadeWasm { pub fn create_state_transition( &self, documents: &JsValue, - nonce_counter_value: &js_sys::Object, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransitionWasm, JsValue> { + nonce_counter_value: &js_sys::Object, //IdentityID/ContractID -> nonce (BigInt) + ) -> Result<BatchTransitionWasm, JsValue> { self.factory .create_state_transition(documents, nonce_counter_value) } diff --git a/packages/wasm-dpp/src/document/errors/document_already_exists_error.rs b/packages/wasm-dpp/src/document/errors/document_already_exists_error.rs index 111d138b8d4..a4b028f7263 100644 --- a/packages/wasm-dpp/src/document/errors/document_already_exists_error.rs +++ b/packages/wasm-dpp/src/document/errors/document_already_exists_error.rs @@ -1,5 +1,5 @@ // use crate::document::state_transition::document_batch_transition::document_transition::from_document_transition_to_js_value; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; use thiserror::Error; use super::*; diff --git a/packages/wasm-dpp/src/document/errors/document_not_provided_error.rs b/packages/wasm-dpp/src/document/errors/document_not_provided_error.rs index 769f1853c48..bc520332441 100644 --- a/packages/wasm-dpp/src/document/errors/document_not_provided_error.rs +++ b/packages/wasm-dpp/src/document/errors/document_not_provided_error.rs @@ -1,5 +1,5 @@ // use crate::document::state_transition::document_batch_transition::document_transition::from_document_transition_to_js_value; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; use thiserror::Error; use super::*; diff --git a/packages/wasm-dpp/src/document/errors/invalid_document_action_error.rs b/packages/wasm-dpp/src/document/errors/invalid_document_action_error.rs index 0496d71c07b..78eb5d5d05b 100644 --- a/packages/wasm-dpp/src/document/errors/invalid_document_action_error.rs +++ b/packages/wasm-dpp/src/document/errors/invalid_document_action_error.rs @@ -1,9 +1,9 @@ // use crate::document::state_transition::document_batch_transition::document_transition::from_document_transition_to_js_value; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dpp::state_transition::batch_transition::batched_transition::document_transition::DocumentTransition; use thiserror::Error; use super::*; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; +use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionTypeGetter; #[wasm_bindgen] #[derive(Error, Debug)] diff --git a/packages/wasm-dpp/src/document/extended_document.rs b/packages/wasm-dpp/src/document/extended_document.rs index 08d81ff81cd..a33ab17f293 100644 --- a/packages/wasm-dpp/src/document/extended_document.rs +++ b/packages/wasm-dpp/src/document/extended_document.rs @@ -133,17 +133,15 @@ impl ExtendedDocumentWasm { } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, rev: Option<u32>) { - // TODO: js feeds Number (u32). Is casting revision to u64 safe? + pub fn set_revision(&mut self, rev: Option<u64>) { self.0 .document_mut() .set_revision(rev.map(|r| r as Revision)); } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> Option<u32> { - // TODO: js expects Number (u32). Is casting revision to u32 safe? - self.0.document().revision().map(|r| r as u32) + pub fn get_revision(&self) -> Option<u64> { + self.0.document().revision().map(|r| r) } #[wasm_bindgen(js_name=setEntropy)] diff --git a/packages/wasm-dpp/src/document/factory.rs b/packages/wasm-dpp/src/document/factory.rs index 0b927a60803..24b1049505c 100644 --- a/packages/wasm-dpp/src/document/factory.rs +++ b/packages/wasm-dpp/src/document/factory.rs @@ -13,18 +13,18 @@ use dpp::document::Document; use dpp::prelude::ExtendedDocument; -use dpp::identifier::Identifier; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; -use dpp::version::PlatformVersion; -use std::convert::TryFrom; - -use crate::document_batch_transition::DocumentsBatchTransitionWasm; +use crate::batch_transition::BatchTransitionWasm; use crate::entropy_generator::ExternalEntropyGenerator; use crate::{ identifier::identifier_from_js_value, utils::{IntoWasm, ToSerdeJSONExt, WithJsError}, DataContractWasm, ExtendedDocumentWasm, }; +use dpp::identifier::Identifier; +use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionType; +use dpp::version::PlatformVersion; +use std::convert::TryFrom; +use std::str::FromStr; #[wasm_bindgen(js_name=DocumentTransitions)] #[derive(Debug, Default)] @@ -109,7 +109,7 @@ impl DocumentFactoryWASM { &self, documents: &JsValue, nonce_counter_value: &js_sys::Object, //IdentityID/ContractID -> nonce - ) -> Result<DocumentsBatchTransitionWasm, JsValue> { + ) -> Result<BatchTransitionWasm, JsValue> { let mut nonce_counter = BTreeMap::new(); let mut contract_ids_to_check = HashSet::<&Identifier>::new(); @@ -128,7 +128,12 @@ impl DocumentFactoryWASM { .for_each(|entry| { let key_value = js_sys::Array::from(&entry); let contract_id = identifier_from_js_value(&key_value.get(0)).unwrap(); - let nonce = key_value.get(1).as_f64().unwrap() as u64; + let nonce = key_value + .get(1) + .as_string() + .unwrap() + .parse::<u64>() + .unwrap(); nonce_counter.insert((identity_id, contract_id), nonce); }); }); @@ -245,6 +250,7 @@ impl DocumentFactoryWASM { // // Ok(document.into()) // } + // #[wasm_bindgen(js_name=createExtendedDocumentFromDocumentBuffer)] pub fn create_extended_from_document_buffer( diff --git a/packages/wasm-dpp/src/document/mod.rs b/packages/wasm-dpp/src/document/mod.rs index 3c6892249d0..60de8050371 100644 --- a/packages/wasm-dpp/src/document/mod.rs +++ b/packages/wasm-dpp/src/document/mod.rs @@ -126,15 +126,13 @@ impl DocumentWasm { } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: Option<u32>) { - // TODO: JS feeding Number here (u32). Is it okay to cast u32 to u64? + pub fn set_revision(&mut self, revision: Option<u64>) { self.0.set_revision(revision.map(|r| r as u64)); } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> Option<u32> { - // TODO: JS tests expecting Number (u32). Is it okay to cast u64 to u32 here? - self.0.revision().map(|r| r as u32) + pub fn get_revision(&self) -> Option<u64> { + self.0.revision().map(|r| r) } #[wasm_bindgen(js_name=setData)] diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/batched_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/batched_transition/mod.rs new file mode 100644 index 00000000000..d83ae4d4735 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/batched_transition/mod.rs @@ -0,0 +1,18 @@ +use dpp::state_transition::batch_transition::batched_transition::BatchedTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=BatchedTransition)] +#[derive(Debug, Clone)] +pub struct BatchedTransitionWasm(BatchedTransition); + +impl From<BatchedTransition> for BatchedTransitionWasm { + fn from(t: BatchedTransition) -> Self { + BatchedTransitionWasm(t) + } +} + +impl From<BatchedTransitionWasm> for BatchedTransition { + fn from(t: BatchedTransitionWasm) -> Self { + t.0 + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_create_transition.rs similarity index 84% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_create_transition.rs index 8cf7b5d0b97..1afe02d94d9 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_create_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_create_transition.rs @@ -1,10 +1,13 @@ use dpp::prelude::Revision; -use dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransition; +use dpp::state_transition::batch_transition::document_create_transition::DocumentCreateTransition; use dpp::document::INITIAL_REVISION; use wasm_bindgen::prelude::*; +use dpp::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use dpp::state_transition::batch_transition::document_base_transition::document_base_transition_trait::DocumentBaseTransitionAccessors; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; #[wasm_bindgen(js_name=DocumentCreateTransition)] #[derive(Debug, Clone)] @@ -77,8 +80,47 @@ impl DocumentCreateTransitionWasm { } #[wasm_bindgen(getter, js_name=INITIAL_REVISION)] - pub fn initial_revision() -> u32 { - INITIAL_REVISION as u32 + pub fn initial_revision() -> u64 { + INITIAL_REVISION + } + + #[wasm_bindgen(js_name = getEntropy)] + pub fn get_entropy(&self) -> Vec<u8> { + Vec::from(self.inner.entropy()) + } + + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> u64 { + self.inner.base().identity_contract_nonce() + } + + #[wasm_bindgen(js_name=setIdentityContractNonce)] + pub fn set_identity_contract_nonce(&mut self, identity_contract_nonce: u64) { + let mut base = self.inner.base().clone(); + + base.set_identity_contract_nonce(identity_contract_nonce); + + self.inner.set_base(base) + } + + #[wasm_bindgen(js_name = getPrefundedVotingBalance)] + pub fn get_prefunded_voting_balance(&self) -> Result<JsValue, JsValue> { + let prefunded_voting_balance = self.inner.prefunded_voting_balance().clone(); + + match prefunded_voting_balance { + None => Ok(JsValue::null()), + Some((index_name, credits)) => { + let js_object = js_sys::Object::new(); + + js_sys::Reflect::set( + &js_object, + &JsValue::from_str(&index_name), + &JsValue::from(credits), + )?; + + Ok(JsValue::from(js_object)) + } + } } // // AbstractDocumentTransitionMethods diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_delete_transition.rs similarity index 68% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_delete_transition.rs index df92c0605df..451de27743f 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_delete_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_delete_transition.rs @@ -1,4 +1,4 @@ -use dpp::state_transition::documents_batch_transition::{ +use dpp::state_transition::batch_transition::{ document_delete_transition, DocumentDeleteTransition, }; @@ -10,9 +10,9 @@ use crate::{ document::document_batch_transition::document_transition::to_object, identifier::IdentifierWrapper, utils::WithJsError, }; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::document_delete_transition::v0::v0_methods::DocumentDeleteTransitionV0Methods; +use dpp::state_transition::batch_transition::document_transition::action_type::DocumentTransitionActionType; #[wasm_bindgen(js_name=DocumentDeleteTransition)] #[derive(Debug, Clone)] @@ -68,11 +68,30 @@ impl DocumentDeleteTransitionWasm { self.inner.base().document_type_name().clone() } + #[wasm_bindgen(js_name = getEntropy)] + pub fn get_entropy(&self) -> Vec<u8> { + Vec::from(self.inner.entropy()) + } + #[wasm_bindgen(js_name=getDataContractId)] pub fn data_contract_id(&self) -> IdentifierWrapper { self.inner.base().data_contract_id().into() } + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> u64 { + self.inner.base().identity_contract_nonce() as u64 + } + + #[wasm_bindgen(js_name=setIdentityContractNonce)] + pub fn set_identity_contract_nonce(&mut self, identity_contract_nonce: u64) { + let mut base = self.inner.base().clone(); + + base.set_identity_contract_nonce(identity_contract_nonce); + + self.inner.set_base(base) + } + #[wasm_bindgen(js_name=get)] pub fn get(&self, path: String) -> Result<JsValue, JsValue> { let _ = path; diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_replace_transition.rs similarity index 91% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_replace_transition.rs index e0fcdbaeb3f..8b354ffeb32 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/document_replace_transition.rs +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/document_replace_transition.rs @@ -3,11 +3,15 @@ use std::convert::TryInto; use serde_json::Value as JsonValue; +use dpp::data_contract::accessors::v0::DataContractV0Getters; +use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; use dpp::platform_value::btreemap_extensions::{ BTreeValueMapHelper, BTreeValueMapPathHelper, BTreeValueMapReplacementPathHelper, }; use dpp::platform_value::ReplacementType; use dpp::prelude::Revision; +use dpp::state_transition::batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; +use dpp::state_transition::batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use dpp::{ prelude::{DataContract, Identifier}, state_transition::documents_batch_transition::{ @@ -18,10 +22,6 @@ use dpp::{ }; use serde::Serialize; use wasm_bindgen::prelude::*; -use dpp::data_contract::accessors::v0::DataContractV0Getters; -use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters; -use dpp::state_transition::documents_batch_transition::document_base_transition::v0::v0_methods::DocumentBaseTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; use crate::{ buffer::Buffer, @@ -31,7 +31,7 @@ use crate::{ utils::{ToSerdeJSONExt, WithJsError}, BinaryType, DataContractWasm, }; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::DocumentTransitionActionType; +use dpp::state_transition::batch_transition::document_transition::action_type::DocumentTransitionActionType; #[wasm_bindgen(js_name=DocumentReplaceTransition)] #[derive(Debug, Clone)] @@ -96,6 +96,11 @@ impl DocumentReplaceTransitionWasm { self.inner.revision() } + #[wasm_bindgen(js_name = getEntropy)] + pub fn get_entropy(&self) -> Vec<u8> { + Vec::from(self.inner.entropy()) + } + #[wasm_bindgen(js_name=getUpdatedAt)] pub fn updated_at(&self) -> Option<js_sys::Date> { self.inner @@ -189,6 +194,20 @@ impl DocumentReplaceTransitionWasm { self.inner.base().data_contract_id().into() } + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> u64 { + self.inner.base().identity_contract_nonce() as u64 + } + + #[wasm_bindgen(js_name=setIdentityContractNonce)] + pub fn set_identity_contract_nonce(&mut self, identity_contract_nonce: u64) -> () { + let mut base = self.inner.base().clone(); + + base.set_identity_contract_nonce(identity_contract_nonce); + + self.inner.set_base(base) + } + #[wasm_bindgen(js_name=get)] pub fn get(&self, path: String) -> Result<JsValue, JsValue> { let document_data = if let Some(ref data) = self.inner.data() { diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/mod.rs similarity index 50% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/mod.rs index a26d579d7de..d7080c5da83 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/document_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/document_transition/mod.rs @@ -7,17 +7,23 @@ mod document_create_transition; // pub use document_replace_transition::*; use dpp::platform_value::Value; -use dpp::state_transition::documents_batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; -use dpp::state_transition::documents_batch_transition::document_transition::action_type::TransitionActionTypeGetter; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransitionV0Methods; -use dpp::{ - state_transition::documents_batch_transition::document_transition::DocumentTransition, - util::json_value::JsonValueExt, ProtocolError, +use dpp::state_transition::batch_transition::batched_transition::document_transition::{ + DocumentTransition, DocumentTransitionV0Methods, }; +use dpp::state_transition::batch_transition::batched_transition::document_transition_action_type::DocumentTransitionActionTypeGetter; +use dpp::state_transition::batch_transition::document_create_transition::v0::v0_methods::DocumentCreateTransitionV0Methods; +use dpp::{util::json_value::JsonValueExt, ProtocolError}; use serde::Serialize; use serde_json::Value as JsonValue; use wasm_bindgen::prelude::*; - +use dpp::fee::Credits; +use dpp::platform_value::converter::serde_json::BTreeValueJsonConverter; +use dpp::prelude::Revision; +use dpp::state_transition::batch_transition::document_base_transition::DocumentBaseTransition; +use dpp::state_transition::batch_transition::document_replace_transition::v0::v0_methods::DocumentReplaceTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_purchase_transition::v0::v0_methods::DocumentPurchaseTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_transfer_transition::v0::v0_methods::DocumentTransferTransitionV0Methods; +use dpp::state_transition::batch_transition::batched_transition::document_update_price_transition::v0::v0_methods::DocumentUpdatePriceTransitionV0Methods; use crate::{ buffer::Buffer, identifier::{identifier_from_js_value, IdentifierWrapper}, @@ -42,6 +48,28 @@ impl DocumentTransitionWasm { self.0.document_type_name().to_owned() } + #[wasm_bindgen(js_name=getData)] + pub fn get_data(&self) -> JsValue { + match &self.0 { + DocumentTransition::Create(document_create_transition) => { + let json_value = document_create_transition.data().to_json_value().unwrap(); + json_value + .serialize(&serde_wasm_bindgen::Serializer::json_compatible()) + .unwrap() + } + DocumentTransition::Replace(document_replace_transition) => { + let json_value = document_replace_transition.data().to_json_value().unwrap(); + json_value + .serialize(&serde_wasm_bindgen::Serializer::json_compatible()) + .unwrap() + } + DocumentTransition::Delete(_) => JsValue::null(), + DocumentTransition::Transfer(_) => JsValue::null(), + DocumentTransition::UpdatePrice(_) => JsValue::null(), + DocumentTransition::Purchase(_) => JsValue::null(), + } + } + #[wasm_bindgen(js_name=getAction)] pub fn get_action(&self) -> u8 { self.0.action_type() as u8 @@ -59,18 +87,49 @@ impl DocumentTransitionWasm { Ok(()) } + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_contract_nonce(&self) -> JsValue { + match self.0.base() { + DocumentBaseTransition::V0(v0) => JsValue::from(v0.identity_contract_nonce), + } + } + #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> JsValue { - if let Some(revision) = self.0.revision() { - (revision as f64).into() - } else { - JsValue::NULL + pub fn get_revision(&self) -> Option<Revision> { + self.0.revision() + } + #[wasm_bindgen(js_name=getEntropy)] + pub fn get_entropy(&self) -> Option<Vec<u8>> { + self.0.entropy() + } + + #[wasm_bindgen(js_name=get_price)] + pub fn get_price(&self) -> Option<Credits> { + match &self.0 { + DocumentTransition::Create(_) => None, + DocumentTransition::Replace(_) => None, + DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(_) => None, + DocumentTransition::UpdatePrice(update_price) => Some(update_price.price()), + DocumentTransition::Purchase(purchase) => Some(purchase.price()), + } + } + + #[wasm_bindgen(js_name=getReceiverId)] + pub fn get_receiver_id(&self) -> Option<IdentifierWrapper> { + match &self.0 { + DocumentTransition::Create(_) => None, + DocumentTransition::Replace(_) => None, + DocumentTransition::Delete(_) => None, + DocumentTransition::Transfer(transfer) => Some(transfer.recipient_owner_id().into()), + DocumentTransition::UpdatePrice(_) => None, + DocumentTransition::Purchase(_) => None, } } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: u32) { - self.0.set_revision(revision as u64); + pub fn set_revision(&mut self, revision: u64) { + self.0.set_revision(revision); } #[wasm_bindgen(js_name=hasPrefundedBalance)] @@ -82,6 +141,32 @@ impl DocumentTransitionWasm { _ => false, } } + + #[wasm_bindgen(js_name=getPrefundedVotingBalance)] + pub fn get_prefunded_voting_balance(&self) -> Result<JsValue, JsValue> { + match &self.0 { + DocumentTransition::Create(create_transition) => { + let prefunded_voting_balance = create_transition.prefunded_voting_balance().clone(); + + if prefunded_voting_balance.is_none() { + return Ok(JsValue::null()); + } + + let (index_name, credits) = prefunded_voting_balance.unwrap(); + + let js_object = js_sys::Object::new(); + + js_sys::Reflect::set( + &js_object, + &JsValue::from_str(&index_name), + &JsValue::from(credits), + )?; + + Ok(JsValue::from(js_object)) + } + _ => Ok(JsValue::null()), + } + } } impl From<DocumentTransition> for DocumentTransitionWasm { diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs similarity index 85% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs index d0ebb9ae56d..02cb8d66297 100644 --- a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/mod.rs @@ -12,9 +12,8 @@ use dpp::consensus::signature::SignatureError; use dpp::consensus::ConsensusError; use dpp::platform_value::BinaryData; use dpp::serialization::PlatformSerializable; -use dpp::state_transition::documents_batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; -use dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; -use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition; +use dpp::state_transition::batch_transition::accessors::DocumentsBatchTransitionAccessorsV0; +use dpp::state_transition::batch_transition::BatchTransition; use dpp::state_transition::StateTransition; use wasm_bindgen::prelude::*; @@ -26,17 +25,23 @@ use crate::{ IdentityPublicKeyWasm, }; -use document_transition::DocumentTransitionWasm; -use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use dpp::ed25519_dalek::ed25519::signature::SignerMut; +use dpp::state_transition::batch_transition::batched_transition::BatchedTransition; +use dpp::state_transition::batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0; +use crate::batch_transition::batched_transition::BatchedTransitionWasm; +use crate::batch_transition::document_transition::DocumentTransitionWasm; +use crate::batch_transition::token_transition::TokenTransitionWasm; use dpp::state_transition::StateTransitionIdentitySigned; +mod batched_transition; pub mod document_transition; +mod token_transition; // pub mod validation; #[derive(Clone, Debug)] -#[wasm_bindgen(js_name = DocumentsBatchTransition)] -pub struct DocumentsBatchTransitionWasm(DocumentsBatchTransition); +#[wasm_bindgen(js_name = BatchTransition)] +pub struct BatchTransitionWasm(BatchTransition); #[derive(Debug, Serialize, Deserialize, Default, Clone, Copy)] #[serde(rename_all = "camelCase")] @@ -47,8 +52,8 @@ pub struct ToObjectOptions { skip_identifiers_conversion: bool, } -#[wasm_bindgen(js_class=DocumentsBatchTransition)] -impl DocumentsBatchTransitionWasm { +#[wasm_bindgen(js_class=BatchTransition)] +impl BatchTransitionWasm { // #[wasm_bindgen(constructor)] // pub fn from_object( // js_raw_transition: JsValue, @@ -90,7 +95,7 @@ impl DocumentsBatchTransitionWasm { #[wasm_bindgen(js_name=getType)] pub fn get_type(&self) -> u8 { - StateTransitionType::DocumentsBatch.into() + StateTransitionType::Batch.into() } #[wasm_bindgen(js_name=getOwnerId)] @@ -98,14 +103,26 @@ impl DocumentsBatchTransitionWasm { self.0.owner_id().to_owned().into() } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + #[wasm_bindgen(js_name=getTransitions)] pub fn get_transitions(&self) -> js_sys::Array { let array = js_sys::Array::new(); - let transitions = self.0.transitions(); - for tr in transitions.iter().cloned() { - let transition: DocumentTransitionWasm = tr.into(); - array.push(&transition.into()); + for tr in self.0.transitions_iter() { + let js_value = match tr.to_owned_transition() { + BatchedTransition::Token(doc) => TokenTransitionWasm::from(doc).into(), + BatchedTransition::Document(tok) => DocumentTransitionWasm::from(tok).into(), + }; + array.push(&js_value); } array @@ -115,8 +132,8 @@ impl DocumentsBatchTransitionWasm { pub fn set_transitions(&mut self, js_transitions: Array) -> Result<(), JsValue> { let mut transitions = vec![]; for js_transition in js_transitions.iter() { - let transition: DocumentTransition = js_transition - .to_wasm::<DocumentTransitionWasm>("DocumentTransition")? + let transition: BatchedTransition = js_transition + .to_wasm::<BatchedTransitionWasm>("BatchedTransition")? .to_owned() .into(); transitions.push(transition) @@ -128,8 +145,8 @@ impl DocumentsBatchTransitionWasm { } #[wasm_bindgen(js_name=setIdentityContractNonce)] - pub fn set_identity_contract_nonce(&mut self, nonce: u32) { - self.0.set_identity_contract_nonce(nonce as u64); + pub fn set_identity_contract_nonce(&mut self, nonce: u64) { + self.0.set_identity_contract_nonce(nonce); } // #[wasm_bindgen(js_name=toJSON)] @@ -276,7 +293,7 @@ impl DocumentsBatchTransitionWasm { let bls_adapter = BlsAdapter(bls); // TODO: come up with a better way to set signature to the binding. - let mut state_transition = StateTransition::DocumentsBatch(self.0.clone()); + let mut state_transition = StateTransition::Batch(self.0.clone()); state_transition .sign( &identity_public_key.to_owned().into(), @@ -322,7 +339,7 @@ impl DocumentsBatchTransitionWasm { ) -> Result<bool, JsValue> { let bls_adapter = BlsAdapter(bls); - let verification_result = StateTransition::DocumentsBatch(self.0.clone()) + let verification_result = StateTransition::Batch(self.0.clone()) .verify_signature(&identity_public_key.to_owned().into(), &bls_adapter); match verification_result { @@ -402,10 +419,9 @@ impl DocumentsBatchTransitionWasm { #[wasm_bindgen(js_name=toBuffer)] pub fn to_buffer(&self) -> Result<Buffer, JsValue> { - let bytes = PlatformSerializable::serialize_to_bytes(&StateTransition::DocumentsBatch( - self.0.clone(), - )) - .with_js_error()?; + let bytes = + PlatformSerializable::serialize_to_bytes(&StateTransition::Batch(self.0.clone())) + .with_js_error()?; Ok(Buffer::from_bytes(&bytes)) } @@ -423,14 +439,14 @@ impl DocumentsBatchTransitionWasm { // } } -impl From<DocumentsBatchTransition> for DocumentsBatchTransitionWasm { - fn from(t: DocumentsBatchTransition) -> Self { - DocumentsBatchTransitionWasm(t) +impl From<BatchTransition> for BatchTransitionWasm { + fn from(t: BatchTransition) -> Self { + BatchTransitionWasm(t) } } -impl From<DocumentsBatchTransitionWasm> for DocumentsBatchTransition { - fn from(t: DocumentsBatchTransitionWasm) -> Self { +impl From<BatchTransitionWasm> for BatchTransition { + fn from(t: BatchTransitionWasm) -> Self { t.0 } } diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs new file mode 100644 index 00000000000..d3b31f9f889 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/burn.rs @@ -0,0 +1,12 @@ +use dpp::state_transition::batch_transition::TokenBurnTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenBurnTransition)] +#[derive(Debug, Clone)] +pub struct TokenBurnTransitionWasm(TokenBurnTransition); + +impl From<TokenBurnTransition> for TokenBurnTransitionWasm { + fn from(value: TokenBurnTransition) -> Self { + Self(value) + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs new file mode 100644 index 00000000000..10712d3cd8a --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/config.rs @@ -0,0 +1,12 @@ +use dpp::state_transition::batch_transition::TokenConfigUpdateTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenConfigUpdateTransition)] +#[derive(Debug, Clone)] +pub struct TokenConfigUpdateTransitionWasm(TokenConfigUpdateTransition); + +impl From<TokenConfigUpdateTransition> for TokenConfigUpdateTransitionWasm { + fn from(value: TokenConfigUpdateTransition) -> Self { + Self(value) + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destroy.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destroy.rs new file mode 100644 index 00000000000..71d9a7f6195 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/destroy.rs @@ -0,0 +1,22 @@ +use crate::identifier::IdentifierWrapper; +use wasm_bindgen::prelude::wasm_bindgen; +use dpp::state_transition::batch_transition::token_destroy_frozen_funds_transition::v0::v0_methods::TokenDestroyFrozenFundsTransitionV0Methods; +use dpp::state_transition::batch_transition::TokenDestroyFrozenFundsTransition; + +#[wasm_bindgen(js_name=TokenDestroyFrozenFundsTransition)] +#[derive(Debug, Clone)] +pub struct TokenDestroyFrozenFundsTransitionWasm(TokenDestroyFrozenFundsTransition); + +impl From<TokenDestroyFrozenFundsTransition> for TokenDestroyFrozenFundsTransitionWasm { + fn from(value: TokenDestroyFrozenFundsTransition) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl TokenDestroyFrozenFundsTransitionWasm { + #[wasm_bindgen(js_name=getFrozenIdentityId)] + pub fn frozen_identity_id(&self) -> IdentifierWrapper { + self.0.frozen_identity_id().into() + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency_action.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency_action.rs new file mode 100644 index 00000000000..ba704f005af --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/emergency_action.rs @@ -0,0 +1,12 @@ +use dpp::state_transition::batch_transition::TokenEmergencyActionTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenEmergencyActionTransition)] +#[derive(Debug, Clone)] +pub struct TokenEmergencyActionTransitionWasm(TokenEmergencyActionTransition); + +impl From<TokenEmergencyActionTransition> for TokenEmergencyActionTransitionWasm { + fn from(value: TokenEmergencyActionTransition) -> Self { + Self(value) + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs new file mode 100644 index 00000000000..5957967fe50 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/freeze.rs @@ -0,0 +1,22 @@ +use crate::identifier::IdentifierWrapper; +use dpp::state_transition::batch_transition::token_freeze_transition::v0::v0_methods::TokenFreezeTransitionV0Methods; +use dpp::state_transition::batch_transition::TokenFreezeTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenFreezeTransition)] +#[derive(Debug, Clone)] +pub struct TokenFreezeTransitionWasm(TokenFreezeTransition); + +impl From<TokenFreezeTransition> for TokenFreezeTransitionWasm { + fn from(value: TokenFreezeTransition) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl TokenFreezeTransitionWasm { + #[wasm_bindgen(js_name=getFrozenIdentityId)] + pub fn frozen_identity_id(&self) -> IdentifierWrapper { + self.0.frozen_identity_id().into() + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs new file mode 100644 index 00000000000..0edb35f6368 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mint.rs @@ -0,0 +1,31 @@ +use crate::identifier::IdentifierWrapper; +use crate::tokens::TokenConfigurationWasm; +use crate::utils::WithJsError; +use dpp::state_transition::batch_transition::token_mint_transition::v0::v0_methods::TokenMintTransitionV0Methods; +use dpp::state_transition::batch_transition::TokenMintTransition; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; + +#[wasm_bindgen(js_name=TokenMintTransition)] +#[derive(Debug, Clone)] +pub struct TokenMintTransitionWasm(TokenMintTransition); + +impl From<TokenMintTransition> for TokenMintTransitionWasm { + fn from(value: TokenMintTransition) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl TokenMintTransitionWasm { + #[wasm_bindgen(js_name=getRecipientId)] + pub fn recipient_id( + &self, + token_configuration: TokenConfigurationWasm, + ) -> Result<IdentifierWrapper, JsValue> { + self.0 + .recipient_id(&token_configuration.into()) + .with_js_error() + .map(Into::into) + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs new file mode 100644 index 00000000000..8a0fb050c00 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/mod.rs @@ -0,0 +1,117 @@ +mod burn; +mod config; +mod destroy; +mod emergency_action; +mod freeze; +mod mint; +mod transfer; +mod unfreeze; + +use crate::batch_transition::token_transition::burn::TokenBurnTransitionWasm; +use crate::batch_transition::token_transition::config::TokenConfigUpdateTransitionWasm; +use crate::batch_transition::token_transition::destroy::TokenDestroyFrozenFundsTransitionWasm; +use crate::batch_transition::token_transition::emergency_action::TokenEmergencyActionTransitionWasm; +use crate::batch_transition::token_transition::freeze::TokenFreezeTransitionWasm; +use crate::batch_transition::token_transition::mint::TokenMintTransitionWasm; +use crate::batch_transition::token_transition::transfer::TokenTransferTransitionWasm; +use crate::batch_transition::token_transition::unfreeze::TokenUnfreezeTransitionWasm; +use crate::identifier::IdentifierWrapper; +use dpp::state_transition::batch_transition::batched_transition::token_transition::{ + TokenTransition, TokenTransitionV0Methods, +}; +use dpp::state_transition::batch_transition::token_base_transition::v0::v0_methods::TokenBaseTransitionV0Methods; +use js_sys::Number; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; + +#[wasm_bindgen] +pub enum TokenTransitionType { + Burn, + Mint, + Transfer, + Freeze, + Unfreeze, + DestroyFrozenFunds, + EmergencyAction, + ConfigUpdate, +} + +impl From<&TokenTransition> for TokenTransitionType { + fn from(t: &TokenTransition) -> Self { + match t { + TokenTransition::Burn(_) => TokenTransitionType::Burn, + TokenTransition::Mint(_) => TokenTransitionType::Mint, + TokenTransition::Transfer(_) => TokenTransitionType::Transfer, + TokenTransition::Freeze(_) => TokenTransitionType::Freeze, + TokenTransition::Unfreeze(_) => TokenTransitionType::Unfreeze, + TokenTransition::DestroyFrozenFunds(_) => TokenTransitionType::DestroyFrozenFunds, + TokenTransition::EmergencyAction(_) => TokenTransitionType::EmergencyAction, + TokenTransition::ConfigUpdate(_) => TokenTransitionType::ConfigUpdate, + } + } +} + +#[wasm_bindgen(js_name=TokenTransition)] +#[derive(Debug, Clone)] +pub struct TokenTransitionWasm(TokenTransition); + +impl From<TokenTransition> for TokenTransitionWasm { + fn from(t: TokenTransition) -> Self { + TokenTransitionWasm(t) + } +} + +impl From<TokenTransitionWasm> for TokenTransition { + fn from(t: TokenTransitionWasm) -> Self { + t.0 + } +} + +#[wasm_bindgen] +impl TokenTransitionWasm { + #[wasm_bindgen(js_name=getTransitionType)] + pub fn transition_type(&self) -> TokenTransitionType { + TokenTransitionType::from(&self.0) + } + + #[wasm_bindgen(js_name=getTokenId)] + pub fn token_id(&self) -> IdentifierWrapper { + self.0.base().token_id().into() + } + + #[wasm_bindgen(js_name=getTokenContractPosition)] + pub fn token_contract_position(&self) -> Number { + self.0.base().token_contract_position().into() + } + + #[wasm_bindgen(js_name=getDataContractId)] + pub fn data_contract_id(&self) -> IdentifierWrapper { + self.0.base().data_contract_id().into() + } + + #[wasm_bindgen(js_name=toTransition)] + pub fn to_transition(&self) -> JsValue { + match &self.0 { + TokenTransition::Burn(burn) => TokenBurnTransitionWasm::from(burn.clone()).into(), + TokenTransition::Mint(mint) => TokenMintTransitionWasm::from(mint.clone()).into(), + TokenTransition::Transfer(transfer) => { + TokenTransferTransitionWasm::from(transfer.clone()).into() + } + TokenTransition::Freeze(freeze) => { + TokenFreezeTransitionWasm::from(freeze.clone()).into() + } + TokenTransition::Unfreeze(unfreeze) => { + TokenUnfreezeTransitionWasm::from(unfreeze.clone()).into() + } + TokenTransition::DestroyFrozenFunds(destroy_frozen_funds) => { + TokenDestroyFrozenFundsTransitionWasm::from(destroy_frozen_funds.clone()).into() + } + TokenTransition::EmergencyAction(emergency_action) => { + TokenEmergencyActionTransitionWasm::from(emergency_action.clone()).into() + } + TokenTransition::ConfigUpdate(config_update) => { + TokenConfigUpdateTransitionWasm::from(config_update.clone()).into() + } + } + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs new file mode 100644 index 00000000000..316a16a2d4f --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/transfer.rs @@ -0,0 +1,22 @@ +use crate::identifier::IdentifierWrapper; +use dpp::state_transition::batch_transition::token_transfer_transition::v0::v0_methods::TokenTransferTransitionV0Methods; +use dpp::state_transition::batch_transition::TokenTransferTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenTransferTransition)] +#[derive(Debug, Clone)] +pub struct TokenTransferTransitionWasm(TokenTransferTransition); + +impl From<TokenTransferTransition> for TokenTransferTransitionWasm { + fn from(value: TokenTransferTransition) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl TokenTransferTransitionWasm { + #[wasm_bindgen(js_name=getRecipientId)] + pub fn recipient_id(&self) -> IdentifierWrapper { + self.0.recipient_id().into() + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs new file mode 100644 index 00000000000..72d65555db8 --- /dev/null +++ b/packages/wasm-dpp/src/document/state_transition/batch_transition/token_transition/unfreeze.rs @@ -0,0 +1,22 @@ +use crate::identifier::IdentifierWrapper; +use dpp::state_transition::batch_transition::token_unfreeze_transition::v0::v0_methods::TokenUnfreezeTransitionV0Methods; +use dpp::state_transition::batch_transition::TokenUnfreezeTransition; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=TokenUnfreezeTransition)] +#[derive(Debug, Clone)] +pub struct TokenUnfreezeTransitionWasm(TokenUnfreezeTransition); + +impl From<TokenUnfreezeTransition> for TokenUnfreezeTransitionWasm { + fn from(value: TokenUnfreezeTransition) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl TokenUnfreezeTransitionWasm { + #[wasm_bindgen(js_name=getFrozenIdentityId)] + pub fn frozen_identity_id(&self) -> IdentifierWrapper { + self.0.frozen_identity_id().into() + } +} diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/find_duplicates_by_id.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_id.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/find_duplicates_by_id.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/find_duplicates_by_indices.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/find_duplicates_by_indices.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/find_duplicates_by_indices.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/mod.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/mod.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/mod.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/validate_documents_batch_transition_basic.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/validate_documents_batch_transition_basic.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/validate_documents_batch_transition_basic.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/validate_partial_compound_indices.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/basic/validate_partial_compound_indices.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/basic/validate_partial_compound_indices.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/mod.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/mod.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/mod.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/fetch_extended_documents.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/fetch_extended_documents.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/fetch_extended_documents.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/mod.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/mod.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/mod.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/mod.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/validate_documents_batch_transitions_state.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_batch_transitions_state.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/validate_documents_batch_transitions_state.rs diff --git a/packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs b/packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs similarity index 100% rename from packages/wasm-dpp/src/document/state_transition/document_batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs rename to packages/wasm-dpp/src/document/state_transition/batch_transition/validation/state/validate_documents_uniqueness_by_indices.rs diff --git a/packages/wasm-dpp/src/document/state_transition/mod.rs b/packages/wasm-dpp/src/document/state_transition/mod.rs index 7db6d118e0a..03238bee69e 100644 --- a/packages/wasm-dpp/src/document/state_transition/mod.rs +++ b/packages/wasm-dpp/src/document/state_transition/mod.rs @@ -1 +1 @@ -pub mod document_batch_transition; +pub mod batch_transition; diff --git a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs index d6b16a71862..5cede681120 100644 --- a/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/basic/identity/identity_insufficient_balance_error.rs @@ -23,8 +23,8 @@ impl IdentityInsufficientBalanceErrorWasm { } #[wasm_bindgen(js_name=getBalance)] - pub fn balance(&self) -> u32 { - self.inner.balance() as u32 + pub fn balance(&self) -> u64 { + self.inner.balance() } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs index 627b65a2674..a063f17fe0c 100644 --- a/packages/wasm-dpp/src/errors/consensus/consensus_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/consensus_error.rs @@ -61,10 +61,13 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{ DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError, }; use wasm_bindgen::{JsError, JsValue}; -use dpp::consensus::basic::data_contract::{ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, InvalidDocumentTypeRequiredSecurityLevelError, UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; +use dpp::consensus::basic::data_contract::{ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, DataContractTokenConfigurationUpdateError, GroupExceedsMaxMembersError, GroupMemberHasPowerOfZeroError, GroupMemberHasPowerOverLimitError, GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, GroupPositionDoesNotExistError, GroupTotalPowerLessThanRequiredError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidTokenBaseSupplyError, NonContiguousContractGroupPositionsError, NonContiguousContractTokenPositionsError, UnknownDocumentCreationRestrictionModeError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError}; use dpp::consensus::basic::document::{ContestedDocumentsTemporarilyNotAllowedError, DocumentCreationNotAllowedError, DocumentFieldMaxSizeExceededError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError}; +use dpp::consensus::basic::group::GroupActionNotAllowedOnTransitionError; use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError, WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError}; use dpp::consensus::basic::overflow_error::OverflowError; +use dpp::consensus::basic::token::{ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError, DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError, InvalidTokenPositionError, TokenTransferToOurselfError}; +use dpp::consensus::state::data_contract::data_contract_update_action_not_allowed_error::DataContractUpdateActionNotAllowedError; use dpp::consensus::state::data_contract::document_type_update_error::DocumentTypeUpdateError; use dpp::consensus::state::document::document_contest_currently_locked_error::DocumentContestCurrentlyLockedError; use dpp::consensus::state::document::document_contest_document_with_same_id_already_present_error::DocumentContestDocumentWithSameIdAlreadyPresentError; @@ -73,12 +76,15 @@ use dpp::consensus::state::document::document_contest_not_joinable_error::Docume use dpp::consensus::state::document::document_contest_not_paid_for_error::DocumentContestNotPaidForError; use dpp::consensus::state::document::document_incorrect_purchase_price_error::DocumentIncorrectPurchasePriceError; use dpp::consensus::state::document::document_not_for_sale_error::DocumentNotForSaleError; +use dpp::consensus::state::group::{GroupActionAlreadyCompletedError, GroupActionAlreadySignedByIdentityError, GroupActionDoesNotExistError, IdentityNotMemberOfGroupError}; use dpp::consensus::state::identity::identity_public_key_already_exists_for_unique_contract_bounds_error::IdentityPublicKeyAlreadyExistsForUniqueContractBoundsError; use dpp::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError; use dpp::consensus::state::identity::missing_transfer_key_error::MissingTransferKeyError; use dpp::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError; +use dpp::consensus::state::identity::RecipientIdentityDoesNotExistError; use dpp::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_insufficient_error::PrefundedSpecializedBalanceInsufficientError; use dpp::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_not_found_error::PrefundedSpecializedBalanceNotFoundError; +use dpp::consensus::state::token::{IdentityDoesNotHaveEnoughTokenBalanceError, IdentityTokenAccountNotFrozenError, IdentityTokenAccountFrozenError, TokenIsPausedError, IdentityTokenAccountAlreadyFrozenError, UnauthorizedTokenActionError, TokenSettingMaxSupplyToLessThanCurrentSupplyError, TokenMintPastMaxSupplyError, NewTokensDestinationIdentityDoesNotExistError, NewAuthorizedActionTakerIdentityDoesNotExistError, NewAuthorizedActionTakerGroupDoesNotExistError, NewAuthorizedActionTakerMainGroupNotSetError, InvalidGroupPositionError, TokenAlreadyPausedError, TokenNotPausedError}; use dpp::consensus::state::voting::masternode_incorrect_voter_identity_id_error::MasternodeIncorrectVoterIdentityIdError; use dpp::consensus::state::voting::masternode_incorrect_voting_address_error::MasternodeIncorrectVotingAddressError; use dpp::consensus::state::voting::masternode_not_found_error::MasternodeNotFoundError; @@ -308,6 +314,67 @@ pub fn from_state_error(state_error: &StateError) -> JsValue { StateError::DocumentContestNotPaidForError(e) => { generic_consensus_error!(DocumentContestNotPaidForError, e).into() } + StateError::RecipientIdentityDoesNotExistError(e) => { + generic_consensus_error!(RecipientIdentityDoesNotExistError, e).into() + } + StateError::IdentityDoesNotHaveEnoughTokenBalanceError(e) => { + generic_consensus_error!(IdentityDoesNotHaveEnoughTokenBalanceError, e).into() + } + StateError::UnauthorizedTokenActionError(e) => { + generic_consensus_error!(UnauthorizedTokenActionError, e).into() + } + StateError::IdentityTokenAccountFrozenError(e) => { + generic_consensus_error!(IdentityTokenAccountFrozenError, e).into() + } + StateError::TokenIsPausedError(e) => generic_consensus_error!(TokenIsPausedError, e).into(), + StateError::IdentityTokenAccountAlreadyFrozenError(e) => { + generic_consensus_error!(IdentityTokenAccountAlreadyFrozenError, e).into() + } + StateError::TokenAlreadyPausedError(e) => { + generic_consensus_error!(TokenAlreadyPausedError, e).into() + } + StateError::TokenNotPausedError(e) => { + generic_consensus_error!(TokenNotPausedError, e).into() + } + StateError::IdentityNotMemberOfGroupError(e) => { + generic_consensus_error!(IdentityNotMemberOfGroupError, e).into() + } + StateError::GroupActionDoesNotExistError(e) => { + generic_consensus_error!(GroupActionDoesNotExistError, e).into() + } + StateError::GroupActionAlreadyCompletedError(e) => { + generic_consensus_error!(GroupActionAlreadyCompletedError, e).into() + } + StateError::GroupActionAlreadySignedByIdentityError(e) => { + generic_consensus_error!(GroupActionAlreadySignedByIdentityError, e).into() + } + StateError::IdentityTokenAccountNotFrozenError(e) => { + generic_consensus_error!(IdentityTokenAccountNotFrozenError, e).into() + } + StateError::DataContractUpdateActionNotAllowedError(e) => { + generic_consensus_error!(DataContractUpdateActionNotAllowedError, e).into() + } + StateError::TokenSettingMaxSupplyToLessThanCurrentSupplyError(e) => { + generic_consensus_error!(TokenSettingMaxSupplyToLessThanCurrentSupplyError, e).into() + } + StateError::TokenMintPastMaxSupplyError(e) => { + generic_consensus_error!(TokenMintPastMaxSupplyError, e).into() + } + StateError::NewTokensDestinationIdentityDoesNotExistError(e) => { + generic_consensus_error!(NewTokensDestinationIdentityDoesNotExistError, e).into() + } + StateError::NewAuthorizedActionTakerIdentityDoesNotExistError(e) => { + generic_consensus_error!(NewAuthorizedActionTakerIdentityDoesNotExistError, e).into() + } + StateError::NewAuthorizedActionTakerGroupDoesNotExistError(e) => { + generic_consensus_error!(NewAuthorizedActionTakerGroupDoesNotExistError, e).into() + } + StateError::NewAuthorizedActionTakerMainGroupNotSetError(e) => { + generic_consensus_error!(NewAuthorizedActionTakerMainGroupNotSetError, e).into() + } + StateError::InvalidGroupPositionError(e) => { + generic_consensus_error!(InvalidGroupPositionError, e).into() + } } } @@ -571,6 +638,67 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue { ) .into() } + BasicError::DataContractTokenConfigurationUpdateError(e) => { + generic_consensus_error!(DataContractTokenConfigurationUpdateError, e).into() + } + BasicError::InvalidTokenIdError(e) => { + generic_consensus_error!(InvalidTokenIdError, e).into() + } + + BasicError::InvalidTokenPositionError(e) => { + generic_consensus_error!(InvalidTokenPositionError, e).into() + } + + BasicError::ContractHasNoTokensError(e) => { + generic_consensus_error!(ContractHasNoTokensError, e).into() + } + + BasicError::InvalidActionIdError(e) => { + generic_consensus_error!(InvalidActionIdError, e).into() + } + BasicError::NonContiguousContractTokenPositionsError(e) => { + generic_consensus_error!(NonContiguousContractTokenPositionsError, e).into() + } + BasicError::NonContiguousContractGroupPositionsError(e) => { + generic_consensus_error!(NonContiguousContractGroupPositionsError, e).into() + } + BasicError::InvalidTokenBaseSupplyError(e) => { + generic_consensus_error!(InvalidTokenBaseSupplyError, e).into() + } + BasicError::TokenTransferToOurselfError(e) => { + generic_consensus_error!(TokenTransferToOurselfError, e).into() + } + BasicError::DestinationIdentityForTokenMintingNotSetError(e) => { + generic_consensus_error!(DestinationIdentityForTokenMintingNotSetError, e).into() + } + BasicError::ChoosingTokenMintRecipientNotAllowedError(e) => { + generic_consensus_error!(ChoosingTokenMintRecipientNotAllowedError, e).into() + } + BasicError::GroupActionNotAllowedOnTransitionError(e) => { + generic_consensus_error!(GroupActionNotAllowedOnTransitionError, e).into() + } + BasicError::GroupPositionDoesNotExistError(e) => { + generic_consensus_error!(GroupPositionDoesNotExistError, e).into() + } + BasicError::GroupExceedsMaxMembersError(e) => { + generic_consensus_error!(GroupExceedsMaxMembersError, e).into() + } + BasicError::GroupMemberHasPowerOfZeroError(e) => { + generic_consensus_error!(GroupMemberHasPowerOfZeroError, e).into() + } + BasicError::GroupMemberHasPowerOverLimitError(e) => { + generic_consensus_error!(GroupMemberHasPowerOverLimitError, e).into() + } + BasicError::GroupTotalPowerLessThanRequiredError(e) => { + generic_consensus_error!(GroupTotalPowerLessThanRequiredError, e).into() + } + BasicError::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(e) => { + generic_consensus_error!( + GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, + e + ) + .into() + } } } diff --git a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs index e5599fe3bde..7d5fb848eb7 100644 --- a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs @@ -29,13 +29,13 @@ impl BalanceIsNotEnoughErrorWasm { } #[wasm_bindgen(js_name=getBalance)] - pub fn get_balance(&self) -> f64 { - self.inner.balance() as f64 + pub fn get_balance(&self) -> u64 { + self.inner.balance() } #[wasm_bindgen(js_name=getFee)] - pub fn get_fee(&self) -> f64 { - self.inner.fee() as f64 + pub fn get_fee(&self) -> u64 { + self.inner.fee() as u64 } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/factory_utils.rs b/packages/wasm-dpp/src/identity/factory_utils.rs index 18e19428423..f14431ac8ee 100644 --- a/packages/wasm-dpp/src/identity/factory_utils.rs +++ b/packages/wasm-dpp/src/identity/factory_utils.rs @@ -9,7 +9,6 @@ use dpp::identity::{IdentityPublicKey, KeyID}; use dpp::serialization::ValueConvertible; use dpp::state_transition::public_key_in_creation::IdentityPublicKeyInCreation; use std::collections::BTreeMap; -use wasm_bindgen::__rt::Ref; use wasm_bindgen::{JsCast, JsValue}; pub fn parse_public_keys( @@ -47,11 +46,10 @@ pub fn parse_create_identity_update_transition_keys( let keys: Vec<IdentityPublicKeyInCreation> = add_public_keys_array .iter() .map(|key| { - let public_key: Ref<IdentityPublicKeyWithWitnessWasm> = - generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( - &key, - "IdentityPublicKeyWithWitness", - )?; + let public_key = generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( + &key, + "IdentityPublicKeyWithWitness", + )?; Ok(public_key.clone().into()) }) @@ -74,7 +72,7 @@ pub fn parse_create_identity_update_transition_keys( let keys: Vec<KeyID> = disable_public_keys_array .iter() .map(|key| { - let public_key_wasm: Ref<IdentityPublicKeyWasm> = + let public_key_wasm = generic_of_js_val::<IdentityPublicKeyWasm>(&key, "IdentityPublicKey")?; Ok(public_key_wasm.get_id()) }) diff --git a/packages/wasm-dpp/src/identity/identity.rs b/packages/wasm-dpp/src/identity/identity.rs index d6c22dacec3..ef8cf76336e 100644 --- a/packages/wasm-dpp/src/identity/identity.rs +++ b/packages/wasm-dpp/src/identity/identity.rs @@ -105,38 +105,38 @@ impl IdentityWasm { } #[wasm_bindgen(getter)] - pub fn balance(&self) -> f64 { - self.inner.balance() as f64 + pub fn balance(&self) -> u64 { + self.inner.balance() } #[wasm_bindgen(js_name=getBalance)] - pub fn get_balance(&self) -> f64 { - self.inner.balance() as f64 + pub fn get_balance(&self) -> u64 { + self.inner.balance() } #[wasm_bindgen(js_name=setBalance)] - pub fn set_balance(&mut self, balance: f64) { - self.inner.set_balance(balance as u64); + pub fn set_balance(&mut self, balance: u64) { + self.inner.set_balance(balance); } #[wasm_bindgen(js_name=increaseBalance)] - pub fn increase_balance(&mut self, amount: f64) -> f64 { - self.inner.increase_balance(amount as u64) as f64 + pub fn increase_balance(&mut self, amount: u64) -> u64 { + self.inner.increase_balance(amount) } #[wasm_bindgen(js_name=reduceBalance)] - pub fn reduce_balance(&mut self, amount: f64) -> f64 { - self.inner.reduce_balance(amount as u64) as f64 + pub fn reduce_balance(&mut self, amount: u64) -> u64 { + self.inner.reduce_balance(amount) } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: f64) { - self.inner.set_revision(revision as u64); + pub fn set_revision(&mut self, revision: u64) { + self.inner.set_revision(revision); } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> f64 { - self.inner.revision() as f64 + pub fn get_revision(&self) -> u64 { + self.inner.revision() as u64 } #[wasm_bindgen(js_name=setMetadata)] diff --git a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs index 861188d0ca4..dd4fca03cd3 100644 --- a/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs +++ b/packages/wasm-dpp/src/identity/state_transition/asset_lock_proof/mod.rs @@ -5,7 +5,6 @@ pub use chain::*; pub use instant::*; use std::convert::TryInto; use wasm_bindgen::JsCast; -use wasm_bindgen::__rt::Ref; use dpp::identity::errors::UnknownAssetLockProofTypeError; use wasm_bindgen::prelude::*; @@ -144,13 +143,13 @@ pub fn create_asset_lock_proof_from_wasm_instance( match lock_type { AssetLockProofType::Instant => { - let instant: Ref<InstantAssetLockProofWasm> = + let instant = generic_of_js_val::<InstantAssetLockProofWasm>(js_value, "InstantAssetLockProof")?; Ok(AssetLockProof::Instant(instant.clone().into())) } AssetLockProofType::Chain => { - let chain: Ref<ChainAssetLockProofWasm> = + let chain = generic_of_js_val::<ChainAssetLockProofWasm>(js_value, "ChainAssetLockProof")?; Ok(AssetLockProof::Chain(chain.clone().into())) diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs index 86681592df3..672b8541321 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_create_transition/identity_create_transition.rs @@ -1,6 +1,5 @@ use std::default::Default; -use wasm_bindgen::__rt::Ref; use wasm_bindgen::prelude::*; use crate::bls_adapter::BlsAdapter; @@ -101,11 +100,10 @@ impl IdentityCreateTransitionWasm { let public_keys = public_keys .iter() .map(|value| { - let public_key: Ref<IdentityPublicKeyWithWitnessWasm> = - generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( - value, - "IdentityPublicKeyWithWitness", - )?; + let public_key = generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( + value, + "IdentityPublicKeyWithWitness", + )?; Ok(public_key.clone().into()) }) .collect::<Result<Vec<IdentityPublicKeyInCreation>, JsValue>>()?; @@ -120,11 +118,10 @@ impl IdentityCreateTransitionWasm { let mut public_keys = public_keys .iter() .map(|value| { - let public_key: Ref<IdentityPublicKeyWithWitnessWasm> = - generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( - value, - "IdentityPublicKeyWithWitness", - )?; + let public_key = generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( + value, + "IdentityPublicKeyWithWitness", + )?; Ok(public_key.clone().into()) }) .collect::<Result<Vec<IdentityPublicKeyInCreation>, JsValue>>()?; @@ -170,6 +167,16 @@ impl IdentityCreateTransitionWasm { (IdentityCreateTransitionAccessorsV0::owner_id(&self.0)).into() } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> { let opts: super::to_object::ToObjectOptions = if options.is_object() { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs index 40fcf84fb96..40501905f86 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_transfer_transition/transition.rs @@ -90,13 +90,33 @@ impl IdentityCreditTransferTransitionWasm { } #[wasm_bindgen(js_name=getAmount)] - pub fn get_amount(&self) -> f64 { - self.0.amount() as f64 + pub fn get_amount(&self) -> u64 { + self.0.amount() } #[wasm_bindgen(js_name=setAmount)] - pub fn set_amount(&mut self, amount: f64) { - self.0.set_amount(amount as u64); + pub fn set_amount(&mut self, amount: u64) { + self.0.set_amount(amount); + } + + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + + #[wasm_bindgen(js_name=getNonce)] + pub fn get_nonce(&self) -> u64 { + self.0.nonce() + } + + #[wasm_bindgen(js_name=setNonce)] + pub fn set_nonce(&mut self, nonce: u64) { + self.0.set_nonce(nonce) } #[wasm_bindgen(js_name=toObject)] @@ -161,7 +181,7 @@ impl IdentityCreditTransferTransitionWasm { js_sys::Reflect::set( &js_object, &"amount".to_owned().into(), - &JsValue::from_f64(object.amount as f64), + &JsValue::bigint_from_str(&object.amount.to_string()), )?; Ok(js_object.into()) @@ -236,7 +256,7 @@ impl IdentityCreditTransferTransitionWasm { js_sys::Reflect::set( &js_object, &"amount".to_owned().into(), - &JsValue::from_f64(object.amount as f64), + &JsValue::bigint_from_str(&object.amount.to_string()), )?; Ok(js_object.into()) @@ -318,6 +338,11 @@ impl IdentityCreditTransferTransitionWasm { .set_signature(BinaryData::new(signature.unwrap_or_default())) } + #[wasm_bindgen(js_name=getSignaturePublicKeyId)] + pub fn get_signature_public_key_id(&self) -> u32 { + self.0.signature_public_key_id() + } + #[wasm_bindgen] pub fn sign( &mut self, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs index 3de33cb834d..2b4462d1ad7 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_credit_withdrawal_transition/transition.rs @@ -136,6 +136,16 @@ impl IdentityCreditWithdrawalTransitionWasm { self.0.set_nonce(revision); } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> { let opts: super::to_object::ToObjectOptions = if options.is_object() { @@ -400,6 +410,11 @@ impl IdentityCreditWithdrawalTransitionWasm { .set_signature(BinaryData::new(signature.unwrap_or_default())) } + #[wasm_bindgen(js_name=getSignaturePublicKeyId)] + pub fn get_signature_public_key_id(&self) -> u32 { + self.0.signature_public_key_id() + } + #[wasm_bindgen] pub fn sign( &mut self, diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs index 5455e12edca..ff79eb2479c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_topup_transition/identity_topup_transition.rs @@ -115,6 +115,16 @@ impl IdentityTopUpTransitionWasm { self.0.owner_id().to_owned().into() } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> { let opts: super::to_object::ToObjectOptions = if options.is_object() { diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs index 1d8988ba6f9..4c48002bb52 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/identity_update_transition.rs @@ -1,24 +1,12 @@ -use std::convert::TryInto; -use std::default::Default; - -use serde::{Deserialize, Serialize}; - -use wasm_bindgen::__rt::Ref; -use wasm_bindgen::prelude::*; - +use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; +use crate::errors::from_dpp_err; use crate::identifier::IdentifierWrapper; - +use crate::utils::{generic_of_js_val, WithJsError}; use crate::{ buffer::Buffer, identity::state_transition::identity_public_key_transitions::IdentityPublicKeyWithWitnessWasm, identity::IdentityPublicKeyWasm, with_js_error, }; - -use crate::bls_adapter::{BlsAdapter, JsBlsAdapter}; - -use crate::utils::{generic_of_js_val, WithJsError}; - -use crate::errors::from_dpp_err; use dpp::errors::consensus::signature::SignatureError; use dpp::errors::consensus::ConsensusError; use dpp::errors::ProtocolError; @@ -34,6 +22,10 @@ use dpp::state_transition::StateTransition; use dpp::state_transition::StateTransitionIdentitySigned; use dpp::version::PlatformVersion; use dpp::{identifier::Identifier, state_transition::StateTransitionLike}; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use std::default::Default; +use wasm_bindgen::prelude::*; #[wasm_bindgen(js_name=IdentityUpdateTransition)] #[derive(Clone)] @@ -93,11 +85,10 @@ impl IdentityUpdateTransitionWasm { keys_to_add = keys .iter() .map(|value| { - let public_key: Ref<IdentityPublicKeyWithWitnessWasm> = - generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( - value, - "IdentityPublicKeyWithWitness", - )?; + let public_key = generic_of_js_val::<IdentityPublicKeyWithWitnessWasm>( + value, + "IdentityPublicKeyWithWitness", + )?; Ok(public_key.clone().into()) }) .collect::<Result<Vec<IdentityPublicKeyInCreation>, JsValue>>()?; @@ -169,6 +160,26 @@ impl IdentityUpdateTransitionWasm { StateTransitionLike::owner_id(&self.0).to_owned().into() } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_nonce(&self) -> u64 { + self.0.nonce() + } + + #[wasm_bindgen(js_name=setIdentityContractNonce)] + pub fn set_identity_contract_nonce(&mut self, identity_nonce: u64) { + self.0.set_nonce(identity_nonce) + } + #[wasm_bindgen(js_name=toObject)] pub fn to_object(&self, options: JsValue) -> Result<JsValue, JsValue> { let opts: super::to_object::ToObjectOptions = if options.is_object() { @@ -412,6 +423,11 @@ impl IdentityUpdateTransitionWasm { Buffer::from_bytes_owned(self.0.signature().to_vec()) } + #[wasm_bindgen(js_name=getSignaturePublicKeyId)] + pub fn get_signature_public_key_id(&self) -> u32 { + self.0.signature_public_key_id() + } + #[wasm_bindgen(js_name=setSignature)] pub fn set_signature(&mut self, signature: Option<Vec<u8>>) { self.0 @@ -419,13 +435,13 @@ impl IdentityUpdateTransitionWasm { } #[wasm_bindgen(js_name=getRevision)] - pub fn get_revision(&self) -> u32 { - self.0.revision() as u32 + pub fn get_revision(&self) -> u64 { + self.0.revision() } #[wasm_bindgen(js_name=setRevision)] - pub fn set_revision(&mut self, revision: u32) { - self.0.set_revision(revision as u64) + pub fn set_revision(&mut self, revision: u64) { + self.0.set_revision(revision) } #[wasm_bindgen] diff --git a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs index bf343c15808..d00f03e0aa8 100644 --- a/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs +++ b/packages/wasm-dpp/src/identity/state_transition/identity_update_transition/to_object.rs @@ -16,7 +16,7 @@ pub struct ToObjectOptions { #[derive(Default)] pub struct ToObject { pub transition_type: u8, - pub revision: u32, + pub revision: u64, pub signature: Option<Vec<u8>>, pub signature_public_key_id: KeyID, pub public_keys_to_add: Option<Vec<IdentityPublicKeyInCreation>>, @@ -30,7 +30,7 @@ pub fn to_object_struct( ) -> ToObject { let mut to_object = ToObject { transition_type: transition.state_transition_type() as u8, - revision: transition.revision() as u32, + revision: transition.revision(), identity_id: transition.identity_id().to_owned(), ..ToObject::default() }; diff --git a/packages/wasm-dpp/src/identity/state_transition/transition_types.rs b/packages/wasm-dpp/src/identity/state_transition/transition_types.rs index 1a4942726e0..1fa4ee3dd9c 100644 --- a/packages/wasm-dpp/src/identity/state_transition/transition_types.rs +++ b/packages/wasm-dpp/src/identity/state_transition/transition_types.rs @@ -19,7 +19,7 @@ impl From<StateTransitionType> for StateTransitionTypeWasm { fn from(state_transition_type: StateTransitionType) -> Self { match state_transition_type { StateTransitionType::DataContractCreate => StateTransitionTypeWasm::DataContractCreate, - StateTransitionType::DocumentsBatch => StateTransitionTypeWasm::DocumentsBatch, + StateTransitionType::Batch => StateTransitionTypeWasm::DocumentsBatch, StateTransitionType::IdentityCreate => StateTransitionTypeWasm::IdentityCreate, StateTransitionType::IdentityTopUp => StateTransitionTypeWasm::IdentityTopUp, StateTransitionType::DataContractUpdate => StateTransitionTypeWasm::DataContractUpdate, diff --git a/packages/wasm-dpp/src/metadata.rs b/packages/wasm-dpp/src/metadata.rs index e2a19afdf01..aae0298cfb0 100644 --- a/packages/wasm-dpp/src/metadata.rs +++ b/packages/wasm-dpp/src/metadata.rs @@ -3,10 +3,8 @@ pub use serde::Serialize; use wasm_bindgen::prelude::*; -use crate::utils::ToSerdeJSONExt; use dpp::metadata::Metadata; use dpp::util::deserializer::ProtocolVersion; -use dpp::util::json_value::JsonValueExt; #[wasm_bindgen(js_name=Metadata)] #[derive(Clone, Debug)] @@ -34,25 +32,16 @@ impl Into<Metadata> for MetadataWasm { #[wasm_bindgen(js_class=Metadata)] impl MetadataWasm { #[wasm_bindgen(constructor)] - pub fn new(options: JsValue) -> Result<MetadataWasm, JsValue> { - let metadata_options = options.with_serde_to_json_value()?; - let block_height = metadata_options - .get_f64("blockHeight") - .map_err(|e| JsError::new(&e.to_string()))?; - let core_chain_locked_height = metadata_options - .get_f64("coreChainLockedHeight") - .map_err(|e| JsError::new(&e.to_string()))?; - let time_ms = metadata_options - .get_f64("timeMs") - .map_err(|e| JsError::new(&e.to_string()))?; - let protocol_version = metadata_options - .get_f64("protocolVersion") - .map_err(|e| JsError::new(&e.to_string()))?; - + pub fn new( + block_height: u64, + core_chain_locked_height: u32, + time_ms: u64, + protocol_version: u32, + ) -> Result<MetadataWasm, JsValue> { let inner = Metadata { - block_height: block_height as u64, + block_height, core_chain_locked_height: core_chain_locked_height as u64, - time_ms: time_ms as u64, + time_ms, protocol_version: protocol_version as u64 as ProtocolVersion, }; Ok(inner.into()) @@ -77,22 +66,22 @@ impl MetadataWasm { } #[wasm_bindgen(js_name=getBlockHeight)] - pub fn block_height(&self) -> f64 { - self.0.block_height as f64 + pub fn block_height(&self) -> u64 { + self.0.block_height } #[wasm_bindgen(js_name=getCoreChainLockedHeight)] - pub fn core_chain_locked_height(&self) -> f64 { - self.0.core_chain_locked_height as f64 + pub fn core_chain_locked_height(&self) -> u32 { + self.0.core_chain_locked_height as u32 } #[wasm_bindgen(js_name=getTimeMs)] - pub fn time_ms(&self) -> f64 { - self.0.time_ms as f64 + pub fn time_ms(&self) -> u64 { + self.0.time_ms } #[wasm_bindgen(js_name=getProtocolVersion)] - pub fn protocol_version(&self) -> f64 { - self.0.protocol_version as f64 + pub fn protocol_version(&self) -> u32 { + self.0.protocol_version } } diff --git a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs index 8b3f8bfa863..2ba1a0e025c 100644 --- a/packages/wasm-dpp/src/state_transition/state_transition_factory.rs +++ b/packages/wasm-dpp/src/state_transition/state_transition_factory.rs @@ -1,5 +1,5 @@ +use crate::batch_transition::BatchTransitionWasm; use crate::data_contract::{DataContractCreateTransitionWasm, DataContractUpdateTransitionWasm}; -use crate::document_batch_transition::DocumentsBatchTransitionWasm; use crate::errors::from_dpp_err; use crate::identity::state_transition::{ IdentityCreateTransitionWasm, IdentityCreditTransferTransitionWasm, @@ -56,9 +56,7 @@ impl StateTransitionFactoryWasm { StateTransition::IdentityCreditWithdrawal(st) => { Ok(IdentityCreditWithdrawalTransitionWasm::from(st).into()) } - StateTransition::DocumentsBatch(st) => { - Ok(DocumentsBatchTransitionWasm::from(st).into()) - } + StateTransition::Batch(st) => Ok(BatchTransitionWasm::from(st).into()), StateTransition::MasternodeVote(st) => { Ok(MasternodeVoteTransitionWasm::from(st).into()) } diff --git a/packages/wasm-dpp/src/voting/state_transition/masternode_vote_transition/mod.rs b/packages/wasm-dpp/src/voting/state_transition/masternode_vote_transition/mod.rs index 4ee92d0023d..ab6823f6a82 100644 --- a/packages/wasm-dpp/src/voting/state_transition/masternode_vote_transition/mod.rs +++ b/packages/wasm-dpp/src/voting/state_transition/masternode_vote_transition/mod.rs @@ -220,60 +220,85 @@ impl MasternodeVoteTransitionWasm { self.0.is_voting_state_transition() } + #[wasm_bindgen(js_name=getUserFeeIncrease)] + pub fn get_user_fee_increase(&self) -> u16 { + self.0.user_fee_increase() as u16 + } + + #[wasm_bindgen(js_name=setUserFeeIncrease)] + pub fn set_user_fee_increase(&mut self, user_fee_increase: u16) { + self.0.set_user_fee_increase(user_fee_increase); + } + + #[wasm_bindgen(js_name=getIdentityContractNonce)] + pub fn get_identity_nonce(&self) -> u64 { + self.0.nonce() + } + #[wasm_bindgen(js_name=getContestedDocumentResourceVotePoll)] pub fn contested_document_resource_vote_poll(&self) -> Option<Object> { match self.0.vote() { - Vote::ResourceVote(vote) => match vote.vote_poll() { - VotePoll::ContestedDocumentResourceVotePoll( - contested_document_resource_vote_poll, - ) => { - let js_object = Object::new(); - - let contract_id = IdentifierWrapper::from( - contested_document_resource_vote_poll.contract_id.clone(), - ); - - Reflect::set(&js_object, &"contractId".into(), &contract_id.into()).unwrap(); - Reflect::set( - &js_object, - &"documentTypeName".into(), - &contested_document_resource_vote_poll - .document_type_name - .clone() - .into(), - ) - .unwrap(); - Reflect::set( - &js_object, - &"indexName".into(), - &contested_document_resource_vote_poll - .index_name - .clone() - .into(), - ) - .unwrap(); - - let config = bincode::config::standard() - .with_big_endian() - .with_no_limit(); - - let serialized_index_values = contested_document_resource_vote_poll - .index_values - .iter() - .map(|value| { - JsValue::from(Buffer::from_bytes_owned( - bincode::encode_to_vec(value, config) - .expect("expected to encode value in path"), - )) - }); - - let js_array = Array::from_iter(serialized_index_values); - - Reflect::set(&js_object, &"indexValues".into(), &js_array.into()).unwrap(); - - Some(js_object) + Vote::ResourceVote(vote) => { + let js_object = Object::new(); + + Reflect::set( + &js_object, + &"choice".into(), + &vote.resource_vote_choice().clone().to_string().into(), + ) + .unwrap(); + + match vote.vote_poll() { + VotePoll::ContestedDocumentResourceVotePoll( + contested_document_resource_vote_poll, + ) => { + let contract_id = IdentifierWrapper::from( + contested_document_resource_vote_poll.contract_id.clone(), + ); + + Reflect::set(&js_object, &"contractId".into(), &contract_id.into()) + .unwrap(); + Reflect::set( + &js_object, + &"documentTypeName".into(), + &contested_document_resource_vote_poll + .document_type_name + .clone() + .into(), + ) + .unwrap(); + Reflect::set( + &js_object, + &"indexName".into(), + &contested_document_resource_vote_poll + .index_name + .clone() + .into(), + ) + .unwrap(); + + let config = bincode::config::standard() + .with_big_endian() + .with_no_limit(); + + let serialized_index_values = contested_document_resource_vote_poll + .index_values + .iter() + .map(|value| { + JsValue::from(Buffer::from_bytes_owned( + bincode::encode_to_vec(value, config) + .expect("expected to encode value in path"), + )) + }); + + let js_array = Array::from_iter(serialized_index_values); + + Reflect::set(&js_object, &"indexValues".into(), &js_array.into()).unwrap(); + + Some(js_object) + } } - }, + } } } diff --git a/packages/wasm-dpp/test/integration/document/Document.spec.js b/packages/wasm-dpp/test/integration/document/Document.spec.js index f3f4b8f2e50..e418228e243 100644 --- a/packages/wasm-dpp/test/integration/document/Document.spec.js +++ b/packages/wasm-dpp/test/integration/document/Document.spec.js @@ -85,7 +85,7 @@ describe('ExtendedDocument', () => { expect(result.$id.toBuffer()).to.deep.equal(document.getId().toBuffer()); expect(result.$ownerId.toBuffer()).to.deep.equal(document.getOwnerId().toBuffer()); expect(result.identifierField.toBuffer()).to.deep.equal(document.get('identifierField').toBuffer()); - expect(result.$revision).to.deep.equal(document.getRevision()); + expect(BigInt(result.$revision)).to.deep.equal(document.getRevision()); expect(result.$type).to.deep.equal(document.getType()); expect(result.byteArrayField).to.deep.equal(document.get('byteArrayField')); }); @@ -93,12 +93,7 @@ describe('ExtendedDocument', () => { describe('#setMetadata', () => { it('should set metadata - Rust', () => { - const otherMetadata = new Metadata({ - blockHeight: 43, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); + const otherMetadata = new Metadata(BigInt(43), 1, BigInt(100), 2); document.setMetadata(otherMetadata); expect(document.getMetadata().toObject()).to.deep.equal(otherMetadata.toObject()); diff --git a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js index 1fccf76acdf..06f935716f0 100644 --- a/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js +++ b/packages/wasm-dpp/test/integration/document/DocumentFacade.spec.js @@ -8,7 +8,7 @@ const { ExtendedDocument, DataContract, ValidationResult, - DocumentsBatchTransition, + BatchTransition, DashPlatformProtocol, DataContractNotPresentError, } = require('../../..'); @@ -95,7 +95,7 @@ describe('DocumentFacade', () => { }); describe('createStateTransition', () => { - it('should create DocumentsBatchTransition with passed documents - Rust', () => { + it('should create BatchTransition with passed documents - Rust', () => { const identityId = documents[0].getOwnerId(); const contractId = documents[0].getDataContractId(); @@ -103,11 +103,11 @@ describe('DocumentFacade', () => { create: documents, }, { [identityId.toString()]: { - [contractId.toString()]: 1, + [contractId.toString()]: '1', }, }); - expect(result).to.be.instanceOf(DocumentsBatchTransition); + expect(result).to.be.instanceOf(BatchTransition); // expect(result.getTransitions().map((t) => t.toObject())) // .has.deep.members(getDocumentTransitionsFixture({ // create: documentsJs, diff --git a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js index 2ed05d3bcbf..c3888c4661c 100644 --- a/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js +++ b/packages/wasm-dpp/test/integration/identity/IdentityFacade.spec.js @@ -32,7 +32,7 @@ describe('IdentityFacade', () => { chainAssetLockProof = new ChainAssetLockProof(chainAssetLockProofJS.toObject()); identity = await getIdentityFixture(instantAssetLockProof.createIdentifier()); - identity.setBalance(0); + identity.setBalance(BigInt(0)); }); describe('#create', () => { @@ -62,16 +62,11 @@ describe('IdentityFacade', () => { describe('#createFromBuffer', () => { it('should create Identity from a Buffer', () => { - let result; - try { - result = dpp.identity.createFromBuffer(identity.toBuffer()); - } catch (e) { - console.dir(e.getErrors()[0].toString()); - } + const deserialized = dpp.identity.createFromBuffer(identity.toBuffer()); - expect(result).to.be.an.instanceOf(Identity); + expect(deserialized).to.be.an.instanceOf(Identity); - expect(result.toObject()).to.deep.equal(identity.toObject()); + expect(deserialized.toObject()).to.deep.equal(identity.toObject()); }); }); @@ -186,7 +181,7 @@ describe('IdentityFacade', () => { expect(stateTransition.getIdentityId().toBuffer()) .to.be.deep.equal(identity.getId().toBuffer()); expect(stateTransition.getRevision()).to.equal( - identity.getRevision() + 1, + identity.getRevision() + BigInt(1), ); expect( stateTransition.getPublicKeysToAdd().map((pk) => pk.toObject()), diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js index 19d40b4ff84..964f406a742 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityUpdateTransition/validation/state/validateIdentityUpdateTransitionStateFactory.spec.js @@ -124,7 +124,7 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { expect(error.getId()).to.equal(3); }); - it('should pass when disabling public key', async function () { + it('should pass when disabling public key', async function it() { stateTransition.setPublicKeyIdsToDisable([1]); stateTransition.setPublicKeysToAdd(undefined); @@ -143,7 +143,7 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { .to.be.calledOnce(); }); - it('should pass when adding public key', async function () { + it('should pass when adding public key', async function it() { stateTransition.setPublicKeyIdsToDisable(undefined); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -161,7 +161,7 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { .to.not.be.called(); }); - it('should pass when both adding and disabling public keys', async function () { + it('should pass when both adding and disabling public keys', async function it() { stateTransition.setPublicKeyIdsToDisable([1]); const result = await validateIdentityUpdateTransitionState(stateTransition); @@ -227,7 +227,7 @@ describe.skip('validateIdentityUpdateTransitionStateFactory', () => { // ); }); - it('should return valid result on dry run', async function () { + it('should return valid result on dry run', async function it() { stateTransition.setPublicKeyIdsToDisable([3]); // Make code that executes after dry run check to fail diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js index 9a292d1a324..556554b40d5 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/chain/validateChainAssetLockProofStructureFactory.spec.js @@ -307,7 +307,7 @@ describe.skip('validateChainAssetLockProofStructureFactory', () => { expect(stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight).to.not.be.called(); }); - it('should point to existing transaction', async function () { + it('should point to existing transaction', async function it() { stateRepositoryMock.fetchTransaction.resolves(null); const result = await validateChainAssetLockProofStructure( @@ -353,7 +353,7 @@ describe.skip('validateChainAssetLockProofStructureFactory', () => { ); }); - it('should point to transaction from block lower than core chain locked height', async function () { + it('should point to transaction from block lower than core chain locked height', async function it() { rawProof.coreChainLockedHeight = 41; stateRepositoryMock.fetchLatestPlatformCoreChainLockedHeight.resolves(41); @@ -378,7 +378,7 @@ describe.skip('validateChainAssetLockProofStructureFactory', () => { }); }); - it('should return valid result', async function () { + it('should return valid result', async function it() { const result = await validateChainAssetLockProofStructure( rawProof, executionContext, diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js index ea05c270722..92a0a12eb38 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/assetLockProof/fetchAssetLockTransactionOutputFactory.spec.js @@ -89,7 +89,7 @@ describe.skip('fetchAssetLockTransactionOutputFactory', () => { ([output] = transaction.outputs); }); - it('should fetch output from state repository', async function () { + it('should fetch output from state repository', async function it() { const assetLockTransactionOutput = await fetchAssetLockTransactionOutput( assetLockProofFixture, executionContext, diff --git a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js index d155a4b742d..76e5d81ca47 100644 --- a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -102,14 +102,14 @@ describe('StateTransitionFacade', () => { create: documents, }, { [documents[0].getOwnerId().toString()]: { - [documents[0].getDataContractId().toString()]: 0, + [documents[0].getDataContractId().toString()]: '0', }, }); await documentsBatchTransition.sign(identityPublicKey, privateKey); identity = await getIdentityFixture(); identity.setId(await generateRandomIdentifierAsync()); - identity.setBalance(10000000); + identity.setBalance(BigInt(10000000)); identity.setPublicKeys([identityPublicKey]); dpp = new DashPlatformProtocol( @@ -171,7 +171,7 @@ describe('StateTransitionFacade', () => { }); it('should return invalid result if not enough balance to pay fee for State Transition', async () => { - identity.setBalance(0); + identity.setBalance(BigInt(0)); stateRepositoryMock.fetchIdentityBalance.resolves(0); const result = await dpp.stateTransition.validate( dataContractCreateTransition, diff --git a/packages/wasm-dpp/test/unit/Metadata.spec.js b/packages/wasm-dpp/test/unit/Metadata.spec.js index 81a4868270f..070ca935aee 100644 --- a/packages/wasm-dpp/test/unit/Metadata.spec.js +++ b/packages/wasm-dpp/test/unit/Metadata.spec.js @@ -9,41 +9,26 @@ describe('Metadata', () => { describe('#constructor', () => { it('should set height and core chain-locked height', () => { - const result = new Metadata({ - blockHeight: 42, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); - - expect(result.getBlockHeight()).to.equal(42); + const result = new Metadata(BigInt(42), 1, BigInt(100), 2); + + expect(result.getBlockHeight()).to.equal(BigInt(42)); expect(result.getCoreChainLockedHeight()).to.equal(1); - expect(result.getTimeMs()).to.equal(100); + expect(result.getTimeMs()).to.equal(BigInt(100)); expect(result.getProtocolVersion()).to.equal(2); }); }); describe('#getBlockHeight', () => { it('should get block height', () => { - const result = new Metadata({ - blockHeight: 42, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); - - expect(result.getBlockHeight()).to.equal(42); + const result = new Metadata(BigInt(42), 1, BigInt(100), 2); + + expect(result.getBlockHeight()).to.equal(BigInt(42)); }); }); describe('#getCoreChainLockedHeight', () => { it('should get core chain-locked height', () => { - const result = new Metadata({ - blockHeight: 1, - coreChainLockedHeight: 42, - timeMs: 100, - protocolVersion: 2, - }); + const result = new Metadata(BigInt(1), 42, BigInt(100), 2); expect(result.getCoreChainLockedHeight()).to.equal(42); }); diff --git a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js index 4726cb31cd5..9acee8bba5e 100644 --- a/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js +++ b/packages/wasm-dpp/test/unit/dataContract/DataContract.spec.js @@ -300,12 +300,7 @@ describe('DataContract', () => { describe('#setMetadata', () => { it('should set metadata', () => { - const otherMetadata = new Metadata({ - blockHeight: 43, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); + const otherMetadata = new Metadata(BigInt(43), 1, BigInt(100), 2); const otherMetadataToObject = otherMetadata.toObject(); dataContract.setMetadata(otherMetadata); diff --git a/packages/wasm-dpp/test/unit/document/Document.spec.js b/packages/wasm-dpp/test/unit/document/Document.spec.js index 3caa3750ccf..382a0b4bc14 100644 --- a/packages/wasm-dpp/test/unit/document/Document.spec.js +++ b/packages/wasm-dpp/test/unit/document/Document.spec.js @@ -1,5 +1,3 @@ -const crypto = require('crypto'); - const generateRandomIdentifierAsync = require('../../../lib/test/utils/generateRandomIdentifierAsync'); const { default: loadWasmDpp, DocumentCreateTransition } = require('../../..'); const { getLatestProtocolVersion } = require('../../..'); @@ -29,7 +27,6 @@ describe('Document', () => { const ownerId = await generateRandomIdentifierAsync(); const dataContractFactory = new DataContractFactory( 1, - { generate: () => crypto.randomBytes(32) }, ); const rawDataContract = { @@ -83,7 +80,7 @@ describe('Document', () => { $type: 'test', $dataContractId: dataContract.getId(), $ownerId: ownerId, - $revision: DocumentCreateTransition.INITIAL_REVISION, + $revision: Number(DocumentCreateTransition.INITIAL_REVISION.toString()), $createdAt: now, $createdAtBlockHeight: 1, $createdAtCoreBlockHeight: 1, @@ -101,7 +98,7 @@ describe('Document', () => { $type: 'test', $dataContractId: dataContract.getId().toBuffer(), $ownerId: ownerId.toBuffer(), - $revision: DocumentCreateTransition.INITIAL_REVISION, + $revision: Number(DocumentCreateTransition.INITIAL_REVISION.toString()), $createdAt: now, $createdAtBlockHeight: 1, $createdAtCoreBlockHeight: 1, @@ -261,7 +258,7 @@ describe('Document', () => { document = new ExtendedDocument(rawDocument, dataContract); - expect(document.getRevision()).to.equal(rawDocument.$revision); + expect(document.getRevision()).to.equal(BigInt(rawDocument.$revision)); }); it('should create Document with $createdAt and data if present', async () => { @@ -342,7 +339,7 @@ describe('Document', () => { describe('#setRevision/#getRevision', () => { it('should set $revision and get $revision', () => { - const revision = 5; + const revision = BigInt(5); document.setRevision(revision); diff --git a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js index fa74dfd88fa..2ed208c04ee 100644 --- a/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js +++ b/packages/wasm-dpp/test/unit/document/DocumentFactory.spec.js @@ -294,7 +294,7 @@ describe('DocumentFactory', () => { replace: [newDocument], }, { [identityId.toString()]: { - [dataContract.getId().toString()]: 1, + [dataContract.getId().toString()]: '1', }, }); @@ -304,7 +304,7 @@ describe('DocumentFactory', () => { .filter((t) => t.getAction() === 0); expect(replaceDocuments[0].getId()).to.deep.equal(newDocument.getId()); - expect(replaceDocuments[0].getRevision()).to.deep.equal(2); + expect(replaceDocuments[0].getRevision()).to.deep.equal(BigInt(2)); expect(createDocuments).to.have.lengthOf(documents.length); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/Identity.spec.js b/packages/wasm-dpp/test/unit/identity/Identity.spec.js index dbff88969bf..89288a103b9 100644 --- a/packages/wasm-dpp/test/unit/identity/Identity.spec.js +++ b/packages/wasm-dpp/test/unit/identity/Identity.spec.js @@ -22,21 +22,11 @@ describe('Identity', () => { rawIdentity = identity.toObject(); - metadataFixture = new Metadata({ - blockHeight: 42, - coreChainLockedHeight: 0, - timeMs: 100, - protocolVersion: 2, - }); + metadataFixture = new Metadata(BigInt(42), 1, BigInt(100), 2); identity.setMetadata(metadataFixture); - metadataFixture = new Metadata({ - blockHeight: 42, - coreChainLockedHeight: 0, - timeMs: 100, - protocolVersion: 2, - }); + metadataFixture = new Metadata(BigInt(42), 1, BigInt(100), 2); }); describe('#constructor', () => { @@ -173,52 +163,42 @@ describe('Identity', () => { describe('#getBalance', () => { it('should return set identity balance', () => { - identity.setBalance(42); - expect(identity.getBalance()).to.equal(42); + identity.setBalance(BigInt(42)); + expect(identity.getBalance()).to.equal(BigInt(42)); }); }); describe('#setBalance', () => { it('should set identity balance', () => { - identity.setBalance(42); - expect(identity.getBalance()).to.equal(42); + identity.setBalance(BigInt(42)); + expect(identity.getBalance()).to.equal(BigInt(42)); }); }); describe('#increaseBalance', () => { it('should increase identity balance', () => { - const result = identity.increaseBalance(42); + const result = identity.increaseBalance(BigInt(42)); - expect(result).to.equal(42); - expect(identity.getBalance()).to.equal(42); + expect(result).to.equal(BigInt(42)); + expect(identity.getBalance()).to.equal(BigInt(42)); }); }); describe('#reduceBalance', () => { it('should reduce identity balance', () => { - identity.setBalance(42); + identity.setBalance(BigInt(42)); - const result = identity.reduceBalance(2); + const result = identity.reduceBalance(BigInt(2)); - expect(result).to.equal(40); - expect(identity.getBalance()).to.equal(40); + expect(result).to.equal(BigInt(40)); + expect(identity.getBalance()).to.equal(BigInt(40)); }); }); describe('#setMetadata', () => { it('should set metadata', () => { - const otherMetadata = new Metadata({ - blockHeight: 43, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); - const expectedMetadata = new Metadata({ - blockHeight: 43, - coreChainLockedHeight: 1, - timeMs: 100, - protocolVersion: 2, - }); + const otherMetadata = new Metadata(BigInt(43), 1, BigInt(100), 2); + const expectedMetadata = new Metadata(BigInt(43), 1, BigInt(100), 2); identity.setMetadata(otherMetadata); diff --git a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js index 1cd8fc84693..01417544e6f 100644 --- a/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js +++ b/packages/wasm-dpp/test/unit/identity/IdentityFactory.spec.js @@ -29,7 +29,7 @@ describe('IdentityFactory', () => { factory = new IdentityFactory(3); identity = await getIdentityFixture(instantAssetLockProof.createIdentifier()); - identity.setBalance(0); + identity.setBalance(BigInt(0)); fakeTime = this.sinon.useFakeTimers(new Date()); }); @@ -179,7 +179,7 @@ describe('IdentityFactory', () => { describe('createChainAssetLockProof', () => { it('should create IdentityCreateTransition from Identity model', async () => { identity = await getIdentityFixture(chainAssetLockProof.createIdentifier()); - identity.setBalance(0); + identity.setBalance(BigInt(0)); const stateTransition = factory.createIdentityCreateTransition( identity, @@ -226,7 +226,7 @@ describe('IdentityFactory', () => { describe('createIdentityUpdateTransition', () => { it('should create IdentityUpdateTransition', () => { - const revision = 1; + const revision = BigInt(1); const disablePublicKeys = [identity.getPublicKeyById(0)]; const key = new IdentityPublicKeyWithWitness(1); key.setData(Buffer.from('AuryIuMtRrl/VviQuyLD1l4nmxi9ogPzC9LT7tdpo0di', 'base64')); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js index 178ab4d865a..0b94ee83021 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/IdentityUpdateTransition/IdentityUpdateTransition.spec.js @@ -45,9 +45,9 @@ describe('IdentityUpdateTransition', () => { describe('#setRevision', () => { it('should set revision', () => { - stateTransition.setRevision(42); + stateTransition.setRevision(BigInt(42)); - expect(stateTransition.getRevision()).to.equal(42); + expect(stateTransition.getRevision()).to.equal(BigInt(42)); }); }); diff --git a/packages/wasm-dpp/test/unit/identity/stateTransition/identityCreditTransferTransition/identityCreditTransferTransition.spec.js b/packages/wasm-dpp/test/unit/identity/stateTransition/identityCreditTransferTransition/identityCreditTransferTransition.spec.js index 951ec00be62..688a42ac4da 100644 --- a/packages/wasm-dpp/test/unit/identity/stateTransition/identityCreditTransferTransition/identityCreditTransferTransition.spec.js +++ b/packages/wasm-dpp/test/unit/identity/stateTransition/identityCreditTransferTransition/identityCreditTransferTransition.spec.js @@ -24,7 +24,7 @@ describe('IdentityCreditTransferTransition', () => { ); expect(stateTransition.getAmount()).to.be.equal( - rawStateTransition.amount, + BigInt(rawStateTransition.amount), ); }); }); diff --git a/packages/wasm-sdk/.gitignore b/packages/wasm-sdk/.gitignore new file mode 100644 index 00000000000..03314f77b5a --- /dev/null +++ b/packages/wasm-sdk/.gitignore @@ -0,0 +1 @@ +Cargo.lock diff --git a/packages/wasm-sdk/Cargo.toml b/packages/wasm-sdk/Cargo.toml new file mode 100644 index 00000000000..785128a917f --- /dev/null +++ b/packages/wasm-sdk/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "wasm-sdk" +edition = "2021" +# rust-version.workspace = true +publish = false +[lib] +crate-type = ["cdylib"] + +[dependencies] +dash-sdk = { path = "../rs-sdk", default-features = false } +console_error_panic_hook = { version = "0.1.6" } +thiserror = { version = "2.0.9" } +web-sys = { version = "0.3.4", features = [ + 'console', + 'Document', + 'Element', + 'HtmlElement', + 'Node', + 'Window', +] } +wasm-bindgen = { version = "=0.2.99" } +wasm-bindgen-futures = { version = "0.4.49" } +drive-proof-verifier = { path = "../rs-drive-proof-verifier" } # TODO: I think it's not needed (LKl) +# tonic = { version = "*", features = ["transport"], default-features = false } +# client = [ +# "tonic/channel", FAIL +# "tonic/transport", FAIL +# "tonic/tls", +# "tonic/tls-roots", +# "tonic/tls-webpki-roots", +# "platform", +# ] +tracing-wasm = { version = "0.2.1" } +wee_alloc = "0.4" +platform-value = { path = "../rs-platform-value", features = ["json"] } +serde-wasm-bindgen = { version = "0.6.5" } + +[profile.release] +lto = "fat" +opt-level = "z" +panic = "abort" +debug = false + +#[package.metadata.wasm-pack.profile.release] +#wasm-opt = ['-g', '-O'] # -g for profiling +# -Oz -Oz -g diff --git a/packages/wasm-sdk/build.sh b/packages/wasm-sdk/build.sh new file mode 100755 index 00000000000..d9c1016741c --- /dev/null +++ b/packages/wasm-sdk/build.sh @@ -0,0 +1,12 @@ +#! /bin/bash +# +# Build WASM-SDK. +# +# EXPERIMENTAL: This script is experimental and may be removed in the future. +# + +set -ex -o pipefail + +wasm-pack build --target web --release --no-opt +wasm-opt -tnh --flatten --rereloop -Oz --gufa -Oz --gufa -Oz -o pkg/optimized.wasm pkg/wasm_sdk_bg.wasm +ls -lah pkg diff --git a/packages/wasm-sdk/index.html b/packages/wasm-sdk/index.html new file mode 100644 index 00000000000..457479785a2 --- /dev/null +++ b/packages/wasm-sdk/index.html @@ -0,0 +1,87 @@ +<!DOCTYPE html> +<html> + +<head> + <meta content="text/html;charset=utf-8" http-equiv="Content-Type" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <style> + #preloader { + display: none; + } + + .container { + padding: 10px; + } + </style> +</head> + +<body> + <div id="preloader">Loading...</div> + <div class="container"> + <input type="text" id="identityInput" placeholder="Enter Identity ID" /> + <button id="fetchButton">Fetch Identity</button> + </div> + + <div class="container"> + <input type="text" id="identityInput2" placeholder="Enter Data Contract ID" /> + <button id="fetchButton2">Fetch Data Contract</button> + </div> + <div id="identityInfo"></div> + + <script type="module"> + import init, { start, WasmSdkBuilder, identity_fetch, data_contract_fetch } from './pkg/wasm_sdk.js'; + + async function run() { + await init(); + + const sdk = await WasmSdkBuilder.new_mainnet().build(); + console.log(sdk); + + document.getElementById('fetchButton').addEventListener('click', async () => { + const identityId = document.getElementById('identityInput').value; + const preloader = document.getElementById('preloader'); + const identityInfo = document.getElementById('identityInfo'); + + preloader.style.display = 'block'; + identityInfo.textContent = ''; + + try { + const identity = await identity_fetch(sdk, identityId); + console.log("fetched identity"); + console.log(identity); + identityInfo.textContent = JSON.stringify(identity.toJSON(), null, 2); + } catch (error) { + console.error("Error fetching identity:", error); + identityInfo.textContent = `Error fetching identity: ${error}`; + } finally { + preloader.style.display = 'none'; + } + }); + + document.getElementById('fetchButton2').addEventListener('click', async () => { + const identityId = document.getElementById('identityInput2').value; + const preloader = document.getElementById('preloader'); + const identityInfo = document.getElementById('identityInfo'); + + preloader.style.display = 'block'; + identityInfo.textContent = ''; + + try { + const dataContract = await data_contract_fetch(sdk, identityId); + console.log("fetched data contract"); + console.log(dataContract); + identityInfo.textContent = JSON.stringify(dataContract.toJSON(), null, 2); + } catch (error) { + console.error("Error fetching contract:", error); + identityInfo.textContent = `Error fetching contract: ${error}`; + } finally { + preloader.style.display = 'none'; + } + }); + } + + run(); + </script> +</body> + +</html> \ No newline at end of file diff --git a/packages/wasm-sdk/src/context_provider.rs b/packages/wasm-sdk/src/context_provider.rs new file mode 100644 index 00000000000..173c8a4948b --- /dev/null +++ b/packages/wasm-sdk/src/context_provider.rs @@ -0,0 +1,101 @@ +use std::sync::Arc; + +use dash_sdk::{ + dpp::{ + prelude::CoreBlockHeight, + util::vec::{decode_hex, encode_hex}, + }, + error::ContextProviderError, + platform::{DataContract, Identifier}, +}; +use drive_proof_verifier::ContextProvider; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen] +pub struct WasmContext {} +/// Quorum keys for the testnet +/// This is a hardcoded list of quorum keys for the testnet. +/// This list was generated using the following script: +/// ```bash +// #!/bin/bash +/// function dash-cli() { +/// docker exec -ti dashmate_2d59c0c6_mainnet-core-1 dash-cli $@ +/// } +/// +/// +/// # Get the list of all quorum hashes +/// quorum_hashes=$(dash-cli quorum list | jq -r '.llmq_100_67[]') +/// +/// count=$(wc -w <<< $quorum_hashes) +/// +/// echo "const QUORUM_KEYS: [&str; $count] = [" +/// # Iterate over each quorum hash and get the respective public key +/// for quorum_hash in $quorum_hashes; do +/// quorum_public_key=$(dash-cli quorum info 4 $quorum_hash | jq -r '.quorumPublicKey') +/// echo "\"$quorum_hash:$quorum_public_key\"," +/// done +/// echo "]; +/// ``` +const QUORUM_KEYS: [&str; 24] = [ + "0000000000000010c832afa3f737b24aa0a19cb8c5fa8a7ebd51d195965c204e:a7123c10b0083c96665954dacbc92779b9bf5ee15b6e0b37de6c3ac6b5e611490611fbdf8128ea8012e1b8d79faf70e1", + "000000000000000b7ef1903452e3a0234b893567fe4f0f093b0de655756e413d:a75bca441f781fde0ae048181ab64e5bc85a2541b25267148bced1d1cbc1ff223e9b0d767f06b4a0773b65a7f374f72d", + "000000000000000aaf16a867b579ddbafc421ebf52b991c445aba9d42cc70f62:9665f284f989b998c053e4d34d022d7a9c1744214356150b6b815ba0c4b28dd6312ff3f6d86eb2ab49d84cb2a20518c5", + "00000000000000097177f56b1d83fcaa96101cb3c5e5cc1e624422552265aab0:ab96113d539e30e7f8f1ec605ab9228b6825bef1ea55cdf66826bb8308edf92fa782db1c3c6c348fb2daf5e13422fdff", + "00000000000000210518749e17c00b035a2a4982c906236c28c41ea2231bf7ef:803c3341a037217c6b8d6bf9a1f08b140749039fcbf2bd79d639ee6d70b16c9911f979e6f7014429d1a805876a9cb8dd", + "000000000000000d9085a108ae45615da3fc0b43313959a7fde892bb307d4f6a:ab880781c7ef1b5a38202065a90afc92ff25009f231a16daa766528bf36b78856d2a9a35c4d396326df434eb09fb3897", + "000000000000001871d3dab13ccefca7dd9735c27028e6612e8f1ac16114b080:ae5334bc41a2a2b1b52c8c454957f00a4554fb0ec82e7ca61b9391a4371346ab4679b55a15220af7ea657e153af867be", + "00000000000000223578d6be39205e0cddd36a0c73cde66aee0a7ad4bf451931:986eb45b5cd503f6ae09070b93fbf101ac69999147cce55a2f1f4b04b2aaf0ad7ea57ea96ee3f4335bcdd13dce6577f6", + "000000000000000208d59d5275610de33bca248e4055974573775affb2d99b0a:b4c419af96d4a053e90c6cc3be88c09f47543a8af9b5e94f0e345f91604843a60d8b19d045908b22ce52084f82f3a627", + "00000000000000065644145a3a5f94f9786245f4242a09fadfe277de7059b44a:95bebdad569bfe6c870f6f96c6a5d265f2d8561997b2a8be2d3192ad16ee872b833593a8096d8d7b142ba6ba2f662147", + "000000000000000ab82df09faf91a3e07b756dfc715c309a21feca21dd233559:91ebfc1415bf0e87e88024a1a794735130b8b438abdd29313f26bb3dece7577f77c80b0103a6c97c9a888f8e4334f44a", + "0000000000000023b4287203df6f4e1e67726b4f9bbeeec96a3b2e47227bcf7c:b1cc46b8d00f193238550b035860994e95c1515d95ef675c890bf38257dfc44631cc1da786550c1df7bda83dea17299c", + "000000000000000dd6431b32390b87c7c3c2377c46ecb8be2e36e0625400204b:a84f43efe056cd1221b9d4449dc3d0b3ce2e260f6378790f3e6123903d204ae83589e5a144533eb556acd05f920869a6", + "0000000000000005609c7e47752ff16847a49bd81f12885d3047c26c1d4de394:8f08f63fdd26e3e15f4c6daf45943c6ae097a40f46f4344cea63bcdfa9498525cfe0891c9d04057692738fa8f5e7b30d", + "000000000000001fb29b450739378551cd7539357e0ee49fd93c186eb8dd9db4:8cc74c3c7f10dd11845894dafafe47e60395d40bb151299638736dd078cc1052da13b3676e945d84cd4139a519a37975", + "0000000000000005f3b003f2b70096157046005944b316950c2d6f31a7fbdb6c:82780a7c99e2e09589a42a38e7be3d78d53072b09d964762cd9025b5b0b88bbed7e9e6c294a4fc8310d5025668240eaa", + "000000000000001f7bdf487d9ab675b9d4c53d8601b2b9dd619cf6f91271c1ef:ac79a22006a9c5d96250bd91784919a65259b5e1cf72af8294a998a420684ab3b9064094f247b0ebf1c5e39a545ac176", + "00000000000000127ae21d0e85ab8f511309b3492a689e680872d05d3d5e27b9:887332518d8a6d8806dfb1dd9588d2d4a2ec80193b5357ed87fc49567a72752ec8022dfaf4f5dec22c85aff4139daeb3", + "000000000000001c5d877e4b2b5964277c71377acd0e83d2b949426b54b761a2:a7149631eed0fdef466de0360ae09700b96fc29e76d46465efe60677596e7f93f8ff5e5e39917e04a3a26febe12b3b8a", + "000000000000000dab4691b25d967682b1902c05eefe691312cf520f6f2a3063:acc45cbf3ead9a04347438a68d72f86ffec76211562786f86125bbc2a444026343149cfb3d21fd27b386b50094250099", + "000000000000001aad53ced4755062f69421f7ca6c0bbe259e2626738c310759:8037c5282d443eb274a819a1d83758b29a97c12fdbbfa65a255e460045e71d9a5301f96ae76743787b12edf4f4e79e1c", + "0000000000000003e9cc2a59ebbede397e73e951f0968d4c94e04a92edb5586f:a62305e5154688adcc129da4a11bd0da388a731e52a361896f27473056d4dccb3642526086f83f36accbcaea43468121", + "000000000000001fd65c58acf87be67925c89348c5a76cc61cb467bbd9991a80:818283cbc34445f0c294d8ac071d4e43099fd318dad53337cd1daccc8a2aa760ee108c80f3f3c5bb01c41bba69ab2e8b", + "0000000000000028113a56cdec51df03d0a4786886455b56c405888820ef0941:a9cc0b5debb51078cc74666ce230512b5cc8a210e92e7a61143a94f2d39e0f2396fdb8a236f9e4f08bb9f9efade56aa0", +]; + +impl ContextProvider for WasmContext { + fn get_quorum_public_key( + &self, + _quorum_type: u32, + quorum_hash: [u8; 32], + _core_chain_locked_height: u32, + ) -> Result<[u8; 48], ContextProviderError> { + let quorum_label = encode_hex(&quorum_hash) + ":"; + let key_hex = QUORUM_KEYS + .iter() + .find(|key| key.starts_with(&quorum_label)) + .ok_or(ContextProviderError::InvalidQuorum(format!( + "key for quorum {:?} not found in hardcoded dictionary", + &quorum_label[0..quorum_label.len() - 1] + )))?; + let key = decode_hex(&key_hex[quorum_label.len()..]) + .map_err(|e| ContextProviderError::InvalidQuorum(e.to_string()))? + .try_into() + .map_err(|_e| { + ContextProviderError::InvalidQuorum("invalid quorum key size".to_string()) + })?; + + Ok(key) + } + + fn get_data_contract( + &self, + _id: &Identifier, + ) -> Result<Option<Arc<DataContract>>, ContextProviderError> { + todo!() + } + + fn get_platform_activation_height(&self) -> Result<CoreBlockHeight, ContextProviderError> { + todo!() + } +} diff --git a/packages/wasm-sdk/src/dpp.rs b/packages/wasm-sdk/src/dpp.rs new file mode 100644 index 00000000000..120ab559f30 --- /dev/null +++ b/packages/wasm-sdk/src/dpp.rs @@ -0,0 +1,308 @@ +use dash_sdk::dpp::identity::accessors::{IdentityGettersV0, IdentitySettersV0}; +use dash_sdk::dpp::platform_value::ReplacementType; +use dash_sdk::dpp::serialization::PlatformDeserializable; +use dash_sdk::dpp::serialization::ValueConvertible; + +use crate::error::to_js_error; +use dash_sdk::dashcore_rpc::dashcore::hashes::serde::Serialize; +use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::conversion::json::DataContractJsonConversionMethodsV0; +use dash_sdk::dpp::version::PlatformVersion; +use dash_sdk::platform::{DataContract, Identity}; +use platform_value::string_encoding::Encoding; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsValue; +use web_sys::js_sys; + +#[wasm_bindgen] +#[derive(Clone)] +pub struct IdentityWasm { + inner: Identity, + // metadata: Option<Metadata>, +} + +impl From<IdentityWasm> for Identity { + fn from(identity: IdentityWasm) -> Self { + identity.inner + } +} + +impl From<Identity> for IdentityWasm { + fn from(identity: Identity) -> Self { + Self { + inner: identity, + // metadata: None, + } + } +} +#[wasm_bindgen] +impl IdentityWasm { + #[wasm_bindgen(constructor)] + pub fn new(platform_version: u32) -> Result<IdentityWasm, JsError> { + let platform_version = &PlatformVersion::get(platform_version).map_err(to_js_error)?; + + Identity::default_versioned(platform_version) + .map(Into::into) + .map_err(to_js_error) + } + // + // #[wasm_bindgen(js_name=getId)] + // pub fn get_id(&self) -> IdentifierWrapper { + // self.inner.id().into() + // } + // + // #[wasm_bindgen(js_name=setId)] + // pub fn set_id(&mut self, id: IdentifierWrapper) { + // self.inner.set_id(id.into()); + // } + + #[wasm_bindgen(js_name=setPublicKeys)] + pub fn set_public_keys(&mut self, public_keys: js_sys::Array) -> Result<usize, JsValue> { + if public_keys.length() == 0 { + return Err(format!("Setting public keys failed. The input ('{}') is invalid. You must use array of PublicKeys", public_keys.to_string()).into()); + } + + // let public_keys = public_keys + // .iter() + // .map(|key| { + // key.to_wasm::<IdentityPublicKeyWasm>("IdentityPublicKey") + // .map(|key| { + // let key = IdentityPublicKey::from(key.to_owned()); + // (key.id(), key) + // }) + // }) + // .collect::<Result<_, _>>()?; + // + // self.inner.set_public_keys(public_keys); + + Ok(self.inner.public_keys().len()) + } + // + // #[wasm_bindgen(js_name=getPublicKeys)] + // pub fn get_public_keys(&self) -> Vec<JsValue> { + // self.inner + // .public_keys() + // .iter() + // .map(|(_, k)| k.to_owned()) + // .map(IdentityPublicKeyWasm::from) + // .map(JsValue::from) + // .collect() + // } + // + // #[wasm_bindgen(js_name=getPublicKeyById)] + // pub fn get_public_key_by_id(&self, key_id: u32) -> Option<IdentityPublicKeyWasm> { + // let key_id = key_id as KeyID; + // self.inner + // .get_public_key_by_id(key_id) + // .map(IdentityPublicKey::to_owned) + // .map(Into::into) + // } + + #[wasm_bindgen(getter)] + pub fn balance(&self) -> f64 { + self.inner.balance() as f64 + } + + #[wasm_bindgen(js_name=getBalance)] + pub fn get_balance(&self) -> f64 { + self.inner.balance() as f64 + } + + #[wasm_bindgen(js_name=setBalance)] + pub fn set_balance(&mut self, balance: f64) { + self.inner.set_balance(balance as u64); + } + + #[wasm_bindgen(js_name=increaseBalance)] + pub fn increase_balance(&mut self, amount: f64) -> f64 { + self.inner.increase_balance(amount as u64) as f64 + } + + #[wasm_bindgen(js_name=reduceBalance)] + pub fn reduce_balance(&mut self, amount: f64) -> f64 { + self.inner.reduce_balance(amount as u64) as f64 + } + + #[wasm_bindgen(js_name=setRevision)] + pub fn set_revision(&mut self, revision: f64) { + self.inner.set_revision(revision as u64); + } + + #[wasm_bindgen(js_name=getRevision)] + pub fn get_revision(&self) -> f64 { + self.inner.revision() as f64 + } + // + // #[wasm_bindgen(js_name=setMetadata)] + // pub fn set_metadata(&mut self, metadata: JsValue) -> Result<(), JsValue> { + // if !metadata.is_falsy() { + // let metadata = metadata.to_wasm::<MetadataWasm>("Metadata")?.to_owned(); + // self.metadata = Some(metadata.into()); + // } + // + // Ok(()) + // } + // + // #[wasm_bindgen(js_name=getMetadata)] + // pub fn get_metadata(&self) -> Option<MetadataWasm> { + // self.metadata.map(|metadata| metadata.to_owned().into()) + // } + + // #[wasm_bindgen(js_name=from)] + // pub fn from(object: JsValue) -> Self { + // let i: Identity = serde_json::from_str(&object.as_string().unwrap()).unwrap(); + // IdentityWasm { + // inner: i, + // metadata: None, + // } + // } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result<JsValue, JsValue> { + let mut value = self.inner.to_object().map_err(to_js_error)?; + + value + .replace_at_paths( + dash_sdk::dpp::identity::IDENTIFIER_FIELDS_RAW_OBJECT, + ReplacementType::TextBase58, + ) + .map_err(|e| e.to_string())?; + + // Monkey patch public keys data to be deserializable + let public_keys = value + .get_array_mut_ref(dash_sdk::dpp::identity::property_names::PUBLIC_KEYS) + .map_err(|e| e.to_string())?; + + for key in public_keys.iter_mut() { + key.replace_at_paths( + dash_sdk::dpp::identity::identity_public_key::BINARY_DATA_FIELDS, + ReplacementType::TextBase64, + ) + .map_err(|e| e.to_string())?; + } + + let json = value + .try_into_validating_json() + .map_err(|e| e.to_string())? + .to_string(); + + js_sys::JSON::parse(&json) + } + // + // #[wasm_bindgen(js_name=toObject)] + // pub fn to_object(&self) -> Result<JsValue, JsValue> { + // let js_public_keys = js_sys::Array::new(); + // for pk in self.inner.public_keys().values() { + // let pk_wasm = IdentityPublicKeyWasm::from(pk.to_owned()); + // js_public_keys.push(&pk_wasm.to_object()?); + // } + // + // let value = self.inner.to_object().with_js_error()?; + // + // let serializer = serde_wasm_bindgen::Serializer::json_compatible(); + // let js_object = with_js_error!(value.serialize(&serializer))?; + // + // let id = Buffer::from_bytes(self.inner.id().as_slice()); + // + // js_sys::Reflect::set(&js_object, &"id".to_owned().into(), &id)?; + // + // js_sys::Reflect::set( + // &js_object, + // &"publicKeys".to_owned().into(), + // &JsValue::from(&js_public_keys), + // )?; + // + // Ok(js_object) + // } + // + // #[wasm_bindgen(js_name=toBuffer)] + // pub fn to_buffer(&self) -> Result<Buffer, JsValue> { + // let bytes = + // PlatformSerializable::serialize_to_bytes(&self.inner.clone()).with_js_error()?; + // Ok(Buffer::from_bytes(&bytes)) + // } + + #[wasm_bindgen] + pub fn hash(&self) -> Result<Vec<u8>, JsError> { + self.inner.hash().map_err(to_js_error) + } + + // #[wasm_bindgen(js_name=addPublicKey)] + // pub fn add_public_key(&mut self, public_key: IdentityPublicKeyWasm) { + // self.inner + // .public_keys_mut() + // .insert(public_key.get_id(), public_key.into()); + // } + // + // #[wasm_bindgen(js_name=addPublicKeys)] + // pub fn add_public_keys(&mut self, public_keys: js_sys::Array) -> Result<(), JsValue> { + // if public_keys.length() == 0 { + // return Err(format!("Setting public keys failed. The input ('{}') is invalid. You must use array of PublicKeys", public_keys.to_string()).into()); + // } + // + // let public_keys: Vec<IdentityPublicKey> = public_keys + // .iter() + // .map(|key| { + // key.to_wasm::<IdentityPublicKeyWasm>("IdentityPublicKey") + // .map(|key| key.to_owned().into()) + // }) + // .collect::<Result<_, _>>()?; + // + // self.inner.add_public_keys(public_keys); + // + // Ok(()) + // } + + #[wasm_bindgen(js_name=getPublicKeyMaxId)] + pub fn get_public_key_max_id(&self) -> f64 { + self.inner.get_public_key_max_id() as f64 + } + + #[wasm_bindgen(js_name=fromBuffer)] + pub fn from_buffer(buffer: Vec<u8>) -> Result<IdentityWasm, JsError> { + let identity: Identity = PlatformDeserializable::deserialize_from_bytes(buffer.as_slice()) + .map_err(to_js_error)?; + Ok(identity.into()) + } +} +// +// impl Inner for IdentityWasm { +// type InnerItem = Identity; +// +// fn into_inner(self) -> Self::InnerItem { +// self.inner +// } +// +// fn inner(&self) -> &Self::InnerItem { +// &self.inner +// } +// +// fn inner_mut(&mut self) -> &mut Self::InnerItem { +// &mut self.inner +// } +// } + +#[wasm_bindgen] +pub struct DataContractWasm(DataContract); + +impl From<DataContract> for DataContractWasm { + fn from(value: DataContract) -> Self { + Self(value) + } +} + +#[wasm_bindgen] +impl DataContractWasm { + pub fn id(&self) -> String { + self.0.id().to_string(Encoding::Base58) + } + + #[wasm_bindgen(js_name=toJSON)] + pub fn to_json(&self) -> Result<JsValue, JsError> { + let platform_version = PlatformVersion::first(); + + let json = self.0.to_json(platform_version)?; + let serializer = ::serde_wasm_bindgen::Serializer::json_compatible(); + json.serialize(&serializer).map_err(to_js_error) + } +} diff --git a/packages/wasm-sdk/src/error.rs b/packages/wasm-sdk/src/error.rs new file mode 100644 index 00000000000..0e3742b368f --- /dev/null +++ b/packages/wasm-sdk/src/error.rs @@ -0,0 +1,13 @@ +use dash_sdk::Error; +use std::fmt::Display; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsError; + +#[wasm_bindgen] +#[derive(thiserror::Error, Debug)] +#[error("Dash SDK error: {0:?}")] +pub struct WasmError(#[from] Error); + +pub(crate) fn to_js_error(e: impl Display) -> JsError { + JsError::new(&format!("{}", e)) +} diff --git a/packages/wasm-sdk/src/lib.rs b/packages/wasm-sdk/src/lib.rs new file mode 100644 index 00000000000..ccbc036845c --- /dev/null +++ b/packages/wasm-sdk/src/lib.rs @@ -0,0 +1,24 @@ +use wasm_bindgen::{prelude::wasm_bindgen, JsValue}; + +pub mod context_provider; +pub mod dpp; +pub mod error; +pub mod sdk; +pub mod state_transitions; +pub mod verify; + +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +#[wasm_bindgen(start)] +pub async fn start() -> Result<(), JsValue> { + // We use tracing-wasm together with console_error_panic_hook to get logs from the wasm module. + // Other alternatives are: + // * https://github.com/jquesada2016/tracing_subscriber_wasm + // * https://crates.io/crates/tracing-web + console_error_panic_hook::set_once(); + + tracing_wasm::set_as_global_default(); + + Ok(()) +} diff --git a/packages/wasm-sdk/src/sdk.rs b/packages/wasm-sdk/src/sdk.rs new file mode 100644 index 00000000000..7701a8e8c0b --- /dev/null +++ b/packages/wasm-sdk/src/sdk.rs @@ -0,0 +1,208 @@ +use crate::context_provider::WasmContext; +use crate::dpp::{DataContractWasm, IdentityWasm}; +use dash_sdk::dpp::block::extended_epoch_info::ExtendedEpochInfo; +use dash_sdk::dpp::dashcore::{Network, PrivateKey}; +use dash_sdk::dpp::data_contract::accessors::v0::DataContractV0Getters; +use dash_sdk::dpp::data_contract::DataContractFactory; +use dash_sdk::dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0; +use dash_sdk::dpp::identity::signer::Signer; +use dash_sdk::dpp::identity::IdentityV0; +use dash_sdk::dpp::prelude::AssetLockProof; +use dash_sdk::dpp::serialization::PlatformSerializableWithPlatformVersion; +use dash_sdk::platform::transition::broadcast::BroadcastStateTransition; +use dash_sdk::platform::transition::put_identity::PutIdentity; +use dash_sdk::platform::{DataContract, Document, DocumentQuery, Fetch, Identifier, Identity}; +use dash_sdk::sdk::AddressList; +use dash_sdk::{Sdk, SdkBuilder}; +use platform_value::platform_value; +use std::collections::BTreeMap; +use std::fmt::Debug; +use std::ops::{Deref, DerefMut}; +use std::str::FromStr; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsError; +use web_sys::{console, js_sys}; + +#[wasm_bindgen] +pub struct WasmSdk(Sdk); +// Dereference JsSdk to Sdk so that we can use &JsSdk everywhere where &sdk is needed +impl std::ops::Deref for WasmSdk { + type Target = Sdk; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl AsRef<Sdk> for WasmSdk { + fn as_ref(&self) -> &Sdk { + &self.0 + } +} + +impl From<Sdk> for WasmSdk { + fn from(sdk: Sdk) -> Self { + WasmSdk(sdk) + } +} + +#[wasm_bindgen] +pub struct WasmSdkBuilder(SdkBuilder); + +impl Deref for WasmSdkBuilder { + type Target = SdkBuilder; + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for WasmSdkBuilder { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +#[wasm_bindgen] +impl WasmSdkBuilder { + pub fn new_mainnet() -> Self { + let sdk_builder = SdkBuilder::new_mainnet().with_context_provider(WasmContext {}); + + Self(sdk_builder) + } + + pub fn new_testnet() -> Self { + WasmSdkBuilder(SdkBuilder::new_testnet()).with_context_provider(WasmContext {}) + } + + pub fn build(self) -> Result<WasmSdk, JsError> { + Ok(WasmSdk(self.0.build()?)) + } + + pub fn with_context_provider(self, context_provider: WasmContext) -> Self { + WasmSdkBuilder(self.0.with_context_provider(context_provider)) + } +} + +#[wasm_bindgen] +pub async fn identity_fetch(sdk: &WasmSdk, base58_id: &str) -> Result<IdentityWasm, JsError> { + let id = Identifier::from_string( + base58_id, + dash_sdk::dpp::platform_value::string_encoding::Encoding::Base58, + )?; + + Identity::fetch_by_identifier(sdk, id) + .await? + .ok_or_else(|| JsError::new("Identity not found")) + .map(Into::into) +} + +#[wasm_bindgen] +pub async fn data_contract_fetch( + sdk: &WasmSdk, + base58_id: &str, +) -> Result<DataContractWasm, JsError> { + let id = Identifier::from_string( + base58_id, + dash_sdk::dpp::platform_value::string_encoding::Encoding::Base58, + )?; + + DataContract::fetch_by_identifier(sdk, id) + .await? + .ok_or_else(|| JsError::new("Data contract not found")) + .map(Into::into) +} + +#[wasm_bindgen] +pub async fn identity_put(sdk: &WasmSdk) { + // This is just a mock implementation to show how to use the SDK and ensure proper linking + // of all required dependencies. This function is not supposed to work. + let id = Identifier::from_bytes(&[0; 32]).expect("create identifier"); + + let identity = Identity::V0(IdentityV0 { + id, + public_keys: BTreeMap::new(), + balance: 0, + revision: 0, + }); + + let asset_lock_proof = AssetLockProof::default(); + let asset_lock_proof_private_key = + PrivateKey::from_slice(&[0; 32], Network::Testnet).expect("create private key"); + + let signer = MockSigner; + let _pushed: Identity = identity + .put_to_platform( + sdk, + asset_lock_proof, + &asset_lock_proof_private_key, + &signer, + None, + ) + .await + .expect("put identity") + .broadcast_and_wait(sdk, None) + .await + .unwrap(); +} + +#[wasm_bindgen] +pub async fn epoch_testing() { + let sdk = SdkBuilder::new(AddressList::new()) + .build() + .expect("build sdk"); + + let _ei = ExtendedEpochInfo::fetch(&sdk, 0) + .await + .expect("fetch extended epoch info") + .expect("extended epoch info not found"); +} + +#[wasm_bindgen] +pub async fn docs_testing(sdk: &WasmSdk) { + let id = Identifier::random(); + + let factory = DataContractFactory::new(1).expect("create data contract factory"); + factory + .create(id, 1, platform_value!({}), None, None) + .expect("create data contract"); + + let dc = DataContract::fetch(sdk, id) + .await + .expect("fetch data contract") + .expect("data contract not found"); + + let dcs = dc + .serialize_to_bytes_with_platform_version(sdk.version()) + .expect("serialize data contract"); + + let query = DocumentQuery::new(dc.clone(), "asd").expect("create query"); + let doc = Document::fetch(sdk, query) + .await + .expect("fetch document") + .expect("document not found"); + + let document_type = dc + .document_type_for_name("aaa") + .expect("document type for name"); + let doc_serialized = doc + .serialize(document_type, sdk.version()) + .expect("serialize document"); + + let msg = js_sys::JsString::from_str(&format!("{:?} {:?} ", dcs, doc_serialized)) + .expect("create js string"); + console::log_1(&msg); +} + +#[derive(Clone, Debug)] +struct MockSigner; +impl Signer for MockSigner { + fn can_sign_with(&self, _identity_public_key: &dash_sdk::platform::IdentityPublicKey) -> bool { + true + } + fn sign( + &self, + _identity_public_key: &dash_sdk::platform::IdentityPublicKey, + _data: &[u8], + ) -> Result<dash_sdk::dpp::platform_value::BinaryData, dash_sdk::dpp::ProtocolError> { + todo!("signature creation is not implemented due to lack of dash platform wallet support in wasm") + } +} diff --git a/packages/wasm-sdk/src/state_transitions/documents.rs b/packages/wasm-sdk/src/state_transitions/documents.rs new file mode 100644 index 00000000000..83991f26440 --- /dev/null +++ b/packages/wasm-sdk/src/state_transitions/documents.rs @@ -0,0 +1,75 @@ +use crate::error::to_js_error; +use dash_sdk::dpp::identity::KeyID; +use dash_sdk::dpp::serialization::PlatformSerializable; +use dash_sdk::dpp::state_transition::documents_batch_transition::document_base_transition::v0::DocumentBaseTransitionV0; +use dash_sdk::dpp::state_transition::documents_batch_transition::document_base_transition::DocumentBaseTransition; +use dash_sdk::dpp::state_transition::documents_batch_transition::document_create_transition::DocumentCreateTransitionV0; +use dash_sdk::dpp::state_transition::documents_batch_transition::document_transition::DocumentTransition; +use dash_sdk::dpp::state_transition::documents_batch_transition::{ + DocumentCreateTransition, DocumentsBatchTransition, DocumentsBatchTransitionV0, +}; +use wasm_bindgen::prelude::*; +use web_sys::js_sys::{Number, Uint8Array}; + +#[wasm_bindgen] +pub fn create_document( + _document: JsValue, + _identity_contract_nonce: Number, + signature_public_key_id: Number, +) -> Result<Uint8Array, JsError> { + // TODO: Extract document fields from JsValue + + let _base = DocumentBaseTransition::V0(DocumentBaseTransitionV0 { + id: Default::default(), + identity_contract_nonce: 1, + document_type_name: "".to_string(), + data_contract_id: Default::default(), + }); + + let transition = DocumentCreateTransition::V0(DocumentCreateTransitionV0 { + base: Default::default(), + entropy: [0; 32], + data: Default::default(), + prefunded_voting_balance: None, + }); + + create_batch_transition( + vec![DocumentTransition::Create(transition)], + signature_public_key_id, + ) +} + +fn create_batch_transition( + transitions: Vec<DocumentTransition>, + signature_public_key_id: Number, +) -> Result<Uint8Array, JsError> { + let signature_public_key_id = signature_public_key_id + .as_f64() + .ok_or_else(|| JsError::new("public_key_id must be a number"))?; + + // boundary checks + let signature_public_key_id = if signature_public_key_id.is_finite() + && signature_public_key_id >= KeyID::MIN as f64 + && signature_public_key_id <= (KeyID::MAX as f64) + { + signature_public_key_id as KeyID + } else { + return Err(JsError::new(&format!( + "signature_public_key_id {} out of valid range", + signature_public_key_id + ))); + }; + + let document_batch_transition = DocumentsBatchTransition::V0(DocumentsBatchTransitionV0 { + owner_id: Default::default(), + transitions, + user_fee_increase: 0, + signature_public_key_id, + signature: Default::default(), + }); + + document_batch_transition + .serialize_to_bytes() + .map_err(to_js_error) + .map(|bytes| Uint8Array::from(bytes.as_slice())) +} diff --git a/packages/wasm-sdk/src/state_transitions/mod.rs b/packages/wasm-sdk/src/state_transitions/mod.rs new file mode 100644 index 00000000000..487a38d50d4 --- /dev/null +++ b/packages/wasm-sdk/src/state_transitions/mod.rs @@ -0,0 +1 @@ +pub mod documents; diff --git a/packages/wasm-sdk/src/verify.rs b/packages/wasm-sdk/src/verify.rs new file mode 100644 index 00000000000..b926a63b774 --- /dev/null +++ b/packages/wasm-sdk/src/verify.rs @@ -0,0 +1,189 @@ +use dash_sdk::dpp::dashcore::Network; +use dash_sdk::dpp::data_contract::DataContract; +use dash_sdk::dpp::document::{Document, DocumentV0Getters}; +use dash_sdk::dpp::identity::Identity; +use dash_sdk::dpp::platform_value::string_encoding::Encoding; +use dash_sdk::dpp::serialization::PlatformDeserializableWithPotentialValidationFromVersionedStructure; +use dash_sdk::dpp::version::PlatformVersion; +use dash_sdk::platform::proto::get_identity_request::{ + GetIdentityRequestV0, Version as GetIdentityRequestVersion, +}; +use dash_sdk::platform::proto::get_identity_response::{ + get_identity_response_v0, GetIdentityResponseV0, Version, +}; +use dash_sdk::platform::proto::{ + GetDocumentsResponse, GetIdentityRequest, Proof, ResponseMetadata, +}; +use dash_sdk::platform::DocumentQuery; +use drive_proof_verifier::types::Documents; +use drive_proof_verifier::FromProof; +use wasm_bindgen::prelude::wasm_bindgen; + +use crate::context_provider::WasmContext; +use crate::dpp::{DataContractWasm, IdentityWasm}; + +#[wasm_bindgen] +pub async fn verify_identity_response() -> Option<IdentityWasm> { + let request = dash_sdk::dapi_grpc::platform::v0::GetIdentityRequest { + version: Some(GetIdentityRequestVersion::V0(GetIdentityRequestV0 { + id: vec![], + prove: true, + })), + }; + + let response = dash_sdk::dapi_grpc::platform::v0::GetIdentityResponse { + version: Some(Version::V0(GetIdentityResponseV0 { + result: Some(get_identity_response_v0::Result::Proof(Proof { + grovedb_proof: vec![], + quorum_hash: vec![], + signature: vec![], + round: 0, + block_id_hash: vec![], + quorum_type: 0, + })), + metadata: Some(ResponseMetadata { + height: 0, + core_chain_locked_height: 0, + epoch: 0, + time_ms: 0, + protocol_version: 0, + chain_id: "".to_string(), + }), + })), + }; + + let context = WasmContext {}; + + let (response, _metadata, _proof) = + <Identity as FromProof<GetIdentityRequest>>::maybe_from_proof_with_metadata( + request, + response, + Network::Dash, + PlatformVersion::latest(), + &context, + ) + .expect("parse proof"); + + response.map(IdentityWasm::from) +} + +#[wasm_bindgen] +pub async fn verify_data_contract() -> Option<DataContractWasm> { + let request = dash_sdk::dapi_grpc::platform::v0::GetDataContractRequest { + version: Some( + dash_sdk::platform::proto::get_data_contract_request::Version::V0( + dash_sdk::platform::proto::get_data_contract_request::GetDataContractRequestV0 { + id: vec![], + prove: true, + }, + ), + ), + }; + + let response = dash_sdk::dapi_grpc::platform::v0::GetDataContractResponse { + version: Some( + dash_sdk::platform::proto::get_data_contract_response::Version::V0( + dash_sdk::platform::proto::get_data_contract_response::GetDataContractResponseV0 { + result: Some( + dash_sdk::platform::proto::get_data_contract_response::get_data_contract_response_v0::Result::Proof( + dash_sdk::platform::proto::Proof { + grovedb_proof: vec![], + quorum_hash: vec![], + signature: vec![], + round: 0, + block_id_hash: vec![], + quorum_type: 0, + }, + ), + ), + metadata: Some(dash_sdk::platform::proto::ResponseMetadata { + height: 0, + core_chain_locked_height: 0, + epoch: 0, + time_ms: 0, + protocol_version: 0, + chain_id: "".to_string(), + }), + }, + ), + ), + }; + + let context = WasmContext {}; + + let (response, _, _) = <DataContract as FromProof< + dash_sdk::dapi_grpc::platform::v0::GetDataContractRequest, + >>::maybe_from_proof_with_metadata( + request, + response, + Network::Dash, + PlatformVersion::latest(), + &context, + ) + .expect("parse proof"); + + response.map(DataContractWasm::from) +} + +#[wasm_bindgen] +pub async fn verify_documents() -> Vec<DocumentWasm> { + // TODO: this is a dummy implementation, replace with actual verification + let data_contract = + DataContract::versioned_deserialize(&[13, 13, 13], false, PlatformVersion::latest()) + .expect("create data contract"); + + let query = DocumentQuery::new(data_contract, "asd").expect("create query"); + + let response = GetDocumentsResponse { + version: Some(dash_sdk::platform::proto::get_documents_response::Version::V0( + dash_sdk::platform::proto::get_documents_response::GetDocumentsResponseV0 { + result: Some( + dash_sdk::platform::proto::get_documents_response::get_documents_response_v0::Result::Proof( + Proof { + grovedb_proof: vec![], + quorum_hash: vec![], + signature: vec![], + round: 0, + block_id_hash: vec![], + quorum_type: 0, + }, + ), + ), + metadata: Some(ResponseMetadata { + height: 0, + core_chain_locked_height: 0, + epoch: 0, + time_ms: 0, + protocol_version: 0, + chain_id: "".to_string(), + }), + }, + )), + }; + + let (documents, _, _) = + <Documents as FromProof<DocumentQuery>>::maybe_from_proof_with_metadata( + query, + response, + Network::Dash, + PlatformVersion::latest(), + &WasmContext {}, + ) + .expect("parse proof"); + + documents + .unwrap() + .into_iter() + .filter(|(_, doc)| doc.is_some()) + .map(|(_, doc)| DocumentWasm(doc.unwrap())) + .collect() +} + +#[wasm_bindgen] +pub struct DocumentWasm(Document); +#[wasm_bindgen] +impl DocumentWasm { + pub fn id(&self) -> String { + self.0.id().to_string(Encoding::Base58) + } +} diff --git a/packages/withdrawals-contract/Cargo.toml b/packages/withdrawals-contract/Cargo.toml index 576a0f043e0..bb4b612765e 100644 --- a/packages/withdrawals-contract/Cargo.toml +++ b/packages/withdrawals-contract/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "withdrawals-contract" description = "Witdrawals data contract schema and tools" -version = "1.6.2" +version = "1.8.0" edition = "2021" rust-version.workspace = true license = "MIT" diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 4caf33288ff..6976961a51b 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "1.6.2", + "version": "1.8.0", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", @@ -38,7 +38,7 @@ "eslint": "^8.53.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.29.0", - "mocha": "^10.2.0", + "mocha": "^11.1.0", "sinon": "^17.0.1", "sinon-chai": "^3.7.0" } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 42a546e0324..66c0393df69 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] # Rust version the same as in /README.md -channel = "1.80" +channel = "1.85" targets = ["wasm32-unknown-unknown"] diff --git a/scripts/check_network_version.sh b/scripts/check_network_version.sh deleted file mode 100755 index 400501329c8..00000000000 --- a/scripts/check_network_version.sh +++ /dev/null @@ -1,207 +0,0 @@ -#! /bin/bash - -# Some defaults -PORT=${PORT:-443} -CSV=/tmp/masternodes.csv -MASTERNODES="" -ALL="" - -function help() { - if [[ -z "$1" ]]; then - - echo This script connects to all masternodes and tries to detect their version. - echo "" - echo "Usage: $0 [-p | --port <port>] [-h | --help] [-m | --masternodes <masternodes.txt>] [-j | --json <masternodes.json>] [-w | --mnowatch] [-c | --csv <file>]" - echo "Options:" - echo " -p, --port <port> Port to connect to (default: $PORT)" - echo " -h, --help Show this help" - echo " -m, --masternodes <file> File with IP addresses of masternodes to check" - echo " -j, --json <file> File with masternodes.json in format generated by mnowatch" - echo " -w, --mnowatch Use mnowatch.org to get masternodes" - echo " -c, --csv <file> Save results to CSV file; default: $CSV" - echo "" - echo "Note: --masternodes, --json, and --mnowatch are mutually exclusive and the latest one takes precedence." - exit 1 - fi -} - -REPO="$(realpath "$(dirname "$0")/..")" - -function load_masternodes_json() { - # curl https://mnowatch.org/json/?method=emn_details - # TODO: use curl above - jq 'map(select(.platformHTTPPortStatus != "CLOSED"))|map(select(.active_YNU!="N"))|map(select(.status!="P"))' "$1" | - jq -r .[].ip | - sort | - uniq -} - -function grpc_core { - docker run \ - -v "${REPO}:/repo" \ - fullstorydev/grpcurl:latest \ - -import-path "/repo/packages/dapi-grpc/protos/core/v0" \ - -proto core.proto \ - -max-time 30 \ - -keepalive-time 1 \ - "$@" -} - -function grpc_platform { - docker run \ - -v "${REPO}:/repo" \ - fullstorydev/grpcurl:latest \ - -import-path "/repo/packages/dapi-grpc/protos/platform/v0" \ - -proto platform.proto \ - -max-time 30 \ - -keepalive-time 1 \ - "$@" -} - -# Go to specified IP and fetch SML (subscribeToMasternodeList) - -# MASTERNODES=$( -# grpc_core "$FULLNODE:$PORT" org.dash.platform.dapi.v0.Core/subscribeToMasternodeList | -# jq -r .masternodeListDiff | -# base64 -d | -# grep -aEo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -# ) - -# Try to determine version of the platform -function detect_platform() { - NODE="$1" - - err="$(grpc_platform -insecure "$NODE:${PORT}" org.dash.platform.dapi.v0.Platform/getTotalCreditsInPlatform 2>&1)" - - echo "============ $NODE ============" >>/tmp/detect_platform.log - echo "$err" >>/tmp/detect_platform.log - - case "$err" in - *"decoding error: could not decode"*) - echo 1.1 - ;; - *"upstream connect error or disconnect/reset before headers"*) - echo "upstream connect error" - ;; - *"connect: connection refused"*) - echo "connection refused" - ;; - *"Code: Unimplemented"*) - echo "unimplemented" - ;; - *) - echo "ERROR" - ;; - esac -} - -# Check if core is available by calling getBlockchainStatus -# UNUSED -function detect_core() { - NODE="$1" - - err="$(grpc_core -insecure -d '{}' "$NODE:${PORT}" org.dash.platform.dapi.v0.Core/getBlockchainStatus 2>&1)" - - echo "============ $NODE ============" >>/tmp/detect_core.log - echo "$err" >>/tmp/detect_core.log - - version="$(echo "$err" | jq -r .version.agent 2>/dev/null)" - if [[ -z "$version" ]]; then - case "$err" in - *"upstream connect error"*) - echo down - ;; - *"connect: connection refused"*) - echo "connection refused" - ;; - *) - echo "UNKNOWN" - ;; - esac - else - echo "$version" - fi -} - -# Parse arguments -while [[ "$1" == -* ]]; do - case "$1" in - -p | --port) - PORT="$2" - shift 2 - ;; - -m | --masternodes) - MASTERNODES=$(cat "$2") - shift 2 - ;; - -j | --json) - MASTERNODES=$(load_masternodes_json "$2") - ALL=$(jq '.|length' "$2") - shift 2 - ;; - -w | --mnowatch) - MN_FILE=$(mktemp /tmp/masternodes.json.XXXXXX) - echo -n Fetching masternodes from mnowatch.org... - curl -s https://mnowatch.org/json/?method=emn_details >"$MN_FILE" - ALL=$(jq '.|length' "$MN_FILE") - MASTERNODES=$(load_masternodes_json "$MN_FILE") - echo " done." - shift - ;; - -c | --csv) - CSV="$2" - shift 2 - ;; - *) - echo "Unknown option: $1" - exit 1 - ;; - esac -done - -COUNT=$(echo "$MASTERNODES" | wc -l) -if [[ -z "$ALL" ]]; then - ALL=$COUNT -fi - -# Fetch getTotalCreditsInPlatform : -# * can’t connect - no platform, not found - means platform version -# * less than 1.1.0, internal - right version but init chain is not called yet. -# Fetch getBlockchainStatus to get information about Core: -# * can’t connect - no platform or no core -# grpc_core -help -set +e - -# Reset logs -truncate -s 0 /tmp/detect_platform.log -truncate -s 0 /tmp/detect_core.log - -if [[ -z "$MASTERNODES" ]]; then - echo "No masternodes found" - exit 1 -fi - -# CSV header -echo "'no','masternode','platform','core'" >"$CSV" - -i=1 -for MN in $MASTERNODES; do - echo "Checking status of evo node $MN ($i/$COUNT)" - - PLATFORM="$(detect_platform "$MN")" - # CORE="$(detect_core "$MN")" - # Format result as CSV - echo "$i,'$MN','$PLATFORM','$CORE'" >>"$CSV" - i=$((i + 1)) -done - -echo "Done." - -echo "" -echo "Results saved to $CSV" -echo "" -echo "Some statistics:" -echo "Total evonodes: $ALL" -echo "Potentially correct evo nodes: $COUNT" -echo "Platform versions:" -tail -n +2 "$CSV" | cut -d, -f3 | sort | uniq -c | sort -n diff --git a/scripts/configure_test_suite_network.sh b/scripts/configure_test_suite_network.sh index 498e9d2d03e..b84e0286afa 100755 --- a/scripts/configure_test_suite_network.sh +++ b/scripts/configure_test_suite_network.sh @@ -57,16 +57,15 @@ MASTERNODE_OWNER_MASTER_PRIVATE_KEY=$(yq .hp_masternodes."$MASTERNODE_NAME".owne if [[ "$NETWORK_STRING" == "devnet"* ]]; then NETWORK=devnet - INSIGHT_URL="http://insight.${NETWORK_STRING#devnet-}.networks.dash.org:3001/insight-api/sync" CERT_FLAG=":self-signed" ST_EXECUTION_INTERVAL=5000 else NETWORK=testnet - INSIGHT_URL="https://testnet-insight.dashevo.org/insight-api/sync" CERT_FLAG="" ST_EXECUTION_INTERVAL=15000 fi -SKIP_SYNC_BEFORE_HEIGHT=4800 # $(curl -s $INSIGHT_URL | jq '.height - 200') +INSIGHT_URL="http://insight.${NETWORK_STRING#devnet-}.networks.dash.org:3001/insight-api/sync" +SKIP_SYNC_BEFORE_HEIGHT=$(curl -s $INSIGHT_URL | jq '.height - 200') # check variables are not empty if [ -z "$FAUCET_ADDRESS" ] || \ diff --git a/yarn.lock b/yarn.lock index e9661201c4f..a72b195b171 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1449,7 +1449,7 @@ __metadata: eslint-plugin-import: "npm:^2.29.0" lodash: "npm:^4.17.21" mathjs: "npm:^10.4.3" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" languageName: unknown linkType: soft @@ -1498,7 +1498,7 @@ __metadata: karma-mocha-reporter: "npm:^2.2.5" karma-webpack: "npm:^5.0.0" lodash: "npm:^4.17.21" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" node-fetch: "npm:^2.6.7" node-inspect-extracted: "npm:^1.0.8" nyc: "npm:^15.1.0" @@ -1535,7 +1535,7 @@ __metadata: eslint-plugin-import: "npm:^2.29.0" google-protobuf: "npm:^3.12.2" long: "npm:^5.2.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" mocha-sinon: "npm:^2.1.2" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" @@ -1574,7 +1574,7 @@ __metadata: jayson: "npm:^4.1.0" lodash: "npm:^4.17.21" lru-cache: "npm:^5.1.1" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" mocha-sinon: "npm:^2.1.2" nyc: "npm:^15.1.0" pino: "npm:^8.16.2" @@ -1607,7 +1607,7 @@ __metadata: eslint-plugin-import: "npm:^2.29.0" levelup: "npm:^4.4.0" memdown: "npm:^5.1.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" should: "npm:^13.2.3" sinon: "npm:^17.0.1" wasm-x11-hash: "npm:~0.0.2" @@ -1674,7 +1674,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -1712,7 +1712,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -1728,7 +1728,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -1750,7 +1750,7 @@ __metadata: eslint-plugin-import: "npm:^2.29.0" lodash: "npm:^4.17.21" long: "npm:^5.2.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" mocha-sinon: "npm:^2.1.2" nyc: "npm:^15.1.0" semver: "npm:^7.5.3" @@ -1769,7 +1769,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -1815,7 +1815,7 @@ __metadata: karma-sourcemap-loader: "npm:^0.3.7" karma-webpack: "npm:^5.0.0" localforage: "npm:^1.10.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" net: "npm:^1.0.2" nodeforage: "npm:^1.1.2" os-browserify: "npm:^0.3.0" @@ -1878,6 +1878,22 @@ __metadata: languageName: node linkType: hard +"@dashevo/token-history-contract@workspace:packages/token-history-contract": + version: 0.0.0-use.local + resolution: "@dashevo/token-history-contract@workspace:packages/token-history-contract" + dependencies: + "@dashevo/wasm-dpp": "workspace:*" + chai: "npm:^4.3.10" + dirty-chai: "npm:^2.0.1" + eslint: "npm:^8.53.0" + eslint-config-airbnb-base: "npm:^15.0.0" + eslint-plugin-import: "npm:^2.29.0" + mocha: "npm:^11.1.0" + sinon: "npm:^17.0.1" + sinon-chai: "npm:^3.7.0" + languageName: unknown + linkType: soft + "@dashevo/wallet-lib@workspace:*, @dashevo/wallet-lib@workspace:packages/wallet-lib": version: 0.0.0-use.local resolution: "@dashevo/wallet-lib@workspace:packages/wallet-lib" @@ -1912,7 +1928,7 @@ __metadata: karma-sourcemap-loader: "npm:^0.3.7" karma-webpack: "npm:^5.0.0" lodash: "npm:^4.17.21" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" node-inspect-extracted: "npm:^1.0.8" nyc: "npm:^15.1.0" os-browserify: "npm:^0.3.0" @@ -1945,7 +1961,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -1991,7 +2007,7 @@ __metadata: karma-webpack: "npm:^5.0.0" lodash: "npm:^4.17.21" long: "npm:^5.2.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" path-browserify: "npm:^1.0.1" process: "npm:^0.11.10" sinon: "npm:^17.0.1" @@ -2020,7 +2036,7 @@ __metadata: eslint: "npm:^8.53.0" eslint-config-airbnb-base: "npm:^15.0.0" eslint-plugin-import: "npm:^2.29.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" languageName: unknown @@ -2287,16 +2303,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/source-map@npm:^0.3.2": - version: 0.3.2 - resolution: "@jridgewell/source-map@npm:0.3.2" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 1aaa42075bac32a551708025da0c07b11c11fb05ccd10fb70df2cb0db88773338ab0f33f175d9865379cb855bb3b1cda478367747a1087309fda40a7b9214bfa - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": version: 0.3.6 resolution: "@jridgewell/source-map@npm:0.3.6" @@ -2331,7 +2337,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.18 resolution: "@jridgewell/trace-mapping@npm:0.3.18" dependencies: @@ -3708,13 +3714,6 @@ __metadata: languageName: node linkType: hard -"@ungap/promise-all-settled@npm:1.1.2": - version: 1.1.2 - resolution: "@ungap/promise-all-settled@npm:1.1.2" - checksum: ee8fe811becd830f5e276ec63469ec66c22503eb140064580e712c9fccadfd54157c462188640ba6765d5c21f829e7120eb37afb5ead512684b9a1ab86d2db66 - languageName: node - linkType: hard - "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -4122,7 +4121,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.9.0": +"acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.9.0": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -4254,13 +4253,20 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:4.1.1, ansi-colors@npm:^4.1.1": +"ansi-colors@npm:^4.1.1": version: 4.1.1 resolution: "ansi-colors@npm:4.1.1" checksum: e862fddd0a9ca88f1e7c9312ea70674cec3af360c994762309f6323730525e92c77d2715ee5f08aa8f438b7ca18efe378af647f501fc92b15b8e4b3b52d09db4 languageName: node linkType: hard +"ansi-colors@npm:^4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: 43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 + languageName: node + linkType: hard + "ansi-escapes@npm:^3.1.0": version: 3.2.0 resolution: "ansi-escapes@npm:3.2.0" @@ -4501,7 +4507,7 @@ __metadata: languageName: node linkType: hard -"arrify@npm:^1.0.0, arrify@npm:^1.0.1": +"arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 @@ -4926,7 +4932,7 @@ __metadata: languageName: node linkType: hard -"browser-stdout@npm:1.3.1": +"browser-stdout@npm:^1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" checksum: ac70a84e346bb7afc5045ec6f22f6a681b15a4057447d4cc1c48a25c6dedb302a49a46dd4ddfb5cdd9c96e0c905a8539be1b98ae7bc440512152967009ec7015 @@ -5050,7 +5056,7 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.0": +"buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb @@ -5458,7 +5464,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:^3.4.0, chokidar@npm:^3.5.1, chokidar@npm:^3.5.2": +"chokidar@npm:^3.4.0, chokidar@npm:^3.5.1, chokidar@npm:^3.5.2": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -5477,6 +5483,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.5.3": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -5638,6 +5663,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 + languageName: node + linkType: hard + "clone-buffer@npm:^1.0.0": version: 1.0.0 resolution: "clone-buffer@npm:1.0.0" @@ -6387,7 +6423,7 @@ __metadata: karma-mocha: "npm:^2.0.1" karma-mocha-reporter: "npm:^2.2.5" karma-webpack: "npm:^5.0.0" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" net: "npm:^1.0.2" node-inspect-extracted: "npm:^1.0.8" nodemon: "npm:^2.0.20" @@ -6400,10 +6436,9 @@ __metadata: stream-browserify: "npm:^3.0.0" stream-http: "npm:^3.2.0" string_decoder: "npm:^1.3.0" - terser-webpack-plugin: "npm:^5.3.1" + terser-webpack-plugin: "npm:^5.3.11" tls: "npm:^0.0.1" ts-loader: "npm:^9.5.0" - ts-mocha: "npm:^10.0.0" ts-mock-imports: "npm:^1.3.0" ts-node: "npm:^10.4.0" tsd: "npm:^0.28.1" @@ -6458,7 +6493,7 @@ __metadata: listr2: "npm:5.0.7" lodash: "npm:^4.17.21" memory-streams: "npm:^0.1.3" - mocha: "npm:^10.2.0" + mocha: "npm:^11.1.0" mocha-sinon: "npm:^2.1.2" node-forge: "npm:^1.3.1" node-graceful: "npm:^3.0.1" @@ -6471,7 +6506,7 @@ __metadata: semver: "npm:^7.5.3" sinon: "npm:^17.0.1" sinon-chai: "npm:^3.7.0" - systeminformation: "npm:^5.22.11" + systeminformation: "npm:^5.25.11" table: "npm:^6.8.1" tar: "npm:7.4.3" wrap-ansi: "npm:^7.0.0" @@ -6510,7 +6545,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:~4.3.1, debug@npm:~4.3.2": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -6522,18 +6557,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.3": - version: 4.3.3 - resolution: "debug@npm:4.3.3" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 723a9570dcd15d146ea4992f0dca12467d1b00f534abb42473df166d36826fcae8bab045aef59ac2f407b47a23266110bc0e646df8ac82f7800c11384f82050e - languageName: node - linkType: hard - "debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -6543,6 +6566,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.5": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + languageName: node + linkType: hard + "debug@npm:~4.3.4": version: 4.3.5 resolution: "debug@npm:4.3.5" @@ -6758,20 +6793,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: 4a179a75b17cbb420eb9145be913f9ddb34b47cb2ba4301e80ae745122826a468f02ca8f5e56945958de26ace594899c8381acb6659c88e7803ef078b53d690c - languageName: node - linkType: hard - -"diff@npm:^3.1.0": - version: 3.5.0 - resolution: "diff@npm:3.5.0" - checksum: cfbc2df98d6f8eb82c0f7735c8468695f65189d31f95a708d4c97cd96a8083fdfd83d87a067a29924ae7d8ff64f578e7da78391af537815750268555fe0df9f0 - languageName: node - linkType: hard - "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -6786,6 +6807,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -7908,16 +7936,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:5.0.0, find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - "find-up@npm:^2.0.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -7937,6 +7955,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + "find-up@npm:^6.3.0": version: 6.3.0 resolution: "find-up@npm:6.3.0" @@ -8382,20 +8410,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.0.4" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: bc78b6ea0735b6e23d20678aba4ae6a4760e8c9527e3c4683ac25b14e70f55f9531245dcf25959b70cbc4aa3dcce1fc37ab65fd026a4cbd70aa3a44880bd396b - languageName: node - linkType: hard - "glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.4": version: 10.4.1 resolution: "glob@npm:10.4.1" @@ -8411,7 +8425,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.7": +"glob@npm:^10.3.7, glob@npm:^10.4.5": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -8589,13 +8603,6 @@ __metadata: languageName: node linkType: hard -"growl@npm:1.10.5": - version: 1.10.5 - resolution: "growl@npm:1.10.5" - checksum: 1391a9add951964de566adc0aee8b0e2b2321e768c1fdccb7a8e156d6a6cd7ea72782883ba8c2c307baf524e3059519423b72e585eba5e7a5f6e83a1e2359b0d - languageName: node - linkType: hard - "handlebars@npm:^4.7.6": version: 4.7.7 resolution: "handlebars@npm:4.7.7" @@ -8739,7 +8746,7 @@ __metadata: languageName: node linkType: hard -"he@npm:1.2.0": +"he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -9829,17 +9836,6 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 - languageName: node - linkType: hard - "js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.0, js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -9852,6 +9848,17 @@ __metadata: languageName: node linkType: hard +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 + languageName: node + linkType: hard + "jsbn@npm:1.1.0": version: 1.1.0 resolution: "jsbn@npm:1.1.0" @@ -10437,16 +10444,6 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - "log-symbols@npm:^2.1.0": version: 2.2.0 resolution: "log-symbols@npm:2.2.0" @@ -10456,6 +10453,16 @@ __metadata: languageName: node linkType: hard +"log-symbols@npm:^4.0.0, log-symbols@npm:^4.1.0": + version: 4.1.0 + resolution: "log-symbols@npm:4.1.0" + dependencies: + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + languageName: node + linkType: hard + "log-update@npm:^4.0.0": version: 4.0.0 resolution: "log-update@npm:4.0.0" @@ -10959,24 +10966,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:4.2.1": - version: 4.2.1 - resolution: "minimatch@npm:4.2.1" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 27e49fb720116face9588c29634404edc0c6677e5448ba01b4ec6179002461cc4fabc842497a0537edc5aa87bc93e65cfb0fe6dc32b850563429a64836dd1d54 - languageName: node - linkType: hard - -"minimatch@npm:5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 2656580f18d9f38ada186196fcc72dc9076d70f7227adc664e72614d464e075dc4ae3936e6742519e09e336996ef33c6035e606888b12f65ca7fda792ddd2085 - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -10986,7 +10975,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1": +"minimatch@npm:^5.0.0, minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": version: 5.1.6 resolution: "minimatch@npm:5.1.6" dependencies: @@ -11033,7 +11022,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.1.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.6 resolution: "minimist@npm:1.2.6" checksum: b956a7d48669c5007f0afce100a92d3af18e77939a25b5b4f62e9ea07c2777033608327e14c2af85684d5cd504f623f2a04d30a4a43379d21dd3c6dcf12b8ab8 @@ -11184,7 +11173,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.5": +"mkdirp@npm:^0.5.5": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -11223,70 +11212,34 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.2.0": - version: 10.2.0 - resolution: "mocha@npm:10.2.0" +"mocha@npm:^11.1.0": + version: 11.1.0 + resolution: "mocha@npm:11.1.0" dependencies: - ansi-colors: "npm:4.1.1" - browser-stdout: "npm:1.3.1" - chokidar: "npm:3.5.3" - debug: "npm:4.3.4" - diff: "npm:5.0.0" - escape-string-regexp: "npm:4.0.0" - find-up: "npm:5.0.0" - glob: "npm:7.2.0" - he: "npm:1.2.0" - js-yaml: "npm:4.1.0" - log-symbols: "npm:4.1.0" - minimatch: "npm:5.0.1" - ms: "npm:2.1.3" - nanoid: "npm:3.3.3" - serialize-javascript: "npm:6.0.0" - strip-json-comments: "npm:3.1.1" - supports-color: "npm:8.1.1" - workerpool: "npm:6.2.1" - yargs: "npm:16.2.0" - yargs-parser: "npm:20.2.4" - yargs-unparser: "npm:2.0.0" + ansi-colors: "npm:^4.1.3" + browser-stdout: "npm:^1.3.1" + chokidar: "npm:^3.5.3" + debug: "npm:^4.3.5" + diff: "npm:^5.2.0" + escape-string-regexp: "npm:^4.0.0" + find-up: "npm:^5.0.0" + glob: "npm:^10.4.5" + he: "npm:^1.2.0" + js-yaml: "npm:^4.1.0" + log-symbols: "npm:^4.1.0" + minimatch: "npm:^5.1.6" + ms: "npm:^2.1.3" + serialize-javascript: "npm:^6.0.2" + strip-json-comments: "npm:^3.1.1" + supports-color: "npm:^8.1.1" + workerpool: "npm:^6.5.1" + yargs: "npm:^17.7.2" + yargs-parser: "npm:^21.1.1" + yargs-unparser: "npm:^2.0.0" bin: _mocha: bin/_mocha mocha: bin/mocha.js - checksum: f7362898ae65e8fe716cfe62fd014b432d100c9611aaf5abe85ed14efcbfdd82f3bdf32c44bccf00c9059a264c7e8d93a69dd5b830652109052a92beffb7ea35 - languageName: node - linkType: hard - -"mocha@npm:^9.1.2": - version: 9.2.2 - resolution: "mocha@npm:9.2.2" - dependencies: - "@ungap/promise-all-settled": "npm:1.1.2" - ansi-colors: "npm:4.1.1" - browser-stdout: "npm:1.3.1" - chokidar: "npm:3.5.3" - debug: "npm:4.3.3" - diff: "npm:5.0.0" - escape-string-regexp: "npm:4.0.0" - find-up: "npm:5.0.0" - glob: "npm:7.2.0" - growl: "npm:1.10.5" - he: "npm:1.2.0" - js-yaml: "npm:4.1.0" - log-symbols: "npm:4.1.0" - minimatch: "npm:4.2.1" - ms: "npm:2.1.3" - nanoid: "npm:3.3.1" - serialize-javascript: "npm:6.0.0" - strip-json-comments: "npm:3.1.1" - supports-color: "npm:8.1.1" - which: "npm:2.0.2" - workerpool: "npm:6.2.0" - yargs: "npm:16.2.0" - yargs-parser: "npm:20.2.4" - yargs-unparser: "npm:2.0.0" - bin: - _mocha: bin/_mocha - mocha: bin/mocha - checksum: 8ee58bff8694ad4013fc0fbb5670c5ec6d8404c601df2d4ae798fad01dd03b5f9395347cf59167006b315a14813a6f839290d60dcbdee8ef4246afe43609d2dc + checksum: 50d1305813d1b3f5882e17d0fbe66793c82bc6b5286ed3e56bbe9edf52446ed27486f41b08a2b4b79e2dbbbb34e0e51d647d58de61b7aedb6f076296b374a263 languageName: node linkType: hard @@ -11341,7 +11294,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -11386,24 +11339,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:3.3.1": - version: 3.3.1 - resolution: "nanoid@npm:3.3.1" - bin: - nanoid: bin/nanoid.cjs - checksum: 306f2cb9e4dcfb94738b09de9dc63839a37db33626f66b24dbcc8f66d4b91784645794a7c4f250d629e4d66f5385164c6748c58ac5b7c95217e9e048590efbe4 - languageName: node - linkType: hard - -"nanoid@npm:3.3.3": - version: 3.3.3 - resolution: "nanoid@npm:3.3.3" - bin: - nanoid: bin/nanoid.cjs - checksum: c703ed58a234b68245a8a4826dd25c1453a9017d34fa28bc58e7aa8247de87d854582fa2209d7aee04084cff9ce150be8fd30300abe567dc615d4e8e735f2d99 - languageName: node - linkType: hard - "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -13756,6 +13691,18 @@ __metadata: languageName: node linkType: hard +"schema-utils@npm:^4.3.0": + version: 4.3.0 + resolution: "schema-utils@npm:4.3.0" + dependencies: + "@types/json-schema": "npm:^7.0.9" + ajv: "npm:^8.9.0" + ajv-formats: "npm:^2.1.1" + ajv-keywords: "npm:^5.1.0" + checksum: 86c5a7c72a275c56f140bc3cdd832d56efb11428c88ad588127db12cb9b2c83ccaa9540e115d7baa9c6175b5e360094457e29c44e6fb76787c9498c2eb6df5d6 + languageName: node + linkType: hard + "scoped-regex@npm:^2.0.0": version: 2.1.0 resolution: "scoped-regex@npm:2.1.0" @@ -13799,16 +13746,7 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:6.0.0, serialize-javascript@npm:^6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" - dependencies: - randombytes: "npm:^2.1.0" - checksum: ed3dabfbb565c48c9eb1ca8fe58f0d256902ab70a8a605be634ddd68388d5f728bb0bd1268e94fab628748ba8ad8392f01b05f3cbe1e4878b5c58c669fd3d1b4 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.1": +"serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: @@ -14235,7 +14173,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.20": +"source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -14616,22 +14554,13 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 languageName: node linkType: hard -"supports-color@npm:8.1.1, supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 157b534df88e39c5518c5e78c35580c1eca848d7dbaf31bbe06cdfc048e22c7ff1a9d046ae17b25691128f631a51d9ec373c1b740c12ae4f0de6e292037e4282 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -14650,6 +14579,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 157b534df88e39c5518c5e78c35580c1eca848d7dbaf31bbe06cdfc048e22c7ff1a9d046ae17b25691128f631a51d9ec373c1b740c12ae4f0de6e292037e4282 + languageName: node + linkType: hard + "supports-hyperlinks@npm:^2.0.0, supports-hyperlinks@npm:^2.2.0": version: 2.3.0 resolution: "supports-hyperlinks@npm:2.3.0" @@ -14704,12 +14642,12 @@ __metadata: languageName: node linkType: hard -"systeminformation@npm:^5.22.11": - version: 5.22.11 - resolution: "systeminformation@npm:5.22.11" +"systeminformation@npm:^5.25.11": + version: 5.25.11 + resolution: "systeminformation@npm:5.25.11" bin: systeminformation: lib/cli.js - checksum: 315cd3f2cc2aefbee9201fac043521d073e8c94a77f8900617dad67fdb798116fd2963a365d4d3da81dbca6da360d1f7008c61e1fe33ef9f8f3b77aa4f506014 + checksum: 9a43bb8991ac07a0bcf3f9002c32e9f36a1100b2f620049c4c3dc24f74556c681b1e4552dc27581af32a842540cd42c1bb085e842b0c325273fb558b51c7159f conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) languageName: node linkType: hard @@ -14814,15 +14752,15 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.1": - version: 5.3.3 - resolution: "terser-webpack-plugin@npm:5.3.3" +"terser-webpack-plugin@npm:^5.3.10": + version: 5.3.10 + resolution: "terser-webpack-plugin@npm:5.3.10" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.7" + "@jridgewell/trace-mapping": "npm:^0.3.20" jest-worker: "npm:^27.4.5" schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.0" - terser: "npm:^5.7.2" + serialize-javascript: "npm:^6.0.1" + terser: "npm:^5.26.0" peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -14832,19 +14770,19 @@ __metadata: optional: true uglify-js: optional: true - checksum: db2bc0e57048d5e0856b12561f8f9f3303e5bbb6f2c6068b982682c434f3fdca7d524d4254f117aaf928134c29c64c91050535d65376c9913943c6482bd5be21 + checksum: fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"terser-webpack-plugin@npm:^5.3.11": + version: 5.3.11 + resolution: "terser-webpack-plugin@npm:5.3.11" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" + "@jridgewell/trace-mapping": "npm:^0.3.25" jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" + schema-utils: "npm:^4.3.0" + serialize-javascript: "npm:^6.0.2" + terser: "npm:^5.31.1" peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -14854,7 +14792,7 @@ __metadata: optional: true uglify-js: optional: true - checksum: fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + checksum: a8f7c92c75aa42628adfa4d171d4695c366c1852ecb4a24e72dd6fec86e383e12ac24b627e798fedff4e213c21fe851cebc61be3ab5a2537e6e42bea46690aa3 languageName: node linkType: hard @@ -14872,17 +14810,17 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.7.2": - version: 5.14.2 - resolution: "terser@npm:5.14.2" +"terser@npm:^5.31.1": + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: - "@jridgewell/source-map": "npm:^0.3.2" - acorn: "npm:^8.5.0" + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" commander: "npm:^2.20.0" source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 0646b5db1dc1fed8796ee6182e6f46192d9bda38b4f4a6e6a7b6d9d2df9d260fe439cdaa966ea9efcc052280b8e8862b1e37ba10968fdbe69ac58383372e97e5 + checksum: d84aff642398329f7179bbeaca28cac76a86100e2372d98d39d9b86c48023b6b9f797d983d6e7c0610b3f957c53d01ada1befa25d625614cb2ccd20714f1e98b languageName: node linkType: hard @@ -15093,23 +15031,6 @@ __metadata: languageName: node linkType: hard -"ts-mocha@npm:^10.0.0": - version: 10.0.0 - resolution: "ts-mocha@npm:10.0.0" - dependencies: - ts-node: "npm:7.0.1" - tsconfig-paths: "npm:^3.5.0" - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - dependenciesMeta: - tsconfig-paths: - optional: true - bin: - ts-mocha: bin/ts-mocha - checksum: b11f2a8ceecf195b0db724da429159982fef12e4357088fe900289223587217e8c126ead7929679edd58bf19ad96c5da5911535d26f535386632e18fbff10c40 - languageName: node - linkType: hard - "ts-mock-imports@npm:^1.3.0": version: 1.3.8 resolution: "ts-mock-imports@npm:1.3.8" @@ -15120,25 +15041,45 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:7.0.1": - version: 7.0.1 - resolution: "ts-node@npm:7.0.1" +"ts-node@npm:^10.4.0": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" dependencies: - arrify: "npm:^1.0.0" - buffer-from: "npm:^1.1.0" - diff: "npm:^3.1.0" + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" make-error: "npm:^1.1.1" - minimist: "npm:^1.2.0" - mkdirp: "npm:^0.5.1" - source-map-support: "npm:^0.5.6" - yn: "npm:^2.0.0" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true bin: ts-node: dist/bin.js - checksum: c1e0f1582867c34a03a25b1861e86922b9576931d473d48cd13275400832972350c4564e5f2c2df5817be6acbbb8e1dedf43bdd6f8c0f06b15d3530562a08a90 + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: a91a15b3c9f76ac462f006fa88b6bfa528130dcfb849dd7ef7f9d640832ab681e235b8a2bc58ecde42f72851cc1d5d4e22c901b0c11aa51001ea1d395074b794 languageName: node linkType: hard -"ts-node@npm:^10.4.0, ts-node@npm:^10.9.1": +"ts-node@npm:^10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -16009,25 +15950,25 @@ __metadata: languageName: node linkType: hard -"which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" +"which@npm:^1.2.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" dependencies: isexe: "npm:^2.0.0" bin: - node-which: ./bin/node-which - checksum: 4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f + which: ./bin/which + checksum: 549dcf1752f3ee7fbb64f5af2eead4b9a2f482108b7de3e85c781d6c26d8cf6a52d37cfbe0642a155fa6470483fe892661a859c03157f24c669cf115f3bbab5e languageName: node linkType: hard -"which@npm:^1.2.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" dependencies: isexe: "npm:^2.0.0" bin: - which: ./bin/which - checksum: 549dcf1752f3ee7fbb64f5af2eead4b9a2f482108b7de3e85c781d6c26d8cf6a52d37cfbe0642a155fa6470483fe892661a859c03157f24c669cf115f3bbab5e + node-which: ./bin/node-which + checksum: 4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f languageName: node linkType: hard @@ -16119,17 +16060,10 @@ __metadata: languageName: node linkType: hard -"workerpool@npm:6.2.0": - version: 6.2.0 - resolution: "workerpool@npm:6.2.0" - checksum: c7dce6eae02098d70fe9924503bd95688564a1316cbb96fe55600f7ede0e66f1f2fea4d18aaec71fcee32373d17eda0bf87ac4dac8e5823e90ca1524aac90bdc - languageName: node - linkType: hard - -"workerpool@npm:6.2.1": - version: 6.2.1 - resolution: "workerpool@npm:6.2.1" - checksum: 3e637f76320cab92eaeffa4fbefb351db02e20aa29245d8ee05fa7c088780ef7b4446bfafff2668a22fd94b7d9d97c7020117036ac77a76370ecea278b9a9b91 +"workerpool@npm:^6.5.1": + version: 6.5.1 + resolution: "workerpool@npm:6.5.1" + checksum: b1b00139fe62f2ebec556a2af8085bf6e7502ad26cf2a4dcb34fb4408b2e68aa12c88b0a50cb463b24f2806d60fa491fc0da933b56ec3b53646aeec0025d14cb languageName: node linkType: hard @@ -16289,13 +16223,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.2.4": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: db8f251ae40e24782d5c089ed86883ba3c0ce7f3c174002a67ec500802f928df9d505fea5d04829769221ce20b0f69f6fb1138fbb2e2fb102e3e9d426d20edab - languageName: node - linkType: hard - "yargs-parser@npm:^18.1.2": version: 18.1.3 resolution: "yargs-parser@npm:18.1.3" @@ -16313,7 +16240,14 @@ __metadata: languageName: node linkType: hard -"yargs-unparser@npm:2.0.0": +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e + languageName: node + linkType: hard + +"yargs-unparser@npm:^2.0.0": version: 2.0.0 resolution: "yargs-unparser@npm:2.0.0" dependencies: @@ -16325,21 +16259,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:16.2.0, yargs@npm:^16.1.1, yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e - languageName: node - linkType: hard - "yargs@npm:^15.0.2": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -16359,6 +16278,36 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^16.1.1, yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 + languageName: node + linkType: hard + "yeoman-environment@npm:^3.15.1": version: 3.19.3 resolution: "yeoman-environment@npm:3.19.3" @@ -16441,13 +16390,6 @@ __metadata: languageName: node linkType: hard -"yn@npm:^2.0.0": - version: 2.0.0 - resolution: "yn@npm:2.0.0" - checksum: 9d49527cb3e9a0948cc057223810bf30607bf04b9ff7666cc1681a6501d660b60d90000c16f9e29311b0f28d8a06222ada565ccdca5f1049cdfefb1908217572 - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"

    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

    G>%vRU}OM3BEt?Jp!K# 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%0D$PPV5v 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±6Y(2lO9#4RVZ!xs#+B#R3CfUB@>m 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